PineScript技术问题:如何按顺序满足两条件后执行plotshape
MA5先跌破20再突破20的标记实现
你的代码逻辑存在两个核心问题:
- 嵌套
if要求MA5同时满足<20和>25,这两个条件不可能同时成立,永远触发不了标记 - 没有记录“MA5先跌破20”这个前置状态,无法区分“首次突破20”和“先破后穿”的情况
以下是修正后的Pine Script代码,精准实现你要的逻辑:
//@version=5 indicator("MA5先破20再穿20信号", overlay=true) MA5 = ta.sma(close, 5) // 用var定义状态变量,仅初始化一次,记录是否出现过MA5跌破20的情况 var bool hasBrokenBelow = false // 捕捉MA5跌破20的瞬间(20上穿MA5),更新状态 if ta.crossover(20, MA5) hasBrokenBelow := true // 当MA5突破20,且之前已经跌破过20时,生成信号 triggerSignal = ta.crossover(MA5, 20) and hasBrokenBelow // 在图表上绘制标记 plotshape(triggerSignal, title="先破后穿信号", location=location.belowbar, color=color.new(color.green, 0), style=shape.triangleup, size=size.small) // 可选:触发信号后重置状态,避免同一轮趋势中重复标记 if triggerSignal hasBrokenBelow := false
关键逻辑说明
var关键字确保hasBrokenBelow只在脚本启动时设为false,不会随K线刷新重置,能持续记录前置状态ta.crossover()用来捕捉瞬间突破/跌破的时刻,而非持续处于某个区间的状态,避免误标记- 触发信号后重置状态,保证每一次标记都对应“先跌破→再突破”的完整流程
内容的提问来源于stack exchange,提问作者KarlEs
相关产品推荐
相关产品推荐

