物美价廉的神经网络 - 链接 NeuroPro 与 MetaTrader 5(基础篇)
把 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 就能直接喂神经网络了。
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 再谈下一步。
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 跑实盘验证。