MACD三柱扩展分析交易助手实战
用MT4脚本透视趋势加速度与反转
一、为什么只看两根MACD柱不够
在经典用法中,亚历山大·埃尔德博士建议用对应时间周期上最后两根MACD柱来判断价格趋势方向。这种方法简单直观,但存在明显局限:仅凭两根柱我们只能知道价格是上涨还是下跌,无法判断动能是在增强还是减弱。经验丰富的交易者或许能靠盘感补充判断,但新手极易在趋势末端追单。当我们把分析样本扩大到最后三根柱,也就是第零根(最新)、第一根和第二根柱时,信息维度从一阶差分升级到二阶差分,能够直接读出加速度概念,大幅提升对趋势健康度的识别质量。
所谓二阶差分,就是比较「当前柱与前一根柱的差值」和「前一根柱与前两根柱的差值」谁大谁小。如果前者大于后者,说明同方向运动在加速;如果前者小于后者,说明同方向运动在减速,也就是衰减;如果两者接近,说明匀速。这一逻辑构成了本文脚本的核心算法基础。
二、TrendMACD脚本的核心算法原理
脚本通过iMACD函数抓取指定周期下最近三根柱的MACD主线值,分别赋值给Macd_h1_a(第零根)、Macd_h1_b(第一根)、Macd_h1_c(第二根)。随后计算两个增量:r1为a与b的绝对差值,r2为b与c的绝对差值。通过对比r1与r2的大小,结合三根柱的数值排列顺序与零轴位置关系,脚本将市场状态分类为:轴下下跌加速、轴下下跌减速、轴下上涨加速、轴下上涨减速、轴下反转向下、轴下反转向上、轴上类似分类、上穿零轴、下穿零轴、轴下反转、轴上反转以及扁平震荡。
原文将对比逻辑切分为六个程序块:块1-2处理零轴下方的MACD;块2-3处理零轴上方;块3-4处理向上穿越零轴;块4-5处理向下穿越零轴;块5-6与6-7分别处理轴下与轴上反转。这种模块化结构方便用户按需启用,尤其在历史回看时可逐块取消注释来精确定位某种形态的发生位置。
三、输入参数与两种运行模式
脚本头部用extern声明了两个关键变量:a代表初始分析柱序号,period代表要分析的时间框架。period通过注释切换,支持1分钟到月线共11个周期。根据使用目的,脚本分为两种模式。第一是历史分析模式:将脚本拖到图表后弹出的属性窗口中,可自由设置a为较大的历史偏移量,并选定想要复盘的周期,脚本会扫描并弹窗提示该范围内的各种状态。第二是实盘交易助手模式:此时应将a设为零或一,period设为实际用于开仓或持仓监控的周期。
- a=0:从当前未闭合柱开始分析,适合实时盯盘但需注意数据可能不完整
- a=1:从上一根已闭合柱开始,实盘更稳妥,避免周期中途请求到半截柱
- period:必须明确设定,不可依赖图表当前周期,否则分析层级错位
四、关键代码结构与可视化控制
以下为v5版本头部的周期声明片段,展示如何用注释切换时间框架。show_inputs属性确保拖入图表时弹出输入窗口,若注释掉则该窗口不显示。
#property show_inputs extern int a = 0; // here you can specify any initial bar to be analyzed //extern int period = 1; // 1 minute //extern int period = 5; // 5 minutes //extern int period = 15; // 15 minutes extern int period = 30; // 30 minutes //extern int period = 60; // comment on the timeframe you need //extern int period = 240; // 4 hours
start函数中先定义b=a+1、c=b+1,再调用iMACD获取三根柱值。下列代码即为核心取值部分。
int b,c; b=a+1; c=b+1; double Macd_h1_a= iMACD(NULL,period,12,26,9,PRICE_CLOSE,MODE_MAIN,a); double Macd_h1_b= iMACD(NULL,period,12,26,9,PRICE_CLOSE,MODE_MAIN,b); double Macd_h1_c= iMACD(NULL,period,12,26,9,PRICE_CLOSE,MODE_MAIN,c);
为便于观察历史计算结果,可用Print输出放大后的值。
Print(" Macd_h1_c= ",Macd_h1_c*1000," Macd_h1_b= ",
Macd_h1_b*1000," Macd_h1_a= ",Macd_h1_a*1000);
五、状态判定代码详解与避坑
以零轴下方块为例,脚本先确认三根柱均小于零,再依据排列与r1、r2关系报警。比如当c>b>a且r1>r2,判定为「轴下下跌加速」;若r1<r2则为「下跌减速」,提示应考虑平多。注意原文用MathAbs(r1-r2)<0.000015作为相等容差,这是因MACD浮点精度所致,直接写r1==r2会漏判。
if(Macd_h1_c<0.0&&Macd_h1_b<0.0&&Macd_h1_a<0.0)
{
double r1=MathAbs(MathAbs(Macd_h1_a)-MathAbs(Macd_h1_b));
double r2=MathAbs(MathAbs(Macd_h1_b)-MathAbs(Macd_h1_c));
if(Macd_h1_c>Macd_h1_b&&Macd_h1_b>Macd_h1_a)
{
if(r1>r2) Alert("On bar ",a," MACD<0 = ",Macd_h1_a," The trend is moving down with acceleration");
if(r1<r2) Alert("On bar ",a," MACD<0 = ",Macd_h1_a," The trend is moving down with slowing down");
}
}
向上穿越零轴块则处理c、b在轴下而a在轴上的情形,用r1为a与b绝对值之和、r2为c与b绝对值之差来比较穿越动能。类似逻辑对称用于向下穿越。这些块在v5中带详细注释,适合学习;v6为交易版,去掉了部分历史注释并固定a与period为extern以便实盘前手动设。
六、运行耗时监控与信息开关
脚本利用GetTickCount函数测算执行时间,在开头记录start时刻,结尾弹窗显示毫秒差,便于评估在历史大量柱上扫描时的性能。
int start=GetTickCount();
//…
Alert(" Calculation time ", GetTickCount()-start," millisec");
若不想被频繁Alert打扰,可将全局变量int Message = 1改为0,并把后续Alert替换为Print,信息就会只出现在终端的Expert Advisors日志里,而不弹窗。对于后台历史扫描,这一改动能避免MT4弹窗堆积卡顿。
七、v5历史版与v6交易版的区别
v5定位为分析工具,允许在属性窗随意改a和period,内部六个块全开且注释充分,方便逐态回看。v6则在标头去掉show_inputs依赖、将a和period直接extern固定默认值,逻辑块保持但更紧凑,专注实时辅助决策。实战中,新手可先用v5在的历史图形上肉眼验证「加速-减速-反转」标注是否吻合直觉,再切v6挂盘观察。
// v6 trading header extern int a = 0; // here you can specify the initial bar to be analyzed extern int period = 30; // set the value of the period you need
八、与其他趋势判断方案的对比
传统MACD金叉死叉只看两根线交叉,滞后且易陷震荡;埃尔德两根柱法虽超前却无加速度概念;本脚本的三柱法在两者间取得平衡:比单纯交叉早一步提示衰减,比裸看柱形图多一层量化标准。与斜率指标相比,它不引入回归计算,直接利用原生MACD值,资源占用低。缺点是仍属辅助提示,未内置下单函数,需交易者自行结合仓位管理。作者称合理使用可降错单率至少10%,对新手建立趋势敬畏感尤其有价值。
九、部署步骤与常见错误
- 从原文附件下载TrendMACD_v5.mq4与v6.mq4,放入MT4的MQL4/Scripts目录
- 重启终端或刷新导航器,右键脚本选修改可在MetaEditor看完整代码
- 历史分析:拖v5至图表,在弹出窗设a为想回看的偏移、period为目标周期,确定后即开始扫描
- 实盘辅助:拖v6前先改extern的a和period,存盘编译,再拖入图表
- 误报排查:确认a=0时是否处于柱体早期;确认period是否真为你意图的周期而非图表周期
- 若弹窗太多,按前文改Message=0并换Print
最后需注意,本文代码为MQL4脚本(.mq4),若要在MT5使用需重写iMACD调用并改为MQL5事件驱动结构,不可直接复制。原文链接为https://www.mql5.com/zh/articles/1519,附件版权归Genkov与MetaQuotes,禁止整段转载。