TradingView Pine Script突破策略问题:同Bar平仓后重复同向开仓
Pine Script突破策略:解决同一Bar止盈后重复开仓问题
问题重现
你编写的突破策略规则如下:
- 收盘价突破过去100根Bar最高价做多
- 收盘价跌破过去50根Bar最低价做空
- 设置25个Ticks止盈
- 禁止连续两次同向交易
但存在核心问题:当同一Bar内完成开仓+止盈平仓后,若当前多/空条件仍满足,会再次开立同向新仓,违反了禁止连续同向交易的规则。
核心原因
原代码仅通过pos[2] != 1/-1判断是否连续同向开仓,但该逻辑无法识别同一Bar内已经完成开仓+平仓的场景:
- 实时模式下(
process_orders_on_close = false),止盈触发后仓位立即平仓,此时strategy.position_size回到0 - 但当前Bar的价格仍满足开仓条件,
pos变量仍保持1/-1,且pos[2]的历史值未发生变化,导致再次触发开仓条件
解决方案
通过两个关键判断完善开仓条件,避免同一Bar内重复同向开仓:
- 检查当前是否无未平仓头寸(
strategy.position_size == 0) - 检查当前Bar是否未执行过同向开仓:通过跟踪上次开仓的Bar索引与方向,确保同一Bar内不会重复触发同向开仓
修改后的完整代码
//@version=5 strategy(title="Breakout", overlay = true, process_orders_on_close = false, default_qty_type=strategy.cash, default_qty_value=10000) periodhh = input(100, title="多头突破周期") periodll = input(50, title="空头突破周期") take_profit_ticks = input(25, title="止盈Ticks") // 计算高低点 hh = ta.highest(periodhh) ll = ta.lowest(periodll) // 突破条件判断 is_long_signal = close > hh[1] is_short_signal = close < ll[1] // 跟踪上次开仓的Bar索引与方向 var int last_entry_bar = na var int last_entry_dir = 0 // 多头开仓条件:无持仓+多头信号+当前Bar未开过多头 if (is_long_signal and strategy.position_size <= 0 and (bar_index != last_entry_bar or last_entry_dir != 1)) strategy.entry("Long", strategy.long) strategy.exit("Take Profit Long", "Long", profit=take_profit_ticks) last_entry_bar := bar_index last_entry_dir := 1 // 空头开仓条件:无持仓+空头信号+当前Bar未开过空头 if (is_short_signal and strategy.position_size >= 0 and (bar_index != last_entry_bar or last_entry_dir != -1)) strategy.entry("Short", strategy.short) strategy.exit("Take Profit Short", "Short", profit=take_profit_ticks) last_entry_bar := bar_index last_entry_dir := -1
关键改进点
- 新增
last_entry_bar和last_entry_dir变量,分别记录上次开仓的Bar索引与方向,从根源避免同一Bar内重复开仓 - 将止盈订单与对应开仓订单绑定(
strategy.exit的第二个参数指定开仓订单ID),避免止盈指令混乱 - 明确
strategy.position_size的判断逻辑,确保反向平仓后再开仓的规则正常运行 - 拆分开仓条件为独立变量,提升代码可读性与维护性
验证说明
可在30分钟图表上使用ES1!或NQ1!合约测试:
- 当价格突破后触发开仓,若同一Bar内达到止盈,不会再次开仓
- 若未触发止盈,出现反向信号时会自动平仓并开立反向仓位
- 严格遵守禁止连续同向交易的规则
内容的提问来源于stack exchange,提问作者Corrado
相关产品推荐
相关产品推荐

