为EA交易提供指标的现成模板(第3部分):趋势指标(基础篇)
📘

为EA交易提供指标的现成模板(第3部分):趋势指标(基础篇)

第 1/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 里就能编译看效果:

MQL5 / C++
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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InpPeriod&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;<span class="number">9</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">/* Period&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</span><span class="comment"></span> <span class="keyword">input</span> <span class="keyword">uint</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InpPeriodFast&nbsp;&nbsp;=&nbsp;&nbsp;<span class="number">2</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">/* Fast EMA Period*/</span><span class="comment"></span> <span class="keyword">input</span> <span class="keyword">uint</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InpPeriodSlow&nbsp;&nbsp;=&nbsp;&nbsp;<span class="number">30</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/* Slow EMA Period*/</span><span class="comment"></span> <span class="keyword">input</span> <span class="keyword">int</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InpShift&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;<span class="number">0</span>;&nbsp;&nbsp;&nbsp;&nbs

常见问题

先从指标类库的骨架入手,把周期和品种参数留空用当前图表默认值,再替换核心计算函数即可跑通。
AMA通过噪声过滤系数动态调整平滑度,在震荡行情中滞后和噪声都比普通MA少,但趋势反转时仍可能慢半拍,属概率优势而非绝对。
小布盯盘可读取品种页的AMA状态并提示噪声水平,你根据它的AIGC诊断决定是否重设平滑系数,不用自己盯面板。
多是品种名带空格或时间帧写错导致iAMA返回空句柄,检查参数拼写并在Init里判空重连即可。
基础篇建议快周期2慢周期30起步,贵金属高风险品种先跑样本外验证,再按波动微调,别直接抄极端值。