如何让脚本逻辑依赖strategy.entry交易指令的执行?
让Pine Script逻辑依赖strategy.entry执行的实现方法
嘿,我看了你代码里的需求——想让后续的平仓等逻辑只在strategy.entry执行之后才触发,对吧?这里有几个靠谱的实现方式,我帮你梳理一下,顺便修正你代码里的小问题:
问题分析
你原来写的if( strategy.long = true)有两个问题:一是用了赋值符号=而不是判断相等的==,二是直接用strategy.long虽然能判断多头持仓,但有时候不如自定义状态变量或者用内置的订单跟踪函数精准;另外你代码里lastTrade的赋值逻辑没和进场绑定,会导致不管有没有进场都会更新这个变量,逻辑容易混乱。
方法一:自定义持仓状态变量
这种方式最直观,自己跟踪是否已经进场,完全掌控逻辑:
//@version=5 strategy("依赖进场的策略", overlay=true) // 替换成你自己的delta计算逻辑 delta = ta.sma(close, 5) - ta.sma(close, 20) buy = ta.crossover(delta, 0) milliseconds_in_xdays = 1000 * 60 * 60 * 24 * 15 // 用var声明变量,保证脚本运行时只初始化一次 var bool in_position = false var float entry_time = na // 进场逻辑:仅在无持仓且buy信号触发时执行 if (buy and not in_position) strategy.entry("Long", strategy.long, comment="Long") in_position := true // 标记进入持仓状态 entry_time := time // 记录进场时间 // 后续逻辑:仅在持仓状态下运行 if (in_position) // 15天后触发平仓 if (time >= entry_time + milliseconds_in_xdays) strategy.close("Long") in_position := false // 重置持仓状态 entry_time := na // 清空进场时间记录
方法二:使用策略内置的订单跟踪函数
Pine Script提供了strategy.opentrades来获取当前未平仓订单的数量,用它来判断是否已经进场也很方便:
//@version=5 strategy("依赖进场的策略", overlay=true) delta = ta.sma(close, 5) - ta.sma(close, 20) buy = ta.crossover(delta, 0) milliseconds_in_xdays = 1000 * 60 * 60 * 24 * 15 var float entry_time = na // 进场逻辑:确保当前无未平仓订单时才执行 if (buy and strategy.opentrades == 0) strategy.entry("Long", strategy.long, comment="Long") entry_time := time // 后续逻辑:当有未平仓订单时(即进场之后)才触发 if (strategy.opentrades > 0) if (time >= entry_time + milliseconds_in_xdays) strategy.close("Long") entry_time := na
关键要点
- 核心逻辑都是先确认进场动作已完成,再执行后续的平仓等操作;
- 进场时一定要加防重复下单的判断(比如
not in_position或strategy.opentrades == 0),避免同一信号多次开仓; - 平仓后记得重置状态变量/时间记录,防止后续逻辑误触发。
内容的提问来源于stack exchange,提问作者Mike Mann
相关产品推荐
相关产品推荐

