种群优化算法:入侵杂草优化(IWO)(基础篇)
◍ 用杂草入侵思路给参数找最优解
入侵杂草优化(IWO)是一类受自然杂草繁殖扩散启发的种群优化算法,核心逻辑是:以随机散布的「杂草」代表候选解,按适应度决定留种数量,再通过空间内随机播撒子代逐步逼近更优区域。在 MT5 里,它常被拿来替代网格遍历,给指标周期、止损倍数这类连续参数做自动寻优。 这套机制对外汇与贵金属交易者有意义的地方在于:手动调参容易陷在局部经验里,而 IWO 以种群迭代方式探索参数空间,可能找出人脑忽略的组合。但需明确,优化结果依赖历史样本,实盘存在滑点、点差与跳空,贵金属与外汇均属高风险品种,回测优解不保证未来概率占优。 要直观验证,可先跑一个极简版:初始化少量杂草,计算各自在指定品种上的净值曲线适应度,保留较优者并繁殖。下面这段 MQL5 骨架演示了种群初始化与适应度占位,复制进 MT5 脚本即可改。
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 和迭代逻辑。外汇/贵金属参数优化属高风险,回测过拟合概率不低,别直接拿来跑实盘。
<span class="comment">class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————</span> <span class="keyword">class="kw">struct</span> S_Weed { <span class="keyword">class="type">class="kw">double</span> c []; <span class="comment">class=class="str">"cmt">//coordinates</span> <span class="keyword">class="type">class="kw">double</span> f; <span class="comment">class=class="str">"cmt">//fitness</span> <span class="keyword">class="type">int</span> s; <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 { <span class="keyword">class="type">class="kw">double</span> start; <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 { <span class="comment">class=class="str">"cmt">//============================================================================</span> <span class="keyword">class="kw">public</span>: <span class="keyword">class="type">class="kw">double</span> rangeMax []; <span class="comment">class=class="str">"cmt">//maximum search range</span> <span class="keyword">class="kw">public</span>: <span class="keyword">class="type">class="kw">double</span> rangeMin []; <span class="comment">class=class="str">"cmt">//manimum search range</span> <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> <span class="keyword">class="kw">public</span>: S_Weed weeds []; <span class="comment">class=class="str">"cmt">//weeds</span> <span class="keyword">class="kw">public</span>: S_Weed weedsT []; <span class="comment">class=class="str">"cmt">//temp weeds</span> <span class="keyword">class="kw">public</span>: S_Weed seeds []; <span class="comment">class=class="str">"cmt">//seeds</span> <span class="keyword">class="kw">public</span>: <span class="keyword">class="type">class="kw">double</span> cB []; <span class="comment">class=class="str">"cmt">//best coordinates</span> <span class="keyword">class="kw">public</span>: <span class="keyword">class="type">class="kw">double</span> fB; <span class="comment">class=class="str">"cmt">//fitness of the best coordinates</span> <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> coordinatesP, <span class="comment">class=class="str">"cmt">//Number of coordinates</span> <span class="keyword">class="kw">const</span> <span class="keyword">class="type">int</span> numberSeedsP, <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 把这段粘进去,就能以零改动方式复用这套元启发式骨架。 外汇与贵金属市场波动剧烈、杠杆风险高,任何算法参数都先在策略测试器用历史数据验证,再考虑实盘。
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 };