如何用逻辑运算符组合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
相关产品推荐
相关产品推荐

