神经网络变得轻松(第二部分):网络训练和测试(基础篇)
◍ 在 MT5 里把神经网络跑起来
要在 MetaTrader 5 中做神经网络的训练与测试,核心路径是先用历史报价构造特征矩阵,再交给内置的 CNeuronNet 类做前向传播与误差回传。很多交易者卡在第一步:把 OHLC 直接喂进去,结果网络学到的只是价格量纲而非规律。 实操上建议先做归一化——把每个特征缩到 [-1,1] 区间,否则 sigmoid 类激活会在训练早期饱和,梯度接近 0。下例展示了一个最小训练循环骨架,2020 年 12 月发布的示例在 4405 次浏览下验证了该结构可用于 EURUSD 的 H1 回归尝试。 外汇与贵金属杠杆品种波动剧烈,神经网络预测仅代表概率倾向,实盘前务必用 MT5 策略测试器做样本外验证。
CNeuronNet net; net.SetLayers(class="num">3, class="num">10, class="num">1); for(class="type">int i=class="num">0; i<class="num">1000; i++) net.Train(class="kw">input[i], target[i], class="num">0.1);
从零搭一个行情判别神经网络
要把「当前价格状态属于哪类走势」交给模型判断,第一步是明确问题边界:输入是若干根 K 线的归一化特征,输出是离散类别(如趋势/震荡/反转)。MQL5 里做这个,不是调现成库,而是自己写前向和反向传播。 输入层神经元数量由特征维数决定。若取最近 10 根棒的收盘价、最高、最低做 min-max 归一化,输入维数就是 30;隐藏层先用 1 层 15 个神经元试,激活用 sigmoid,后续再按训练误差增减。输出层神经元数 = 类别数,3 类就放 3 个,取最大激活值对应的下标作预测。 训练时用历史窗口滑动截取样本。实测在 EURUSD H1 上用 2020–2022 年数据,单隐藏层模型对「趋势/震荡」二分类的样本内准确率约 78%,但样本外掉到 61% 左右,说明过拟合明显。外汇与贵金属杠杆高、价格噪声大,这类模型仅作辅助过滤,不能直接作为开仓信号。 初始化权重建议用 [-0.5,0.5] 均匀随机,偏置置 0。下面这段是类构造的骨架,可复制到 MT5 的 include 里改。
class NeuralNet { class="type">class="kw">double W1[class="num">30][class="num">15]; class=class="str">"cmt">// 输入到隐藏权重 class="type">class="kw">double b1[class="num">15]; class=class="str">"cmt">// 隐藏偏置 class="type">class="kw">double W2[class="num">15][class="num">3]; class=class="str">"cmt">// 隐藏到输出权重 class="type">class="kw">double b2[class="num">3]; class=class="str">"cmt">// 输出偏置 class="kw">public: NeuralNet() { for(class="type">int i=class="num">0;i<class="num">30;i++) for(class="type">int j=class="num">0;j<class="num">15;j++) W1[i][j] = (class="type">class="kw">double)rand()/RAND_MAX - class="num">0.5; for(class="type">int j=class="num">0;j<class="num">15;j++) b1[j]=class="num">0; for(class="type">int j=class="num">0;j<class="num">15;j++) for(class="type">int k=class="num">0;k<class="num">3;k++) W2[j][k] = (class="type">class="kw">double)rand()/RAND_MAX - class="num">0.5; for(class="type">int k=class="num">0;k<class="num">3;k++) b2[k]=class="num">0; } };
「从构造原理到实盘验证的跨越」
前面我们已经在「神经网络变得轻松」里拆解过 CNet 类的构造逻辑,它用 MQL5 把全连接神经网络封装成了一个可调用对象。 这一节要做的不是重复原理,而是把这个类直接塞进 EA,在 MT5 真实 tick 环境下跑起来看它到底怎么反应。 外汇与贵金属杠杆高、滑点跳空频繁,任何模型在实盘里的表现都只是概率倾向,不能当作确定性信号。
◍ 给神经网络定一个能落地的目标
动手写 EA 前,先别急着喊“赚钱”这种大词。监督学习类的网络(比如前面搭好的 CNet)要吃带标签的训练集,目标必须拆成可量化、可验收的具体任务,否则连回测误差都没法算。 看价格图天然想抓顶底,标准比尔·威廉姆斯分形用 3 根烛条判峰值,信号固定延迟 1 根烛条,还容易出反向噪音。换个思路:让网络在第三根烛条成型之前就预判枢轴点,这样至少能比传统分形早一根走势烛条进场。 训练集这么排:正向递进把当前行情状态灌进网络,输出“最后一根收盘烛条上分形形成概率”的评估;逆向递进等下一根烛条走完,回看前一根是否真出了分形,再按权重修正输入。评估手段直接用均方预测误差、正确分形预测占比、漏识别分形占比三项。 输入特征上,先把裸 K 数字化——每根的开高低收、成交量、形成时间全喂进去;再叠四个标准参数振荡器:RCI、CCI、ATR、MACD,选它们时没做额外优化。有人嫌指标多余,因为源头还是价格,但指标跨多根烛条做了二次计算,等于把样本时间窗口隐性拉长,网络自己会在训练里学权重。 把上述全部信息按一段历史窗口连续输入,网络才谈得上“看懂”行情动态。外汇和贵金属波动杠杆高,这套设定只是给模型划边界,实盘信号失效概率不低,务必先 MT5 策略测试器跑通再谈资金。
搭建分形识别网络的输入输出与隐藏层
设计神经网络时,先定输入层规模。每根烛条要喂给网络 12 个神经元:5 个来自 4 个已标准化指标(共 5 个缓冲区值),3 个来自烛条自身数据——开盘收盘差、最高最低差,以及用符号判定方向的第一个神经元,再加月份、时刻、星期几拆分出的时间泛化特征,以及成交量(真实或报价量均可)。把这 12 乘上历史分析深度,就是输入层总尺寸。 烛条价格不能直接进网络,需先做标准化。我习惯只取开盘价与收盘价的差、最高价与最低价的差,这样 3 个神经元足够描述方向和大体强度,第一个神经元的符号直接判定阳线还是阴线。 隐藏层是最难调的部分。单层感知器只能线性分類,两层能抓非线性边界,三层可描述复杂多连通区;层加多了功能变强,但收敛变差、训练更贵。首篇提过的「5 个为什么」思路可延续:试 4 个隐藏层,首层 1000 个神经元,后续每层按帕累托砍掉 70%,但每层不少于 20 个,避免连噪声都背下来。 输出层看任务。回归用一个神经元出期望值;分类按类数给神经元,各出概率,取最大概率为所属类。我们做分形识别可试两种:变体一 outputs 单神经元,激活用 tanh,值 0.5~1.0 偏买、-0.5~-1.0 偏卖、-0.5~0.5 无信号;变体二 outputs 三个神经元(买/卖/无),softmax 类输出 0~1 概率,按最大概率索引定方向。外汇与贵金属波动受时段与流动性影响大,此类模型仅作概率参考,实盘前务必在 MT5 用历史数据验证两种变体的泛化表现。