循环孤雌生殖算法(CPA)(基础篇)
◍ 循环孤雌生殖算法在 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 概率做群间最优迁飞。 下面这段是类声明的头部,逐行看参数预设比读伪代码更直白:
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 用历史数据多轮回测验证稳定性。
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