You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的判断逻辑刚好能匹配计算节奏,所以不会出问题。

修复方案

  1. 修正持仓判断逻辑,将inMarket的定义改为直接判断当前是否有未平仓订单:
inMarket = strategy.opentrades > 0
  1. 新增固定变量存储开仓时的止盈止损价,避免持仓过程中价位随K线数据变动,在策略变量定义区新增两个可变存储变量:
var float fixedLongTarget = na
var float fixedLongStop = na
  1. 在开仓信号触发的代码块中,同步存储当前计算的止盈止损价,以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
  1. 删除原有的checkLongBuy、checkLongTarget、checkLongstopLoss相关冗余逻辑。

内容的提问来源于stack exchange,提问作者Marques

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 22:57:02