TradingView PineScript策略回测时止损止盈偶发不触发问题咨询
问题核心原因
1. 止盈止损价计算时机错误
你将strategy.exit和strategy.entry放在同一个if代码块内执行,此时strategy.entry提交的多单还未实际成交,strategy.position_avg_price还没有更新为本次新开仓的成本价,计算出来的止损、止盈价实际上是错误的(首次开仓时甚至会取到0值,导致订单完全无法触发)。
第二次场景正常触发是因为上一次持仓平仓后,position_avg_price残留了上一次的成本值,刚好和本次开仓价接近,才碰巧符合预期。
2. 策略计算频率设置问题
Pine Script策略默认仅在K线收盘时计算信号,如果你的止盈止损是在K线运行过程中被触及,但K线收盘时价格又回到了止盈止损价之外,默认设置下不会触发平仓。
如果需要让策略响应K线内的价格波动,需要在策略声明代码中开启calc_on_every_tick参数:
strategy("你的策略名称", calc_on_every_tick = true, 其他参数...)
3. 回测填充规则匹配问题
如果你的回测设置中开启了严格的订单填充规则(比如要求成交量匹配、滑点设置过大),也会出现价格触及止盈止损位但订单无法成交的情况,可以检查回测设置中的「交易」选项卡,调整填充规则到你需要的模式。
修复代码示例
正确的写法应该是单独判断持仓状态后设置止损止盈,同时增加重复开仓限制,避免订单绑定混乱:
longcon = crossover(ema5, ema21) longCondition1 = longcon[4] longCondition2 = ema50 > ema200 ? 1: 0 longCondition3 = bbr > 0.75 ? 1: 0 longCondition4 = sig > 15 ? 1: 0 longCondition5 = ao > 2 ? 1: 0 // 仅在无持仓时开仓,避免重复下单 if (longCondition1 and longCondition2 and longCondition3 and longCondition4 and longCondition5 and strategy.position_size == 0) strategy.entry("long", strategy.long) // 持仓状态下绑定止盈止损,此时开仓价已经更新完成 if strategy.position_size > 0 strategy.exit("exit", "long", stop=strategy.position_avg_price*0.98, limit=strategy.position_avg_price*1.01) plot(strategy.position_avg_price) plot(strategy.position_avg_price*0.98) plot(strategy.position_avg_price*1.01)
内容的提问来源于stack exchange,提问作者Mider111
相关产品推荐
相关产品推荐

