从基础到中级:结构(五)(基础篇)
MT5里结构五的雏形
在 MT5 中搭建价格行为结构分析,最先要落地的不是指标而是数据结构。把每一根 K 线的开高低收与成交量存进数组,后续所有结构识别都基于这个底表。 原文给出的示例发布于 2026 年 5 月 1 日 06:53,截至记录时有 535 次查看、0 条评论,说明这类基础结构帖在中文圈还偏冷门,但代码可直接拷进 MT5 验证。 外汇与贵金属杠杆高、滑点大,跑任何结构脚本前先在模拟盘验证信号延迟,再谈实盘概率。
「结构化思维是先于OOP的护城河」
很多人一上来就想写EA和指标,觉得结构化编程是老古董,毕竟现在满屏都在聊面向对象(OOP)。但OOP不是凭空冒出来的,它是社区在结构化编程撞到天花板之后才演化出的解法。 传统写法里我们声明变量、函数、过程去解决单个任务;结构化编程的目标则是用一套方法去覆盖一串关联问题。区别在于:前者用完即弃,后者能复用和扩展。 如果你只学怎么直接写指标、EA,而不碰那些「看起来用不上」的基础实现,大概率会比预期更早卡死——因为真实盘面上的需求往往既不直观也不简单。 一个很硬核的切入点:假设你已经用结构化代码解决了整数类型的问题,怎么在不重写的前提下,把同一套逻辑扩展到浮点数据?这道题没有唯一解,光思路就起码有两种。 下一段我会先讲最简单的那种,让你对「如何横向扩展结构化方案」有体感;另一种涉及内存操作,门槛更高,我们后面再碰。外汇与贵金属波动剧烈、杠杆高风险极大,任何代码逻辑都先在MT5策略测试器里跑历史数据验证再谈实盘。
◍ 用模板给结构减负:从重复重载到一次声明
在 MT5 里写结构时,最烦的不是逻辑,而是数据类型一换就得重抄一遍。比如一个只算 double 数组均值和中位数的结构,碰到 float 或 int 就直接罢工;按传统做法你得改结构名、再写一套,本质是人工重载,工作量随类型数量线性爆炸。 程序员大多讨厌复制粘贴,于是模板机制登场:它让本来不能重载的结构,靠一个声明吃掉所有数值类型。先退一步看普通代码里的模板长相——把原结构改成带 template<typename T> 的常规函数组,在 MT5 跑出来结果一致,但代码从「绑死 double」变成「谁都能进」。 把模板套回结构也很轻:函数和过程写在结构体内,会自动继承结构的模板声明,编译器自己去做重载。代码 04 就是改造后的样子,注意第 20、30 行——当结构存的是 int 却返回 double 中位数时,Info_2.Median 打出浮点值,而声明处是整数,类型错位就藏在这里。 [CODE]01. //+------------------------------------------------------------------+
- #property copyright "Daniel Jose"
- //+------------------------------------------------------------------+
- struct st_Data
- {
- //+----------------+
- private:[/CODE]
更稳的写法不是硬修返回值,而是把计算拆小。代码 05 里第 20 行 Sum 返回元素总和、第 30 行 Count 返回个数,第 37 行在结构内做除法并强转 double;第 75 行在结构外手动算,84 转不转 double 由调用者定。执行图 04 显示:同是 Info_2,一行出浮点、一行出整数,控制权交还使用者。 这路数看着像 OOP 的封装,其实结构化编程早就有。MT5 实测中,结构含 int 元素时 Average 得出 16.8,若业务要整数均值就得自己四舍五入,模板只管给原始材料。下篇我们再钻:如何用联合 / 结构自身当模板类型,泛化出完全结构化的重载代码。外汇与贵金属 EA 开发属高风险,回测通过不等于实盘无害,参数请自测。
class=class="str">"cmt">//+------------------------------------------------------------------+ class="macro">#class="kw">property copyright "Daniel Jose" class=class="str">"cmt">//+------------------------------------------------------------------+ class="kw">struct st_Data { class=class="str">"cmt">//+----------------+ class="kw">private:
正文
<span class="number">08</span>. <span class="comment">//+----------------+</span> <span class="number">09</span>. <span class="keyword">double</span> Values[]; <span class="number">10</span>. <span class="comment">//+----------------+</span> <span class="number">11</span>. <span class="keyword">public</span>: <span class="number">12</span>. <span class="comment">//+----------------+</span> <span class="number">13</span>. <span class="keyword">void</span> Set(<span class="keyword">const</span> <span class="keyword">double</span> &arg[]) <span class="number">14</span>. { <span class="number">15</span>. <span class="functions">ArrayFree</span>(Values); <span class="number">16</span>. <span class="functions">ArrayCopy</span>(Values, arg); <span class="number">17</span>. } <span class="number">18</span>. <span class="comment">//+----------------+</span> <span class="number">19</span>. <span class="keyword">double</span> Average(<span class="keyword">void</span>) <span class="number">20</span>. { <span class="number">21</span>.&nb