种群优化算法:入侵杂草优化(IWO)(基础篇)
📘

种群优化算法:入侵杂草优化(IWO)(基础篇)

第 1/2 篇

◍ 用杂草入侵思路给参数找最优解

入侵杂草优化(IWO)是一类受自然杂草繁殖扩散启发的种群优化算法,核心逻辑是:以随机散布的「杂草」代表候选解,按适应度决定留种数量,再通过空间内随机播撒子代逐步逼近更优区域。在 MT5 里,它常被拿来替代网格遍历,给指标周期、止损倍数这类连续参数做自动寻优。 这套机制对外汇与贵金属交易者有意义的地方在于:手动调参容易陷在局部经验里,而 IWO 以种群迭代方式探索参数空间,可能找出人脑忽略的组合。但需明确,优化结果依赖历史样本,实盘存在滑点、点差与跳空,贵金属与外汇均属高风险品种,回测优解不保证未来概率占优。 要直观验证,可先跑一个极简版:初始化少量杂草,计算各自在指定品种上的净值曲线适应度,保留较优者并繁殖。下面这段 MQL5 骨架演示了种群初始化与适应度占位,复制进 MT5 脚本即可改。

MQL5 / C++
class="type">int weeds = class="num">10;              class=class="str">"cmt">// 初始杂草数量
 class="type">class="kw">double pos[class="num">10][class="num">2];          class=class="str">"cmt">// 每只杂草的两个参数维度
 class="type">class="kw">double fitness[class="num">10];         class=class="str">"cmt">// 对应适应度(如净利润)
 for(class="type">int i=class="num">0;i<weeds;i++){
   pos[i][class="num">0] = MathRand()/class="num">32767.0;  class=class="str">"cmt">// 随机初始化参数1
   pos[i][class="num">1] = MathRand()/class="num">32767.0;  class=class="str">"cmt">// 随机初始化参数2
   fitness[i] = class="num">0;           class=class="str">"cmt">// 适应度先置零,后续接回测
 }

把杂草的生存术搬进优化器

入侵杂草元启发式(IWO)是一种基于种群的随机优化算法,核心不是模拟某棵草,而是模拟整个杂草群落在受限空间里抢资源、自适应、随机散布的行为特征。它把「兼容性强 + 随机扩散」两套机制揉进迭代过程,用来在复杂目标函数上找全局较优解,而不是卡在局部洼地。 自然界里杂草能打,靠的是八条硬本事:通用基因型随气候快速演化;生命周期策略多变、繁衍惊人(玉米播种蓟单株可产约 19000 颗种子);发芽与生长不挑土壤,扛得住温湿度剧变;表观遗传让植株不改 DNA 也能临时调表达;杂交后代常有活力优势;几十年内对除草剂抗性陡增;随人类耕作共同进化、外伤反而助繁殖;气候变化比温室作物更利好杂草。 这些特性直接对应算法设计语言:种群初始化像杂草到处落籽,竞争排斥像保留适应度高的个体,空间散布标准差随迭代收缩像种子传播范围收敛。外汇与贵金属参数优化属高风险场景,IWO 只是提供「可能更全的搜索」,不保证过拟合外的实盘胜率。 实操上,若你在 MT5 策略测试器外想自写优化器,可先按「种群数=杂草数、迭代=生长季、适应度=作物产量反向」建模,再用历史 tick 跑一遍看收敛曲线是否比网格快。

「入侵杂草算法怎么在MT5里落地」

入侵杂草优化(IWO)是 2006 年提出的连续随机数值算法,模拟杂草定植:随机播种子、按适应度繁衍、合并排序、淘汰弱株。它和遗传或蜂群不同的一点很关键——哪怕适应性最差的植株也保底留种,全局极值探索概率始终非零,这对避免早熟收敛有用。 算法七步里最容易被忽略的是‘散播半径随迭代线性递减’。作者原建议用正态分布,但实盘代码里改成了立方函数:迭代越多,播种半径越小,极值被细化。外部参数取散播下限/上限,比如某次设最大极限3、最小极限2,离散度随迭代次数走。 保底留种在代码层是个硬约束。举例:亲本5株、每株最多6粒、最少1粒,种子总数参数设50,则 5*6=30 仍小于50,播种权会顺链表传下去,直到每株触顶。这意味着写 Sowing() 时必须用双循环保证每株先拿保底种,再按适应度轮盘赌补多余种。 下面这段结构定义是整套类的骨架:杂草用坐标数组+适应度+种子计数器,轮盘赌区间用 start/end 描述。开 MT5 新建 EA 把这段贴进头文件,就能接着写 Init 和迭代逻辑。外汇/贵金属参数优化属高风险,回测过拟合概率不低,别直接拿来跑实盘。

MQL5 / C++
<span class="comment">class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————</span>
<span class="keyword">class="kw">struct</span> S_Weed
{
&nbsp;&nbsp;<span class="keyword">class="type">class="kw">double</span> c []; <span class="comment">class=class="str">"cmt">//coordinates</span>
&nbsp;&nbsp;<span class="keyword">class="type">class="kw">double</span> f;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">class=class="str">"cmt">//fitness</span>
&nbsp;&nbsp;<span class="keyword">class="type">int</span>&nbsp;&nbsp;&nbsp;&nbsp;s;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">class=class="str">"cmt">//number of seeds</span>
};
<span class="comment">class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————</span>
<span class="comment">class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————</span>
<span class="keyword">class="kw">struct</span> S_WeedFitness
{
&nbsp;&nbsp;<span class="keyword">class="type">class="kw">double</span> start;
&nbsp;&nbsp;<span class="keyword">class="type">class="kw">double</span> end;
};
<span class="comment">class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————</span>
<span class="comment">class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————</span>
<span class="keyword">class</span> C_AO_IWO
{
&nbsp;&nbsp;<span class="comment">class=class="str">"cmt">//============================================================================</span>
&nbsp;&nbsp;<span class="keyword">class="kw">public</span>: <span class="keyword">class="type">class="kw">double</span> rangeMax&nbsp;&nbsp;[]; <span class="comment">class=class="str">"cmt">//maximum search range</span>
&nbsp;&nbsp;<span class="keyword">class="kw">public</span>: <span class="keyword">class="type">class="kw">double</span> rangeMin&nbsp;&nbsp;[]; <span class="comment">class=class="str">"cmt">//manimum search range</span>
&nbsp;&nbsp;<span class="keyword">class="kw">public</span>: <span class="keyword">class="type">class="kw">double</span> rangeStep []; <span class="comment">class=class="str">"cmt">//step search</span>
&nbsp;&nbsp;<span class="keyword">class="kw">public</span>: S_Weed weeds&nbsp;&nbsp;&nbsp;&nbsp; []; <span class="comment">class=class="str">"cmt">//weeds</span>
&nbsp;&nbsp;<span class="keyword">class="kw">public</span>: S_Weed weedsT&nbsp;&nbsp;&nbsp;&nbsp;[]; <span class="comment">class=class="str">"cmt">//temp weeds</span>
&nbsp;&nbsp;<span class="keyword">class="kw">public</span>: S_Weed seeds&nbsp;&nbsp;&nbsp;&nbsp; []; <span class="comment">class=class="str">"cmt">//seeds</span>
&nbsp;&nbsp;<span class="keyword">class="kw">public</span>: <span class="keyword">class="type">class="kw">double</span> cB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[]; <span class="comment">class=class="str">"cmt">//best coordinates</span>
&nbsp;&nbsp;<span class="keyword">class="kw">public</span>: <span class="keyword">class="type">class="kw">double</span> fB;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">class=class="str">"cmt">//fitness of the best coordinates</span>
&nbsp;&nbsp;<span class="keyword">class="kw">public</span>: <span class="keyword">class="type">void</span> Init(<span class="keyword">class="kw">const</span> <span class="keyword">class="type">int</span>&nbsp;&nbsp;&nbsp;&nbsp;coordinatesP,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">class=class="str">"cmt">//Number of coordinates</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">class="kw">const</span> <span class="keyword">class="type">int</span>&nbsp;&nbsp;&nbsp;&nbsp;numberSeedsP,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">class=class="str">"cmt">//Number of seeds</span>

◍ 入侵杂草算法的类内部结构

这段声明把一个入侵杂草优化(IWO)框架的 C++ 风格类骨架搬到了 MQL5 里,参数和私有成员一目了然,方便你在 EA 里直接套用种群搜索逻辑。 构造函数接收 numberWeedsP(杂草数)、max/minNumberSeedsP(单株种子上下限)、max/minDispersionP(散布标准差上下限)和 maxIterationP(最大迭代),这几个量直接决定种群规模和收敛速度。 公开方法只有 Sowing(int iter) 和 Germination(),前者按当前迭代播撒种子,后者执行发芽筛选;真正的排序与坐标映射都藏在 private 里,比如 Sorting() 和 Scale() 负责把适应度缩放到搜索空间。 私有数组 vec[]、ind[]、val[] 以及 wf[](杂草适应度结构体)构成了核心状态,coordinates 记录维度、totalNumWeeds 跟踪总杂草数——开 MT5 新建一个 mqh 把这段粘进去,就能以零改动方式复用这套元启发式骨架。 外汇与贵金属市场波动剧烈、杠杆风险高,任何算法参数都先在策略测试器用历史数据验证,再考虑实盘。

MQL5 / C++
class="kw">const class="type">int      numberWeedsP,      class=class="str">"cmt">//Number of weeds
class="kw">const class="type">int      maxNumberSeedsP,   class=class="str">"cmt">//Maximum number of seeds per weed
class="kw">const class="type">int      minNumberSeedsP,   class=class="str">"cmt">//Minimum number of seeds per weed
class="kw">const class="type">class="kw">double maxDispersionP,      class=class="str">"cmt">//Maximum dispersion
class="kw">const class="type">class="kw">double minDispersionP,      class=class="str">"cmt">//Minimum dispersion
class="kw">const class="type">int      maxIterationP);    class=class="str">"cmt">//Maximum iterations
class="kw">public: class="type">void Sowing(class="type">int iter);
class="kw">public: class="type">void Germination();
class=class="str">"cmt">//============================================================================
class="kw">private: class="type">void   Sorting();
class="kw">private: class="type">class="kw">double SeInDiSp(class="type">class="kw">double In, class="type">class="kw">double InMin, class="type">class="kw">double InMax, class="type">class="kw">double Step);
class="kw">private: class="type">class="kw">double RNDfromCI(class="type">class="kw">double Min, class="type">class="kw">double Max);
class="kw">private: class="type">class="kw">double Scale(class="type">class="kw">double In, class="type">class="kw">double InMIN, class="type">class="kw">double InMAX, class="type">class="kw">double OutMIN, class="type">class="kw">double OutMAX, class="type">bool Revers);
class="kw">private: class="type">class="kw">double vec [];          class=class="str">"cmt">//Vector
class="kw">private: class="type">int    ind [];
class="kw">private: class="type">class="kw">double val [];
class="kw">private: S_WeedFitness wf [];    class=class="str">"cmt">//Weed fitness
class="kw">private: class="type">bool   sowing;          class=class="str">"cmt">//Sowing
class="kw">private: class="type">int    coordinates;     class=class="str">"cmt">//Coordinates number
class="kw">private: class="type">int    numberSeeds;     class=class="str">"cmt">//Number of seeds
class="kw">private: class="type">int    numberWeeds;     class=class="str">"cmt">//Number of weeds
class="kw">private: class="type">int    totalNumWeeds;   class=class="str">"cmt">//Total number of weeds
class="kw">private: class="type">int    maxNumberSeeds;  class=class="str">"cmt">//Maximum number of seeds
class="kw">private: class="type">int    minNumberSeeds;  class=class="str">"cmt">//Minimum number of seeds
class="kw">private: class="type">class="kw">double maxDispersion;   class=class="str">"cmt">//Maximum dispersion
class="kw">private: class="type">class="kw">double minDispersion;   class=class="str">"cmt">//Minimum dispersion
class="kw">private: class="type">int    maxIteration;    class=class="str">"cmt">//Maximum iterations
};

常见问题

IWO 用种群扩散和竞争淘汰,能在非凸空间里跳出局部最优,比穷举网格更省计算量,适合多参数EA寻优。
有可能。建议在样本外数据做交叉验证,并限制迭代代数与种群规模,降低曲线拟合风险。
小布内置AIGC优化诊断,可对接你的策略跑类IWO搜索,自动给出低相关参数组合供你回测。
通常含个体位置、适应度、繁殖扩散方差、最大迭代次数,以及种群排序淘汰逻辑。
早期大方差广撒网探索,后期小方差精细局部搜索,平衡全局与局部寻优概率。