基于PineScript实现价格突破EMA100后的首次EMA7/13交叉识别
解决方案
要实现这个策略的核心是用状态变量跟踪当前价格所处的EMA100区间,以及该区间内是否已触发过交叉信号,避免重复识别。以下以Pine Script(TradingView常用脚本语言)为例给出实现逻辑:
1. 定义基础EMA指标
先计算所需的三条EMA:
//@version=5 indicator("EMA Cross Strategy", overlay=true) ema7 = ta.ema(close, 7) ema13 = ta.ema(close, 13) ema100 = ta.ema(close, 100)
2. 标记交叉信号
识别EMA7与EMA13的金叉、死叉:
golden_cross = ta.crossover(ema7, ema13) // 金叉:EMA7上穿EMA13 death_cross = ta.crossunder(ema7, ema13) // 死叉:EMA7下穿EMA13
3. 跟踪区间状态与首次交叉
用var关键字声明状态变量(这类变量不会随K线周期重置,能持续保存状态):
// 跟踪当前是否处于EMA100上方区间 var in_ema100_upper = false // 跟踪当前区间内是否已触发过金叉 var has_triggered_gold = false // 跟踪当前是否处于EMA100下方区间 var in_ema100_lower = false // 跟踪当前区间内是否已触发过死叉 var has_triggered_death = false // 更新EMA100区间状态 current_in_upper = close > ema100 current_in_lower = close < ema100 // 当区间切换时,重置交叉触发标记 if current_in_upper != in_ema100_upper has_triggered_gold := false in_ema100_upper := current_in_upper if current_in_lower != in_ema100_lower has_triggered_death := false in_ema100_lower := current_in_lower
4. 过滤首次交叉信号
结合区间状态和触发标记,筛选出符合要求的首次信号:
// 做多信号:价格在EMA100上方,首次金叉 long_signal = current_in_upper and golden_cross and not has_triggered_gold if long_signal has_triggered_gold := true label.new(bar_index, low, "做多", color=color.green, textcolor=color.white) // 做空信号:价格在EMA100下方,首次死叉 short_signal = current_in_lower and death_cross and not has_triggered_death if short_signal has_triggered_death := true label.new(bar_index, high, "做空", color=color.red, textcolor=color.white)
关键逻辑说明
var变量用于持久化状态:比如has_triggered_gold会记住当前EMA100上方区间内是否已经触发过金叉,直到价格跌破EMA100才会重置。- 区间切换时重置标记:当价格从EMA100下方回到上方,或者从上方跌到下方,都会清空对应交叉的触发标记,确保下一次交叉是该区间内的首次。
内容的提问来源于stack exchange,提问作者veliakman
相关产品推荐
相关产品推荐

