循环孤雌生殖算法(CPA)(基础篇)
📘

循环孤雌生殖算法(CPA)(基础篇)

第 1/2 篇

◍ 循环孤雌生殖算法在 MT5 里的落地形态

循环孤雌生殖算法(CPA)是一套在 MetaTrader 5 上跑的演化式参数搜索逻辑,核心是不依赖交叉变异、而是让单组优势参数「自我复制 + 微扰」来逼近局部最优。2025 年 10 月 8 日有测试者在社区贴出跑通记录,该帖截至统计时获 552 次查看、0 条跟评,说明这套东西还停在少数人验证阶段。 从结构看,CPA 把每一代「个体」视为一组 EA 输入参数,孤雌生殖意味着子代只继承母代基因、再叠加随机扰动,没有传统 GA 的双亲重组。这样做的好处是收敛路径更可控,代价是容易卡在狭长极值区,对外汇与贵金属这种跳空频繁的高风险品种尤其要防过拟合。 想在 MT5 里复现,先开 MetaEditor 建一个空的 EA 框架,把参数数组当作「染色体」存进全局结构,再用 OnTester 钩子把每代净值回传优化器。下一步就是写微扰函数——这是 CPA 区别于标准遗传优化的唯一硬代码点。

蚜虫生殖策略怎么变成优化算法

CPA(循环孤雌生殖算法)的思路来自蚜虫的两种繁殖方式:环境好时孤雌生殖快速扩群,环境差时有性生殖换多样性。算法把前者映射成对已发现解的利用,后者映射成对搜索空间新区域的探索,靠这个机制在局部与全局搜索之间找平衡。 除了繁殖逻辑,CPA 还复刻了蚜虫的群体行为:群内做决策、群间迁移交换信息。这让它在多维优化里处理局部陷入和全局跳出时,比单纯靠随机扰动的方法更有结构感。 该算法由 Ali Kaveh 与 Zolghadr 提出,2019 年首次发表。对外汇或贵金属交易者来说,这类群智能算法的高风险在于:参数敏感、过拟合概率高,拿去筛参数前务必在 MT5 上做样本外验证。

「把蚜虫生殖搬进 MT5 优化器」

CPA(周期性孤雌生殖算法)借用了蚜虫两种繁殖思路来搜最优解:群体里分雌、雄个体,雌性走「自体复制」——拿当前最优加微扰生成副本;雄性走「配对繁殖」——拽一个同群雌体坐标做差分。偶尔最优解会按概率迁飞到更差的群,逼着算法既利用已知良解又探新区域,外汇与贵金属参数寻优里这种平衡直接影响过拟合概率。 代码层从 C_AO 派生出 C_AO_CPA,构造函数里先把默认规模钉死:总种群 50、分 10 个群、雌占比 0.2、迁飞概率 0.9、孤雌缩放 0.3、配对缩放 0.9。这几个数直接决定搜索粒度,做 EA 调参时建议先原样跑一遍再动。 Init 方法按种群和群数算每群成员 Nm,雌数 fNumber 至少保 1,雄数靠差值补;Moving 里核心在变量 k=(总期-当期)/总期,随迭代收敛移动半径收缩。Revision 则负责按 f 值排序、存最优、并以 Pf 概率做群间最优迁飞。 下面这段是类声明的头部,逐行看参数预设比读伪代码更直白:

MQL5 / C++
class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————
class=class="str">"cmt">// Class implementing the Cyclic Parthenogenesis Algorithm(CPA)
class=class="str">"cmt">// Inherited from the optimization base class
class C_AO_CPA : class="kw">public C_AO
{
  class="kw">public:
  C_AO_CPA(class="type">void)
  {
    ao_name = "CPA";
    ao_desc = "Cyclic Parthenogenesis Algorithm";
    ao_link = "[MQL5官方文档]
    popSize = class="num">50;       class=class="str">"cmt">// total population size Na
    Nc      = class="num">10;       class=class="str">"cmt">// number of colonies
    Fr      = class="num">0.2;      class=class="str">"cmt">// ratio of female individuals
    Pf      = class="num">0.9;      class=class="str">"cmt">// probability of flight between colonies
    alpha1  = class="num">0.3;      class=class="str">"cmt">// scaling factor for parthenogenesis
    alpha2  = class="num">0.9;      class=class="str">"cmt">// scaling factor for pairing
    ArrayResize(params, class="num">6);
    class=class="str">"cmt">// Setting algorithm parameters
    params [class="num">0].name = "popSize";    params [class="num">0].val = popSize;

◍ 把蜂群参数接进优化器内核

这段声明把群智能算法的可调旋钮全部暴露给 MT5 的遗传优化器,靠 params 数组做桥接。popSize 取索引 0,Nc、Fr、Pf 占 1 到 3,alpha1 与 alpha2 占 4 和 5,初始化时写 name 再写 val,优化器就能在每代喂不同数值进来。 SetParams 里做了强制类型回落:popSize 和 Nc 用 (int) 截断,Fr、Pf、alpha1、alpha2 保留 double 精度。若你在策略测试器里把 Nc 设成 10、Fr 设 0.5、Pf 设 0.1,蜂群会倾向分裂出 10 个殖民群且半数雌性,跨群飞行概率压到一成,收敛轨迹可能更平滑但也更慢。 Init 的形参给出了搜索边界三元组:rangeMinP、rangeMaxP、rangeStepP 分别对应最小域、最大域与步长,epochsP 默认 0 表示不限制代数。Moving 与 Revision 是两个钩子,前者管个体位移、后者管位置评审更新,改写它们就能换自己的迁移逻辑。 私有段里的 Nm 是每群个体数,fNumber 与 mNumber 由 Fr 推导,alpha1 管孤雌增殖缩放、alpha2 管配对缩放。外汇与贵金属行情跳变频繁,这类算法参数敏感度高,实盘前务必在 MT5 用历史数据多轮回测验证稳定性。

MQL5 / C++
params [class="num">1].name = "Nc";        params [class="num">1].val = Nc;
params [class="num">2].name = "Fr";        params [class="num">2].val = Fr;
params [class="num">3].name = "Pf";        params [class="num">3].val = Pf;
params [class="num">4].name = "alpha1_init"; params [class="num">4].val = alpha1;
params [class="num">5].name = "alpha2_init"; params [class="num">5].val = alpha2;
}
class="type">void SetParams()
{
   popSize = (class="type">int)params [class="num">0].val;
   Nc       = (class="type">int)params [class="num">1].val;
   Fr       = params       [class="num">2].val;
   Pf       = params       [class="num">3].val;
   alpha1   = params       [class="num">4].val;
   alpha2   = params       [class="num">5].val;
}
class="type">bool Init(const class="type">class="kw">double &rangeMinP  [], class=class="str">"cmt">// minimum search range
                    const class="type">class="kw">double &rangeMaxP  [], class=class="str">"cmt">// maximum search range
                    const class="type">class="kw">double &rangeStepP [], class=class="str">"cmt">// search step
                    const class="type">int     epochsP = class="num">0);  class=class="str">"cmt">// number of epochs
class="type">void Moving();       class=class="str">"cmt">// function for moving individuals
class="type">void Revision();      class=class="str">"cmt">// function for reviewing and updating positions
class=class="str">"cmt">//----------------------------------------------------------------------------
class="type">int    Nc;             class=class="str">"cmt">// number of colonies
class="type">class="kw">double Fr;             class=class="str">"cmt">// ratio of female individuals
class="type">class="kw">double Pf;             class=class="str">"cmt">// probability of flight between colonies
class="kw">private: class=class="str">"cmt">//-------------------------------------------------------------------
class="type">int    epochs;         class=class="str">"cmt">// total number of epochs
class="type">int    epochNow;       class=class="str">"cmt">// current epoch
class="type">int    Nm;             class=class="str">"cmt">// number of individuals in each colony
class="type">class="kw">double alpha1;         class=class="str">"cmt">// scaling factor for parthenogenesis
class="type">class="kw">double alpha2;         class=class="str">"cmt">// scaling factor for pairing
class="type">int    fNumber;        class=class="str">"cmt">// number of females in the colony
class="type">int    mNumber;        class=class="str">"cmt">// number of males in the colony

常见问题

正常。该算法靠多代孤雌克隆维持种群,迭代次数通常更高,可在样本周期上先跑小种群验证再放大。
实测算力够时设 50~80 个体较稳,小于 20 容易陷局部最优,具体看品种波动频率。
可以。小布内置 AIGC 分析能调用该类生物启发算法做参数寻优,打开对应品种页即可发起诊断。
看跨周期稳定性,若仅单周期锐利而相邻周期失效即为过拟合,建议用三年多品种交叉检验。
先锁感知半径再降惯性权重,多数情况步长收敛变快,仍乱则检查目标函数是否带噪声。