零基础学 MQL5:用 C 语言底色撬开自动化交易编程
🧩

零基础学 MQL5:用 C 语言底色撬开自动化交易编程

(1/1)· 一位 C/C++ 老手用一年半写出 MQL5 文章,路径比天赋更值得抄

案例拆解新手友好
很多交易者卡在 MQL5 门口,是因为误以为必须先啃完厚重的编程教材。其实从 C 语言基础语法切入,再平移到 MQL5,起步成本能降一大半。别被「语言大师」四个字吓退,这篇文章就是给萌新拆路径的。

◍ 从 MQL5 起步做自己的策略工具

MQL5 是 MetaTrader 5 的原生编程语言,想在 MT5 里把价格行为分析自动化,绕不开它。官方社区 2023 年 7 月的一则示例帖拿到 2533 次查看、21 条讨论,说明普通交易者也在靠它改指标、写脚本。 对外汇和贵金属这类高杠杆品种,手动盯盘容易漏掉关键 K 线形态;用 MQL5 写个自定义指标,让终端替你标注入场区,概率上更稳。 开 MT5 按 F4 进 MetaEditor,新建一个 Indicator 模板,先跑通编译再改逻辑,是最快的入门路径。

「写给零基础者的自学路径」

这一节面向的是对 MQL5 甚至通用编程都几乎没有接触的交易者。原文作者把它定位成一次「自我访谈」,用问答方式拆解从零起步到写出品级合格 EA 的过程。 如果你打开 MT5 终端后连「文件-新建-智能交易系统」都还没点过,这一节就是给你铺路的:它不预设你懂变量类型,也不要求你读过前作。 高风险提示:外汇与贵金属杠杆交易可能令本金快速亏损,用真金白银跑任何自写代码前,请先在策略测试器用历史数据验证至少 3 个月周期。

从 C 到 MQL5 的迁移捷径

MQL5 的语法设计刻意贴近 C/C++,这让有底层语言底子的人能极快上手。作者自述有 23 年 C/C++ 经验,但接触 MQL5 仅 1.5 年,却已能输出可在 MT5 跑起来的完整文章案例——说明语言迁移成本远低于直觉预期。 如果你是完全零基础,直接啃 MQL5 社区文档效率偏低。社区外资料分散且良莠不齐,弊大于利;而 C 语言资料极其完备、文档化好。只需学 C 的基础语法与命令(不必深入),再过渡到 C++ 同时练 MQL5,起步会顺畅很多。 另一个反直觉点:好程序员大多不是从头写,而是改。拿有经验的人的开源代码逐行改、跑、看结果,比按教程抄更能理解构建逻辑。外汇和贵金属交易自动化高风险,实盘前务必在策略测试器用历史数据验证逻辑。

◍ 从 C++ 视角写出的第一段 MT5 脚本

有 C/C++ 底子的人上手 MQL5,第一道坎不是语法,而是得把过程式思维换成事件驱动。作者最早只靠 MetaEditor 自带的文档和示例源码硬啃,写出了下面这段脚本,目的仅仅是验证自己有没有读懂 MQL5 的元素定义方式。 这段脚本干的事很窄:在图表上隐藏或显示时间轴 / 价格轴。但它证明了一件事——把已有的 C 枚举、输入参数写法直接套到 MQL5 里是走得通的,剩下的只是适配平台专属常量。 代码逐行拆解: 02-04 行用 #property 声明脚本版权、版本与描述,MT5 在脚本属性框里会直接读这些字段;05 行 script_show_inputs 让输入参数面板弹出。 07-10 行定义 eWhat 枚举,把 CHART_SHOW_DATE_SCALE(时间轴)和 CHART_SHOW_PRICE_SCALE(价格轴)映射成可读名字;11-14 行 eOp 枚举用 eFalse/eTrue 控制隐藏或显示。 16-17 行 input 声明两个外部参数,运行脚本时你能下拉选「改哪根轴」和「隐藏还是显示」;19-22 行 OnStart 是脚本入口,ChartSetInteger(0, ..., user01) 对当前图表(句柄 0)写入整数型属性,一行就完成改动。 外汇与贵金属交易自带高杠杆风险,这类脚本只改界面属性、不触单,但拿去批处理多图表时仍建议先在模拟盘验证。打开 MT5 按 F4 新建脚本粘入上述代码,编译后拖到黄金 H1 图,把 user00 选 eScalePrice、user01 选 eTrue,右侧价格轴就会消失——你能直观确认 MQL5 枚举与 ChartSetInteger 的传参逻辑。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class="macro">#class="kw">property copyright "Daniel Jose"
class="macro">#class="kw">property version   "class="num">1.00"
class="macro">#class="kw">property description "Modify special chart properties"
class="macro">#class="kw">property script_show_inputs
class=class="str">"cmt">//+------------------------------------------------------------------+
enum eWhat  {
                     eScaleDate   = CHART_SHOW_DATE_SCALE,   class=class="str">"cmt">//Time scale
                     eScalePrice = CHART_SHOW_PRICE_SCALE   class=class="str">"cmt">//Price scale
                  };
enum eOp    {
                     eFalse,                                  class=class="str">"cmt">//Makes hidden
                     eTrue                                    class=class="str">"cmt">//Makes visible
                  };
class=class="str">"cmt">//+------------------------------------------------------------------+
class="kw">input eWhat user00 = eScaleDate;                      class=class="str">"cmt">//Graphic class="kw">property
class="kw">input eOp   user01 = eFalse;                          class=class="str">"cmt">//What to do?
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void OnStart()
{
   ChartSetInteger(class="num">0, (ENUM_CHART_PROPERTY_INTEGER) user00, user01);
}
class=class="str">"cmt">//+------------------------------------------------------------------+

「枚举与显式转换的实战拆解」

MQL5 脚本里第 2~4 行只是向用户说明代码用途的注释性内容,在学习和测试阶段可以直接删掉,不影响编译运行。但第 5 行的 #property 指令不能省,它告诉 MetaTrader 5 这是一个自定义脚本,并关联了后面第 16、17 行定义的 inputs 输入结构。 第 7 行和第 11 行出现了枚举(enum)。很多只学过 MQL5 或来自非 C/C++ 体系的人初看会懵,其实它本质就是一组带名字的常量序列。若不给枚举成员赋值,计数从 0 开始;第 11 行的枚举就遵循这个规则,eFalse 在第 12 行被显式赋 0,第 13 行第二个成员顺延为 1,再往后就是 2、3……C/C++ 里 0 为假、1 为真,MQL5 完全一致。 第 12 行末尾的 // 注释在 MT5 里不只是给自己看。把脚本拖到图表会弹出图例 01 的用户交互窗口,里面高亮显示的文字正是代码注释内容。相比其他语言要写额外逻辑才能做这种用户提示,MQL5 用注释就能自定义弹窗消息,既好读又实用。 第 7 行的枚举和第 11 行不同:它的每个成员都手动绑定了 MQL5 内置常量数值。之所以不直接用常量而包一层枚举,是因为若用裸常量就得配合数组或结构,麻烦得多;枚举允许你在任意位置插入任意值,编译器自动分配。我见过不少交易者绕远路写复杂结构,其实第 21 行一行就能搞定。 第 21 行是真正执行的唯一一行,这里必须做显式类型转换。处理器只认数字不在意类型,但 ChartSetInteger 函数要求特定参数类型而非裸数值;即便你传的数字就等于那个常量,编译器也会报错。显式转换后编译器才确认类型匹配,外汇和贵金属市场波动剧烈、杠杆风险高,在 MT5 里跑这段代码验证前请先用模拟盘。

Python 与 MQL5 的分工边界

常被问到刚入门量化要不要先啃 Python。结论很直接:若目的只是用数学方式快速验证某个 SETUP 是否盈利,Python 比走完 C→C++→MQL5 的路子省事得多,它可以通过官方接口直接拉 MT5 数据跑回测。 但边界要划清。Python 能复刻不少 MQL5 程序员的调研动作,甚至把结果导出到 Excel 做图形表现;它却不能在 MT5 图表上生成指标或 EA,这件事只能由 MQL5 完成。两者不是替代关系,是互补。 为什么不直接用 Excel 的 VBA?VBA 无法直接访问 MT5 数据,要么写 DLL 要么手动导一堆 CSV;而 Python 改个数据库指向就能重新拉数重算,Excel 里则得重做整套计算。外汇与贵金属杠杆高、滑点跳空频繁,任何回测结论都只是概率倾向,实盘前务必在小布盯盘里用历史tick复核。 所以建议很朴素:两条线都摸。你不知道哪天要临时写个脚本扫品种相关性,还是得进 MT5 挂个自定义指标。开 MT5 装好 Python 包,先跑一段拉 EURUSD 日线算均值的代码,比空谈工具优劣有用。

◍ 从能跑起来的小函数开始练手

刚接触 MQL5 的人容易一上来就想写复杂 EA,其实更稳的路子是先用简单函数做出能跑的东西。哪怕只是切换图表属性这类小动作,先跑通再一点点加逻辑,比空想架构更有用。 评论区有人提到用 AI 辅助写 EA 并不轻松,反而是先补 C/C++ 基础更顺手;也有老用户说 MQL5 比外部桥接快,因为原生代码少一层管道。把基础函数玩熟,后面接 CSV、套接字才不至于卡壳。 顺带说一个容易踩的类型细节:bool 和 int 互转时,false 就是 0,true 只可能是 1,但给 bool 赋非零值(比如 -5)它仍记为 true。下面这段在 USDCAD M15 上跑过,输出能直接验证。 别把正态当圣经 类型隐式转换看着简单,实盘里若拿 bool 当状态位又顺手赋了计数变量,逻辑会悄悄偏掉。开 MT5 把下面代码贴进脚本跑一次,比看十遍说明更踏实。

MQL5 / C++
    class="type">bool b1 = class="num">0, b2 = -class="num">5, b3 = class="num">5;
    Print(b1,", ", b2,", ", b3);
    Print((class="type">int)true,", ", (class="type">int)class="kw">false);
class="num">2025.04.class="num">15 class="num">01:class="num">48:class="num">32.862 BuySellStop(USDCAD,M15)      class="kw">false, true, true
class="num">2025.04.class="num">15 class="num">01:class="num">48:class="num">32.862 BuySellStop(USDCAD,M15)      class="num">1, class="num">0
把语法对照交给小布
小布盯盘内置的 AIGC 能把你写的 C 片段自动映射成 MQL5 雏形,省去翻文档的对表时间,你只管调逻辑。

常见问题

概率上更吃力。先摸一点 C 语言语法和编程逻辑,再碰 MQL5 会顺很多,社区优质资料也大多默认你有这点底色。
可以。小布盯盘的 AIGC 模块能解释基础指标脚本结构,并把简单 C 逻辑转成 MQL5 示例,适合边看边改。
MQL5 在语法和命令设计上贴近 C/C++,老手无需重学概念,只需适配交易终端的专用函数。
不一定。多改别人的开源代码、做小实验,比死记课程更容易建立真实手感,犯错本身就是学习环节。
若目标只在 MT5 内跑策略,MQL5 更直接;Python 适合做外部分析和数据管道,两者不冲突。