为EA交易提供指标的现成模板(第3部分):趋势指标(基础篇)
MT5里直接套用的趋势指标模板
想在 MT5 里快速给 EA 接上趋势判断,不必从零写指标。平台自带的趋势指标模板(如 Moving Average、ADX、Ichimoku)可直接以 iCustom 或内置 iMA / iADX 函数调用,省去重复造轮子。 一篇 2024 年 3 月 21 日发布的示例帖,在站内获得 2449 次查看、2 条讨论,说明这类现成模板对实战开发者确有高频需求。 对贵金属与外汇品种,趋势指标在震荡市会频繁假突破,属高风险信号源;建议先用策略测试器跑 2023 年 EURUSD H1 数据,观察斜率过滤后的信号衰减再决定参数。
◍ 指标类库的骨架长这样
这套 MQL5 指标类库把十几种常见技术指标拆成了统一的结构:每个指标都对应「参数 / 初始化 / 析构 / 读取数据」四个环节。从自适应移动平均、平均方向性运动,到布林带、一目均衡、抛物线转向,一共覆盖了 14 个指标模块。 对交易者来说,这种拆分意味着你不用每次重写指标逻辑——直接调对应的读取数据接口就能拿到序列值。比如要在 EA 里同时挂布林带和抛物线转向做过滤,只需分别实例化并初始化,再周期性读值即可。 外汇与贵金属波动剧烈、杠杆高风险大,直接套用指标信号不等于稳赢;建议先在 MT5 策略测试器里把这几个类的初始化耗时跑一遍,确认实盘 tick 下不会卡顿再上真仓。
「把趋势指标接进EA的通用骨架」
这一节承接前面振荡指标、成交量与比尔威廉姆斯指标的接法,把重心放到趋势指标上。目标很直接:在系列首篇搭好的仪表板上,把趋势指标算出来的数值实时显示出来,方便交易者开MT5边跑边看。 整套模板按五个固定环节组织:先写输入参数和全局变量,再初始化并创建指标句柄,接着处理去初始化,然后从指标取数,最后把数据塞进仪表板。复制粘贴即可用,但建议先跑通一处再改其他指标。 外汇与贵金属市场高波动、高杠杆,模板只解决“接数据”的工程问题,信号本身不代表方向确定性,实际概率仍取决于品种与周期。
AMA 如何压住噪声又少滞后
自适应移动平均(AMA)的核心诉求很直接:对价格序列里的噪声低敏感,同时在趋势启动时不拖泥带水地跟住。Perry Kaufman 在《更聪明的交易》里给出这套逻辑,本质是用波动率去调节平滑系数。 普通均线有两个老毛病:价格冷不丁跳一下,就骗出假趋势信号;真要把线修平滑了,趋势拐头又总是慢半拍。AMA 的做法是用效率比(ER)衡量最近一段价格运动的方向强度,噪声大的时候把平滑权重调高,趋势清晰时把权重降下来。 对外汇和贵金属这种常因数据瞬间跳空的高波动品种,AMA 比固定周期均线更少被毛刺触发误报,但杠杆市场高风险仍在,任何信号都只是概率倾向,不是方向保证。
◍ iAMA 句柄与面板参数怎么挂
在 MT5 里用 iAMA() 拿自适应移动平均的句柄,它只输出一个缓冲区。调用时 symbol 填 NULL 就是抓当前品种,period 填 0 代表用当前周期,这两个默认值能少写不少判断。 ama_period 是效率计算周期,fast_ma_period 和 slow_ma_period 分别管趋势快、慢时的平滑率——快周期小、慢周期大,AMA 才会随波动率自动调速。ama_shift 控制指标相对图表的水平偏移,applied_price 可以塞价格常量或别的指标句柄。函数失败返回 INVALID_HANDLE,不用的句柄记得丢给 IndicatorRelease() 释放内存,否则实盘跑久了可能拖慢终端。 原文给出的声明片段里,ENUM_LINE_STATE 枚举把线态拆成了 13 种:从 NONE、UP、DOWN 到 TOUCH_BELOW、EQUALS 等,专门用来判断 AMA 相对另一条线或某个水平的形态与位置。EA 里若接仪表板,得把这类枚举和面板类文件一起声明成全局变量,才方便后续状态机读取。 下面这段是 MT5 里 iAMA 函数头与线态枚举的最小可贴代码,直接复制到 .mq5 里就能编译看效果:
class="type">int iAMA( class="type">class="kw">string symbol, class=class="str">"cmt">// symbol name ENUM_TIMEFRAMES period, class=class="str">"cmt">// period class="type">int ama_period, class=class="str">"cmt">// AMA period class="type">int fast_ma_period, class=class="str">"cmt">// fast Moving Average period class="type">int slow_ma_period, class=class="str">"cmt">// slow Moving Average period class="type">int ama_shift, class=class="str">"cmt">// horizontal shift of the indicator ENUM_APPLIED_PRICE applied_price class=class="str">"cmt">// price type or handle ); class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| TestTrendAMA.mq5 | class=class="str">"cmt">//| Copyright class="num">2023, MetaQuotes Ltd. | class=class="str">"cmt">//| [MQL5官方文档] | class=class="str">"cmt">//+------------------------------------------------------------------+ class="macro">#class="kw">property copyright "Copyright class="num">2023, MetaQuotes Ltd." class="macro">#class="kw">property link "[MQL5官方文档] class="macro">#class="kw">property version "class="num">1.00" class=class="str">"cmt">//--- enums enum ENUM_LINE_STATE { LINE_STATE_NONE, class=class="str">"cmt">// Undefined state LINE_STATE_UP, class=class="str">"cmt">// Upward LINE_STATE_DOWN, class=class="str">"cmt">// Downward LINE_STATE_TURN_UP, class=class="str">"cmt">// Upward reversal LINE_STATE_TURN_DOWN, class=class="str">"cmt">// Downward reversal LINE_STATE_STOP_UP, class=class="str">"cmt">// Upward stop LINE_STATE_STOP_DOWN, class=class="str">"cmt">// Downward stop LINE_STATE_ABOVE, class=class="str">"cmt">// Above value LINE_STATE_UNDER, class=class="str">"cmt">// Below value LINE_STATE_CROSS_UP, class=class="str">"cmt">// Crossing value upwards LINE_STATE_CROSS_DOWN, class=class="str">"cmt">// Crossing value downwards LINE_STATE_TOUCH_BELOW, class=class="str">"cmt">// Touching value from below LINE_STATE_TOUCH_ABOVE, class=class="str">"cmt">// Touch value from above LINE_STATE_EQUALS, class=class="str">"cmt">// Equal to value };
「正文」
<span class="keyword">input</span> <span class="keyword">uint</span> InpPeriod = <span class="number">9</span>; <span class="comment">/* Period */</span><span class="comment"></span> <span class="keyword">input</span> <span class="keyword">uint</span> InpPeriodFast = <span class="number">2</span>; <span class="comment">/* Fast EMA Period*/</span><span class="comment"></span> <span class="keyword">input</span> <span class="keyword">uint</span> InpPeriodSlow = <span class="number">30</span>; <span class="comment">/* Slow EMA Period*/</span><span class="comment"></span> <span class="keyword">input</span> <span class="keyword">int</span> InpShift = <span class="number">0</span>; &nbs