NeuroPro接MT5:免费神经网络造EA
从数据导出到MQL5代码转换的完整实操指南
NeuroPro是什么:老牌免费神经网络工具
NeuroPro由一家俄国研究院早在1998年编写,虽界面仅有俄语,但至今在Windows XP到Windows 7环境仍具实用价值。其0.25版本免费且易获取,核心能力是创建带S形曲线激活函数的多层神经网络。对刚入门神经网络的交易者,这已足够理解基本概念,无需更复杂功能。
从交易者视角看,NeuroPro的最大短板是与MetaTrader 5无原生集成。本文目标正是打通这一隔阂:把MT5的市场和指标数据送入NeuroPro训练,再将网络权重转为MQL5的EA。不同于需调用DLL的神经网络程序,NeuroPro可将全部神经元权重导出为文本公式,从而编译为高速、低资源占用的纯MQL5代码,这是其明显优势,甚至可支撑剥头皮EA的即时决策。
教学策略设定:EURUSD小时线预测
为降低复杂度,本文不谈剥头皮,而构建简单EA:标的EURUSD、周期H1。EA分析最近24根柱线(即上一日行情),预测随后数小时价格方向并下单。这种设定便于理解数据准备、训练与转换全流程,真实盈利需自行深化。
策略本质是用历史归一化收盘价序列作为网络输入,输出为未来价格偏移。训练与测试须用相同时间帧,文中网络学习约10个月H1数据。EA内置过滤器,当预期盈利低于点差不入场,输入参数MinPrognosis设0.0005。
从MT5导出数据:CSV到DBF的必经路
NeuroPro仅读DBMS(Paradox)与DBF(dBase/FoxPro)格式。我们选用最常见的DBF。完整链路为:MT5脚本导出逗号分隔CSV → 专用工具转DBF → NeuroPro打开。字段名不能超过10字符(部分转换器截为10),故用Bar___N__命名,三重下划线便于后期批量替换成数组括号。
下方脚本从MT5历史复制rates,以首根柱收盘价为基准做归一化,写出含date与Bar___0__至Bar___24__的CSV。注意DBF字段上限128-512,本例25列安全。运行后EA日志提示成功即生成文件。
#property script_show_inputs
//+------------------------------------------------------------------+
input string Export_FileName = "NeuroPro\\data.csv"; // EA 文件 (在 "MQL5/Files" 文件夹)
input int Export_Bars_Skip = 0; // EA 之前要跳过的历史柱线数量
input int Export_Bars = 5000; // EA 的柱线数
//+------------------------------------------------------------------+
const int inputlen=24; // 交易策略分析的过去柱线数量
//+------------------------------------------------------------------+
void OnStart()
{
int file=FileOpen(Export_FileName,FILE_WRITE|FILE_CSV|FILE_ANSI,',');
if(file!=INVALID_HANDLE)
{
string row="date";
for(int i=0; i<=inputlen; i++)
{
if(StringLen(row)) row+=",";
StringConcatenate(row,row,"Bar___",i,"__");
}
FileWrite(file,row);
MqlRates rates[],rate;
int count=Export_Bars+inputlen;
if(CopyRates(Symbol(),Period(),1+Export_Bars_Skip,count,rates)<count)
{
Print("Error!Insufficient historical data for exporting required data.");
return;
}
ArraySetAsSeries(rates,true);
for(int bar=0; bar<Export_Bars; bar++)
{
row="";
double zlevel=rates[bar+1].close;
for(int i=0; i<=inputlen; i++)
{
if(StringLen(row)) row+=',';
rate=rates[bar+i];
if(i==0) row+=TimeToString(rate.time,TIME_DATE || TIME_MINUTES)+",";
row+=DoubleToString(rate.close-zlevel,Digits());
}
FileWrite(file,row);
}
FileClose(file);
Print("Data export successfully completed.");
}
else Print("Error!Failed to create a file for data export. ",GetLastError());
}
CSV转DBF有多种方案:老版Excel(2007前)可存DBF但限65535行;新Excel需插件;Access可导入导出;付费转换器;或免费OpenOffice Calc。作者荐Calc,理念与免费NeuroPro契合。操作:开Calc导入CSV,设逗号分隔、英文语言使小数点被识别;选数字列设精度;另存为dBase(*.dbf),忽略格式警告,编码随意因为无文本列。
NeuroPro建网与训练实操
启动NeuroPro建空项目,打开DBF。点新网络:输入/输出栏设Bar___0__为输出神经元(精度外汇1点0.0001),其余Bar___N__为输入。网络结构栏设3隐藏层各20神经元,点创建。未经训练网络预测精度低于5%、误差约10点。
进入神经网络→训练,等待进度结束。再测试:训练后准确率达16%、平均误差4点,说明已学到规律。此时可导出。需强调:训练集盈利不保证样本外盈利,真正稳健需深厚交易与神经网络知识。
网络公式转MQL5的关键步骤
NeuroPro独特处是以文本公式表达网络(菜单神经网络→语言表达),含每层每神经元权重。我们半自动改写到MQL5语法:用记事本批量替换___为[、--为- -(避双减号编译错)、Sigmoid/ Syndrom保留或转拉丁。因字段名Bar___N__,替换后成BAR[N]数组,极利声明。
具体替换表:三重下划线→[与];双下划线无关;两个减号加空格;函数名Sigmoid保原;变量Syndrom改Syndrome。接着把枚举BAR[1]..BAR[24]输入改为数组声明double BAR[25]; 激活函数写MQL5版;所有公式末加分号,中间层神经元名前加double(批量替换)。
double BAR [25];
double Sigmoid1 (double A)
{
return A/(0.1 + MathAbs(A));
}
double Sigmoid2 (double A)
{
return A/(0.1 + MathAbs(A));
}
double Sigmoid3 (double A)
{
return A/(0.1 + MathAbs(A));
}
NeuroPro两处缺陷须手工修:其一,若输入常量(如Bar___1__恒为0参考点)公式含除零(BAR[1]=(BAR[1]-0)/0;),要改为BAR[1]=0;;其二,末公式多右括号,编译器不报但打乱大括号,须删。常练后整转换仅数分钟,编译报错再溯。
BAR[1]=(BAR[1]-0)/0;
BAR[1]=0;
BAR[0]=((BAR[0]*0.0180000001564622)+0.000599999912083149)/2);
BAR[0]=((BAR[0]*0.0180000001564622)+0.000599999912083149)/2;
组装可运行EA与回测验证
将转好的公式粘入MetaEditor,补EA框架:输入参数Lots=0.1、MinPrognosis=0;CopyRates取24+1柱,首柱收盘为zlevel,填BAR[0..24];调NeuroPro归一化常数;算Syndrome隐藏层;输出预测。文末附完整neuropro.mq5。测试同周期H1,结果净值持续增长,证明流程正确。
input double Lots = 0.1; // 交易量
input double MinPrognosis = 0; // 预测比当下更有利可图开单
const int inputlen=24;
double Sigmoid1(double A){return A/(0.1 + MathAbs(A));}
double Sigmoid2(double A){return A/(0.1 + MathAbs(A));}
double Sigmoid3(double A){return A/(0.1 + MathAbs(A));}
double CalcNeuroNet()
{
MqlRates rates[],rate;
CopyRates(Symbol(),Period(),0,inputlen+1,rates);
ArraySetAsSeries(rates,true);
double BAR[512];
double zlevel=rates[1].close;
for(int bar=0; bar<=inputlen; bar++)
{rate=rates[bar]; BAR[bar]=rate.close-zlevel;}
BAR[1]=0;//(BAR[1]-0)/0;
BAR[2]=(BAR[2]- -0.0003)/0.009;
BAR[3]=(BAR[3]-4.999992E-5)/0.01045;
BAR[4]=(BAR[4]-0.0011)/0.011;
double Syndrome1_1=Sigmoid1( 0.07165167*BAR[1]-0.08914512*BAR[2]+0.160242*BAR[3]-0.1136391*BAR[4]+0.01358515*BAR[5]+0.3755009*BAR[6]-0.1433693*BAR[7]+0.224411*BAR[8]+0.03298632*BAR[9]-0.2551045*BAR[10]-0.1418581*BAR[11]+0.007130164*BAR[12]-0.08727393*BAR[13]-0.2567087*BAR[14]+0.1118081*BAR[15]+0.73848*BAR[16]+0.05880548*BAR[17]-0.1544689*BAR[18]+0.192913*BAR[19]-0.1743894*BAR[20]-0.2184512*BAR[21]-0.2290305*BAR[22]+0.3946579*BAR[23]-0.02947071*BAR[24]-0.08091708 );
return Syndrome1_1;
}
与其他神经网络方案对比及局限
相比Python/TensorFlow,NeuroPro免编程、界面直观、公式直出可转MQL5,无DLL依赖;但缺中文、停更、仅Win旧版稳。相较商业神经网络软件,它免费且导出透明。局限:市场近似随机,社区实测多年训练仍近50%故障率,单货币或多货币通用模型样本外均失效,故仅作技术桥梁,实盘需自研过滤与验证。
另有用户释出脚本自动完成90%口述转码日常,见 https://www.mql5.com/zh/code/69583 。原文与附加ZIP(NeuroPro_allOS.zip等)地址 https://www.mql5.com/zh/articles/830 。本文译自俄文,反映作者个人观点,平台不对准确性负责。