Pine Script内包突破策略未按条件取消挂单问题求助
内包突破策略:未及时取消挂单问题修复
策略规则与问题描述
策略逻辑:
- 识别内包K线(当前K线高点<前一根K线高点,且当前K线低点>前一根K线低点)
- 以内包K线的高点作为突破入场价,挂多单入场
- 止盈设为内包前一根K线的高点,止损设为内包K线的低点
问题:内包形成后,若第一根后续K线未触发入场(未触及内包高点),策略本该取消所有挂单,但实际会在多根K线后仍触发入场,导致无效交易。
原代码问题分析
原代码存在核心逻辑错误:
BarsPast>1的判断嵌套在BarsPast<2的外层条件里,永远不会被执行- 未正确跟踪内包出现后的K线计数,无法在超过1根K线后触发订单取消逻辑
修复后的代码
strategy("内包突破策略", overlay=true, initial_capital=10000, default_qty_value=10, default_qty_type=strategy.percent_of_equity, calc_on_every_tick=true, process_orders_on_close=false) // 内包条件:当前K线为内包K线 isInsideBar = high < high[1] and low > low[1] // 记录距离最近一次内包的K线数,0表示当前K线就是内包 barsSinceInside = ta.barssince(isInsideBar) // 时间范围过滤 timePeriod = time >= timestamp(syminfo.timezone, 2022, 1, 1, 0, 0) // 1. 内包出现时,挂入场单与止盈止损(仅无持仓时挂单) if (timePeriod and isInsideBar and strategy.opentrades == 0) // 挂突破多单:触发价为内包高点 strategy.entry("long", strategy.long, stop=high) // 设置止盈止损:止盈为内包前一根K线高点,止损为内包低点 strategy.exit("exit", "long", stop=low, limit=high[1]) // 2. 内包出现后超过1根K线,且无持仓时,取消所有挂单 if (timePeriod and barsSinceInside > 1 and strategy.opentrades == 0) strategy.cancel_all()
关键修复点
- 拆分内包识别与订单取消逻辑,确保
cancel_all()能在正确时机执行 - 用
barsSinceInside跟踪内包后的K线计数,当超过1根且无持仓时取消挂单 - 增加
strategy.opentrades == 0判断,避免重复挂单
内容的提问来源于stack exchange,提问作者rigatoni4
相关产品推荐
相关产品推荐

