神经网络实验(第 2 部分):智能神经网络优化·综合运用
🧠

神经网络实验(第 2 部分):智能神经网络优化·综合运用

(3/3)·从 4-4-3 小网络到六套 EA 实测,把十万次无效验算压成可读的优化结果

案例拆解 第 3/3 篇

接上篇,我们继续深挖如何把神经网络真正跑在 MetaTrader 5 里而不依赖第三方软件。前面铺垫了几何直觉和简单感知器,这一篇直接面对优化器算不动、参数记不住的工程现实。如果你也卡在策略测试器只跑了一万次验算就放弃,那下面的做法值得对照。

万次验算后的缓存清理动作

实盘前先在策略测试器跑一轮优化:样本取 EURUSD 的 H1 周期、开盘价撮合,时间窗 2018.07.12–2021.07.12,每种参数组合跑满 10,000 次验算。对比组覆盖 Angle EA 的 4-4-3 与 4-4-4-3、图例 EA 的同结构两组,以及函数库作者原版 Original EA 的 4-4-3 和 4-4-4-3,全部用复杂判则最大值模式。 跑完这 10,000 次不是结束。继续把优选参数写回文件之前,务必先存好策略测试器的优化报告和相关验算参数,否则后面复跑会丢了对照基准。 MT5 有个坑:终端历史若不清,测试器会直接调出旧优化结果,让你以为新参数已生效。我习惯用一段 .bat 脚本硬清 cache 与 logs 目录,省得手动点。 del C:\Users\Your Username\AppData\Roaming\MetaQuotes\Terminal\36A64B8C79A6163D85E6173B54096685\Tester\cache\*.* /q /f /s for /d %%i in (C:\Users\ Your Username \AppData\Roaming\MetaQuotes\Terminal\36A64B8C79A6163D85E6173B54096685\Tester\cache\*) do rd /s /q "%%i" del C:\Users\ Your Username \AppData\Roaming\MetaQuotes\Terminal\36A64B8C79A6163D85E6173B54096685\Tester\logs\*.* /q /f /s for /d %%i in (C:\Users\ Your Username \AppData\Roaming\MetaQuotes\Terminal\36A64B8C79A6163D85E6173B54096685\Tester\logs\*) do rd /s /q "%%i" 脚本里 (Your Username) 和那串终端 ID 是你本机路径,拿自己电脑实际值替换,记事本就能改。外汇与贵金属杠杆高,优化结果仅代表历史样本表现,未来走势可能偏离。

MQL5 / C++
del C:\Users\Your Username\AppData\Roaming\MetaQuotes\Terminal\36A64B8C79A6163D85E6173B54096685\Tester\cache\*.* /q /f /s
for /d %%i in(C:\Users\ Your Username \AppData\Roaming\MetaQuotes\Terminal\36A64B8C79A6163D85E6173B54096685\Tester\cache\*) do rd /s /q "%%i"
del C:\Users\ Your Username \AppData\Roaming\MetaQuotes\Terminal\36A64B8C79A6163D85E6173B54096685\Tester\logs\*.* /q /f /s
for /d %%i in(C:\Users\ Your Username \AppData\Roaming\MetaQuotes\Terminal\36A64B8C79A6163D85E6173B54096685\Tester\logs\*) do rd /s /q "%%i"

「把优化开关关掉后怎么验参数」

在 MT5 里回看优化结果,第一步是把 EA 的 Optimization 开关拨到 false,然后在验算参数里填想要的 Pass 索引——双击优化报告里那一行就能直接带进来,不用手敲。 关掉优化后,EA 会去读之前落盘的权重文件。代码逻辑是拿文件第一列和 Passages 参数比对,命中了就把后面读到的权重和偏差写进 weight[] 数组,相当于把某一次优化结果固化下来做单独回测。 前向验证我跑的是 2021.07.12 到 2022.07.12,H1 周期、固定 0.01 手、初始 1 万美金的真实跳价环境。筛选判则只认两条:盈利因子尽量大,且交易次数过 100。Angle EA 的 4-4-3 和 4-4-4-3 结构,表现明显好于同结构的图例 EA 和原作者原始策略,倾向是因为它用了非标准市场分析角度。 整套优化基于 3 年数据、2 核并行,耗时约 20 分钟。外汇与贵金属属高风险品种,这类神经网回测优不等于实盘稳,算力消耗也大,完整训练还得更深。 留的几个坑:优化区间要拉更长、验算数量得加、前进策略没定死,还有能不能边优化边交易、换时间帧、多网拼装——这些后续都得啃。

MQL5 / C++
if (FileIsExist(OptimizationFileName)==false){
class="type">int id = class="num">0;
class="type">int i = class="num">0;
class="type">class="kw">string f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,f25,f26,f27,f28,f29,f30,f31,f32,f33,f34,f35,f36;
class="type">int handle = FileOpen(OptimizationFileName,FILE_WRITE|FILE_READ|FILE_CSV|FILE_COMMON|FILE_ANSI, ";");
  if(handle!=INVALID_HANDLE)
   {Print("Loading optimization file.");

  class="kw">while(!FileIsEnding(handle) && !IsStopped())
   {
   f1=FileReadString(handle);
   f2=FileReadString(handle);
   f3=FileReadString(handle);
   f4=FileReadString(handle);
   f5=FileReadString(handle);
   f6=FileReadString(handle);
   f7=FileReadString(handle);
   f8=FileReadString(handle);
   f9=FileReadString(handle);
   f10=FileReadString(handle);
   f11=FileReadString(handle);
   f12=FileReadString(handle);
   f13=FileReadString(handle);
   f14=FileReadString(handle);
   f15=FileReadString(handle);
   f16=FileReadString(handle);
   f17=FileReadString(handle);
   f18=FileReadString(handle);
   f19=FileReadString(handle);
   f20=FileReadString(handle);
   f21=FileReadString(handle);
   f22=FileReadString(handle);
   f23=FileReadString(handle);
   f24=FileReadString(handle);
   f25=FileReadString(handle);
   f26=FileReadString(handle);
   f27=FileReadString(handle);
   f28=FileReadString(handle);
   f29=FileReadString(handle);
   f30=FileReadString(handle);
   f31=FileReadString(handle);
   f32=FileReadString(handle);
   f33=FileReadString(handle);
   f34=FileReadString(handle);
   f35=FileReadString(handle);
   f36=FileReadString(handle);
   if (StringToInteger(f1)==Passages){
   weight[class="num">0]=StringToDouble(f2);
   Print(weight[class="num">0]);
   weight[class="num">1]=StringToDouble(f3);
   Print(weight[class="num">1]);
   weight[class="num">2]=StringToDouble(f4);
   Print(weight[class="num">2]);
   weight[class="num">3]=StringToDouble(f5);
   weight[class="num">4]=StringToDouble(f6);
   weight[class="num">5]=StringToDouble(f7);

◍ 权重数组落地与文件收尾

这段逻辑处在 EA 初始化阶段,负责把外部优化文件里的字符串字段逐行转成 double 写进 weight[]。索引从 6 到 34 共 29 个槽位,分别映射 f8 到 f36 的变量名,说明前面至少已经处理了 f1–f7 的基础参数。 StringToDouble 在这里是核心转换函数,若优化文件里某行不是合法数字文本,转换会静默得到 0.0,不会抛错但会污染权重。建议开 MT5 后在策略测试器里故意改错一个 f 字段,看日志权重分布是否异常。 FileClose(handle) 在 break 之后和函数尾各调用一次,属于双重保险;若文件打开失败则 PrintFormat 报出错误码并返回 INIT_FAILED,EA 不会加载。外汇与贵金属品种杠杆高,参数文件错读可能导致仓位计算偏移,实盘前务必在模拟环境跑一遍初始化。

MQL5 / C++
  weight[class="num">6]=StringToDouble(f8);
  weight[class="num">7]=StringToDouble(f9);
  weight[class="num">8]=StringToDouble(f10);
  weight[class="num">9]=StringToDouble(f11);
  weight[class="num">10]=StringToDouble(f12);
  weight[class="num">11]=StringToDouble(f13);
  weight[class="num">12]=StringToDouble(f14);
  weight[class="num">13]=StringToDouble(f15);
  weight[class="num">14]=StringToDouble(f16);
  weight[class="num">15]=StringToDouble(f17);
  
  weight[class="num">16]=StringToDouble(f18);
  weight[class="num">17]=StringToDouble(f19);
  weight[class="num">18]=StringToDouble(f20);
  weight[class="num">19]=StringToDouble(f21);
  
  weight[class="num">20]=StringToDouble(f22);
  weight[class="num">21]=StringToDouble(f23);
  weight[class="num">22]=StringToDouble(f24);
  weight[class="num">23]=StringToDouble(f25);
  weight[class="num">24]=StringToDouble(f26);
  weight[class="num">25]=StringToDouble(f27);
  weight[class="num">26]=StringToDouble(f28);
  weight[class="num">27]=StringToDouble(f29);
  weight[class="num">28]=StringToDouble(f30);
  weight[class="num">29]=StringToDouble(f31);
  weight[class="num">30]=StringToDouble(f32);
  weight[class="num">31]=StringToDouble(f33);
  
  weight[class="num">32]=StringToDouble(f34);
  weight[class="num">33]=StringToDouble(f35);
  weight[class="num">34]=StringToDouble(f36);
  
  FileClose(handle);  
  break;
  }
  }  
FileClose(handle);
  }
  else{
  PrintFormat("Could not open file %s, error code = %d",OptimizationFileName,GetLastError());
  class="kw">return(INIT_FAILED);
  }
}else{
  PrintFormat("Could not open file %s, error code = %d",OptimizationFileName,GetLastError());
  class="kw">return(INIT_FAILED);
  }

别急着下结论

这套基于 MT5 原生环境的神经网络实验,从指标倾角、轨迹线到蜡烛百分比,已经跑通了 4-4-3 与 4-4-4-3 两类结构,不需要任何第三方软件介入。附件里的 EA 包(610.58 KB)直接丢进终端就能加载,但实盘前请先在策略测试器里把优化参数关掉,否则标准设置可能一笔单都开不了。 有读者在 EURUSD H4、2021-01-01 至 2023-01-01 区间做遗传优化,初始权益 1000,近两天跑完 40500 次迭代后净值到 3336;短线胜率 68%,长线仅 45%,说明不同时间框架的止损逻辑差异极大,换到 H4 用 Angle 系统曾几乎全亏。外汇与贵金属杠杆高、滑点跳空频繁,这类结果只代表历史样本,不代表未来概率。 权重是随机初始化后写文件留痕的,不是靠帧传递。想验证就自己下 ZIP,跑一遍前向测试,别直接信回测曲线。

MQL5 / C++
<b>Angle EA class="num">4-class="num">4-class="num">3</b> - МA1 和 МA24 指标倾角策略,神经网络 class="num">4-class="num">4-class="num">3。
<b>Angle EA class="num">4-class="num">4-class="num">4-class="num">3</b> - МA1 和 МA24 指标倾角策略,神经网络 class="num">4-class="num">4-class="num">4-class="num">3。
<b>Figure EA class="num">4-class="num">4-class="num">3</b> - МA1 和 МA24 指标蝴蝶(轨迹线)策略,神经网络 class="num">4-class="num">4-class="num">3。
<b>Figure EA class="num">4-class="num">4-class="num">4-class="num">3</b> - МA1 和 МA24 指标蝴蝶(轨迹线)策略,神经网络 class="num">4-class="num">4-class="num">4-class="num">3。
<b>Original EA class="num">4-class="num">4-class="num">3</b> - 蜡烛大小百分比策略,神经网络 class="num">4-class="num">4-class="num">3。
<b>Original EA class="num">4-class="num">4-class="num">4-class="num">3</b> - 蜡烛大小百分比策略,神经网络 class="num">4-class="num">4-class="num">4-class="num">3。
<b>Clear.bat</b> - 清理终端文件(Log 和 Cache).的脚本。
<b>DeepNeuralNetwork</b> – class="num">4-class="num">4-class="num">4-class="num">3 神经网络库。
<b>DeepNeuralNetwork2</b> – class="num">4-class="num">4-class="num">3 神经网络库。
把重复劳动交给小布
这些多网络多形态的回测与参数归档,小布盯盘的 AIGC 已内置批量诊断,打开对应品种页即可看到各 EA 的验算分布与可疑过拟合区间,你只需判断哪套逻辑值得手动精修。

常见问题

神经网络权重偏差组合空间极大,示例里 35 个参数在 -1 到 1 步长 0.1 下约有 3.68e+51 次验算,测试器默认规模远远不够,需要用内部随机生成加外部记录缩减搜索面。
数组每次初始化清零,全局变量容量有限且难在优化外读取,原文改用 CSV 文件持久化已验算参数组合,方便断点续跑与跨会话分析。
重点看同形态下收敛稳定性与样本外表现,更深层网络不一定更优,外汇贵金属高风险下浅层网络过拟合概率往往更低。
可以,把 CSV 或策略测试报告导入对应品种页,小布会用 AIGC 标注验算密度与潜在偏差,省去手动翻六套结果的麻烦。
会,但工程上是以概率换可行度,倾向先用随机采样圈定候选区,再对局部做精细步长,比盲目全扫更实际。