如何使entryHigh在未持仓时保持初始值,持仓后重新计算开新仓?
解决未持仓时保留entryHigh初始值的方法
核心思路是用变量持久化和状态控制,避免无持仓时重复覆盖entryHigh的值:
- 用
var关键字初始化entryHigh,确保它不会在每根K线重置为na - 增加状态判断,控制只有在「从未设置过entryHigh」或者「已经完成一次交易(持仓后平仓)」时,才允许重新计算entryHigh
修正后的代码示例
//@version=5 strategy("Keep EntryHigh Example", overlay=true) inSession = true // 替换成你的实际交易时段判断逻辑 // 持久化变量:仅脚本启动时初始化一次,后续K线不会重置 var float entryHigh = na var bool canUpdateEntry = true // 控制是否允许更新entryHigh的标志 strategy.cancel_all() if (inSession and close < open and barstate.isconfirmed) // 无持仓且允许更新时,才设置entryHigh if (strategy.opentrades == 0 and canUpdateEntry) entryHigh := high[0] canUpdateEntry := false // 设置后禁止再次更新,直到交易完成 strategy.entry("FirstRed", strategy.long, qty=1, limit=entryHigh, stop=entryHigh) // 持仓平仓后,重置标志允许下次重新计算 if (strategy.opentrades == 0 and not canUpdateEntry) if (strategy.closedtrades > 0) canUpdateEntry := true
代码逻辑说明
var float entryHigh = na:用var声明的变量不会随每根K线重置,保证值能持续保留canUpdateEntry标志:- 初始为
true,允许第一次设置entryHigh - 一旦设置entryHigh就把标志设为
false,无持仓时不会再更新该值 - 当交易完成(持仓平仓,
strategy.closedtrades计数增加),再把标志设为true,允许下一次交易前重新计算entryHigh
- 初始为
简化方案(无需额外标志)
如果只需要「一旦设置entryHigh,无持仓时就不再改变,直到完成过一次交易后才允许更新」,可以直接用持仓历史判断:
//@version=5 strategy("Simplified Keep EntryHigh", overlay=true) inSession = true var float entryHigh = na strategy.cancel_all() if (inSession and close < open and barstate.isconfirmed) if (strategy.opentrades == 0) // 仅当entryHigh未设置,或已经完成过交易时,才更新 if (na(entryHigh) or strategy.closedtrades > 0) entryHigh := high[0] strategy.entry("FirstRed", strategy.long, qty=1, limit=entryHigh, stop=entryHigh)
这个方案更简洁,利用strategy.closedtrades判断是否完成过交易,无持仓且没完成过交易时,会一直保留之前的entryHigh值。
内容的提问来源于stack exchange,提问作者Nishi
相关产品推荐
相关产品推荐

