TradingView Pine策略calc_on_order_fills开启时止盈限价单触发异常
TradingView策略calc_on_order_fills参数开启后止盈价位异常修复方案
根因分析
- 持仓判断逻辑错误:原代码中
inMarket = strategy.opentrades > strategy.opentrades[1]仅会在开仓成交的那一次策略计算时返回真,同K线后续的常规计算中,开仓数没有新增,inMarket会变为假,导致依赖该变量的止盈价checkLongTarget被赋值为na,相当于止盈限价被主动清空。 - 止损未受影响是因为止损参数直接传入了全局计算的
long_stopLoss变量,不依赖inMarket的判断,所以一直生效。 calc_on_order_fills参数开启后,订单成交会立刻触发一次额外的策略重计算,第一次计算时止盈被正常设置,但同K线后续计算时止盈被清空,就出现了止盈失效、只能在K线最高价成交的问题;关闭该参数时策略只在K线收盘后计算,inMarket的判断逻辑刚好能匹配计算节奏,所以不会出问题。
修复方案
- 修正持仓判断逻辑,将
inMarket的定义改为直接判断当前是否有未平仓订单:
inMarket = strategy.opentrades > 0
- 新增固定变量存储开仓时的止盈止损价,避免持仓过程中价位随K线数据变动,在策略变量定义区新增两个可变存储变量:
var float fixedLongTarget = na var float fixedLongStop = na
- 在开仓信号触发的代码块中,同步存储当前计算的止盈止损价,以EMA过滤开启的分支为例,修改后逻辑如下:
if b_media if bullishTrend and indicatorBuy // 开仓时同步存储固定止盈止损 fixedLongTarget := longTarget fixedLongStop := long_stopLoss strategy.entry("Entry", strategy.long,qty=maxQTY, comment="Entry on Bullish Stoch", stop=long_stopBuy) if inMarket // 直接使用固定的止盈止损价,无需动态计算 strategy.exit("Exit","Entry",comment="Stoch Exit",limit=fixedLongTarget, stop=fixedLongStop) // 其余原有逻辑保持不变
无EMA过滤的分支做相同修改即可。
4. 平仓后重置存储变量,避免影响下一次开仓,在原有strategy.cancel_all()的逻辑块中新增重置代码:
if strategy.closedtrades > strategy.closedtrades[1] strategy.cancel_all() fixedLongTarget := na fixedLongStop := na
- 删除原有的
checkLongBuy、checkLongTarget、checkLongstopLoss相关冗余逻辑。
内容的提问来源于stack exchange,提问作者Marques
相关产品推荐
相关产品推荐

