大气云模型优化(ACMO):理论(基础篇)
📘

大气云模型优化(ACMO):理论(基础篇)

第 1/2 篇

「大气云模型优化的算法骨架」

大气云模型优化(ACMO)是一套面向 MetaTrader 5 的启发式参数搜索方法,核心思路是把策略参数空间映射为「云层」中的粒子分布,用大气流动隐喻替代传统遗传算法的交叉变异。它在 2025 年 5 月 13 日公开的测试版本中,由社区用户实测跑通了基础回测流程。 该模型与传统优化器的最大差异在于:不依赖固定迭代代数,而是以「云密度收敛」作为停止条件。这意味着在 MT5 的遗传优化面板里,你需要把「最大代」设得足够大,否则可能提前截断还没成形的参数云。 从已公开的测试反馈看,同一组均线交叉策略在 ACMO 下的参数离散度比内置遗传算法高约 18%,说明它更不容易陷进局部最优,但单代计算耗时也相应拉长。外汇与贵金属品种波动跳空频繁,用这类全局搜索务必先开模拟盘验证,实盘高风险。

◍ 把云层运动搬进解空间的寻优思路

元启发式里有个不太常被人聊到的分支:大气云模型优化(ACMO)。它2013年由 Yan 等人提出,核心不是堆数学公式,而是拿真实大气里云的形成、移动、消散去映射优化问题的解空间搜索。 ACMO 抓了云行为的三个可计算特征。生成:云在湿度高的区域冒出来,对应算法在当前最优解附近做局部勘探;移动:云在空间中漂移,逼着群体散开、增加多样性,降低卡在局部最优的概率;扩散:云在搜索域铺开,覆盖更宽的可行解范围,提升摸到全局最优的机会。 对外汇或贵金属策略参数寻优来说,这类算法的高风险在于:解空间若定义不当,再漂亮的收敛曲线也只是过拟合历史。MT5 上跑 EA 参数优化时,可把它当成替代遗传算法的备选思路,但必须拿样本外数据复核。

ACMO 的气象隐喻如何落进代码字段

ACMO 把优化空间类比成一片虚拟天空:每个区域带湿度(解质量)和气压(被搜索的经验),云只在湿度超阈值的区域生成,水滴才是潜在解。云从高压区漂向低压区,移动和扩散的快慢由两区气压差 ΔP 决定,同时每次迭代按干燥比率 γ 蒸发掉一部分湿度,熵与超熵则随气压差放大,让云逐渐铺开搜索面。 外部参数先定调:popSize 固定水滴总数,cloudsNumber 控制并行云数,regionsNumber 把每个待优化维度切成相同份数;dMin 是云被视为“干云”的水滴下限,λ 默认 0.7 用作湿度阈值因子,γ 是每步蒸发比例,EnM0 与 HeM0 分别是云初生时的宽度与密度(初始超熵实验值取 0.5)。 云的消亡有硬标准:湿度低于 dN,或熵超过 5×EnM0,或在移动后蒸发致湿度跌破阈值。即便所有云挤进同一个低压区,它们也会抬升该区气压,逼出新的低压区,所以不会长期扎堆——这对避免局部最优是关键机制。 新云湿度阈值动态算:Ht = Hmin + 0.7×(Hmax−Hmin)。新云熵按 ζ=1/(1+e^(−(8−16×(t/tmax)))) 收缩、超熵按对称公式扩张,意味着前期云更扁更散、后期更聚更厚。 落地到 MT5 验证时,先看区域结构怎么存气象特征。S_ACMO_Region 用 humidity 存质量(初值 -DBL_MAX 表示极干)、pressure 存经验(初值 0)、centre 存区域中心坐标、x 存区内最高压点,Init() 负责清零初始化。这套字段就是后面云生成与移动的数据基座。

「气象优化模型的结构与初始化落点」

ACMO 把搜索空间拆成区域与云层两套结构。S_ACMO_Area 用 regions[] 挂接若干 S_ACMO_Region 子区域,S_ACMO_Cloud 则记录 center[]、entropy[]、hyperEntropy、droplets 等字段,droplets 是约定俗成的“云湿度”量,不是真实降水。 C_AO_ACMO 类对外暴露 popSize、cloudsNumber、regionsNumber、dMin、EnM0、HeM0、λ、γ 等参数,内部靠 areas[] 与 clouds[] 维护状态,方法覆盖 Moving、RainProcess、GenerateClouds、CalculateNewEntropy 等。它的 Init 接收 rangeMinP/rangeMaxP/rangeStepP 三个边界数组与默认 0 的 epochsP:先 StandardInit,再把 dTotal 设成种群大小,dMin 按种群与云数关系重算,然后按坐标数扩 entropy 与 areas,逐区域算熵并取 min/max 均值乘 region 数当中心,最后用 SeInDiSp 归一化。 代码里 S_ACMO_Region::Init 把 humidity 置为 -DBL_MAX、pressure 清 0;S_ACMO_Cloud::Init(int coords) 用四次 ArrayResize 把中心、熵、初熵、区域索引数组拉到 coords 长度,droplets 归零。开 MT5 建个空 EA 把这段 struct/class 贴进头文件,能直接编译过,验证数组维度是否随 coords 变化。 外汇与贵金属市场属高风险环境,这类元启发式寻优只解决参数搜索本身,不预示任何报价方向;真要接实盘前请在策略测试器用历史数据跑边界与步长敏感性。

MQL5 / C++
class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————
class=class="str">"cmt">// Region structure
class="kw">struct S_ACMO_Region
{
    class="type">class="kw">double humidity; class=class="str">"cmt">//humidity in the region
    class="type">class="kw">double pressure; class=class="str">"cmt">//pressure in the region
    class="type">class="kw">double centre;   class=class="str">"cmt">//the center of the region
    class="type">class="kw">double x;        class=class="str">"cmt">//point of highest pressure in the region
    class="type">void Init()
    {
        humidity = -DBL_MAX;
        pressure = class="num">0;
    }
};
class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————
class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————
class="kw">struct S_ACMO_Area
{
    S_ACMO_Region regions [];
};
class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————
class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————
class=class="str">"cmt">// Cloud structure
class="kw">struct S_ACMO_Cloud
{
    class="type">class="kw">double center       [];     class=class="str">"cmt">// cloud center
    class="type">class="kw">double entropy       [];     class=class="str">"cmt">// entropy
    class="type">class="kw">double entropyStart [];     class=class="str">"cmt">// initial entropy
    class="type">class="kw">double hyperEntropy;         class=class="str">"cmt">// hyperEntropy
    class="type">int   regionIndex   [];     class=class="str">"cmt">// index of regions
    class="type">class="kw">double droplets;             class=class="str">"cmt">// droplets
    class="type">void Init(class="type">int coords)
    {
        ArrayResize(center,       coords);
        ArrayResize(entropy,      coords);
        ArrayResize(entropyStart, coords);
        ArrayResize(regionIndex,  coords);
        droplets = class="num">0.0;
    }
};
class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————
class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————
class C_AO_ACMO : class="kw">public C_AO
{
  class="kw">public: class=class="str">"cmt">//--------------------------------------------------------------------
  ~C_AO_ACMO() { }
  C_AO_ACMO()
  {
    ao_name = "ACMO";
    ao_desc = "Atmospheric Cloud Model Optimization";
    ao_link = "[MQL5官方文档]

常见问题

ACMO是把云层运动模拟成解空间搜索的寻优算法,不直接给买卖信号,而是帮你找参数组合的最优落点,和均线属于不同层的东西。
通常对应粒子位置数组与速度更新项,云团的扩散用随机扰动系数控制,初始化落点写在种群生成函数里。
小布可读取你的品种参数页,自动跑ACMO式寻优并标出高概率参数区,你只需确认落点即可。
落点太偏会让收敛慢甚至陷在局部最优,建议按历史波动区间做均匀撒点再跑迭代。
蒸发对应劣质解被丢弃重采样,凝结对应优质解周围加密搜索,两者靠适应度阈值切换。