Pyramiding模式下带唯一Entry ID的独立止损关联错误求助
解决Pine Script中金字塔下单时独立止损绑定混乱的问题
你的问题核心是Pine Script默认会把同方向无指定qty的entry归为同一仓位组,哪怕你给了唯一名称,from_entry的关联逻辑也会因为仓位组的默认匹配规则出错,导致止损触发时错位平仓。
解决方案要点
- 给每一笔
strategy.entry指定明确的qty值(哪怕是1),强制让系统把每个entry视为独立的仓位单元 - 确保
strategy.exit的from_entry严格对应目标entry的唯一名称
修改后的完整代码
//@version=5 strategy(title="Example Strategy", overlay=true, pyramiding=5) // 明确允许同方向多次开仓(配合pyramiding设置) strategy.risk.allow_entry_in(strategy.long) // Entries storage. var longId = 1 var longs = array.new<string>() // 测试用的开仓条件(保留原逻辑) backtestStartDate = timestamp("1 Jan 2020") backtestEndDate = timestamp("1 Jan 2021") inTradeWindow = time >= backtestStartDate and time < backtestEndDate var currentOrder = 1 var ordersLimit = 5 var barsBetweenEntries = 5 var barsSinceLastEntry = barsBetweenEntries // ----------------------------------------------------- if inTradeWindow if currentOrder <= ordersLimit and barsSinceLastEntry == barsBetweenEntries stopLossPrice = low*0.8 entryName = "LE#" + str.tostring(longId) // 关键修改:指定qty=1,让每个entry成为独立仓位 strategy.entry(entryName, strategy.long, qty=1) strategy.exit(entryName + "#SL", from_entry=entryName, stop=stopLossPrice) log.info("Entry " + entryName + " @ " + str.tostring(close) + ", SL " + str.tostring(stopLossPrice)) longs.push(entryName) longId += 1 currentOrder += 1 barsSinceLastEntry := 0 else barsSinceLastEntry += 1 else if inTradeWindow[1] strategy.cancel_all() strategy.close_all(comment="Date Range Exit")
原理说明
当你不指定qty时,Pine Script会使用策略的默认下单量(通常是账户资金的固定比例或固定手数),并且把所有同方向的entry合并到同一个仓位组里。这时候from_entry的匹配逻辑会优先关联最早的未平仓仓位,而不是你指定的entry名称,就会出现止损错位的情况。
指定qty=1后,每一笔entry都会被系统标记为独立的、不可合并的仓位单元,from_entry就能精准绑定对应的entry订单,触发止损时只会平仓对应的那一笔仓位,不会影响其他entry。
测试后你会看到,LE#4#SL触发时只会关闭LE#4的仓位,其他entry的止损也会各自对应正确的开仓订单。
内容的提问来源于stack exchange,提问作者Bartłomiej Zieliński
相关产品推荐
相关产品推荐

