MQL5 中的范畴论 (第 12 部分):秩序(Orders)·进阶篇
📘

MQL5 中的范畴论 (第 12 部分):秩序(Orders)·进阶篇

第 2/2 篇

◍ 偏序与线性序在行情分类里的取舍

做价格行为分析时,MQL5 里把秩序论落地的关键,是给已有 5 步交易数据结构套上二元函数,吐出输入子集。本文只盯偏序和线性序两种:线性序强制全可比,偏序允许输出里出现「无法归类」的成员。 实战差异很直接。把图表 K 线按看涨/看跌分类,长影线十字星、墓碑十字、蜻蜓十字严格说非牛非熊。线性序为保可比性只能删掉这些点;偏序能保留,而它们常出现在主要支撑阻力区——省略它们,交易系统对设置的定义就会偏。偏序加的反对称属性,正好拿来过滤信号噪音。 另一头,资产组合评估反而该用线性序。面对一堆待选资产,线性序用统一权重排好优先级,先决策高权重项再谈配置规模,每种资产权重可代表动用资本比例;偏序很难稳定给出这种规模参照。外汇与贵金属波动剧烈,用哪类序做过滤或配资,都得先在小周期回测验证,高风险不可逆。 把 K 线形态矢量化也能借偏序思路:每根柱线写成权重数组,算新形态与历史形态的欧几里得距离,距离最近的已训练形态的后继价格式,可当作新形态较可能的结果——这只是概率倾向,不是确定性出口。

偏序与线性序下的系统搭建差异

这套交易系统是在前文 5 步法的基础上做的二次开发,实际只取了第 2 到第 4 步里的临时环节。两个变体一个走偏序、一个走线性序,核心差别在元素可比性。 偏序版本里,幺半群集合整体不可比:回溯周期是整数类型,价格是字符串枚举,指标类型也由字符串硬性指定。三者之间没有天然的先后或大小关系,不能直接套线性排序那套。 要让偏序结构也能用上二元运算符,就得人为引入可比桥梁,否则运算符无从施加。MT5 里可先打印三类输入的运行时类型,确认它们确实处于不可比状态,再决定怎么补映射。 外汇与贵金属市场高杠杆、高波动,这类结构实验仅用于逻辑验证,不代表任何收益可能。

「偏序与线性序在尾随停止里的实盘分野」

把自相关索引当作排序函数的输入,意味着我们不再手动给幺半群集赋权重。偏序只常规化两对集合、第三组留空,流程会塌成 4 步;线性序强制全部常规化,维持原先的 5 步结构。两者都靠同一个索引映射,先映射的集比后映射的权重更高,所以物理权重数字纯属多余。 在多头与空头尾随停止里嵌入偏序处理后,用函数库动量震荡信号类、固定保证金跑 USDJPY 近 12 个月:偏序版本收益超十万、多数盈利平仓由尾随触发,且没有用任何价格目标止盈止损。线性序版本交易次数更少,净值回撤反而更糟,利润也不如偏序。 别把正态当圣经 这套对照只在 USDJPY 单品种、12 个月窗口下成立。要判定偏序是否普遍占优,得拉多个品种和更长周期重跑,外汇与贵金属自带高杠杆高风险,结论仅作方法参考而非盈利保证。 线性序要求所有集可互比、必须穷举,代码上就是把每个索引都映射到全部集;偏序则每个索引只映射两个集,第三个未定义。下面这段排序函数展示了索引如何按 Spearman 相关系数落进 LongIndex / ShortIndex。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//|                                                                  |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CTrailingCT::Ordering(class="type">int Lookback)
  {
   m_low.Refresh(-class="num">1);
   m_high.Refresh(-class="num">1);
   m_close.Refresh(-class="num">1);
   
   class="type">class="kw">double _c[],_l[],_h[];
   
   ArrayResize(_c,Lookback);ArrayInitialize(_c,class="num">0.0);
   ArrayResize(_l,Lookback);ArrayInitialize(_l,class="num">0.0);
   ArrayResize(_h,Lookback);ArrayInitialize(_h,class="num">0.0);
   
   for(class="type">int i=class="num">0;i<Lookback;i++)
   {
    _c[i]=m_close.GetData(i);
    _l[i]=m_low.GetData(Lookback+i);
    _h[i]=m_high.GetData(Lookback+i);
   }
   
   class="type">class="kw">double _r_h=class="num">0.0,_r_l=class="num">0.0;
   
   if(MathCorrelationSpearman(_c,_l,_r_l) && MathCorrelationSpearman(_c,_h,_r_h))
   {
    if(_r_l>=__PHI){ LongIndex(class="num">5); }
    else if(_r_l>=(class="num">1.0-__PHI)){ LongIndex(class="num">4); }
    else if(_r_l>=(class="num">0.0)){ LongIndex(class="num">3); }
    else if(_r_l>=(-class="num">1.0+__PHI)){ LongIndex(class="num">2); }
    else if(_r_l>=(-__PHI)){ LongIndex(class="num">1); }
    else{ LongIndex(class="num">0);}
    
    if(_r_h>=__PHI){ ShortIndex(class="num">5); }
    else if(_r_h>=(class="num">1.0-__PHI)){ ShortIndex(class="num">4); }
    else if(_r_h>=(class="num">0.0)){ ShortIndex(class="num">3); }
    else if(_r_h>=(-class="num">1.0+__PHI)){ ShortIndex(class="num">2); }
    else if(_r_h>=(-__PHI)){ ShortIndex(class="num">1); }
    else{ ShortIndex(class="num">0);}
    
    class="kw">return(true);
   }
   

◍ 多分支下的参数求值顺序

这段逻辑展示了当 m_long_index 从 0 到 5 变化时,回看周期、应用价格和指标值三个变量的求值次序被刻意打乱。 实际在 MT5 里跑,你会看到同一组输入在不同分支下可能先定 _lookback 还是先定 _appliedprice,会直接影响 GetIndicator 拿到的缓冲数组长度。比如 m_long_index==3 时先用默认回看和默认价格算好 _indicator,再回头补 _appliedprice_lookback,与 m_long_index==0 的先后完全相反。 这种写法通常用于遍历参数组合做优化扫描,每一支都保证三个量最终被赋值,但中间态不同。外汇与贵金属杠杆高,此类枚举遍历若用于实盘信号生成,需先在策略测试器确认各分支输出无越界。 把下面代码贴进 EA 的对应函数体,改 m_long_index 跑一遍,能直接观察分支差异。

MQL5 / C++
   class="kw">return(class="kw">false);
   }
	ENUM_TIMEFRAMES _timeframe=GetTimeframe(m_timeframe,__TIMEFRAMES);



   class="type">int _lookback=m_default_lookback;
   ENUM_APPLIED_PRICE _appliedprice=__APPLIEDPRICES[m_default_appliedprice];
   class="type">class="kw">double _indicator=m_default_indicator;

   if(m_long_index==class="num">0)
   {
      _lookback=GetLookback(m_lookback,__LOOKBACKS,_timeframe);
      _appliedprice=GetAppliedprice(m_appliedprice,__APPLIEDPRICES,_lookback,_timeframe);
      _indicator=GetIndicator(_lookback,_timeframe,_appliedprice);
   }
   else if(m_long_index==class="num">1)
   {
      _appliedprice=GetAppliedprice(m_appliedprice,__APPLIEDPRICES,__LOOKBACKS[m_default_lookback],_timeframe);
      _lookback=GetLookback(m_lookback,__LOOKBACKS,_timeframe);
      _indicator=GetIndicator(_lookback,_timeframe,_appliedprice);
   }
   else if(m_long_index==class="num">2)
   {
      _appliedprice=GetAppliedprice(m_appliedprice,__APPLIEDPRICES,__LOOKBACKS[m_default_lookback],_timeframe);
      _indicator=GetIndicator(m_default_lookback,_timeframe,_appliedprice);
      _lookback=GetLookback(m_lookback,__LOOKBACKS,_timeframe);
   }
   else if(m_long_index==class="num">3)
   {
      _indicator=GetIndicator(__LOOKBACKS[m_default_lookback],_timeframe,__APPLIEDPRICES[m_default_appliedprice]);
      _appliedprice=GetAppliedprice(m_appliedprice,__APPLIEDPRICES,m_default_lookback,_timeframe);
      _lookback=GetLookback(m_lookback,__LOOKBACKS,_timeframe);
   }
   else if(m_long_index==class="num">4)
   {
      _indicator=GetIndicator(__LOOKBACKS[m_default_lookback],_timeframe,__APPLIEDPRICES[m_default_appliedprice]);
      _lookback=GetLookback(m_lookback,__LOOKBACKS,_timeframe);
      _appliedprice=GetAppliedprice(m_appliedprice,__APPLIEDPRICES,_lookback,_timeframe);
   }
   else if(m_long_index==class="num">5)
   {
      _lookback=GetLookback(m_lookback,__LOOKBACKS,_timeframe);
      _indicator=GetIndicator(_lookback,_timeframe,__APPLIEDPRICES[m_default_appliedprice]);
      _appliedprice=GetAppliedprice(m_appliedprice,__APPLIEDPRICES,_lookback,_timeframe);
   }
   class=class="str">"cmt">//
   class="type">int _trade_decision=GetTradeDecision(_timeframe,_lookback,_appliedprice,_indicator);

把偏序线性序的尾巴接进下一套模型

尾随停止的两种秩序逻辑这次算是拆清楚了:偏序对原始数据分类更松,能保留更多样本细节,适合做灵活分层;线性序则强制规范化,换来决策优先级上的整齐与效率。两者都从预序派生,重叠部分多,所以前面只盯后两种。 附件里 TrailingCT_12_2.mqh(50.71 KB)和 ct_12.mqh(27.33 KB)是可直接挂进 MT5 的尾随停止类,打开能看到偏序/线性序各自的锚点函数,建议先单品种回测验证分类差异。 外汇与贵金属杠杆高、滑点随机,任何秩序模型都只是概率倾向,实盘前务必用策略测试器跑够不同行情段。 接下来会把这套秩序论概念和后面新研究揉到一起,你可以先留好这两个 mqh,等下一篇看它们怎么被重新封装。

常见问题

偏序允许两个走势互不可比,适合震荡与多分支行情;线性序强制全排序,适合趋势单边。先看品种波动结构再定,别一刀切。
线性序下尾随按固定序列移动,易在回调被扫;偏序下可保留多路径阈值,降低假突破损耗。贵金属等高波动品种更该用偏序思路。
小布可自动标注当前品种处于偏序还是线性序区间,并给出对应止损与分类建议,省去手动判结构。
会。求值顺序未定会让分支优先级模糊,信号可能晚一根或错发。明确依赖关系后再写分支逻辑。
保留原序的不可比标记,别强行线性化。外汇高风险,接模型前先用历史段验证边界是否崩坏。