strategy.exit()函数异常?限制仅执行一次却多次触发
Pine Script v5中strategy.exit()多次触发的问题分析
问题代码
//@version=5 strategy("RsI strategy", overlay=true) length =input( 14) var p = close var stop =false vrsi =ta.rsi(close, length) co =ta.crossover(vrsi,75) cu=close >p*1.0 var bool sell = na if (not na(vrsi)) if(co) p := close log.info('entry: {0} :size: {1}',strategy.position_entry_name,strategy.position_size) strategy.order("RsiLE1",strategy.long,qty = 10) if(cu and strategy.position_size >0 and not stop) log.info('stop: {0} size: {1}', stop,strategy.position_size) stop := true strategy.exit('stop',"RsiLE1", qty = 6, profit = 0.1)
问题原因
你用var stop = false限制strategy.exit()仅执行一次,但核心问题是未在新开仓时重置stop状态:
var声明的变量是全局持久化的,只会初始化一次。第一次触发exit后stop被设为true,后续再次开仓时没有将其重置为false,如果测试场景中第一次开仓后stop未被正确锁定(比如持仓状态波动),会导致cu条件在多个bar中持续满足,进而多次进入if块触发exit。- 你的
log.info放在exit调用的代码块内,每次满足条件都会打印日志,看起来像是exit多次触发,实际是重复进入了条件判断块。
解决方法
在每次开仓(co条件触发)时,手动重置stop为false,确保新仓可以正常触发exit逻辑,同时简化冗余判断:
//@version=5 strategy("RsI strategy", overlay=true) length =input(14) var float p = na var bool stop = false vrsi = ta.rsi(close, length) co = ta.crossover(vrsi, 75) cu = close > p // 简化判断,无需乘1.0 if (not na(vrsi)) if(co) p := close stop := false // 新开仓时重置stop状态 log.info('entry: {0} :size: {1}', strategy.position_entry_name, strategy.position_size) strategy.order("RsiLE1", strategy.long, qty = 10) if(cu and strategy.position_size > 0 and not stop) log.info('stop: {0} size: {1}', stop, strategy.position_size) stop := true strategy.exit('stop', "RsiLE1", qty = 6, profit = 0.1)
额外说明
var变量仅用于需要跨bar持久化的状态,涉及每次开仓都要重置的标记,必须在开仓逻辑中手动重置。strategy.exit()的profit参数是入场价到止盈价的价差(股票为美元,期货为点数),如果需要百分比止盈,可通过ta.valuewhen()获取入场价后计算目标价位。
内容的提问来源于stack exchange,提问作者孙建文
相关产品推荐
相关产品推荐

