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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:46:11