如何实现3根MA全绿/全红时仅触发单次警报,直至MA颜色变更?
修改后的Pine Script v5指标代码
核心修改说明
要实现仅首次满足全绿/全红条件时触发警报,需跟踪信号状态的变化,只在状态从"不满足"切换到"满足"的瞬间触发警报,避免连续K线重复触发。具体通过以下步骤实现:
- 定义整体全绿/全红的条件变量
- 使用
var关键字创建持久化状态变量,记录上一根K线的状态 - 计算状态切换的瞬间信号
- 将警报触发条件绑定到状态切换瞬间
完整代码
//@version=5 indicator(title='Moving Average Colored 3SMA/WMA', shorttitle='NGU-Shujie-Colored3SMA-WMA', overlay=true) smaplot1 = input(true, title='Show SMA7 on chart') len1 = input.int(7, minval=1, title='SMA Length') src1 = close out1 = ta.sma(src1, len1) up1 = out1 > out1[1] down1 = out1 < out1[1] mycolor1 = up1 ? color.green : down1 ? color.red : color.blue plot(out1 and smaplot1 ? out1 : na, title='SMA7', color=mycolor1, linewidth=2) smaplot2 = input(false, title='Show SMA100 on chart') len2 = input.int(100, minval=1, title='SMA Length') src2 = close out2 = ta.sma(src2, len2) up2 = out2 > out2[1] down2 = out2 < out2[1] mycolor2 = up2 ? color.rgb(251, 242, 110) : down2 ? color.rgb(251, 242, 110) : color.rgb(251, 242, 110) plot(out2 and smaplot2 ? out2 : na, title='SMA100', color=mycolor2, linewidth=4) wmaplot1 = input(false, title='Show WMA34 on chart') len3 = input.int(34, minval=1, title='WMA Length') src3 = close out3 = ta.wma(src3, len3) up3 = out3 > out3[1] down3 = out3 < out3[1] mycolor3 = up3 ? color.green : down3 ? color.red : color.blue plot(out3 and wmaplot1 ? out3 : na, title='WMA34', color=mycolor3, linewidth=3) wmaplot2 = input(false, title='Show WMA on chart') len4 = input.int(20, minval=1, title='WMA Length') src4 = close out4 = ta.wma(src4, len4) up4 = out4 > out4[1] down4 = out4 < out4[1] mycolor4 = up4 ? color.green : down4 ? color.red : color.blue plot(out4 and wmaplot2 ? out4 : na, title='WMA', color=mycolor4, linewidth=2) // -------------------------- 新增修改部分 -------------------------- // 定义全绿(三根MA均向上)、全红(三根MA均向下)的整体条件 allGreen = up1 and up3 and up4 allRed = down1 and down3 and down4 // 持久化变量:记录上一根K线是否处于全绿/全红状态(var关键字保证变量不随K线重置) var bool wasAllGreen = false var bool wasAllRed = false // 触发信号:当前满足条件且上一根不满足(状态从无到有的瞬间) buySignal = allGreen and not wasAllGreen sellSignal = allRed and not wasAllRed // 更新状态变量,为下一根K线判断做准备 wasAllGreen := allGreen wasAllRed := allRed // -------------------------- 修改结束 -------------------------- alertcondition(buySignal, title="Buy", message="green buy") alertcondition(sellSignal, title="Sell", message="red sell")
关键细节解释
var bool wasAllGreen = false:使用var关键字声明的变量只会在脚本初始化时赋值一次,后续K线不会重置,用来持续跟踪之前的信号状态。buySignal = allGreen and not wasAllGreen:仅当当前K线满足全绿条件,且上一根K线不满足时,才生成买入信号,确保只触发一次警报。wasAllGreen := allGreen:在每根K线结束时更新状态变量,让下一根K线能获取最新的状态。
内容的提问来源于stack exchange,提问作者CantIhavecrypto
相关产品推荐
相关产品推荐

