Pine Script中strategy.opentrades.entry_bar_index替代方案及用法咨询
问题解决与说明
1. 报错原因分析
你遇到的Invalid value of the 'length' argument (NaN)错误,根源是barsSinceEntry在无持仓时返回na,而ta.highest的length参数要求必须是大于0的有效数字。在K线0时,策略还没有任何持仓,strategy.opentrades为0,所以barsSinceEntry取na,直接传给ta.highest就会触发报错。
2. strategy.opentrades.entry_bar_index(trade_num) 工作原理
- 这个函数用于获取当前持仓中指定交易的进场K线索引。
trade_num是交易的编号,从0开始计数:- 0代表最早开仓的那笔持仓
strategy.opentrades - 1代表最新开仓的那笔持仓(因为strategy.opentrades是当前持仓总笔数)
- 注意:当没有持仓时(
strategy.opentrades == 0),调用这个函数会返回na,这也是你报错的核心原因。
3. 可行替代方案
方案1:处理barsSinceEntry的无效值
通过nz()和math.max()确保传给ta.highest的length始终是大于0的数字:
barsSinceEntry = strategy.opentrades > 0 ? bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1) : na // 把na转为0后取最大值1,保证length有效 validLength = math.max(nz(barsSinceEntry), 1)
之后使用validLength作为ta.highest的周期参数即可。
方案2:用strategy.entry_bar简化(单持仓场景)
如果你的策略始终保持单一持仓(同一时间只持有一笔多单或空单),可以直接用strategy.entry_bar替代,它会直接返回当前持仓的进场K线索引,无需处理交易编号:
hasPosition = strategy.position_size != 0 barsSinceEntry = hasPosition ? bar_index - strategy.entry_bar : na validLength = math.max(nz(barsSinceEntry), 1)
4. 修改后的完整代码示例
//@version=5 strategy("My strategy", overlay=true, margin_long=100, margin_short=100) // 判断是否有持仓 hasPosition = strategy.position_size > 0 // 获取持仓以来的K线数,无持仓时返回na barsSinceEntry = hasPosition ? bar_index - strategy.entry_bar : na // 确保周期参数有效,至少为1 validLength = math.max(nz(barsSinceEntry), 1) longEntryCond = ta.rising(ta.mom(ohlc4, 1), 3) if (longEntryCond) strategy.entry("L", strategy.long) // 基于持仓以来的最高价设置退出条件 longExitCond = hasPosition ? (ta.highest(ohlc4[1], validLength) - ohlc4) >= ta.atr(200) : false if (longExitCond) strategy.close("L")
内容的提问来源于stack exchange,提问作者Alejandro
相关产品推荐
相关产品推荐

