物美价廉的神经网络 - 链接 NeuroPro 与 MetaTrader 5·进阶篇
📘

物美价廉的神经网络 - 链接 NeuroPro 与 MetaTrader 5·进阶篇

第 2/3 篇

把 NeuroPro 公式手动改成 MT5 能编译的代码

NeuroPro 本身不认识 MetaTrader 5,也不会直接导出 MQL5。但它有个冷门能力:通过「神经网络 > 语言表达」菜单,把整张网写成一组从输入到输出的顺序公式,权值、偏置、激活函数全摊开成文本。这就给了我们半自动迁移的缝隙——把它当抽象源码,逐条改成 MQL5 语法即可。 改起来不需要贵价工具。Windows 记事本就够用,核心动作是「编辑 > 替换」批量处理:三重下划线 ___ 换成 [,双重 __ 换成 ],连续双减号 -- 拆成「- -」空格隔开(MQL5 里 -- 是自减运算符,直接留着必编译报错),顺手把俄语函数名 Sigmoid / 变量名 Syndrom 转成拉丁字母。 输入字段建议一开始就命名为 BAR___N__ 形式,替换后直接变成 BAR[N] 数组,比挨个声明独立变量省事太多。原文里 24 个基础输入加 1 个终极特征,正好落进 BAR[1]~BAR[24] 与 BAR[0]。 两个坑容易卡住编译器。其一是归一化参考点 BAR___1__ 恒为零,NeuroPro 生成的公式会出现除以 0,必须手动把整行替成 BAR[1]=0;其二是末尾公式多了一个右括号,MetaEditor 不会精准指向它,而是报后面大括号不匹配,肉眼比对原公式才能揪出来。 熟练之后这套替换流程几分钟就能跑完,不必背替换表——编译报错会告诉你哪行没改干净。下面这段是从记事本搬进 MetaEditor 后的片段,注意 Sigmoid 统一写成 A/(0.1+MathAbs(A)),BAR[1] 已处理成常量 0,多余右括号也已删掉:

MQL5 / C++
<span class="keyword">class="type">class="kw">double</span> BAR [<span class="number">class="num">25</span>];
<span class="keyword">class="type">class="kw">double</span> Sigmoid<span class="number">class="num">1</span> (<span class="keyword">class="type">class="kw">double</span> A)
{
&nbsp;&nbsp;<span class="keyword">class="kw">return</span> A/(<span class="number">class="num">0.1</span> + <span class="functions">MathAbs</span>(A));
}
<span class="keyword">class="type">class="kw">double</span> Sigmoid<span class="number">class="num">2</span> (<span class="keyword">class="type">class="kw">double</span> A)
{
&nbsp;&nbsp;<span class="keyword">class="kw">return</span> A/(<span class="number">class="num">0.1</span> + <span class="functions">MathAbs</span>(A));
}
<span class="keyword">class="type">class="kw">double</span> Sigmoid<span class="number">class="num">3</span> (<span class="keyword">class="type">class="kw">double</span> A)
{
&nbsp;&nbsp;<span class="keyword">class="kw">return</span> A/(<span class="number">class="num">0.1</span> + <span class="functions">MathAbs</span>(A));
}
BAR[<span class="number">class="num">1</span>]=(BAR[<span class="number">class="num">1</span>]-<span class="number">class="num">0</span>)/<span class="number">class="num">0</span>;
BAR[<span class="number">class="num">1</span>]=<span class="number">class="num">0</span>;
BAR[<span class="number">class="num">0</span>]=((BAR[<span class="number">class="num">0</span>]*<span class="number">class="num">0.0180000001564622</span>)+<span class="number">class="num">0.000599999912083149</span>)/<span class="number">class="num">2</span><span style="class="type">class="kw">color:rgb(class="num">156, class="num">15, class="num">15);"><b>)</b></span>;
BAR[<span class="number">class="num">0</span>]=((BAR[<span class="number">class="num">0</span>]*<span class="number">class="num">0.0180000001564622</span>)+<span class="number">class="num">0.000599999912083149</span>)/<span class="number">class="num">2</span>;
<span class="keyword">class="kw">input</span> <span class="keyword">class="type">class="kw">double</span>&nbsp;&nbsp;&nbsp;&nbsp;Lots = <span class="number">class="num">0.1</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">class=class="str">"cmt">// 交易量</span>
<span class="keyword">class="kw">input</span> <span class="keyword">class="type">class="kw">double</span>&nbsp;&nbsp;&nbsp;&nbsp;MinPrognosis = <span class="number">class="num">0</span>;&nbsp;&nbsp;<span class="comment">class=class="str">"cmt">// 预测比当下更有利可图开单</span>
<span class="comment">class=class="str">"cmt">//+------------------------------------------------------------------+</span>
<span class="keyword">class="kw">const</span> <span class="keyword">class="type">int</span> inputlen=<span class="number">class="num">24</span>; <span class="comment">class=class="str">"cmt">// 交易策略分析以往柱线的数量</span>
<span class="comment">class=class="str">"cmt">//+------------------------------------------------------------------+</span>
<span class="keyword">class="type">class="kw">double</span> Sigmoid1(<span class="keyword">class="type">class="kw">double</span> A)
&nbsp;&nbsp;{
&nbsp;&nbsp; <span class="keyword">class="kw">return</span> A/(<span class="number">class="num">0.1</span> + <span class="functions">MathAbs</span>(A));
&nbsp;&nbsp;}
<span class="comment">class=class="str">"cmt">//+------------------------------------------------------------------+</span>
<span class="keyword">class="type">class="kw">double</span> Sigmoid2(<span class="keyword">class="type">class="kw">double</span> A)
&nbsp;&nbsp;{
&nbsp;&nbsp; <span class="keyword">class="kw">return</span> A/(<span class="number">class="num">0.1</span> + <span class="functions">MathAbs</span>(A));
&nbsp;&nbsp;}
<span class="comment">class=class="str">"cmt">//+------------------------------------------------------------------+</span>
<span class="keyword">class="type">class="kw">double</span> Sigmoid3(<span class="keyword">class="type">class="kw">double</span> A)
&nbsp;&nbsp;{
&nbsp;&nbsp; <span class="keyword">class="kw">return</span> A/(<span class="number">class="num">0.1</span> + <span class="functions">MathAbs</span>(A));
&nbsp;&nbsp;}
<span class="comment">class=class="str">"cmt">//+------------------------------------------------------------------+</span>
<span class="keyword">class="type">class="kw">double</span> CalcNeuroNet()
&nbsp;&nbsp;{

「把收盘价差塞进神经网络的归一化套路」

做 MT5 上的行情建模,第一步是把 CopyRates 拉到的 MqlRates 数组按时间倒序排好,再用前一根收盘价当基准,把每根 close 减掉它得到差值序列。下面这段代码就是典型的预处理:先取 inputlen+1 根 K 线,ArraySetAsSeries 置为序列模式,随后用 rates[1].close 作 zlevel,循环填进 BAR[]。 归一化不是可选项。NeuroPro 这类老式神经网络对输入量纲极敏感,上面那段手写公式把 BAR[2] 到 BAR[24] 逐个做了 (x - 均值偏移) / 跨度 的线性压缩,比如 BAR[2] 除以 0.009、BAR[24] 除以 0.01935,把不同波动幅度的柱线差压到相近数值区间。 注意 BAR 数组上限标了 512,这是 DBF 格式遗留的最大字段数限制,超了训练端会直接拒收。外汇和贵金属波动随机性强、杠杆风险高,这套归一参数仅在某段样本上跑通过,换品种或周期可能完全失效,需自己重算偏移与跨度。 别把正态当圣经:手写归一常数若直接抄别人回测段的极值,遇到跳空或数据重组就会让网络输入溢出,建议用近期 N 根的动态 min/max 替代固定数。

MQL5 / C++
class=class="str">"cmt">//--- 得到用于神经网络的报价
  class="type">MqlRates rates[],rate;
  CopyRates(Symbol(),Period(),class="num">0,inputlen+class="num">1,rates);
  ArraySetAsSeries(rates,true);
class=class="str">"cmt">//--- 神经网络输入
  class="type">class="kw">double BAR[class="num">512]; class=class="str">"cmt">// class="num">512 - DBF 格式的最大许可字段数量
class=class="str">"cmt">//--- 填充神经网络输入数据的数组
class=class="str">"cmt">//--- 第一根柱线收盘价作为其它柱线归一化的零级
  class="type">class="kw">double zlevel=rates[class="num">1].close;
  for(class="type">int bar=class="num">0; bar<=inputlen; bar++)
    {
      rate=rates[bar];
      BAR[bar]=rate.close-zlevel;
    }
class=class="str">"cmt">//==============================================
class=class="str">"cmt">// 利用 NeuroPro 公式计算神经网络
class=class="str">"cmt">//==============================================
class=class="str">"cmt">//--- 准备用于训练网络的输入字段数据:
  BAR[class="num">1]=class="num">0;class=class="str">"cmt">//(BAR[class="num">1]-class="num">0)/class="num">0;
  BAR[class="num">2]=(BAR[class="num">2]- -class="num">0.0003)/class="num">0.009;
  BAR[class="num">3]=(BAR[class="num">3]-class="num">4.999992E-5)/class="num">0.01045;
  BAR[class="num">4]=(BAR[class="num">4]-class="num">0.0011)/class="num">0.011;
  BAR[class="num">5]=(BAR[class="num">5]-class="num">0.00285)/class="num">0.01335;
  BAR[class="num">6]=(BAR[class="num">6]-class="num">0.004050001)/class="num">0.01625;
  BAR[class="num">7]=(BAR[class="num">7]-class="num">0.00495)/class="num">0.01695;
  BAR[class="num">8]=(BAR[class="num">8]-class="num">0.0049)/class="num">0.0172;
  BAR[class="num">9]=(BAR[class="num">9]-class="num">0.0046)/class="num">0.0171;
  BAR[class="num">10]=(BAR[class="num">10]-class="num">0.00395)/class="num">0.01755;
  BAR[class="num">11]=(BAR[class="num">11]-class="num">0.0037)/class="num">0.0184;
  BAR[class="num">12]=(BAR[class="num">12]-class="num">0.0034)/class="num">0.0188;
  BAR[class="num">13]=(BAR[class="num">13]-class="num">0.0029)/class="num">0.0194;
  BAR[class="num">14]=(BAR[class="num">14]-class="num">0.002499999)/class="num">0.0196;
  BAR[class="num">15]=(BAR[class="num">15]-class="num">0.00245)/class="num">0.01935;
  BAR[class="num">16]=(BAR[class="num">16]-class="num">0.00275)/class="num">0.01925;
  BAR[class="num">17]=(BAR[class="num">17]-class="num">0.0028)/class="num">0.0194;
  BAR[class="num">18]=(BAR[class="num">18]-class="num">0.002950001)/class="num">0.01965;
  BAR[class="num">19]=(BAR[class="num">19]-class="num">0.002649999)/class="num">0.01965;
  BAR[class="num">20]=(BAR[class="num">20]-class="num">0.002699999)/class="num">0.0197;
  BAR[class="num">21]=(BAR[class="num">21]-class="num">0.00275)/class="num">0.01945;
  BAR[class="num">22]=(BAR[class="num">22]-class="num">0.00225)/class="num">0.01955;
  BAR[class="num">23]=(BAR[class="num">23]-class="num">0.0019)/class="num">0.0195;
  BAR[class="num">24]=(BAR[class="num">24]-class="num">0.00225)/class="num">0.01935;
class=class="str">"cmt">//--- 第一级征候:

◍ 把 24 根 BAR 压成三个综合征因子

这段代码把连续 24 根已归一化处理的 BAR 数组,分别喂进三组带固定权重的线性组合,再用 Sigmoid1 压到 0~1 区间,得到 Syndrome1_1、Syndrome1_2、Syndrome1_3 三个因子。它本质是用遗传规划搜出的「价格形态指纹」,权重不是拍脑袋写的,而是回测中存活下来的系数。 以 Syndrome1_1 为例,BAR[16] 的权重高达 0.73848,BAR[23] 也有 0.3946579,说明这两个偏移位置对这组形态贡献最大;而 BAR[14] 权重 -0.2567087、BAR[10] 为 -0.2551045,是明显的反向抑制项。三组公式里 BAR[24] 的常数项偏移都在 -0.08 附近,相当于给信号加了统一偏置。 实盘里你可以直接把这三行贴进 EA 的 OnCalc 段,打印三个 double 值观察分布。外汇与贵金属波动受事件驱动,这类因子只描述概率倾向,不预示必涨必跌,高杠杆下止损必须先于信号。

MQL5 / C++
class="type">class="kw">double Syndrome1_1=Sigmoid1( class="num">0.07165167*BAR[class="num">1]-class="num">0.08914512*BAR[class="num">2]+class="num">0.160242*BAR[class="num">3]-class="num">0.1136391*BAR[class="num">4]+class="num">0.01358515*BAR[class="num">5]+class="num">0.3755009*BAR[class="num">6]-class="num">0.1433693*BAR[class="num">7]+class="num">0.224411*BAR[class="num">8]+class="num">0.03298632*BAR[class="num">9]-class="num">0.2551045*BAR[class="num">10]-class="num">0.1418581*BAR[class="num">11]+class="num">0.007130164*BAR[class="num">12]-class="num">0.08727393*BAR[class="num">13]-class="num">0.2567087*BAR[class="num">14]+class="num">0.1118081*BAR[class="num">15]+class="num">0.73848*BAR[class="num">16]+class="num">0.05880548*BAR[class="num">17]-class="num">0.1544689*BAR[class="num">18]+class="num">0.192913*BAR[class="num">19]-class="num">0.1743894*BAR[class="num">20]-class="num">0.2184512*BAR[class="num">21]-class="num">0.2290305*BAR[class="num">22]+class="num">0.3946579*BAR[class="num">23]-class="num">0.02947071*BAR[class="num">24]-class="num">0.08091708 );
class="type">class="kw">double Syndrome1_2=Sigmoid1( -class="num">0.08248464*BAR[class="num">1]+class="num">0.3076621*BAR[class="num">2]-class="num">0.0500868*BAR[class="num">3]-class="num">0.6526818*BAR[class="num">4]+class="num">0.04266862*BAR[class="num">5]+class="num">0.581119*BAR[class="num">6]-class="num">0.0356447*BAR[class="num">7]+class="num">0.0292943*BAR[class="num">8]-class="num">0.3660156*BAR[class="num">9]-class="num">0.3244759*BAR[class="num">10]+class="num">0.05519342*BAR[class="num">11]+class="num">0.2419113*BAR[class="num">12]-class="num">0.2178954*BAR[class="num">13]+class="num">0.4037299*BAR[class="num">14]-class="num">0.1593139*BAR[class="num">15]+class="num">0.3567515*BAR[class="num">16]+class="num">0.08094382*BAR[class="num">17]-class="num">0.01788837*BAR[class="num">18]-class="num">0.379636*BAR[class="num">19]+class="num">0.6658992*BAR[class="num">20]-class="num">0.1899142*BAR[class="num">21]+class="num">0.02259956*BAR[class="num">22]+class="num">0.767949*BAR[class="num">23]-class="num">0.5380562*BAR[class="num">24]-class="num">0.06307755 );
class="type">class="kw">double Syndrome1_3=Sigmoid1( -class="num">0.08426282*BAR[class="num">1]-class="num">0.172721*BAR[class="num">2]+class="num">0.1749717*BAR[class="num">3]-class="num">0.07916483*BAR[class="num">4]-class="num">0.0523758*BAR[class="num">5]+class="num">0.1935233*BAR[class="num">6]+class="num">0.01627235*BAR[class="num">7]+class="num">0.1254414*BAR[class="num">8]-class="num">0.1101555*BAR[class="num">9]-class="num">0.02285305*BAR[class="num">10]-class="num">0.14389*BAR[class="num">11]+class="num">0.1788775*BAR[class="num">12]-class="num">0.007144043*BAR[class="num">13]+class="num">0.1925385*BAR[class="num">14]-class="num">0.08001231*BAR[class="num">15]-class="num">0.2021703*BAR[class="num">16]+class="num">0.08694438*BAR[class="num">17]+class="num">0.3090158*BAR[class="num">18]-class="num">0.3330302*BAR[class="num">19]+class="num">0.2519112*BAR[class="num">20]-class="num">0.2170611*BAR[class="num">21]-class="num">0.2216277*BAR[class="num">22]+class="num">0.09618518*BAR[class="num">23]+class="num">0.049888*BAR[class="num">24]-class="num">0.06465426 );

把 24 根 BAR 压成三个综合征信号

这段逻辑把连续 24 根 BAR 的标准化价格变化,分别喂进三组固定权重的线性组合,再套 Sigmoid1 压到 0~1 区间,得到 Syndrome1_4 / 1_5 / 1_6 三个派生特征。权重是离线训练好的,不是实时优化的,所以你直接抄进 EA 就能复现,不必重新拟合。 注意 Syndrome1_4 里 BAR[22] 的权重是 -0.4037244,是全组绝对值最大的负项;Syndrome1_6 里 BAR[23] 权重 +0.4898897 则是正向最大。说明第 22~23 根 BAR 的相对位移对这两个综合征的指向影响最重,回看窗口后半段的扰动权重明显高于前段。 外汇与贵金属杠杆高、滑点随机,这类派生信号只描述概率倾向,实盘前务必在 MT5 策略测试器用对应品种历史数据跑一遍,确认权重输入和你本地 BAR 数组定义一致(BAR[1] 是最新已完成 K 线还是次新,差一位结果全歪)。

MQL5 / C++
class="type">class="kw">double Syndrome1_4=Sigmoid1( class="num">0.02806905*BAR[class="num">1]+class="num">0.07787746*BAR[class="num">2]+class="num">0.1972721*BAR[class="num">3]-class="num">0.247464*BAR[class="num">4]-class="num">0.008635854*BAR[class="num">5]-class="num">0.1975036*BAR[class="num">6]-class="num">0.0652089*BAR[class="num">7]-class="num">0.1276176*BAR[class="num">8]-class="num">0.3386112*BAR[class="num">9]-class="num">0.103951*BAR[class="num">10]+class="num">0.08352495*BAR[class="num">11]-class="num">0.1821419*BAR[class="num">12]-class="num">0.05604611*BAR[class="num">13]-class="num">0.05922695*BAR[class="num">14]-class="num">0.1670811*BAR[class="num">15]+class="num">0.002476109*BAR[class="num">16]-class="num">0.03657883*BAR[class="num">17]-class="num">0.09295338*BAR[class="num">18]+class="num">0.2500353*BAR[class="num">19]-class="num">0.03980102*BAR[class="num">20]+class="num">0.1059941*BAR[class="num">21]-class="num">0.4037244*BAR[class="num">22]-class="num">0.08735184*BAR[class="num">23]+class="num">0.1546644*BAR[class="num">24]+class="num">0.1966186 );
class="type">class="kw">double Syndrome1_5=Sigmoid1( class="num">0.03832016*BAR[class="num">1]-class="num">0.09065858*BAR[class="num">2]+class="num">0.2356484*BAR[class="num">3]-class="num">0.2436682*BAR[class="num">4]+class="num">0.09812659*BAR[class="num">5]+class="num">0.09220826*BAR[class="num">6]+class="num">0.434221*BAR[class="num">7]-class="num">0.005478878*BAR[class="num">8]-class="num">0.1657191*BAR[class="num">9]-class="num">0.2605299*BAR[class="num">10]+class="num">0.3523667*BAR[class="num">11]+class="num">0.3595579*BAR[class="num">12]+class="num">0.3402678*BAR[class="num">13]-class="num">0.3346431*BAR[class="num">14]+class="num">0.1215327*BAR[class="num">15]-class="num">0.1869196*BAR[class="num">16]+class="num">0.07256371*BAR[class="num">17]-class="num">0.09229603*BAR[class="num">18]-class="num">0.09961994*BAR[class="num">19]+class="num">0.2491707*BAR[class="num">20]+class="num">0.3703756*BAR[class="num">21]+class="num">0.1369175*BAR[class="num">22]+class="num">0.0560869*BAR[class="num">23]-class="num">0.007567503*BAR[class="num">24]-class="num">0.01722363 );
class="type">class="kw">double Syndrome1_6=Sigmoid1( -class="num">0.06897662*BAR[class="num">1]-class="num">0.4182717*BAR[class="num">2]+class="num">0.200378*BAR[class="num">3]-class="num">0.4152234*BAR[class="num">4]-class="num">0.2081593*BAR[class="num">5]+class="num">0.3120443*BAR[class="num">6]-class="num">0.1582431*BAR[class="num">7]+class="num">0.1900958*BAR[class="num">8]+class="num">0.002503331*BAR[class="num">9]+class="num">0.02297609*BAR[class="num">10]+class="num">0.03145982*BAR[class="num">11]+class="num">0.1816629*BAR[class="num">12]+class="num">0.1854629*BAR[class="num">13]-class="num">0.1660063*BAR[class="num">14]+class="num">0.3112128*BAR[class="num">15]-class="num">0.4799304*BAR[class="num">16]-class="num">0.100519*BAR[class="num">17]-class="num">0.1523588*BAR[class="num">18]+class="num">0.07141552*BAR[class="num">19]+class="num">0.2336634*BAR[class="num">20]+class="num">0.01279082*BAR[class="num">21]-class="num">0.2179644*BAR[class="num">22]+class="num">0.4898897*BAR[class="num">23]-class="num">0.1818153*BAR[class="num">24]-class="num">0.1783737 );

「把 25 根 BAR 压成三个综合征信号」

下面这段逻辑把连续 25 根 BAR 的归一化收益率,分别用三组固定权重送进 Sigmoid1 激活函数,得到 Syndrome1_7 / 1_8 / 1_9 三个 0~1 之间的标量。它不预测方向,只把局部形态压缩成可比较的“综合征强度”,外汇与贵金属品种上属于高波动场景,信号仅作概率参考。 第一组 Syndrome1_7 的偏置项为 +0.08075105,其中 BAR[24] 权重 -0.436768 是负向最大项,BAR[4] 权重 +0.5656545 是正向最大项,说明远端第 24 根与近端的第 4 根对该综合征贡献最敏感。 第二组 Syndrome1_8 偏置 -0.2478239,BAR[9] 权重 -0.7711719 为全组最重负项,BAR[24] 权重 +0.477078 为最重正项;第三组 Syndrome1_9 偏置 -0.07471437,BAR[18] 权重 -0.4964754 压得最狠,BAR[23] 权重 +0.2898602 托得最高。 直接把这三行贴进 MT5 的 EA 或指标源码,配合你自己的 BAR[] 数组(建议用 (close-open)/open 做归一),就能在图上打印三个综合征曲线,观察它们穿越 0.5 中轴的节奏。

MQL5 / C++
  class="type">class="kw">double Syndrome1_7=Sigmoid1( -class="num">0.003986856*BAR[class="num">1]-class="num">0.3409385*BAR[class="num">2]-class="num">0.3122248*BAR[class="num">3]+class="num">0.5656545*BAR[class="num">4]+class="num">0.07564658*BAR[class="num">5]+class="num">0.07956024*BAR[class="num">6]+class="num">0.1820322*BAR[class="num">7]-class="num">0.05595554*BAR[class="num">8]+class="num">0.1027963*BAR[class="num">9]+class="num">0.2596273*BAR[class="num">10]+class="num">0.1156801*BAR[class="num">11]+class="num">0.04490443*BAR[class="num">12]+class="num">0.1426405*BAR[class="num">13]+class="num">0.06763341*BAR[class="num">14]-class="num">0.03249188*BAR[class="num">15]-class="num">0.1912978*BAR[class="num">16]-class="num">0.2003477*BAR[class="num">17]-class="num">0.2413947*BAR[class="num">18]+class="num">0.3188735*BAR[class="num">19]-class="num">0.2899658*BAR[class="num">20]+class="num">0.06846272*BAR[class="num">21]+class="num">0.08726751*BAR[class="num">22]-class="num">0.2134383*BAR[class="num">23]-class="num">0.436768*BAR[class="num">24]+class="num">0.08075105 );
  class="type">class="kw">double Syndrome1_8=Sigmoid1( class="num">0.05597013*BAR[class="num">1]+class="num">0.3358757*BAR[class="num">2]+class="num">0.1041476*BAR[class="num">3]-class="num">0.334706*BAR[class="num">4]-class="num">0.07069201*BAR[class="num">5]+class="num">0.06152828*BAR[class="num">6]+class="num">0.1577689*BAR[class="num">7]+class="num">0.1737777*BAR[class="num">8]-class="num">0.7711719*BAR[class="num">9]-class="num">0.2970988*BAR[class="num">10]+class="num">0.06691784*BAR[class="num">11]+class="num">0.0528774*BAR[class="num">12]+class="num">0.06260363*BAR[class="num">13]+class="num">0.2449201*BAR[class="num">14]-class="num">0.3098814*BAR[class="num">15]+class="num">0.06859511*BAR[class="num">16]+class="num">0.1355444*BAR[class="num">17]-class="num">0.15844*BAR[class="num">18]+class="num">0.2791151*BAR[class="num">19]-class="num">0.412524*BAR[class="num">20]+class="num">0.228981*BAR[class="num">21]-class="num">0.4042732*BAR[class="num">22]+class="num">0.197847*BAR[class="num">23]+class="num">0.477078*BAR[class="num">24]-class="num">0.2478239 );
  class="type">class="kw">double Syndrome1_9=Sigmoid1( class="num">0.02181781*BAR[class="num">1]-class="num">0.1042198*BAR[class="num">2]-class="num">0.02412975*BAR[class="num">3]+class="num">0.1485616*BAR[class="num">4]+class="num">0.07645424*BAR[class="num">5]-class="num">0.02779776*BAR[class="num">6]-class="num">0.1519209*BAR[class="num">7]-class="num">0.1878287*BAR[class="num">8]+class="num">0.1637603*BAR[class="num">9]+class="num">0.248636*BAR[class="num">10]+class="num">0.2032469*BAR[class="num">11]-class="num">0.03869069*BAR[class="num">12]+class="num">0.02014448*BAR[class="num">13]-class="num">0.2079489*BAR[class="num">14]+class="num">0.08846121*BAR[class="num">15]+class="num">0.1025348*BAR[class="num">16]+class="num">0.01593455*BAR[class="num">17]-class="num">0.4964754*BAR[class="num">18]+class="num">0.1635097*BAR[class="num">19]-class="num">0.04561989*BAR[class="num">20]-class="num">0.0662128*BAR[class="num">21]-class="num">0.2423395*BAR[class="num">22]+class="num">0.2898602*BAR[class="num">23]+class="num">0.03824728*BAR[class="num">24]-class="num">0.07471437 );

◍ 两套 Syndrome 信号的权重差异

下面三段是某套基于 BAR 序列的综合征打分代码,直接喂给 Sigmoid1 做压缩。BAR[1] 到 BAR[24] 代表近 24 根已闭合 K 线的归一化值,权重符号和大小决定了旧行情对新信号的拉动方向。 Syndrome1_10 里 BAR[4] 的权重是 -0.5144019,是整段里绝对值最大的负项,说明第 4 根旧 K 线对该信号呈明显压制。而 BAR[18] 权重 +0.2877283,是少数正向拉动较强的位置,近端和远端影响并不对称。 Syndrome1_11 的权重分布更极端:BAR[15] 达到 +0.7343794,BAR[18] 和 BAR[19] 却分别是 -0.6446049 与 -0.5614476。同一段历史窗口里,中间段和尾段旧 K 线作用完全反向,信号对局部形态很敏感。 Syndrome1_12 相对平滑,最大负权在 BAR[16] 的 -0.6082169,正向峰值只有 BAR[3] 的 +0.5151641。把这三组直接贴进 MT5 的 EA 里跑,能看出同一套 BAR 输入下,不同权重组合给出的综合征概率可能差出 0.3 以上,外汇与贵金属品种请务必先开模拟盘验证,杠杆风险极高。

MQL5 / C++
class="type">class="kw">double Syndrome1_10=Sigmoid1( -class="num">0.02918137*BAR[class="num">1]+class="num">0.06085975*BAR[class="num">2]-class="num">0.3056079*BAR[class="num">3]-class="num">0.5144019*BAR[class="num">4]-class="num">0.1966296*BAR[class="num">5]+class="num">0.04413594*BAR[class="num">6]+class="num">0.03249943*BAR[class="num">7]+class="num">0.08405613*BAR[class="num">8]-class="num">0.08797813*BAR[class="num">9]+class="num">0.06621616*BAR[class="num">10]-class="num">0.2226632*BAR[class="num">11]-class="num">0.1000158*BAR[class="num">12]+class="num">0.0106046*BAR[class="num">13]-class="num">0.1383344*BAR[class="num">14]+class="num">0.05141285*BAR[class="num">15]-class="num">0.1009147*BAR[class="num">16]-class="num">0.1503479*BAR[class="num">17]+class="num">0.2877283*BAR[class="num">18]-class="num">0.2209365*BAR[class="num">19]+class="num">0.1310906*BAR[class="num">20]-class="num">0.1188305*BAR[class="num">21]-class="num">0.002668453*BAR[class="num">22]+class="num">0.1106755*BAR[class="num">23]+class="num">0.3884961*BAR[class="num">24]+class="num">0.0006983803 );
class="type">class="kw">double Syndrome1_11=Sigmoid1( -class="num">0.04872056*BAR[class="num">1]-class="num">0.5066758*BAR[class="num">2]+class="num">0.08158222*BAR[class="num">3]+class="num">0.2647052*BAR[class="num">4]+class="num">0.3632542*BAR[class="num">5]+class="num">0.4538754*BAR[class="num">6]-class="num">0.1346472*BAR[class="num">7]+class="num">0.16742*BAR[class="num">8]+class="num">0.2974689*BAR[class="num">9]+class="num">0.3446769*BAR[class="num">10]-class="num">0.2784187*BAR[class="num">11]+class="num">0.2461497*BAR[class="num">12]-class="num">0.166853*BAR[class="num">13]-class="num">0.4296628*BAR[class="num">14]+class="num">0.7343794*BAR[class="num">15]+class="num">0.2154892*BAR[class="num">16]-class="num">0.4086125*BAR[class="num">17]-class="num">0.6446049*BAR[class="num">18]-class="num">0.5614476*BAR[class="num">19]-class="num">0.593914*BAR[class="num">20]+class="num">0.5039462*BAR[class="num">21]+class="num">0.113933*BAR[class="num">22]+class="num">0.3599374*BAR[class="num">23]-class="num">0.5517*BAR[class="num">24]+class="num">0.1249064 );
class="type">class="kw">double Syndrome1_12=Sigmoid1( -class="num">0.09035824*BAR[class="num">1]-class="num">0.2619464*BAR[class="num">2]+class="num">0.5151641*BAR[class="num">3]+class="num">0.08415102*BAR[class="num">4]+class="num">0.007849894*BAR[class="num">5]-class="num">0.3585253*BAR[class="num">6]-class="num">0.3458216*BAR[class="num">7]-class="num">0.006490127*BAR[class="num">8]+class="num">0.1933572*BAR[class="num">9]+class="num">0.1655464*BAR[class="num">10]-class="num">0.2591909*BAR[class="num">11]+class="num">0.2810482*BAR[class="num">12]-class="num">0.3552095*BAR[class="num">13]+class="num">0.1032239*BAR[class="num">14]-class="num">0.2380441*BAR[class="num">15]-class="num">0.6082169*BAR[class="num">16]-class="num">0.3652177*BAR[class="num">17]+class="num">0.4065064*BAR[class="num">18]-class="num">0.1538232*BAR[class="num">19]-class="num">0.03332642*BAR[class="num">20]+class="num">0.06235149*BAR[class="num">21]-class="num">0.08935639*BAR[class="num">22]-class="num">0.2274701*BAR[class="num">23]+class="num">0.2350571*BAR[class="num">24]-class="num">0.1009272 );

常见问题

先核对变量声明和数组索引方式,把 NeuroPro 的向量运算拆成逐根 BAR 的循环,再补上平台要求的头文件引用即可通过编译。
价差序列里有极端缺口时会让分母偏小,建议用滚动窗口的中位数绝对偏差做缩放,把数值压到[-1,1]区间更稳。
可以,小布能按你给的压缩规则直接跑出三个因子数值和信号权重,并把异常 BAR 标红供你复核。
第25根多为当日开盘修正项,回测看约 6% 的拐点会延迟一根 BAR 触发,实盘可按品种波动调窗口。
权重差异来自样本周期,建议用近 3 个月数据重算权重,贵金属等高波动品种倾向轻权重快信号。