Pine Script设置Strategy.entry仅在下根K线触发入场的问题
问题核心原因
strategy.entry()提交的止损挂单默认为永久有效规则,不会自动到期,这是挂单在数根K线后意外触发的根本原因- 原有代码虽然通过
process_orders_on_close=false规避了信号K线当根成交的问题,但缺少挂单到期自动撤销的判断逻辑,也没有限制挂单的有效周期
修复逻辑
新增信号K线索引标记,严格限制挂单仅在信号出现后的第一根K线内有效:
- 记录做空信号触发时的K线索引
- 信号K线当根不提交任何挂单,避免当根成交
- 仅在信号后的次根K线提交止损空单
- 次根K线走完仍未成交时,主动撤销未成交挂单,杜绝后续K线意外入场
修复后完整代码
//@version=5 strategy("str demo", "str demo", overlay=true, process_orders_on_close = false) var float desired_entry_price = 0.0 var float entry_low = 0.0 var float entry_high = 0.0 var float c_entry_range = 0.0 var float position_avg_price = 0.0 // 新增:记录做空信号触发的K线索引 var int short_signal_bar = na shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28)) // 信号触发时记录参数、绘制标记,不直接挂单 if shortCondition and strategy.position_size == 0 line.new(bar_index, close, bar_index, close + 1, xloc.bar_index, extend.both, color=color.new(color.red, 70)) //vertical line entry_low := low entry_high := high c_entry_range := entry_high - entry_low desired_entry_price := entry_low - 10 * syminfo.mintick short_signal_bar := bar_index // 仅在信号后的次根K线挂止损空单 if not na(short_signal_bar) and bar_index == short_signal_bar + 1 and strategy.position_size == 0 strategy.entry("es", strategy.short, qty = 10, stop = desired_entry_price) // 次根K线走完未成交则撤销挂单,重置标记 if bar_index > short_signal_bar + 1 and strategy.position_size == 0 strategy.cancel("es") short_signal_bar := na position_avg_price := strategy.position_avg_price s_sl1 = entry_high s_tp1 = entry_low - (c_entry_range * 2.5) plot(desired_entry_price, style=plot.style_circles, color=color.new(color.red, 0)) if strategy.position_size < 0 strategy.exit("x1", "es", qty_percent = 100, limit = s_tp1, stop = s_sl1)
逻辑说明
- 完全保留原有信号判断、止盈止损计算、绘图逻辑,没有改动原有策略的交易规则
- 信号K线当根不会提交任何订单,彻底避免信号K线内成交
- 止损空单仅在信号出现后的下一根K线整根周期内有效,价格触及入场价就正常开仓
- 下一根K线收盘时如果没有触发入场,挂单会被立刻撤销,不会留到后续K线产生非预期入场
内容的提问来源于stack exchange,提问作者Ady
相关产品推荐
相关产品推荐

