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

Pine Script开发:均线交叉后检测两次指标方向变化

问题描述

需要实现功能:检测某条MA(移动平均线)交叉另一条MA后,是否完成了两次方向变化,具体流程如下:

  • 步骤1:MA20下穿MA50,以此作为事件起点(遍历历史中所有该事件)。
  • 步骤2:事件发生后,MA20首次改变方向。
  • 步骤3:在步骤2之后,MA20再次改变方向。

要求在第二次方向变化发生时,变量为true,并在回溯测试中所有满足条件的K线上绘制箭头,而非仅最近一次交叉事件后的K线。

当前代码无法正常运行:

MA1 = ta.rsi(close, 5)
MA2 = ta.rsi(close, 26)

MA1_crossdown = ta.crossunder(MA1,MA2)
bars_since_event1 = ta.barssince(MA1_crossdown)

MA1_low = ta.lowestbars(MA1, bars_since_event1)
bars_since_event2 = ta.barssince(MA1_low)

MA1_high = ta.highestbars(MA1, bars_since_event2)
bars_since_event3 = ta.barssince(MA1_high)

final_turn_complete = (bars_since_event3 == 1) and MA1<MA1_high

plotshape(final_turn_complete, title='turns complete', style=shape.arrowdown, size=size.huge)
解决方案

核心思路

  1. 用状态机跟踪每个交叉事件后的阶段:初始状态→等待第一次转向→等待第二次转向→完成两次转向。
  2. 利用ta.change()结合交叉函数判断MA的方向变化(从下跌转上涨/上涨转下跌)。
  3. 用var声明持久化变量,确保每个交叉事件的状态独立跟踪,不会被新事件覆盖。

修正后的代码

//@version=5
indicator("MA交叉后两次转向检测", overlay=false)

// 定义两条均线(可替换为ema等其他类型)
maFast = ta.sma(close, 20)
maSlow = ta.sma(close, 50)

// 检测MA20下穿MA50的事件
crossDownEvent = ta.crossunder(maFast, maSlow)

// 状态变量:0=初始状态,1=等待第一次转向,2=等待第二次转向,3=完成两次转向
var int state = 0

// 判断第一次转向:MA从下跌转为上涨
firstTurn = ta.crossover(ta.change(maFast), 0)
// 判断第二次转向:MA从上涨转为下跌(可根据需求调整方向)
secondTurn = ta.crossunder(ta.change(maFast), 0)

// 状态流转逻辑
if crossDownEvent
    state := 1  // 下穿发生,进入等待第一次转向状态
else if state == 1 and firstTurn
    state := 2  // 完成第一次转向,进入等待第二次转向状态
else if state == 2 and secondTurn
    state := 3  // 完成第二次转向,标记状态为完成
else if state == 3
    state := 0  // 重置状态,准备跟踪下一次下穿事件

// 标记第二次转向完成的K线
finalTurnComplete = state == 3

// 在所有满足条件的K线下绘制箭头
plotshape(finalTurnComplete, title="两次转向完成", style=shape.arrowdown, location=location.belowbar, color=color.red, size=size.huge)

// 可选:绘制均线用于验证
plot(maFast, color=color.blue, title="MA20")
plot(maSlow, color=color.orange, title="MA50")

代码解释

  • 状态机设计:通过state变量连贯跟踪每个下穿事件后的阶段,避免不同事件的逻辑互相干扰。
  • 方向变化判断:ta.change(maFast)计算均线的差值,ta.crossover(ta.change(maFast), 0)表示均线从下跌(差值负)转上涨(差值正),即第一次转向;反之ta.crossunder对应第二次转向。
  • 持久化变量:var关键字让state在脚本运行时保留值,不会随K线刷新重置,确保状态流转的连续性。
  • 箭头绘制:location=location.belowbar将箭头固定在K线下方,所有历史中满足条件的K线都会显示箭头。

自定义调整

  • 若需要反转转向方向(比如第一次是上涨转下跌,第二次是下跌转上涨),交换firstTurn和secondTurn的判断逻辑即可。
  • 可修改maFast和maSlow的定义,替换为ta.ema、ta.wma等其他均线类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:35:28