物美价廉的神经网络 - 链接 NeuroPro 与 MetaTrader 5(基础篇)
📘

物美价廉的神经网络 - 链接 NeuroPro 与 MetaTrader 5(基础篇)

第 1/3 篇

把 NeuroPro 接进 MT5 的低成本路径

想把现成的神经网络模型搬进 MetaTrader 5 做行情推理,不一定非要自己写整套训练框架。NeuroPro 这类桌面级神经工具链,配合 MT5 的 DLL 调用机制,就能以极低的工程成本跑通「外部模型 + 终端执行」的闭环。 这套接法的核心在进程边界:MT5 负责报价、下单与指标展示,NeuroPro 侧承担特征训练与前向计算,两边通过文件或 DLL 交换向量。2015 年 6 月那篇社区贴实测过该思路,原帖拿到 6177 次查看与 81 条讨论,说明轻量神经方案在零售交易者里一直有真实需求。 外汇与贵金属杠杆高、滑点随机,外挂模型给出的信号只代表概率倾向,实盘前务必在策略测试器用历史数据回放一遍。先确认 MT5 的 DLL 导入开关已打开,再谈具体联调。

「老牌俄系神经网络工具 NeuroPro 的实战定位」

NeuroPro 的核心程序由一家俄国研究院在 1998 年写成,到今天对交易者仍有参考价值。它能在 Windows XP、Vista、Win7 上稳定运行,但作者未在新版 Windows 上测过兼容性,这点自己装机验证最靠谱。 版本 0.25 免费且散落在不少站点,它支持建立带 S 形曲线激活函数的多层神经网络——新手入门够用,不必追复杂结构。要注意它的界面全是俄语,没有汉化或英化版本。 它的训练逻辑很适合交易验证:用一组数据训练网络,换另一组测试,能快速看出网络是不是过拟合,以及离开历史样本后(比如实盘)还能不能稳住。外汇和贵金属波动剧烈、杠杆高风险大,这种泛化测试不是可选项而是必做的。 从交易者视角看,NeuroPro 唯一硬伤是没法和 MetaTrader 5 直接打通。本文后续就是解决这事:把 MT5 的行情和指标数据喂给 NeuroPro,再把训好的网络转成 MQL5 的 EA。 顺带一提,它导出的网络权重能整段转成 MQL5 脚本,不依赖外部 DLL,所以跑起来快、占资源少。这点比多数神经网络工具有优势,拿来写剥头皮 EA 也扛得住即时决策。

◍ 用 EURUSD H1 搭一个教学型方向预测 EA

本篇不碰剥头皮。剥头皮 EA 的构建、训练与回测有一整套特殊流程,不在本次讨论范围,避免把教学主线带偏。 我们直接落一个简单 EA:标的锁 EURUSD,周期取 H1。逻辑很朴素——每次只扫描最近 24 根 H1 柱线,也就是约一整天的市场轨迹,据此推断接下来几个小时的价格倾向方向,再下单。 外汇与贵金属属高杠杆品种,这类基于历史窗口的方向推断只代表概率倾向,实盘前务必在 MT5 策略测试器用历史数据跑一遍验证。

把 MT5 行情搬进 NeuroPro 的实操链路

NeuroPro 只认 DBMS 和 DBF 两种老式数据表,实战里最省事的是 DBF——FoxPro/dBase 那套。整条链路就三步:先让 MT5 脚本吐出 CSV,再用工具转成 DBF,最后在 NeuroPro 里直接打开。 写导出脚本时有几个坑必须记牢。DBF 字段名最长 11 字符,多数转换器会截到 10 个,所以命名别超 10 字符;本文样例用 24 根历史柱做输入,字段写成 Bar___0__ 到 Bar___24__(三个下划线加序号加两个下划线),等后面写 EA 你会懂这种写法方便对齐。 下面这段 MQL5 脚本是现成的导出骨架,默认跳过 0 根、抓 5000 根柱,输入长度锁死 24。跑完会在 EA 日志留成功消息,生成的 CSV 首行是字段名,之后每行是日期加 25 个逗号分隔的浮点值——比如 2014.09.25 那行从 -0.0008 一路到 0.0113,就是归一化后的逐根涨跌。 [CODE] 逐行拆解: #property script_show_inputs —— 允许脚本在运行前弹参数框 input string Export_FileName="NeuroPro\\data.csv"; —— 文件落点在 MQL5/Files/NeuroPro 下 input int Export_Bars_Skip=0; —— 头部跳过的柱数,默认不跳 input int Export_Bars=5000; —— 总共导出的柱线量 const int inputlen=24; —— 喂给神经网络的过去柱线数 void OnStart() —— 脚本主入口 int file=FileOpen(...,FILE_CSV,','); —— 以逗号分隔的 ANSI 编码 CSV 写模式开文件 if(file!=INVALID_HANDLE) —— 句柄有效才继续 string row="date"; —— 表头先写 date for(int i=0;i<=inputlen;i++) —— 循环拼 Bar___i__ 字段名,i 从 0 到 24 共 25 列 注释里提醒:DBF 字段截断至 10 字符、最大字段数看版本,EA 里用 [] 替下划线 CSV 转 DBF 路子很多:老版 Excel(2007 前)能直接存 DBF,但最多 65535 行,装下 10 年 H1 够用;Access 走导入导出也行;最干净的是 OpenOffice Calc——免费且和 NeuroPro 调性一致。 Calc 打开 CSV 会弹识别向导,关键两项:分隔符选逗号,小数分隔符必须和文件一致(样例用圆点,选英语区域即可)。数字列全选绿,设好类型和精度,再「文件>保存为>dBase(*.dbf)」,弹窗一律保当前格式,编码随意因为没文本列。出来的 DBF 就能直接喂神经网络了。

MQL5 / C++
class="macro">#class="kw">property script_show_inputs
class=class="str">"cmt">//+------------------------------------------------------------------+
class="kw">input class="type">class="kw">string    Export_FileName  = "NeuroPro\\data.csv"; class=class="str">"cmt">// EA 文件 (在 "MQL5/Files" 文件夹)
class="kw">input class="type">int       Export_Bars_Skip = class="num">0;                   class=class="str">"cmt">// EA 之前要跳过的历史柱线数量
class="kw">input class="type">int       Export_Bars      = class="num">5000;                 class=class="str">"cmt">// EA 的柱线数
class=class="str">"cmt">//+------------------------------------------------------------------+
class="kw">const class="type">int inputlen=class="num">24;   class=class="str">"cmt">// 交易策略分析的过去柱线数量
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void OnStart()
  {
   class=class="str">"cmt">//--- 创建文件
   class="type">int file=FileOpen(Export_FileName,FILE_WRITE|FILE_CSV|FILE_ANSI,&class="macro">#x27;,&class="macro">#x27;);
   if(file!=INVALID_HANDLE)
     {
      class=class="str">"cmt">//--- 写数据头部
      class="type">class="kw">string row="date";
      for(class="type">int i=class="num">0; i<=inputlen; i++)
        {
         if(StringLen(row)) row+=",";
         class=class="str">"cmt">//========================================================
         class=class="str">"cmt">// 注意!
         class=class="str">"cmt">// 在 EA 里用 [] 替代下划线
         class=class="str">"cmt">// DBase 格式的字段名不能超过 class="num">11 个字符。截断至 class="num">10。
         class=class="str">"cmt">// DBase 格式的最大字段数量是 class="num">128-class="num">512, 依据版本。
         class=class="str">"cmt">//========================================================

「把K线收价差写成CSV的归一化导出」

这段逻辑干的事很直接:把最近若干根K线的收盘价差,按相对前一根收盘价的偏移量,逐行写进一个CSV文件,方便后续拿去跑特征工程或喂给小布的分析模块。 核心在双重循环。外层按 Export_Bars 控制导出行数,内层按 inputlen 控制每根bar向后取多少根做差分。zlevel 取 rates[bar+1].close 作为零级基准,意味着第0根的相对值恒为0,后面每根都减它。 CopyRates 调用时从 1+Export_Bars_Skip 开始、取 Export_Bars+inputlen 根,若返回数量不足就直接打印错误并 return,避免写到半截文件残缺。ArraySetAsSeries(rates,true) 让索引0对应最新bar,和循环里的 bar+i 偏移方向要对得上,否则差分会串号。 外汇与贵金属市场杠杆高、滑点跳空频繁,导出的差分序列仅反映历史切片,实盘重构时可能因点差和节假日缺失而偏移,开MT5把这段塞进EA的OnStart里跑一遍,核对输出行数是否等于 Export_Bars 再谈下一步。

MQL5 / C++
      StringConcatenate(row,row,"Bar___",i,"__");
      }
      FileWrite(file,row);
      class=class="str">"cmt">//--- 从历史中复制所需数据
      class="type">MqlRates rates[],rate;
      class="type">int count=Export_Bars+inputlen;
      if(CopyRates(Symbol(),Period(),class="num">1+Export_Bars_Skip,count,rates)<count)
      {
       Print("Error!Insufficient historical data for exporting required data.");
       class="kw">return;
      }
      ArraySetAsSeries(rates,true);
      class=class="str">"cmt">//--- 写数据      
      for(class="type">int bar=class="num">0; bar<Export_Bars; bar++)
      {
       row="";
         class=class="str">"cmt">//--- 第一根柱线的收盘价格将作为其它柱线归一化的零级
       class="type">class="kw">double zlevel=rates[bar+class="num">1].close;
       for(class="type">int i=class="num">0; i<=inputlen; i++)
         {
          if(StringLen(row)) row+=",";
          rate=rates[bar+i];
          if(i==class="num">0) row+=TimeToString(rate.time,TIME_DATE || TIME_MINUTES)+",";
          row+=DoubleToString(rate.close-zlevel,Digits());
         }
       FileWrite(file,row);
      }
      FileClose(file);
      Print("Data class="kw">export successfully completed.");
   }
   else Print("Error!Failed to create a file for data class="kw">export. ",GetLastError());
}

◍ 把建好的网络丢进 MetaTrader 前先练一轮

在 NeuroPro 里搭网络不算难:文件菜单建空项目,项目窗口点“打开数据文件”载入 DBF,再点“新网络”。输入输出端先把 Bar___0__ 设成输出神经元,其余 Bar___N__ 当输入,外汇场景里输出精度直接给 1 点(0.0001)就够了。 网络结构栏里放三层隐藏层、每层 20 个神经元,点创建就能看到新网络进项目树。先跑一遍“神经网络 > 测试”看裸网表现:未经训练时,按 1 点容差算,预测达标率不到 5%,平均误差在 10 点上下,基本等于瞎猜。 再走“神经网络 > 训练”等进度条走完,回测同样口径:达标率升到 16%,平均误差降到 4 点。外汇和贵金属杠杆高、滑点狠,这种精度只是概率层面的改善,不是信号保真。练完这一步,才谈得上把网络导去 MetaTrader 跑实盘验证。

常见问题

可以用老牌俄系工具 NeuroPro,走低成本链路把行情导出再接回交易端,教学型方向预测EA用EURUSD H1就能跑通。
先把K线收价差写成CSV做归一化导出,搬进NeuroPro建网络练一轮,再把模型接回MT5挂EA即可。
小布可替你跑这套导出与归一化链路,把重复劳动交给它,你专注调网络和看盘决策。
不归一化不同量纲会误导网络训练,预测倾向失真;收价差缩放后再进NeuroPro才稳。
教学场景建议先在NeuroPro离线练一轮看误差曲线,概率上误差不收敛就别急着接回交易端。