NeuroPro接MT5:免费神经网络造EA
🧠

NeuroPro接MT5:免费神经网络造EA

从数据导出到MQL5代码转换的完整实操指南

MQL5 编程 难度 · 进阶 2026-03-05 7 分钟阅读
#NeuroPro#神经网络#MQL5#MT5EA#数据导出

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),忽略格式警告,编码随意因为无文本列。

⚠ 区域设置坑
系统区域小数点为逗号会导致Calc读错数字,务必在向导选英语变体或提前在Calc选项设默认语言。

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;
  }
⚠ 数组越界
社区反馈测试报array out of range,多因BAR[bar]=rate.close-zlevel中bar索引或rates长度不足,需保证CopyRates返回inputlen+1根且ArraySetAsSeries正确。

与其他神经网络方案对比及局限

相比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 。本文译自俄文,反映作者个人观点,平台不对准确性负责。

常见问题

在NeuroPro菜单神经网络→语言表达保存公式文本,用记事本批量替换___为数组括号、双减号为减号加空格,把输入枚举改为double BAR[25]声明,激活函数写MQL5版,修正除零与多余右括号,最后粘进MetaEditor补EA框架编译。
用OpenOffice Calc:打开CSV设逗号分隔、英语语言识别小数点,数字列设精度,文件→另存为选dBase(*.dbf),确认保留格式即可,官网 http://www.openoffice.org/ 下载。
因DBF字段名不超10字符,且后期转MQL5时把___批量替换为[和]可直接成BAR[N]数组,比独立变量易声明和填充价格序列,省去手动改24个名字。
检查CopyRates(Symbol(),Period(),0,inputlen+1,rates)是否取足25根,ArraySetAsSeries(rates,true)后BAR[bar]=rate.close-zlevel索引不超界,以及zlevel用rates[1].close存在,必要时扩BAR数组大小。
不能。社区实测即使20年训练或多货币一年历史,样本外预测仍近50%故障率。它仅示技术流程,真盈利需深厚交易经验、网络原理及样本外验证与过滤。