零基础学 MQL5:用 C 语言底色撬开自动化交易编程
(1/1)· 一位 C/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 的传参逻辑。
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 把下面代码贴进脚本跑一次,比看十遍说明更踏实。
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