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

TradingView中plotshape()函数实现特定双交叉后单次标记显示的技术问询

解决TradingView Plotshape交叉标记触发逻辑问题

我明白你的问题了——你想要的是先上穿EMA113,之后再上穿WMA200时才显示标记,而不是必须在同一根K线完成两次交叉,也不想重复标记。咱们来调整代码实现这个逻辑:

修改后的完整代码

//@version=5
indicator("Custom Cross Markers", overlay=true)

// 计算均线
EMA8_ = ta.ema(close, 8)
EMA24_ = ta.ema(close, 24)
WMA50_ = ta.wma(close, 50)
EMA113_ = ta.ema(close, 113)
WMA200_ = ta.wma(close, 200)

// 绘制均线
plot(EMA8_, color=color.white, title="EMA8")
plot(EMA24_, color=color.yellow, title="EMA24")
plot(WMA50_, color=color.red, title="WMA50")
plot(EMA113_, color=color.aqua, title="EMA113")
plot(WMA200_, color=color.blue, title="WMA200")

// 定义持久化变量,跟踪是否已上穿EMA113(var只初始化一次)
var bool ema113Crossed_EMA8 = false
var bool ema113Crossed_EMA24 = false
var bool ema113Crossed_WMA50 = false

// 更新交叉状态:上穿EMA113时设为true,下穿时重置为false
ema113Crossed_EMA8 := ta.crossover(EMA8_, EMA113_) ? true : ta.crossunder(EMA8_, EMA113_) ? false : ema113Crossed_EMA8
ema113Crossed_EMA24 := ta.crossover(EMA24_, EMA113_) ? true : ta.crossunder(EMA24_, EMA113_) ? false : ema113Crossed_EMA24
ema113Crossed_WMA50 := ta.crossover(WMA50_, EMA113_) ? true : ta.crossunder(WMA50_, EMA113_) ? false : ema113Crossed_WMA50

// 触发标记:上穿WMA200且已完成EMA113上穿
plotshape(series = ta.crossover(EMA8_, WMA200_) and ema113Crossed_EMA8, 
          style=shape.flag, location=location.top, color=#9FE2BF, size=size.normal, title="EMA8 Cross WMA200 After EMA113")

plotshape(series = ta.crossover(EMA24_, WMA200_) and ema113Crossed_EMA24, 
          style=shape.flag, location=location.top, color=#FFC000, size=size.normal, title="EMA24 Cross WMA200 After EMA113")

plotshape(series = ta.crossover(WMA50_, WMA200_) and ema113Crossed_WMA50, 
          style=shape.flag, location=location.top, color=#FF5F15, size=size.normal, title="WMA50 Cross WMA200 After EMA113")

关键逻辑解释

  1. 持久化状态跟踪:用var关键字定义的布尔变量会在整个脚本运行期间保留值,不会每根K线重置。这让我们能记住短期均线是否已经完成了对EMA113的上穿。
  2. 状态更新规则:
    • 当短期均线上穿EMA113时,把对应状态设为true
    • 当短期均线下穿EMA113时,重置状态为false(避免后续趋势中错误触发标记)
    • 如果没有交叉发生,保持当前状态不变
  3. 标记触发条件:只有当短期均线上穿WMA200,并且此前已经完成了对EMA113的上穿(对应状态为true)时,才会显示标记,完美符合你的需求。

如果希望标记只触发一次(即使短期均线在WMA200上方多次波动),可以在触发后重置状态,比如修改plotshape的逻辑:

plotshape(series = ta.crossover(EMA8_, WMA200_) and ema113Crossed_EMA8, 
          style=shape.flag, location=location.top, color=#9FE2BF, size=size.normal)
// 触发后重置状态,避免重复标记
if ta.crossover(EMA8_, WMA200_) and ema113Crossed_EMA8
    ema113Crossed_EMA8 := false

内容的提问来源于stack exchange,提问作者Damien

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:27:29