从头开始开发智能交易系统(第 10 部分):访问自定义指标·综合运用
🛠️

从头开始开发智能交易系统(第 10 部分):访问自定义指标·综合运用

(3/3)· 多数 EA 卡在读取非标准指标数据,本篇用 VWAP 打通从指标到策略的最后一公里

实战向进阶 第 3/3 篇
直接在 EA 里读自定义指标数值,却连指标是否在图表上都判断不了,是常见硬伤。文件名随便写、指标无计算身份标识,系统根本无从识别。结果就是明明写了调用代码,回测和实盘却拿不到任何数值。

「用 iCustom 把两条均线挂上图表并比对数值」

在 MT5 里加载自定义指标不用手动拖,直接用 iCustom 拿句柄再 ChartIndicatorAdd 就能挂到指定图表。上面这段把名为 Media Movel.EX5 的自定义均线挂上去,红色、周期参数 52、偏移 1,挂完才允许后续取数。 取数阶段用 CopyBuffer 分别拉 handle1、handle2 的 0 号缓冲区,只取最新 1 根(起始 0、count 1),写进 Buff1、Buff2。随即 Print 把两个值用 <<--- >> 隔开打印,方便在专家日志里肉眼看两者差多少。 实盘前建议把 52 周期换成你常用参数,在 EURUSD 或 XAUUSD 的 M5 上跑一次,观察打印值是否随 K 线实时更新。外汇与贵金属杠杆高,指标共振只代表概率倾向,不等于方向确认。

MQL5 / C++
if ((handle2 = iCustom(NULL, PERIOD_CURRENT, "Media Movel.EX5", clrRed, class="num">52, class="num">1)) != INVALID_HANDLE)
      ChartIndicatorAdd(id, class="num">0, handle2);
    };
    if ((handle1 != INVALID_HANDLE) && (handle2 != INVALID_HANDLE))
    {
        i1 = CopyBuffer(handle1, class="num">0, class="num">0, class="num">1, Buff1);
        i2 = CopyBuffer(handle2, class="num">0, class="num">0, class="num">1, Buff2);
        Print(Buff1[class="num">0], "<<--- >>", Buff2[class="num">0]);
    }
}
class=class="str">"cmt">//+------------------------------------------------------------------+

把自定义指标塞进 EA 里跑

前两篇里我们分别落了两个 EA 和两个自定义指标,核心不是堆代码量,而是验证一件事:复杂 EA 完全可以调用你自己的指标逻辑做决策。 如果你手上有自写的贵金属或外汇指标,现在就能在 MT5 里新建 EA,把 iCustom 指向它,让 EA 在 tick 级跑分析。外汇与贵金属杠杆高、滑点跳空频繁,这类自研组合回测时务必把点差和库存费参数写实。 没人规定分析一定要用平台自带指标。把指标和 EA 打通后,你能拿到的盘口视角大概率比裸 K 或单一均线组合更贴合自己的交易假设。

◍ 一点提醒

上面那段 VWAP 片段里,作者原意是先把 Price / Volume 写进缓冲,再把 Volume 归零等待下一根 K 线累加;但社区里 irbisbars 在 2024-02-26 直接点出:若 Volume 为 0 时先做除法,结果就是除以零的无效值。Rashid Umarov 同日回复说,这段代码应在“成交量 != 0 的股票工具”上跑才合理,外汇和贵金属品种成交量口径不同,直接套用可能出脏数据。 真要在 MT5 里验证,把 Examples___VWAP.zip(1.94 KB)解压挂到 EURUSD 这类品种上,对比分时成交量和分时 VWAP 曲线,能看到零成交量时段画出的横线偏离。外汇与贵金属杠杆高、跳空频繁,这类指标误算会放大信号噪声,实盘前务必用小周期回看。 写 VWAP 类指标时,顺序应当是先判 Volume>0 再除,随后清量;别照抄原片段的语句次序。改完编译跑一遍,比读十篇讨论更管用。

MQL5 / C++
VWAP_Buff[c0] = Price / Volume;
class="type">class="kw">ulong                Volume = class="num">0;
把指标探活交给小布盯盘
小布盯盘的 AIGC 已内置品种页指标状态诊断,打开对应页面就能看到自定义指标加载与数值刷新情况,你只需专注策略逻辑本身。

常见问题

常见原因是自定义指标没有在初始化时设置能反映计算用途的唯一标识名,EA 无法判定它是否已加载在图表上,自然读不到缓冲区数据。
标准库不含 VWAP,通常需要自建自定义指标计算并绘图;EA 侧再通过句柄访问其缓冲区,才可能用于交易分析。
系统只认指标内部声明的名称而非文件名,若内部未声明计算用途标识,EA 侧的探活与读取逻辑会失效。
可以,小布盯盘对应品种页会呈现指标加载与数值刷新状态,省去你在 EA 里反复打印句柄调试的时间。
标准指标有固定枚举,自定义指标走 iCustom 并依赖名称与参数匹配,规划不当时代码耦合度会明显升高。