从基础到中级:结构(五)(基础篇)
📘

从基础到中级:结构(五)(基础篇)

第 1/2 篇

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 开发属高风险,回测通过不等于实盘无害,参数请自测。

MQL5 / C++
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>.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">double</span> Values[]; <span class="number">10</span>. <span class="comment">//+----------------+</span> <span class="number">11</span>.&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">public</span>: <span class="number">12</span>. <span class="comment">//+----------------+</span> <span class="number">13</span>.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">void</span> Set(<span class="keyword">const</span> <span class="keyword">double</span> &amp;arg[]) <span class="number">14</span>.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <span class="number">15</span>.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="functions">ArrayFree</span>(Values); <span class="number">16</span>.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="functions">ArrayCopy</span>(Values, arg); <span class="number">17</span>.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <span class="number">18</span>. <span class="comment">//+----------------+</span> <span class="number">19</span>.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">double</span> Average(<span class="keyword">void</span>) <span class="number">20</span>.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <span class="number">21</span>.&nb

常见问题

先找相邻两个高低点组成的N字,再把第三个反向点连成线段,出现五次有效转折即可视为雏形,用画线工具手动标一遍最直观。
因为先想清楚行情怎么分段、信号怎么归类,再去写代码才不会乱;没理清逻辑直接堆函数,后期改一处崩一片。
可以,小布盯盘的AIGC会扫描品种页自动标出疑似结构段并提示转折次数,你只需复核是否漏掉关键高低点。
把多个相似重载函数收成一次模板声明,改参数只动一处,编译体积也更小,适合把常见结构判断逻辑批量复用。
把错判的K线截出来,单独列当时高低点连线依据,对比后续真实突破方向,重点记自己哪一段主观加了戏。