人工电场算法(AEFA)(基础篇)
📘

人工电场算法(AEFA)(基础篇)

第 1/2 篇

「人工电场算法在 MT5 里的落地形态」

人工电场算法(AEFA)是一类受静电场力启发优化的群体智能方法,在 MT5 中常被封装成自定义指标或 EA 的优化内核。它用带电粒子间的吸引与排斥来搜索参数空间,不像网格搜索那样死板遍历。 Andrey Dik 在 2025 年 1 月 22 日 09:11 发布的示例,截至统计时点获得 897 次查看、0 条评论,说明这类硬核算法内容在中文交易圈还偏冷门。 要验证它是否适合你的品种,直接开 MT5 把示例挂到 EURUSD 的 M15 上跑一周历史,观察参数收敛速度,比看任何说明都实在。外汇与贵金属杠杆高,算法回测顺滑不代表实盘能扛滑点。

把库仑定律搬进优化器

人工电场算法(AEFA)的核心是把带电粒子在电场里的受力过程映射成寻优过程。每个候选解是一个带电粒子,电荷量由适应度决定:电荷越高代表解越优,低电荷粒子会被高电荷粒子按静电力吸引而移动。 原文只取吸引作用——最优个体缓慢位移,其余粒子被它拉向搜索空间中的更优区域,这种力同时充当了个体间的直接通信。力的计算遵循库仑定律:与电荷量乘积成正比、与距离平方成反比。 该算法由印度国立技术学院的研究者于2019年提出,发表在《群体智能与进化计算》。它本质是一个孤立电荷系统,用静电吸引替代了常规群智能里的全局引导项,适合在 MT5 里做参数寻优的对照实验。外汇与贵金属市场波动剧烈、杠杆风险高,任何优化结果都只是概率倾向,需实盘前充分回测。

◍ 把种群当带电粒子来驱赶

AEFA 的核心是把每一个候选解看成带静电的粒子,靠电荷与库仑力在搜索空间里互相推拉。粒子的电荷不固定,取决于它自己的历史最佳以及当前种群里最好和最差个体的适应度差,库仑常数 K(t) 则随迭代衰减,前期偏全局撒网、后期偏局部收敛。 具体推演时,第 i 个粒子在 d 维空间的位置记为 X_i,它记住的个人最佳是 P_i,全群最佳是 P_best。两两粒子间的力用 F_ij = K·Q_i·Q_j / R² 描述,再借牛顿第二定律 a_i = F_ij / M 得到加速度,进而更新速度与位置。 电荷计算是落地关键:先算相对电荷 q_i(t)=exp((fit_p_i(t)-worst(t))/(best(t)-worst(t))),再做归一化使全群电荷总和为 1,即 Q_i(t)=q_i(t)/Σq_j(t)。这里 best(t) 取种群适应度最大值,worst(t) 取最小值,避免除零还加了常数 ε。 力的合成用 F_di(t)=Σ rand()·F_dij(t),其中单维力 F_dij(t)=K(t)·Q_i(t)·Q_j(t)·(p_dj(t)-X_di(t))/(R_ij(t)²+ε),距离 R_ij(t) 直接取坐标差的平方。K(t)=K_0·exp(-α·t/maxiter),α 是你要调的外部参数,控制收敛陡缓。 整套方程跑通后,下一步就是把它写成伪代码再移植进 MT5。外汇与贵金属市场波动剧烈、杠杆风险高,任何优化器给出的参数组合都只是概率上更优,实盘前务必在策略测试器里用历史数据回测验证。

「把电场力塞进EA的粒子结构」

人工电场算法(AEFA)落到 MT5 里,先得有一个能描述「带电粒子」的载体。原文给出的 S_AEFA_Agent 结构就是干这个的:每个粒子带着自己的历史最佳适应度、最佳坐标数组、速度数组,以及电荷与相对电荷两个量。 Init 函数只接一个 coords 参数(维度数量),先把 best_position 和 velocity 两个数组按维度 resize,再把 best_fitness 压到 -DBL_MAX(双精度最小值,保证任何真实回测结果都能覆盖它),charge 和 relative_charge 清零。这一步不做,后面算库仑力时粒子就没有初始电荷基准。 真正的优化逻辑挂在从 C_AO 继承的 C_AO_AEFA 类上。构造函数里写死了两个默认参数:popSize = 50(种群规模),K0 = 500.0(库仑常数初值)。这两个值在外汇品种参数寻优时倾向先不动,等跑通再调。 Moving() 方法管位置推进:epochNow 自增后,若 revision 为 false 就按 rangeMin/Max/Step 随机撒点;为 true 才进 K 值计算、力计算、速度位置更新。CalculateK 用迭代索引 t 和 K0、alpha、epochs 算当前库仑常数;UpdateCharges 按适应度优劣给每个粒子算相对电荷并归一化到 sum_q;CalculateDistance 走标准欧氏距离;CalculateForces 遍历 i≠j 累加受力再除以自身电荷;UpdateVelocityAndPosition 加加速度与随机项后调用 u.SeInDiSp() 做边界钳制。 Revision() 负责记好成绩:循环里若某粒子适应度优于全局 fB 就更新 fB 和 ind,若优于自身历史 best_fitness 就写回 best_position,最后 ind != -1 时把 cB 同步成该粒子坐标。外汇/贵金属优化属高风险,参数平面上多个局部极值,这套结构只是寻优骨架,实盘前需用历史数据多轮重采样验证稳定性。

MQL5 / C++
class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————
class="kw">struct S_AEFA_Agent
{
    class="type">class="kw">double best_fitness;      class=class="str">"cmt">// 粒子历史最佳适应度,初始化为最小双精度
    class="type">class="kw">double best_position [];  class=class="str">"cmt">// 最佳位置坐标数组,维度由Init定
    class="type">class="kw">double velocity      [];  class=class="str">"cmt">// 速度向量数组,与坐标同维度
    class="type">class="kw">double charge;            class=class="str">"cmt">// 粒子电荷
    class="type">class="kw">double relative_charge;   class=class="str">"cmt">// 归一化前的相对电荷
    class="type">void Init(class="type">int coords)    class=class="str">"cmt">// 传入维度数量coords
    {
        ArrayResize(best_position, coords); class=class="str">"cmt">// 按维度扩最佳位置数组
        ArrayResize(velocity,      coords); class=class="str">"cmt">// 按维度扩速度数组
        best_fitness     = -DBL_MAX;         class=class="str">"cmt">// 适应度置双精度下限
        charge           = class="num">0;                class=class="str">"cmt">// 电荷初值0
        relative_charge = class="num">0;                 class=class="str">"cmt">// 相对电荷初值0
    }
};
class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————
class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————
class C_AO_AEFA : class="kw">public C_AO
{
  class="kw">public: class=class="str">"cmt">//--------------------------------------------------------------------
  ~C_AO_AEFA() { }
  C_AO_AEFA()
  {
    ao_name = "AEFA";
    ao_desc = "Artificial Electric Field Algorithm";
    ao_link = ""; class=class="str">"cmt">//"[MQL5官方文档]
    popSize      = class="num">50;   class=class="str">"cmt">// 默认种群规模50
    K0           = class="num">500.0; class=class="str">"cmt">// 库仑常数初值500.class="num">0

常见问题

把每个参数组合看作带电极点,按库仑定律算相互排斥吸引的合力,用合力迭代把种群驱向更优区,本质是一种群体智能优化器。
通常用适应度排名映射电荷量,越好越带电;再按距离平方反比算力,距离近的力更大,避免早熟收敛。
小布可替你加载粒子结构模板并批量驱赶种群,自动输出低回撤参数组合,你只需复核信号逻辑。
贵金属类高波动品种建议 80~120 代,外汇直盘 50 代左右易出过拟合,靠走出样本验证更可靠。
别把力直接当下单手数,只用于更新参数向量;且每代重算适应度,否则会卡在局部最优。