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")
关键逻辑解释
- 持久化状态跟踪:用
var关键字定义的布尔变量会在整个脚本运行期间保留值,不会每根K线重置。这让我们能记住短期均线是否已经完成了对EMA113的上穿。 - 状态更新规则:
- 当短期均线上穿EMA113时,把对应状态设为
true - 当短期均线下穿EMA113时,重置状态为
false(避免后续趋势中错误触发标记) - 如果没有交叉发生,保持当前状态不变
- 当短期均线上穿EMA113时,把对应状态设为
- 标记触发条件:只有当短期均线上穿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
相关产品推荐
相关产品推荐

