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

如何用逻辑运算符组合3种MACD预警条件?求助预警未触发问题

问题描述

需求:在3分钟时间框架下设置预警,规则如下:

  • 3分钟MACD金叉预警:仅在15秒MACD处于零轴下方且发生金叉时触发
  • 3分钟MACD死叉预警:仅在15秒MACD处于零轴上方且发生死叉时触发

已在同一面板绘制两个周期的MACD,但使用以下代码后无预警触发:

macdupcrossAlert = ta.crossover(macd,signal)   ///// 3 minute macd crossover
macddowncrossAlert = ta.crossunder(macd,signal) ////// 3 minute macd crossunder

macdcrossoverAlert_15S = ta.crossover(mtf_15smacd, mtf_15Ssignal) //// 15 seconds macd crossover
macdcrossunderAlert_15S = ta.crossunder(mtf_15smacd, mtf_15Ssignal) //// 15 seconds macd crossunder


condition1 = (macdcrossoverAlert_15S and mtf_15smacd < 0) and macdupcrossAlert  
condition2 = (macdcrossunderAlert_15S and mtf_15smacd > 0) and macddowncrossAlert 

alertcondition(condition1, title="15 seconds up", message="Price is going up!, macd below zero")
alertcondition(condition2, title="15 seconds down", message="Price is going Down! macd above zero")
问题分析与修复方案

原代码的核心问题是:要求3分钟和15秒周期的MACD交叉必须在同一根K线同时触发,这种情况概率极低,几乎不会发生,所以没有预警。

需要调整逻辑,改为:当3分钟周期出现MACD金叉/死叉时,检查15秒周期是否满足对应的状态(零轴位置+已完成交叉),或者15秒的交叉发生在3分钟K线的有效范围内。

以下是修复后的代码:

// 3分钟MACD交叉信号
macd_3m_crossup = ta.crossover(macd, signal)
macd_3m_crossdown = ta.crossunder(macd, signal)

// 15秒MACD状态:当前位置+是否已完成交叉
is_15m_macd_below_zero = mtf_15smacd < 0
is_15m_macd_above_zero = mtf_15smacd > 0
// 检测15秒MACD是否在最近5根K线内发生过金叉(可根据需求调整5这个数值)
has_15m_crossup_recent = ta.barssince(ta.crossover(mtf_15smacd, mtf_15Ssignal)) <= 5
// 检测15秒MACD是否在最近5根K线内发生过死叉
has_15m_crossdown_recent = ta.barssince(ta.crossunder(mtf_15smacd, mtf_15Ssignal)) <= 5

// 调整后的触发条件
condition1 = macd_3m_crossup and is_15m_macd_below_zero and has_15m_crossup_recent
condition2 = macd_3m_crossdown and is_15m_macd_above_zero and has_15m_crossdown_recent

// 预警设置
alertcondition(condition1, title="3分钟金叉预警", message="3分钟MACD金叉,15秒MACD零轴下方且近期金叉")
alertcondition(condition2, title="3分钟死叉预警", message="3分钟MACD死叉,15秒MACD零轴上方且近期死叉")

关键修改说明

  • 用ta.barssince()检测15秒周期的交叉是否在近期发生,避免要求两个周期交叉完全同步
  • 拆分状态判断,让逻辑更清晰,也便于调试
  • 调整预警标题和消息,更准确反映触发条件

如果需要更严格的同步(比如15秒交叉发生在当前3分钟K线内),可以将ta.barssince()的阈值调整为当前3分钟K线包含的15秒K线数量(3分钟=180秒,即12根15秒K线,阈值设为11即可)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:05:11