神经网络实验(第 2 部分):智能神经网络优化·综合运用
(3/3)·从 4-4-3 小网络到六套 EA 实测,把十万次无效验算压成可读的优化结果
接上篇,我们继续深挖如何把神经网络真正跑在 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 是你本机路径,拿自己电脑实际值替换,记事本就能改。外汇与贵金属杠杆高,优化结果仅代表历史样本表现,未来走势可能偏离。
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 分钟。外汇与贵金属属高风险品种,这类神经网回测优不等于实盘稳,算力消耗也大,完整训练还得更深。 留的几个坑:优化区间要拉更长、验算数量得加、前进策略没定死,还有能不能边优化边交易、换时间帧、多网拼装——这些后续都得啃。
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 不会加载。外汇与贵金属品种杠杆高,参数文件错读可能导致仓位计算偏移,实盘前务必在模拟环境跑一遍初始化。
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,跑一遍前向测试,别直接信回测曲线。
<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 神经网络库。