针对交易的组合数学和概率论(第三部分):第一个数学模型·综合运用
(3/3)·对称到非对称走廊的推导闭环,把前两相公式收敛成 EA 可直接调用的数学内核
上行与下行步数的幂次原型封装
这段代码片段给出了价格路径模型中「向上步数累计」和「向下步数累计」的两个幂次原型函数,分别处理 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 小时图上的路径期望偏移——外汇与贵金属杠杆高,模型输出仅代表概率倾向,实盘须严控仓位。
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 里把这段接在你已有的分量计算之后,能快速验证合成值是否随周期参数跳变;外汇与贵金属波动剧烈,该值仅反映历史分量叠加,不预示后续方向。
Mt.SUDd=Mt.SPUd+Mt.SPDd;
class="kw">return Mt;
}◍ 数学模型还能往哪儿拓
这套定价数学模型是从零推导出来的,没有借任何现成框架,跑通之后验证成本比预期低。后续会把模型往更通用的方向推,目标不是单品种拟合,而是用同一套数学结构描述任意交易配置的主要特征。 模型一旦通用化,就不只用来刻画价格过程,也能直接描述交易信号,把多层嵌套的复杂策略压成更薄的逻辑。这条路要啃的时间不会短,但每推进一步,都可以在 MT5 里用历史数据回测来确认化简后策略是否保真。
画得少,看得清
这套组合数学与概率论的连载走到这里,前几节把分形通用结构和基础模型都铺完了,真正能搬上 MT5 的其实就一件事:用订单簿里的挂单聚集区反推价格移动的概率,而不是去猜明确方向。 有读者在讨论里用 Excel 复现了价格变动示例,结论是只有进入并执行的市价单才会推动价格,挂单本身不动价——这和 MT5 部分券商提供的真实订单簿逻辑一致,但外汇和贵金属自带高杠杆高风险,这类概率模型只给几率不给确定性。 把前面说的浓缩成一条:少画几条线,盯住订单簿厚度和分形层级,反而比堆指标更容易看出下一步概率倾斜在哪。开 MT5 找个显示 DOM 的品种,把挂单量突增的位置标出来,就能验证这一节说的「距离小、成交大」的价格跳法。