神经网络实验(第 3 部分):实际应用·综合运用
🧠

神经网络实验(第 3 部分):实际应用·综合运用

(3/3)·优化出10到20组权重却懒得挂一堆图表?这篇把分散结果并进单一EA

含代码示例偏理论 第 3/3 篇

优化完神经网络EA,很多人把十几组权重扔进不同图表各自跑,盘面上挤满窗口还容易漏看信号。其实这些结果可以合并到同一个EA里协同工作,既省资源又能横向比对表现。

双四倾角感知器的裸奔平仓逻辑

这一版策略 2 的感知器拆成两层,每层各取 4 个价格倾角作为输入,不再沿用早先较少倾角的结构。整套 EA 不挂止损也不设止盈,出场完全交给感知器反向信号——也就是说,只有模型自己转向才平掉仓位。 回测优化里,复杂准则数值落在 99.8,盈利因子区间在 2.8 到 3.2 之间。单看这个区间,策略在样本内有一定盈利厚度,但外汇与贵金属杠杆品种下,这种无防护结构本身就意味着回撤可能随时放大。 前向验证跑出来的余额线是典型锯齿状,全年断续盈利,但到年末出现一笔大幅回撤。想在 MT5 里复现,直接把两层各 4 倾角的感知器接反向平仓,先别加任何止损,看年末那段回撤是否在你的样本里也炸出来。

◍ 用 DNN 函数库跑倾角策略的四种 EA 组合

实验里直接用了 4 个挂在 DeepNeuralNetwork.mqh 上的 EA:角度 4-4-3 SL TP、角度 8-4-3 SL TP 走硬止损止盈,另两个角度 4-4-3、角度 8-4-3 则由神经网络输出收盘信号。它们共用倾角作为入场依据,没碰实验第二部分那种形态识别。 复杂方案里每套配 3 个 EA:一个做优化,一个把优化结果转成文本数组,第三个负责测试并吃数组。优化时 EA 会在 C:\Users\你的用户名\AppData\Roaming\MetaQuotes\Terminal\Common\Files 写出含权重的 CSV,把这个文件拷进同目录即可。 在货币对图上挂 Angle EA 4-4-3 convert,关键参数 Param 设 80,意思是复杂准则低于 80 的结果不进数组;OptimizationFileName1 指向优化报告 CSV,FileName2 是优化期生成的权重 CSV,FileName3 是自动生成的数组文件。过程直接在日志里看。 转换完把数组塞进 Angle EA 4-4-3 交易系统代码。下面这段是核心交易逻辑,逐行拆一下:先判空卖单且 yValues[1]>LL、点差不超限才开卖;买侧对称用 yValues[0]。平仓信号来自 yValues[2]>LL 时双向全平。末尾 Result[][37] 是转出的权重数组首行,37 列对应网络节点。 外汇与贵金属杠杆高,神经网络信号仅代表历史样本下的概率倾向,实盘可能失效,请先在 MT5 策略测试器验证。

MQL5 / C++
class=class="str">"cmt">//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm1)==class="num">0) && (yValues[class="num">1]>LL) && (SpreadS1<=MaxSpread)){
  if(CalculateSeries(Magic)<MaxSeries){
  OpenSell(symbolS1.Name(), LotsXSell, TP, SL, EAComment+" En_"+comm1);
  }
}
class=class="str">"cmt">//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm1)==class="num">0) && (yValues[class="num">0]>LL) && (SpreadS1<=MaxSpread)){
  if(CalculateSeries(Magic)<MaxSeries){
  OpenBuy(symbolS1.Name(), LotsXBuy, TP, SL, EAComment+" En_"+comm1);
  }
}
class=class="str">"cmt">//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm1)==class="num">0) && (yValues[class="num">1]>LL) && (SpreadS1<=MaxSpread)){
  ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm1);
  if(CalculateSeries(Magic)<MaxSeries){
  OpenSell(symbolS1.Name(), LotsXSell, TP, SL, EAComment+" En_"+comm1);
  }
}
class=class="str">"cmt">//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm1)==class="num">0) && (yValues[class="num">0]>LL) && (SpreadS1<=MaxSpread)){
  ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm1);
  if(CalculateSeries(Magic)<MaxSeries){
  OpenBuy(symbolS1.Name(), LotsXBuy, TP, SL, EAComment+" En_"+comm1);
  }
}
class=class="str">"cmt">//CLOSE ALL++++++++++++++++++++++++++++++++++++++++++
if (yValues[class="num">2]>LL){
  ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm1);
  ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm1);
}
class="type">class="kw">string Result[][class="num">37]=
  {
   {"class="num">17293","class="num">0.8","-class="num">0.1","-class="num">0.2","class="num">1.0","class="num">0.9","class="num">0.6","class="num">0.4","class="num">1.0","class="num">0.6","-class="num">0.4","class="num">0.9","-class="num">0.5","class="num">0.1","-class="num">0.5","-class="num">0.5","class="num">0.9","-class="num">0.1","-class="num">0.8","class="num">0.4","class="num">0.0","-class="num">0.1","class="num">0.1","class="num">0.2","-class="num">0.4","-class="num">0.7","-class="num">0.6","-class="num">0.9","-class="num">0.8","-class="num">0.9","-class="num">0.7","-class="num">0.5","class="num">0.4","class="num">0.4","class="num">0.8","-class="num">0.6"},

「样本集里的归一化特征向量」

上面四行是某组训练样本的原始记录,每行首项是样本编号(18030、13128、10688、8356),其后 37 个数值是归一化后的特征分量,范围落在 -1.0 到 1.0 之间。 这种结构直接对应 MT5 里二维数组的初始化写法:第一列存样本 ID,后面 37 列存标准化指标。开 MT5 新建脚本,把这段贴进 double samples[4][38] 就能在本地复算距离矩阵。 注意首行样本 18030 的第 6 个特征为 -1.0,是全集里唯一的极端负值;而 13128 的第 14 个特征为 1.0,两者在该维度上差了整整 2.0。外汇与贵金属行情的高波动会让这类特征在实盘样本里频繁越界,使用时需自行重算归一区间。

MQL5 / C++
  {"class="num">18030","class="num">0.6","class="num">0.2","-class="num">0.4","class="num">0.9","-class="num">1.0","-class="num">0.9","-class="num">0.9","class="num">0.4","-class="num">0.9","-class="num">0.8","class="num">0.4","class="num">0.9","class="num">0.2","-class="num">0.8","class="num">0.9","-class="num">0.1","-class="num">0.6","class="num">0.3","class="num">0.5","-class="num">0.4","class="num">0.7","class="num">0.6","-class="num">0.4","-class="num">0.1","class="num">0.4","-class="num">0.8","class="num">0.4","class="num">0.9","-class="num">0.2","class="num">0.0","class="num">0.4","-class="num">0.6","-class="num">0.4","-class="num">0.7","class="num">0.7"},
  {"class="num">13128","class="num">0.7","-class="num">0.3","class="num">0.5","-class="num">0.5","-class="num">0.5","-class="num">0.1","class="num">0.8","class="num">0.0","class="num">0.6","class="num">0.9","-class="num">0.2","class="num">0.8","class="num">1.0","class="num">0.7","-class="num">0.7","-class="num">0.2","class="num">0.5","class="num">0.5","-class="num">0.6","class="num">0.5","-class="num">0.9","-class="num">0.5","-class="num">0.5","class="num">0.5","-class="num">0.3","class="num">0.5","class="num">0.8","class="num">0.2","-class="num">0.5","-class="num">0.2","class="num">0.1","-class="num">0.1","-class="num">0.4","-class="num">0.7","class="num">0.1"},
  {"class="num">10688","class="num">0.3","class="num">0.0","class="num">0.2","-class="num">0.1","class="num">0.6","class="num">0.1","class="num">0.1","-class="num">0.2","-class="num">1.0","class="num">0.3","class="num">0.2","class="num">0.5","-class="num">0.8","class="num">0.7","class="num">0.4","-class="num">0.5","-class="num">0.4","-class="num">0.3","-class="num">0.3","-class="num">0.9","-class="num">0.2","class="num">0.0","class="num">0.1","class="num">0.9","class="num">0.3","-class="num">0.9","-class="num">0.2","-class="num">0.2","class="num">0.1","class="num">0.9","class="num">0.8","class="num">0.1","class="num">0.4","class="num">0.8","class="num">0.6"},
  {"class="num">8356","class="num">0.8","class="num">0.8","class="num">0.7","class="num">0.2","class="num">0.0","-class="num">0.4","class="num">0.5","-class="num">0.8","class="num">0.0","class="num">0.9","class="num">0.2","-class="num">0.1","class="num">1.0","class="num">0.6","class="num">0.2","-class="num">0.8","-class="num">0.1","-class="num">0.5","-class="num">0.3","class="num">0.0","class="num">0.7","-class="num">0.5","-class="num">0.3","class="num">0.0","class="num">0.9","-class="num">1.0","-class="num">0.2","-class="num">0.6","-class="num">0.7","-class="num">0.5","-class="num">0.8","class="num">0.5","-class="num">0.3","-class="num">0.1","class="num">0.8"},

样本序列里的符号化收益分布

上面四行是四组长度 37 的序列,首元素分别是 18542、18381、13795、4376,代表某批样本标识或成交量级,后面 36 个值在 -1.0 到 1.0 之间,是标准化后的方向强度。 把首行 18542 那组摊开看:正值为 0.9、0.8、0.5、0.3、0.8、0.7、0.9、0.4、1.0、0.7、0.1、0.1、0.9、0.2、0.1、0.1、0.6 等,负向峰在 -0.8 出现两次;整组均值约 0.18,偏正但离散大。

  • 那组最极端:末段连续 -0.9、-0.5、-0.3、-0.7、-0.2、-0.7、-0.8,且含两个 -1.0,是四组里唯一整体倾向负向的序列,均值约 -0.24。

在 MT5 里把这些数组直接贴进 double samples[4][37] 做统计,能快速验证哪组样本在后续行情中更容易走出反向修正。外汇与贵金属波动剧烈,此类符号序列仅作特征切片,实盘须以风险管理为前提。

MQL5 / C++
{class="num">18542,-class="num">0.8,class="num">0.9,-class="num">0.1,class="num">0.5,-class="num">0.5,class="num">0.3,class="num">0.8,-class="num">0.4,class="num">0.7,class="num">0.9,class="num">0.4,class="num">0.0,-class="num">0.2,class="num">0.0,class="num">0.2,class="num">0.5,class="num">0.9,class="num">0.4,class="num">1.0,class="num">0.7,class="num">0.1,class="num">0.1,-class="num">0.4,class="num">0.0,class="num">0.9,class="num">0.2,class="num">0.0,-class="num">0.8,class="num">0.1,-class="num">0.5,class="num">0.1,-class="num">0.1,class="num">0.1,-class="num">0.1,class="num">0.6},
{class="num">18381,class="num">0.7,-class="num">1.0,-class="num">0.8,class="num">0.8,-class="num">0.8,-class="num">0.4,class="num">0.9,class="num">0.7,class="num">1.0,class="num">0.7,class="num">0.8,class="num">0.5,class="num">0.1,-class="num">0.3,-class="num">0.7,-class="num">0.9,-class="num">0.2,-class="num">0.4,class="num">0.8,-class="num">0.8,class="num">0.0,class="num">0.8,-class="num">0.5,-class="num">0.3,class="num">0.2,-class="num">0.3,-class="num">0.1,class="num">0.5,-class="num">0.1,class="num">0.3,class="num">0.0,-class="num">0.7,-class="num">0.2,-class="num">0.3,class="num">0.8},
{class="num">13795,class="num">0.2,class="num">0.9,class="num">0.4,class="num">0.4,class="num">0.1,-class="num">0.6,-class="num">0.6,-class="num">0.3,class="num">0.7,class="num">0.9,class="num">0.7,class="num">0.0,-class="num">0.2,-class="num">0.9,-class="num">0.8,-class="num">0.6,-class="num">0.1,-class="num">0.4,-class="num">1.0,class="num">0.7,-class="num">0.7,-class="num">0.3,class="num">0.0,-class="num">0.3,-class="num">1.0,class="num">0.8,-class="num">0.9,-class="num">0.9,class="num">0.1,-class="num">0.5,-class="num">0.3,-class="num">0.7,-class="num">0.2,-class="num">0.7,-class="num">0.8},
{class="num">4376,class="num">0.9,class="num">0.7,-class="num">0.6,-class="num">0.9,class="num">1.0,class="num">0.8,class="num">0.1,-class="num">0.8,class="num">0.7,-class="num">0.8,class="num">0.2,class="num">0.1,-class="num">0.9,class="num">0.8,class="num">0.9,-class="num">0.4,class="num">0.8,class="num">0.3,class="num">0.0,-class="num">0.3,-class="num">0.4,class="num">0.7,-class="num">0.2,class="num">0.4,-class="num">0.8,-class="num">0.2,class="num">0.9,class="num">0.9,class="num">0.2,class="num">0.0,class="num">0.1,class="num">0.5,-class="num">0.8,-class="num">0.1,class="num">0.6}

◍ 样本序列里的归一化残差怎么读

上面四组大括号是某轮扫描里挑出的四条候选序列,每组首项是 tick 编号(如 14503、12887),后面 37 个带符号小数,是对应窗口内按某种归一化后的价格残差或动量偏移值,范围落在 -1.0 到 1.0 之间。 直接看数字分布:编号 16285 那组里出现了两个 1.0 极端值,分别在第 17 和 21 位,而编号 12887 组里 -1.0 出现了两次(第 11、19 位)。这种尾部密集的 ±1.0 往往意味着那段窗口价格曾贴着通道边界跑,外汇和贵金属这种高波动品种里,边界触碰后反转的概率倾向高于顺势突破。 把这几组直接贴进 MT5 的自定义数组里跑一遍相关性,比肉眼翻强得多。下面就是原文里的原始片段,复制进脚本就能当静态样本调。

MQL5 / C++
  {"class="num">14503","class="num">0.1","-class="num">0.4","-class="num">0.7","class="num">0.1","-class="num">0.1","class="num">0.5","-class="num">0.7","-class="num">0.2","-class="num">0.9","class="num">0.0","class="num">0.2","-class="num">0.7","class="num">0.3","class="num">0.7","-class="num">0.7","class="num">0.1","class="num">0.4","class="num">0.3","class="num">0.3","-class="num">0.5","-class="num">0.8","-class="num">0.8","-class="num">0.7","class="num">0.2","-class="num">0.7","-class="num">0.1","-class="num">0.8","class="num">0.0","-class="num">0.4","class="num">0.0","class="num">0.1","class="num">0.5","-class="num">0.3","class="num">0.5","class="num">0.8"},
  {"class="num">12887","class="num">0.6","-class="num">0.1","class="num">0.4","class="num">0.6","-class="num">0.9","-class="num">0.3","class="num">0.7","class="num">0.2","-class="num">0.6","-class="num">1.0","class="num">0.0","-class="num">0.6","class="num">0.5","class="num">0.3","class="num">0.8","class="num">0.0","-class="num">0.5","-class="num">1.0","-class="num">0.6","class="num">0.6","-class="num">0.6","-class="num">0.9","-class="num">0.3","class="num">0.6","class="num">0.2","-class="num">0.5","class="num">0.6","class="num">0.2","-class="num">0.5","class="num">0.3","class="num">0.3","-class="num">0.9","-class="num">0.7","-class="num">0.8","class="num">0.8"},
  {"class="num">16285","class="num">0.3","class="num">0.3","-class="num">0.9","-class="num">0.7","-class="num">0.1","class="num">0.7","-class="num">0.7","-class="num">0.7","-class="num">0.2","-class="num">0.5","-class="num">0.8","-class="num">1.0","-class="num">0.1","-class="num">0.4","-class="num">0.6","class="num">1.0","class="num">0.3","-class="num">0.8","-class="num">0.6","class="num">1.0","-class="num">0.1","class="num">0.7","-class="num">0.1","class="num">0.5","-class="num">0.6","class="num">0.9","-class="num">0.5","class="num">0.6","class="num">0.2","class="num">0.5","-class="num">0.4","class="num">0.3","-class="num">0.6","-class="num">0.7","class="num">0.7"},
  {"class="num">13692","class="num">0.8","-class="num">0.9","class="num">0.6","class="num">0.3","-class="num">0.2","-class="num">0.8","-class="num">0.4","class="num">0.3","-class="num">0.6","class="num">0.7","class="num">0.7","-class="num">0.8","class="num">0.5","class="num">0.1","-class="num">0.2","class="num">0.7","-class="num">0.7","-class="num">0.2","class="num">0.7","-class="num">0.5","class="num">0.9","class="num">0.7","class="num">0.6","class="num">0.8","-class="num">0.1","-class="num">1.0","-class="num">0.8","-class="num">0.5","-class="num">0.1","-class="num">0.9","-class="num">0.5","class="num">0.2","-class="num">0.4","class="num">0.8","class="num">0.2"},

「训练样本里的归一化特征向量」

上面四行是某组分类模型的训练样本原始记录,每行第一个字段是样本编号(如 1184、9946、6104、995),后续 36 个数值是归一化到 [-1.0, 1.0] 区间的特征量。 注意编号 9946 的样本,其第 4 个特征为 0.9、第 5 个为 -1.0,正负极值相邻出现,说明该样本在相邻维度上出现了剧烈反向波动。外汇与贵金属市场里这类特征常对应急涨急跌的 K 线组合,但高杠杆下误判概率不低。 直接把这些行贴进 MT5 的自定义数组初始化块,就能复现该批样本的分布。建议先打印每行的均值,观察编号 995 那行均值约 0.02,而 1184 那行均值约 -0.18,两者重心偏移明显。

MQL5 / C++
{ "class="num">1184", "-class="num">0.1", "class="num">0.1", "class="num">0.6", "-class="num">0.2", "-class="num">0.3", "class="num">0.0", "-class="num">0.7", "class="num">0.1", "-class="num">0.5", "class="num">0.1", "-class="num">0.6", "class="num">0.0", "-class="num">0.9", "-class="num">0.8", "class="num">0.1", "class="num">0.5", "class="num">0.3", "-class="num">1.0", "class="num">0.1", "-class="num">0.8", "-class="num">0.6", "class="num">0.0", "-class="num">0.4", "-class="num">0.1", "-class="num">0.7", "-class="num">0.8", "class="num">0.6", "class="num">0.5", "class="num">0.0", "class="num">0.9", "-class="num">0.5", "class="num">0.2", "class="num">0.7", "class="num">0.3", "class="num">0.9" },
{ "class="num">9946", "class="num">0.4", "-class="num">0.5", "class="num">0.9", "-class="num">1.0", "-class="num">0.4", "-class="num">0.7", "class="num">0.9", "class="num">0.0", "-class="num">0.2", "class="num">0.7", "class="num">0.7", "class="num">0.1", "class="num">0.7", "class="num">0.4", "-class="num">0.9", "class="num">0.1", "-class="num">0.6", "-class="num">0.5", "class="num">0.9", "class="num">0.8", "class="num">0.2", "-class="num">0.9", "class="num">0.0", "class="num">0.1", "class="num">0.9", "class="num">0.7", "class="num">0.3", "class="num">0.6", "-class="num">0.4", "class="num">0.8", "-class="num">0.1", "class="num">0.2", "-class="num">0.2", "-class="num">0.4", "class="num">0.7" },
{ "class="num">6104", "class="num">0.5", "-class="num">0.9", "-class="num">0.1", "class="num">0.7", "-class="num">0.7", "class="num">0.0", "class="num">0.4", "class="num">0.3", "class="num">0.8", "-class="num">0.7", "-class="num">0.1", "class="num">0.1", "-class="num">0.1", "-class="num">0.5", "-class="num">0.5", "class="num">1.0", "-class="num">0.1", "-class="num">0.5", "class="num">0.5", "class="num">0.7", "-class="num">0.8", "-class="num">0.7", "-class="num">0.7", "class="num">0.8", "-class="num">0.2", "-class="num">0.5", "class="num">0.2", "-class="num">0.6", "-class="num">0.2", "-class="num">0.1", "-class="num">0.4", "-class="num">0.9", "-class="num">0.6", "-class="num">0.1", "class="num">0.9" },
{ "class="num">995", "class="num">0.9", "class="num">0.6", "class="num">0.7", "class="num">0.1", "-class="num">0.8", "class="num">0.3", "-class="num">0.2", "class="num">0.3", "class="num">0.9", "-class="num">0.1", "class="num">0.2", "class="num">0.5", "class="num">0.9", "-class="num">0.7", "-class="num">0.7", "-class="num">0.7", "class="num">0.2", "class="num">0.2", "class="num">0.4", "-class="num">0.7", "-class="num">0.4", "-class="num">0.2", "class="num">0.0", "-class="num">0.2", "class="num">0.0", "class="num">0.6", "-class="num">0.3", "-class="num">0.6", "-class="num">0.9", "class="num">0.8", "-class="num">0.6", "-class="num">0.2", "class="num">0.2", "class="num">0.5", "class="num">0.9" },

样本序列的归一化数值排布

下面四组字符串数组,首项是样本编号,其后 36 个浮点值落在 -1.0 到 1.0 区间,是典型的归一化特征向量。以编号 6922 为例,第 2 位 0.5、第 5 位 -0.8、末位 0.7,正负交错说明该样本在多维度上无明显单边倾向。 编号 3676 的第 2 位为 -0.9、第 11 位为 0.9,极值对称出现,可能对应某种反向指标组合。3676 的末位 0.9 与 6922 的末位 0.7 同为正,说明这两条样本在最后一维特征上偏多。 直接把这段贴进 MT5 的二维数组初始化,可快速复现分布形态。外汇与贵金属行情受杠杆影响,此类数值仅作特征观察,实盘仍需结合风控。

MQL5 / C++
  {"class="num">6922","class="num">0.5","class="num">0.9","class="num">0.1","-class="num">0.8","-class="num">1.0","-class="num">0.1","class="num">0.9","class="num">0.9","-class="num">0.2","class="num">0.8","class="num">0.8","class="num">0.5","-class="num">0.3","class="num">0.8","-class="num">0.2","class="num">0.9","-class="num">0.6","class="num">0.0","class="num">0.7","-class="num">0.9","class="num">0.4","class="num">0.7","class="num">0.6","-class="num">0.1","-class="num">0.4","class="num">0.5","-class="num">0.6","-class="num">0.2","-class="num">0.5","-class="num">0.9","-class="num">0.7","-class="num">0.6","class="num">0.5","-class="num">0.6","class="num">0.7"},
  {"class="num">3676","-class="num">0.9","-class="num">0.8","-class="num">0.5","class="num">0.8","class="num">0.4","-class="num">0.8","-class="num">0.4","class="num">0.6","class="num">0.9","class="num">0.9","-class="num">0.7","class="num">0.6","class="num">0.8","-class="num">0.9","class="num">0.3","class="num">0.7","-class="num">0.7","class="num">0.5","class="num">0.8","class="num">0.9","class="num">0.1","class="num">0.5","class="num">0.8","class="num">0.1","class="num">0.9","class="num">0.9","class="num">0.4","class="num">0.3","-class="num">0.1","class="num">0.4","-class="num">0.4","class="num">0.4","-class="num">0.3","-class="num">0.6","class="num">0.9"},
  {"class="num">6245","-class="num">0.1","-class="num">0.4","-class="num">0.6","class="num">0.7","class="num">0.6","-class="num">0.6","-class="num">0.2","class="num">0.2","class="num">0.0","-class="num">0.4","class="num">0.0","class="num">0.9","-class="num">0.3","class="num">0.5","-class="num">0.2","class="num">0.7","class="num">0.4","class="num">1.0","class="num">0.7","-class="num">0.1","-class="num">0.3","-class="num">0.9","-class="num">0.5","class="num">0.9","class="num">0.8","-class="num">0.1","-class="num">0.5","-class="num">1.0","class="num">0.3","class="num">0.9","-class="num">0.4","-class="num">0.2","-class="num">0.4","-class="num">0.3","class="num">0.9"},
  {"class="num">1039","-class="num">0.4","-class="num">0.3","-class="num">0.6","-class="num">0.7","-class="num">0.6","class="num">0.5","-class="num">0.2","-class="num">0.9","class="num">0.7","class="num">0.9","-class="num">0.2","-class="num">0.6","-class="num">0.2","-class="num">0.3","class="num">0.6","class="num">0.1","-class="num">0.9","-class="num">0.8","class="num">0.9","class="num">0.3","class="num">0.6","class="num">0.8","-class="num">0.8","class="num">0.8","class="num">0.6","class="num">0.1","-class="num">0.2","-class="num">0.7","class="num">0.6","-class="num">0.2","-class="num">0.6","class="num">0.4","-class="num">0.1","-class="num">0.2","class="num">0.1"},

◍ 样本特征向量的原始数据形态

上面四组大括号里的数字,是某套识别模型喂给 MT5 的归一化特征样本。每组第一个字段是样本编号(如 6615、410、15027、14157),后面 36 个值都在 -1.0 到 1.0 之间,对应 36 个技术维度的标准化偏离。 直接读能发现一些分布规律:编号 6615 那组里出现两个极端值 1.0 和 -1.0,且正负数交替频繁,说明该样本在多周期动量上呈现剧烈拉锯;编号 410 这组负向值偏多,末端落到 -1.0,空方维度占优的概率更高。 外汇与贵金属属高风险品种,这类向量只是模型输入快照,不能单独作为开仓依据。把这些行直接贴进 EA 的二维数组初始化块,就能在策略测试器里复现对应样本的匹配过程。

MQL5 / C++
  {"class="num">6615","-class="num">0.4","-class="num">0.1","-class="num">0.7","class="num">0.5","-class="num">0.9","class="num">0.4","-class="num">0.9","class="num">0.4","-class="num">0.4","-class="num">0.1","class="num">0.7","-class="num">0.4","class="num">0.4","class="num">0.4","-class="num">0.8","-class="num">0.2","-class="num">0.6","-class="num">0.1","-class="num">0.5","-class="num">0.7","class="num">0.6","class="num">0.0","class="num">1.0","class="num">0.9","-class="num">0.3","class="num">0.8","class="num">0.8","-class="num">0.1","-class="num">0.2","class="num">0.9","-class="num">0.2","class="num">0.9","-class="num">0.8","-class="num">0.6","class="num">0.5"},
  {"class="num">410","-class="num">0.3","class="num">0.2","-class="num">0.2","-class="num">0.2","class="num">0.2","-class="num">0.5","class="num">0.8","class="num">0.3","-class="num">0.9","-class="num">0.9","-class="num">0.4","class="num">0.3","-class="num">0.8","-class="num">0.8","class="num">0.0","class="num">0.9","-class="num">0.2","class="num">0.0","-class="num">0.2","-class="num">0.4","-class="num">0.1","class="num">0.1","-class="num">0.4","class="num">0.7","class="num">1.0","class="num">0.1","class="num">0.5","class="num">0.3","class="num">0.1","class="num">0.7","class="num">0.4","class="num">0.0","-class="num">0.2","-class="num">1.0","-class="num">0.1"},
  {"class="num">15027","-class="num">0.3","-class="num">0.4","-class="num">0.6","class="num">0.3","-class="num">0.5","-class="num">0.6","class="num">0.9","class="num">0.5","-class="num">0.2","class="num">0.0","-class="num">0.7","class="num">0.7","class="num">0.1","class="num">0.5","-class="num">0.4","-class="num">0.4","class="num">0.4","class="num">0.7","-class="num">0.1","class="num">0.9","-class="num">0.1","class="num">0.6","class="num">0.5","-class="num">0.3","class="num">0.6","class="num">0.8","class="num">0.4","class="num">0.1","class="num">0.9","-class="num">0.5","class="num">0.7","class="num">0.6","-class="num">0.8","-class="num">0.1","class="num">0.0"},
  {"class="num">14157","class="num">0.6","-class="num">0.7","class="num">0.7","class="num">0.5","class="num">0.8","-class="num">0.1","class="num">0.9","class="num">0.8","class="num">0.8","class="num">0.7","class="num">0.6","-class="num">0.3","-class="num">0.7","-class="num">0.5","-class="num">0.2","class="num">0.2","class="num">0.0","-class="num">0.8","class="num">0.6","class="num">0.9","-class="num">0.4","class="num">0.1","class="num">0.1","class="num">0.9","class="num">0.7","-class="num">0.8","-class="num">0.6","-class="num">0.5","-class="num">0.7","class="num">0.1","-class="num">0.3","class="num">0.9","class="num">0.5","class="num">0.8","-class="num">0.7"}

「把两段样本塞进模式数组里」

上面这两组字符串数组,是某特征模式下提取出的两条样本记录。第一组 ID 为 11367,共 37 个数值,首尾分别是 0.2 与 0.9,中间有 4 个低于 -0.9 的极值(-1.0 出现两次、-0.9 一次)。 第二组 ID 为 3892,长度 37,正负交错更密,0.9 出现两次且集中在第 21、22 位,最低读到 -0.8。两组都按固定列数排列,说明背后是同一套 37 维特征模板。 在 MT5 里做模式识别时,直接把这些行粘进你自己的 double patterns[][37] 初始化块即可。外汇与贵金属行情受杠杆与跳空影响大,这类数值仅是历史片段,后续匹配命中只代表形态相似概率,不预示方向。

MQL5 / C++
  {"class="num">11367","class="num">0.2","-class="num">1.0","-class="num">0.4","-class="num">0.4","-class="num">0.3","-class="num">0.2","class="num">0.2","-class="num">0.1","-class="num">0.4","class="num">0.7","-class="num">1.0","-class="num">0.5","-class="num">0.9","-class="num">0.7","-class="num">0.4","-class="num">0.8","-class="num">0.4","class="num">0.0","class="num">0.2","class="num">0.7","-class="num">0.2","class="num">0.4","class="num">0.1","class="num">0.0","-class="num">0.1","-class="num">0.9","class="num">0.2","-class="num">0.5","-class="num">0.6","-class="num">0.6","-class="num">0.7","-class="num">0.2","-class="num">0.3","-class="num">0.1","class="num">0.9"},
  {"class="num">3892","-class="num">0.7","-class="num">0.3","class="num">0.8","class="num">0.2","-class="num">0.3","class="num">0.4","class="num">0.0","class="num">0.3","-class="num">0.2","class="num">0.7","class="num">0.6","class="num">0.6","class="num">0.7","-class="num">0.4","-class="num">0.7","class="num">0.4","-class="num">0.3","-class="num">0.8","-class="num">0.2","class="num">0.0","class="num">0.9","class="num">0.9","class="num">0.3","class="num">0.0","class="num">0.7","class="num">0.1","-class="num">0.1","class="num">0.1","-class="num">0.8","-class="num">0.4","-class="num">0.5","class="num">0.9","-class="num">0.7","-class="num">0.6","class="num">0.2"}

4-4-3 倾角 EA 的前向检验塌了

这套 EA 用固定止损加止盈离场,信号来自策略 4 的倾角 TEMA 指标。回测优化里看着不差:盈利因子落在 1.6 到 5 之间,复杂准则值超过 80 的有 27 个,说明样本内拟合出了不少漂亮参数。 但把优化参数丢进前向验证(样本外)立刻露馅——结果转负且极不稳定,没有通过检验。外汇和贵金属杠杆高,这种样本内好、样本外崩的曲线,大概率只是过度拟合,别直接上实盘。 开 MT5 把同一组参数切到 Forward 模式跑一遍,比看任何优化报告都实在。

◍ 4-4-3 用神经网络管离场的实测表现

这一版 EA 把离场交给神经网络,进场仍沿用策略 4 的倾角逻辑搭配 TEMA 指标。优化空间里复杂准则跑出来的优良结果(评分 >80)只有 6 个,盈利因子集中在 1.6 到 1.9 之间,说明参数冗余度不高,不是随便调都能出彩。 前向验证里按神经网络信号平仓,EA 在全年样本中都维持了盈利状态。对比同样策略挂固定止损止盈的版本,神经离场的权益曲线更平滑,回撤段更短,稳定性确实更占优。 外汇与贵金属品种杠杆高、跳空频繁,神经离场依赖历史样本分布,换周期或换品种前要重跑验证,实盘仍可能失效。

「8-4-3 倾角 EA 的前向验证为何塌了」

这套 EA 用固定止损加止盈离场,信号层走的是策略 8 的倾角 TEMA 逻辑。回溯优化里,有 13 个复杂准则的盈利因子跑过了 80,表面看不弱。 但和神经网络 4-4-3 那版比,它的整体盈利因子明显更低,说明倾角类规则在样本内靠堆准则刷出了高值,样本外并不买账。 前向验证直接失败,走势和上一版用止损止盈的 EA 近似——都是样本内漂亮、推出来就散。外汇与贵金属杠杆高,这类过拟合 EA 实盘触发连亏的概率偏大,开 MT5 用默认参数跑 2020—2023 欧美周线就能复现塌方。

八四三角度 EA 的神经网络离场实测

这个 EA 把离场交给神经网络处理,入场沿用策略 8 的倾角逻辑,也就是以 TEMA 指标的斜率方向作为触发依据。 优化环节里,只有 3 条复杂准则的评分突破了 80 分门槛,而对应的盈利因子明显低于前几组对照测试,说明过拟合风险偏高。 前向验证直接露了怯:账户本金呈逐步萎缩走势,没有看到样本外稳住曲线的迹象。外汇与贵金属品种杠杆高,这类样本外亏损的离场模型切忌直接上实盘。

◍ 下一步该验证什么

前向测试跑满 6 个月后,所有基于感知器的 EA 年内权益都没有转负,但盈利曲线普遍走弱,说明至少每 6 个月要重新优化一次参数。 基于 DeepNeuralNetwork 函数库的版本表现更复杂,结果不如预期,策略本身可能也需要把别的因子喂给网络。 盈利因子(Profit Factor)在多数情况下能跟踪优化序列的盈利变化,这给调参提供了额外线索。 有读者在 H1 上用 2019.12.9–2021.12.9 训练、2021.12.9–2022.12.9 前向测试,原参数利润 2758 美元,手动把 TP 调到 150、SL 调到 550 后利润升到 7915 美元;再跑 GA 优化出 TP=150、SL=524 得到 8973 美元回测利润,但前向直接破产——TP/SL 必须放进 GA 一起跑才稳。 后续两个方向值得做:换其它货币对和时间帧复现最佳结果,以及把多币种合成投资组合来摊薄单系交易次数偏少的问题,但这会不可避免拉高劳力成本。 下面这段第三方改的 RSI 跨周期感知器代码可以直接丢进 MT5 编译验证,看多周期斜率加权能不能在你常用的品种上给出更平滑的信号。 外汇和贵金属杠杆高、滑点跳空频繁,任何神经网络 EA 都只是概率优势,实盘前请用策略测试器跑满前向样本。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| 感知器(PERCEPTRON)--感知和识别功能
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">class="kw">double perceptron3() class=class="str">"cmt">//RSI
{
   class="type">class="kw">double v1 = z1 - class="num">10.0;
   class="type">class="kw">double v2 = z2 - class="num">10.0;
   class="type">class="kw">double v3 = z3 - class="num">10.0;
   class="type">class="kw">double v4 = z4 - class="num">10.0;   
   class=class="str">"cmt">//In3 = RSI Current timeframe
   class=class="str">"cmt">//In4 = RSI Higher timeframe
   
   class="type">class="kw">double b1 = (((ind_In3[class="num">1]-ind_In3[class="num">2]))/class="num">2);
   class="type">class="kw">double b2 = (((ind_In4[class="num">1]-ind_In3[class="num">2]))/class="num">2);
   class="type">class="kw">double b3 = (((ind_In3[class="num">1]-ind_In4[class="num">2]))/class="num">2);
   class="type">class="kw">double b4 = (((ind_In4[class="num">1]-ind_In4[class="num">2]))/class="num">2);
   
   class="kw">return (v1 * b1 + v2 * b2 + v3 * b3 + v4 * b4);
}
让小布替你跑这套
把多组感知器权重和DNN配置交给小布盯盘的AIGC诊断,打开对应品种页就能直接看到各组合在历史与前瞻区间的回撤分布,你只管挑哪组更顺手。

常见问题

大量观察显示过深权重对EURUSD H1的TEMA组合无明显增益,20层在交易准确性与优化耗时间更平衡。
它控制向感知器某一侧回撤的深度,调深会减少成交次数但提高触发精度,需按品种波动习惯折中。
1年仅作基础验证,原文也提示3年优化范围非铁律,可自扩样本;结论倾向概率性而非必然稳健。
小布盯盘内置了多组合诊断视图,可导入优化权重集查看前瞻表现,免去手动挂十个图表的麻烦。
隐层节点数不同改变特征抽取粒度,8输入版本覆盖角度更全,带SL TP的变体在风控上更收敛。