针对交易的组合数学和概率论(第三部分):第一个数学模型·综合运用
📐

针对交易的组合数学和概率论(第三部分):第一个数学模型·综合运用

(3/3)·对称到非对称走廊的推导闭环,把前两相公式收敛成 EA 可直接调用的数学内核

含代码示例偏理论 第 3/3 篇
很多人把分形公式当一次性结论,算完平均步阶数就丢进回测。其实非对称走廊里 m≠n 这个细节,直接决定你模型在实盘震荡区的失效概率。先把嵌套性质吃透,再谈实现。

上行与下行步数的幂次原型封装

这段代码片段给出了价格路径模型中「向上步数累计」和「向下步数累计」的两个幂次原型函数,分别处理 m>=n(上行主导)与 m<n(下行主导)两种情形。 KpnEasy 先根据 p 与 0.5 的偏离方向确定符号 D,当 p 恰好等于 0.5 时 D 取 1.0,避免除零;随后用 Log(SUu(n,m),n) 算出基础对数项并减去 1,再乘上以 ((p-0.5)/(0.5*p)) 为底、A 为指数的幂次修正。KpmEasy 逻辑对称,只是把基准换成了 SDd(n,m) 与 m,方向项改为 (0.5-p)/(0.5*(1.0-p))。 SUuS 与 SDdS 只是把前面的 K 修正系数套进 MathPow,直接返回 SUu(n,m)^KpnEasy 与 SDd(n,m)^KpmEasy,供后续模型调用。 CalculateMathModel 是总装入口,默认参数 K=0.582897、A=2.189246 是拟合出来的常数;当 m>=n 时先算总路径 Ss,再推导 pU、pD 以及四类条件步数和(SUu/SUd/SDu/SDd),并在 pU 为 1.0 时把对应条件期望置 0 防除零。读者可在 MT5 里把这两组常数改成自己品种回测出的拟合值,观察 EURUSD 或 XAUUSD 在 1 小时图上的路径期望偏移——外汇与贵金属杠杆高,模型输出仅代表概率倾向,实盘须严控仓位。

MQL5 / C++
class="type">class="kw">double KpnEasy(class="type">int n,class="type">int m, class="type">class="kw">double p,class="type">class="kw">double A)class=class="str">"cmt">//power prototype for steps up m>=n
  {
  class="type">class="kw">double D;
  if ( p-class="num">0.5 != class="num">0 ) D=(p-class="num">0.5)/MathAbs(p-class="num">0.5);
  else D=class="num">1.0;
  class="kw">return class="num">1.0 + D*(Log(SUu(n,m),n) - class="num">1)*MathPow(((p-class="num">0.5)/(class="num">0.5*p)),A);
  }
class="type">class="kw">double KpmEasy(class="type">int n,class="type">int m,class="type">class="kw">double p,class="type">class="kw">double A)class=class="str">"cmt">//power prototype for steps down m<n
  {
  class="type">class="kw">double D;
  if ( class="num">0.5-p != class="num">0 ) D=(class="num">0.5-p)/MathAbs(class="num">0.5-p);
  else D=class="num">1.0;
  class="kw">return class="num">1.0 + D*(Log(SDd(n,m),m) - class="num">1)*MathPow(((class="num">0.5-p)/(class="num">0.5*(class="num">1.0-p))),A);
  }

class="type">class="kw">double SUuS(class="type">int n,class="type">int m,class="type">class="kw">double p, class="type">class="kw">double A)class=class="str">"cmt">//full prototype for average steps up m>=n
  {
  class="kw">return MathPow(SUu(n,m),KpnEasy(n,m,p,A));
  }

class="type">class="kw">double SDdS(class="type">int n,class="type">int m,class="type">class="kw">double p, class="type">class="kw">double A)class=class="str">"cmt">//full prototype for average steps down  n>m
  {
  class="kw">return MathPow(SDd(n,m),KpmEasy(n,m,p,A));
  }    

MathModel1 CalculateMathModel(class="type">int n, class="type">int m, class="type">class="kw">double p,class="type">class="kw">double K=class="num">0.582897,class="type">class="kw">double A=class="num">2.189246)class=class="str">"cmt">//calculating the entire mathematical model
  {
  MathModel1 Mt;
  if ( m >= n )
    {
    Mt.S=Ss(n,m,p,K);
    Mt.pU=(class="num">2*p*Mt.S-Mt.S+m)/(n+m);
    Mt.pD=class="num">1.0-Mt.pU;
    Mt.SUu=SUuS(n,m,p,A);
    Mt.SUd=Mt.SUu-n;
    if (class="num">1.0-Mt.pU != class="num">0.0) Mt.SDu=(Mt.S*p-Mt.SUu*Mt.pU)/(class="num">1.0-Mt.pU);
    else Mt.SDu=class="num">0.0;
    if (class="num">1.0-Mt.pU != class="num">0.0) Mt.SDd=(Mt.S*(class="num">1.0-p)-Mt.SUd*Mt.pU)/(class="num">1.0-Mt.pU);
    else Mt.SDd=class="num">0.0;
    }
  else
    {
    Mt.S=Ss(n,m,p,K);
    Mt.pU=(class="num">2*p*Mt.S-Mt.S+m)/(n+m);
    Mt.pD=class="num">1.0-Mt.pU;
    Mt.SDd=SDdS(n,m,p,A);
    Mt.SDu=Mt.SDd-m;
    if (Mt.pU != class="num">0.0) Mt.SUd=(Mt.S*(class="num">1.0-p)-Mt.SDd*(class="num">1.0-Mt.pU))/Mt.pU;
    else Mt.SUd=class="num">0.0;
    if (Mt.pU != class="num">0.0) Mt.SUu=(Mt.S*p-Mt.SDu*(class="num">1.0-Mt.pU))/Mt.pU;
    else Mt.SUu=class="num">0.0;    
    }

  Mt.SPUu=Mt.SUu*Mt.pU;
  Mt.SPUd=Mt.SUd*Mt.pU;
  Mt.SPDu=Mt.SDu*Mt.pD;
  Mt.SPDd=Mt.SDd*Mt.pD;

  Mt.SPUud=Mt.SPUu+Mt.SPUd;
  Mt.SPDud=Mt.SPDu+Mt.SPDd;

  Mt.SUDu=Mt.SPUu+Mt.SPDu;

「多周期波动分量求和的收口写法」

这段收尾只做了一件事:把上行与下行的周期波动分量相加,作为 Mt 的最终输出值。 Mt.SUDd=Mt.SPUd+Mt.SPDd; 将上行驱动分量 SPUd 与下行驱动分量 SPDd 累加进 Mt.SUDd,构成合成波动。 return Mt; 直接把填充完字段的结构体返回给调用方,函数到此结束。 在 MT5 里把这段接在你已有的分量计算之后,能快速验证合成值是否随周期参数跳变;外汇与贵金属波动剧烈,该值仅反映历史分量叠加,不预示后续方向。

MQL5 / C++
  Mt.SUDd=Mt.SPUd+Mt.SPDd;

  class="kw">return Mt;
  }

◍ 数学模型还能往哪儿拓

这套定价数学模型是从零推导出来的,没有借任何现成框架,跑通之后验证成本比预期低。后续会把模型往更通用的方向推,目标不是单品种拟合,而是用同一套数学结构描述任意交易配置的主要特征。 模型一旦通用化,就不只用来刻画价格过程,也能直接描述交易信号,把多层嵌套的复杂策略压成更薄的逻辑。这条路要啃的时间不会短,但每推进一步,都可以在 MT5 里用历史数据回测来确认化简后策略是否保真。

画得少,看得清

这套组合数学与概率论的连载走到这里,前几节把分形通用结构和基础模型都铺完了,真正能搬上 MT5 的其实就一件事:用订单簿里的挂单聚集区反推价格移动的概率,而不是去猜明确方向。 有读者在讨论里用 Excel 复现了价格变动示例,结论是只有进入并执行的市价单才会推动价格,挂单本身不动价——这和 MT5 部分券商提供的真实订单簿逻辑一致,但外汇和贵金属自带高杠杆高风险,这类概率模型只给几率不给确定性。 把前面说的浓缩成一条:少画几条线,盯住订单簿厚度和分形层级,反而比堆指标更容易看出下一步概率倾斜在哪。开 MT5 找个显示 DOM 的品种,把挂单量突增的位置标出来,就能验证这一节说的「距离小、成交大」的价格跳法。

把模型推导交给小布盯盘验算
这些分形嵌套与走廊步阶的推导,小布盯盘的 AIGC 已内置符号验算,打开对应品种页即可比对你的 EA 参数是否踩在模型边界上。

常见问题

对称时 m=n 退化为 S=K²;非对称需用 S=n*m 分别计上下半步阶数,K 不再适用,这是前篇特例的推广。
它说明分形可嵌套,复杂分形能拆成简单分形乘积,便于把大周期结构降维到小周期分别计算再合成。
可以,小布内置的 AIGC 验算能对照品种页历史分形,提示走廊假设偏离度;外汇贵金属杠杆高,模型外推仅作概率参考。
为兼容非对称情况,原 K 仅镜像等价,重新定义后公式统一,避免 EA 在单边市误用对称结论。
指在幂原型中按边界约束筛选拟合度最高的函数族,作为后续算法输入,减少过拟合可能。