利用 MQL5 向导和 Hlaiman EA 生成器创建神经网络 EA(基础篇)
用向导和 Hlaiman 套件搭一个神经网络 EA
MT5 自带的 MQL5 向导能省掉大量样板代码,配合第三方 Hlaiman EA 生成器,可以把神经网络模型直接编译进 EA 框架。2014 年 3 月社区里有一篇阅读量 1 万出头的实操文,验证了这条路径在当时的 build 环境可跑通。 对老手来说,重点不是「自动生成」本身,而是生成后的网络层数、输入特征怎么接行情缓存。外汇与贵金属杠杆高,这类模型过拟合风险极大,任何信号都只是概率倾向。 开 MT5 后从「文件 → 新建 → EA 交易(生成器)」进向导,选 Hlaiman 模板,先确认你的终端版本支持外部 DLL 调用,否则网络推理会直接编译失败。
◍ 神经网络不是只有博士才玩得转
不少做外汇、贵金属的人一听到神经网络就觉得是黑盒,只知道它能认形态、做联想学习、跑自动交易,但真上手总觉得门槛高得离谱。市面上很多资料还在反复强调:不花大量时间啃理论就别碰,这其实把人吓退了。 本文想直接推翻这种论调。借助高级自动化工具,搭一个能跑的神经网络 EA 可能比画一根均线、读一个 MACD 金叉简单。积累你自己的神经网络经验,概率上比传统技术分析更快见效,当然外汇和贵金属本身高风险,模型失效也正常。 具体路子是用 MQL5 向导加 Hlaiman EA 生成器,自动产出一个 MT5 神经网络 EA。MQL5 向导是目前生成 MQL5 代码最快的机制之一,能用附加模块细调逻辑;Hlaiman 则是神经网络引擎,支持把对象直接写进 EA 代码里。 顺带说个命名细节:这类程序刻意冠以“EA”前缀,是因为神经网络的识别与学习属性占主导,和那些挂羊头卖狗肉、用 EA 名却无智能内核的工具有本质区别。
「把神经网络压成黑盒子来认形态」
本文不铺神经网络的理论、分类和金融调查数据,那些东西别的资料里到处都是。我们只把神经网络当成一个黑盒子:它靠识别图形价格形态,带点联想思维,去预测哪里该入市。对应的形态定义也砍到最薄——就是某交易工具图表上、可盈利变动之前的一串连续 K 线柱。 落地工具这边,MQL5 向导和 MT5 本身不用多介绍;重点是个第三方东西叫 Hlaiman EA 生成器,它本质是个带多文档界面和插件机制的 Windows GUI 程序(壳子是 hlaim.exe),里面集成了一个神经网络引擎。它和 MQL5 打通靠的是“对象 Pascal”脚本解释器,源码通过命名管道传,主网络组件用多层感知器(MLP)。 具体接法是用 SignalHNN.mqh 这个信号库模块把生成器和 MQL5 向导焊在一起。自动生成完 EA 之后,你能训练它跑任意数量金融工具和任意时间框架。图表上的信号箭头,可以手动画,也可以用 TeachHNN.mq5 脚本自动铺并顺带启动训练。外汇和贵金属波动大、杠杆高,跑这套之前先想清楚爆仓风险。 理论就到此为止。后面进实践,分操作原则和实现两部分;实现那块主要写给开发人员看,不想碰代码的交易者跳过也不影响你生成神经网络 EA 并估它的交易表现。
用 Hlaiman 生成器跑通第一个神经网络 EA
在 MT5 里做神经网络 EA,前提是你已经装好 MetaTrader 5 终端和 Hlaiman EA 生成器的试用版。没终端先下载安装,否则后面向导里根本调不出生成器模块。 打开 MT5 后进 MetaEditor,按 Ctrl+N 或走 File→New 拉起 MQL5 向导。选 Expert Advisor (generate) 一路 Next,EA 路径名建议填 Experts\SampleHNN,到信号模块那步点 Add,下拉里挑 Signals of patterns Hlaiman Neural Network EA generator 确定。其余向导步骤无特殊需求可全跳过,编译完关掉 MetaEditor,Navigator 的 Expert Advisors 下就能看到新 EA。 训练前先在终端开一个目标品种图表并挂好时间框架,同时启动 Hlaiman 应用程序。从 Navigator→Scripts 里调 TeachHNN 脚本拖到图表上,重点核对参数:Neural layers(层数)、Middle neurons(每层神经元)、Teaching epochs(训练代数)、Pattern bars(形态包含柱数)。例如默认跑完常看到日志 'Neural net create success! On 431 patterns',说明用了 431 个形态完成训练。 两个典型报错要提前规避:Hlaiman 主程序没开,日志会报 CSignalHNN::InitHNN:Error! initializing pipe server;SignalsCreate 设 false 时箭头不画会报 OnStart:error, orders arrow not found!,设 true 但图表混了别的物体也会出错,所以自动生成信号建议单图表独占。 训练完进策略测试器选 SampleHNN、品种 EURUSD、周期 H4,外部参数可不动。有一份默认参数回测样本:训练区间 2010.01.01–2013.07.01,EURUSD H4,报告可直接看训练信号在样本外的表现。外汇与贵金属杠杆高,神经网络历史拟合不等于未来概率占优,上实盘前先用策略测试器自跑一遍。
◍ SampleHNN 在 EURUSD H4 的回测账本
把 SampleHNN 丢进 MT5 策略测试器,跑 EURUSD 的 H4 周期,区间取 2010.01.01 到 2013.07.12,初始本金 10,000 USD,历史质量标到 100%,一共啃了 5497 根柱。 净落下 9,159.58 USD,毛利 29,735.97、净损 -20,576.39,获利系数 1.45,回收系数 12.81——这组合说明盈利单的覆盖力还行,但回撤回收极快,曲线不拖泥带水。 总交易 1417 笔,短线 703 笔里 56.61% 获利,长线 714 笔里 55.32% 获利;整体盈利交易占 55.96%。最大单笔盈利 53.00、最大单笔亏损 -53.30,平均盈利 37.50、平均亏损 -32.97,多空两边被压得比较对称。 夏普比率只有 0.16,LR 相关性 0.98 但标准误差 595.06,Z 账户 -1.24(78.50%)——样本分布偏离正态,外汇品种这种跳点环境里别把正态假设当圣经。杠杆显示 0.111… 实为测试器旧字段映射,实盘 EURUSD 用 100:1 以上杠杆时,市值亏损峰值 715.08(4.00%)就可能触发强平预警,贵金属更甚,高风险先刻进脑里。 最大连续盈利 9 笔合 450.38,最大连续亏损 9 笔合 -234.00,平均连续都是 2 笔——连赢连亏都不长,参数若往过滤信号方向调,先看连续亏损段会不会破你的本金容忍线。
「CSignalHNN 的两种运行模式与阈值接口」
把 Hlaiman 神经网络接进 MT5 专家信号,核心就是 SignalHNN.mqh 里的 CSignalHNN 类,它从 CExpertSignal 继承,封装了管道通信、数据文件路径和训练/计算所需字段。实例化后靠 InitHNN 的布尔参数 openn 切模式:openn=true 走指标模式,负责找本地与共用文件夹里的神经网络数据文件并加载运行,是 EA 实盘用的;openn=false 走训练模式,留给训练脚本采形态、跑训练。 InitHNN 第一步先连 Hlaiman 的命名管道,hlaim.exe 没开就直接负状态退出;连上才在终端目录搜文件名,再把 ObjectPascal 源码拼成字符串用 '\n\r' 拆行,通过管道丢给插件树执行。返回的 Result 是输入向量元素数,拿来初始化形态数组。 类里 CalculateHNN 在指标模式回传 double 型信号:买区 0..1,卖区 0..-1,Direction 方法在新柱重算并给百分比。训练侧靠 AddPattern 采形态、TeachHNN 触发训练,后者置 'Teached' 标志,计算开始则看 'Computed' 标志。 开仓平仓的响应阈值直接曝成外部变量,默认都是 10(取值 0~100)。信号质量取决于训练误差动态下降的幅度,那个能在插件指标里肉眼看。外汇和贵金属波动剧烈,神经网络信号仅代表概率倾向,实盘前务必在策略测试器跑样本外验证。 input int Signal_ThresholdOpen =10; // 开仓信号阈值[0...100] input int Signal_ThresholdClose=10; // 平仓信号阈值[0...100]
class CSignalHNN :class="kw">public CExpertSignal { class="kw">protected: class=class="str">"cmt">//--- variables class="type">int m_hnn; class=class="str">"cmt">// handle of HNN connect class="type">class="kw">string hnn_path; class=class="str">"cmt">// MT5 Terminal data path class="type">class="kw">string hnn_fil; class=class="str">"cmt">// HNN file w neural net class="type">class="kw">string hnn_nam; class=class="str">"cmt">// Expert name class="type">class="kw">string hnn_sym; class=class="str">"cmt">// Symbol name class="type">class="kw">string hnn_per; class=class="str">"cmt">// Period name ENUM_TIMEFRAMES hnn_period; class=class="str">"cmt">// Period timeframe class="type">int hnn_index; class=class="str">"cmt">// Index ext multinet class="type">int hnn_bar; class=class="str">"cmt">// index of last bar class="type">int hnn_in; class=class="str">"cmt">// input layer class="type">int hnn_out; class=class="str">"cmt">// output layer