You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:35:23