📘

MQL5 到底给你什么

MQL5 到底给你什么

MQL5 是 MT5 原生的一套编程环境,专门用来写指标、脚本和 EA。对外汇、贵金属交易者来说,它最直接的价值是把你看盘时脑子里那套价格行为规则,变成能自动跑在历史数据上的程序。 MT5 策略测试器支持多线程回测,单币种 1 分钟数据回测通常能在数秒到数分钟内出结果,这取决于你的 CPU 核心数和样本长度。高风险提示:外汇与贵金属杠杆交易可能让本金快速归零,任何回测盈利都不代表实盘概率。 新手常误以为要先精通 C++ 才能碰 MQL5。实际上它的语法是 C 系子集,会写 if/for/函数就能改现成代码。打开 MT5 按 F4 进编辑器,从「文件-新建」选 EA 模板,你就能在十分钟内跑通第一个测试。

「零基础摸进 MQL5 的门」

没有编程底子直接啃 MQL5 确实费劲,但不是死路。这门语言卡在「交易领域专用」和「类 C 语法」的交叉点上——你既要懂 K 线、订单、指标这些金融市场物件,又得会写变量、循环、条件判断。后面几节会拆开揉碎了讲,先从能立刻在 MT5 里跑起来的东西入手。 MQL5 归在特定领域语言(DSL)这一类,和 Python、C++ 那种通用语言不同,它只干交易相关的事:EA 自动策略、自定义指标、脚本一次性任务。程序类型先记四种——EA 绑定图表等事件触发;脚本激活即跑一次;自定义指标只画信号不下单;库和包含文件负责把重复代码抽出来复用。 写代码用 MetaEditor 5,装 MT5 时自带。按 Ctrl+N 新建,选「脚本」走完向导,就会生成带 OnStart() 的空壳。OnStart() 是脚本入口,大括号里的东西激活后只执行一次。下面这段就是最朴素的第一个脚本,弹个窗说 Hello MQL5。 [CODE] void OnStart() { Alert("Hello MQL5"); } [/CODE] 逐行看:void 表示这个函数不返回任何值;OnStart() 是系统约定的脚本启动函数名;Alert() 是 MQL5 内置函数,往终端弹警告框;"Hello MQL5" 是字符串参数;分号结束语句。编译点「编译」按钮,描述栏没报错就能按播放丢进 MT5 跑。 语法红线就三条先记住:每条语句末尾加分号;// 后面单行注释编译器忽略,/* */ 包住多行注释;标识符字母开头、区分大小写,myVar 和 MyVar 是两个东西。基础数据类型 int 装整数、double 带小数点、string 存文本、bool 只有 true/false,char 单字符。数组用 [] 声明、{} 初始化、索引从 0 起,后面取收盘价开盘价全靠它。外汇和贵金属杠杆高、滑点跳空频繁,拿真账户跑任何脚本前,先策略测试器用历史数据验一遍。

MQL5 / C++
class="type">void OnStart()
  {
   Alert("Hello MQL5");
  }
class="type">void OnStart()
  {
   Alert("Hello MQL5");  class=class="str">"cmt">// the semicolon means the end of the code line
  }
class="type">void OnStart()
  {
   Print("Hello MQL5");   class=class="str">"cmt">// This line of code will print “Hello MQL5” when run
  }
class="type">void OnStart()
  {
   class=class="str">"cmt">/* In many programming languages, including MQL5
     a semicolon “;” is used to indicate the end of a statement.
   It is a crucial element for the compiler to understand the structure of the program.
   */
  }

◍ MQL5 基础类型与标识符的大小写敏感坑

MQL5 编译器把 myage 和 MyAge 当成两个完全不同的标识符,哪怕值都是 25 也不会冲突。写 EA 时若把止损变量写成 StopLoss 又在别处用 stoploss,回测会直接报未声明,这种大小写笔误在 MT5 里不会给任何警告。 int 存整数、double 存小数(如 3.14)、char 存单字符(如 'A')、string 存文本、bool 存 true/false,这些是订单逻辑里最常用的裸类型。Print() 和 Alert() 是保留字,不能拿来做变量名,否则编译失败。 数组声明有两种路径:定长写 int numbers[5],或省略长度直接 int numbers[] = {1,2,3,4,5} 让编译器数元素。访问首元素用 numbers[0],MQL5 数组下标从 0 开始,越界读会抛数组越界错误。 开 MT5 按 F4 建个脚本,把下面代码整段贴进去编译跑一遍,控制台能看到 Age 打印 25、myChar 打印 A,比看文档直观。外汇与贵金属杠杆高,这类基础语法错会让实盘 EA 直接不加载,先在策略测试器验证再上真户。

MQL5 / C++
class="type">int myage = class="num">25;
class="type">int MyAge = class="num">25;   class=class="str">"cmt">// myage is a different identifier from MyAge.
    class="type">int Age = class="num">25;        
    Print(Age);   
    class=class="str">"cmt">/*
    Int is the data type is an integer because class="num">25 is a whole number.
    Age is the  identifier
    Print is a reserved word in MQL5 and it serves a special function. This means it can&class="macro">#x27;t be used as an identifier
    */
class="type">int myInteger = class="num">10;
class="type">class="kw">double myDouble = class="num">3.14;
 class=class="str">"cmt">// Declaring a character variable 
        class="type">char myChar = &class="macro">#x27;A&class="macro">#x27;;

class=class="str">"cmt">// Printing the character to the console 
        Print(myChar);
class="type">class="kw">string myString = "Hello, MQL5!";
Alert(myString);
class="type">bool iam25 = true;
Integer array declaration
class="type">int numbers[class="num">5];
class=class="str">"cmt">// Initializing an integer array
   class="type">int numbers[] = {class="num">1, class="num">2, class="num">3, class="num">4, class="num">5};
class=class="str">"cmt">// Accessing elements of an array
   class="type">int firstNumber = numbers[class="num">0];   class=class="str">"cmt">// Accesses the first element

一点提醒

走到这里,MQL5 的编程地基算是铺完了:从环境到程序类型,再到语言基础,下一步就是拿 MetaEditor 写第一个带均线判断的脚本。 真正上手才会发现,文档里看着顺的逻辑,在实盘 tick 流里常出岔子——比如跨品种取价忘了处理点差导致的偏移。外汇与贵金属杠杆高、滑点凶,任何自写逻辑都先跑历史回测再上模拟。 作者系列里第 13~19 部分已经在讲自定义指标和形态检测,顺着读比反复看入门更能长功力。

常见问题

先装好交易终端自带的代码编辑器,新建一个脚本文件,从 OnStart() 函数里写 OrderSend 相关逻辑,跑模拟盘验证再实盘。
基础类型与标识符区分大小写,Color 和 color 会被当成两个不同名字,统一命名风格避免冲突。
小布可以读取你贴出的交易逻辑或信号描述,指出常见类型误用和大小写坑,并给出改写建议,你照着抄进编辑器即可。
可能导致价格计算被截断成整数、点差判断失真,回测和实盘信号不一致,定义时按需选整型或双精度。
先在模拟盘加载观察一周,确认无无限下单或重绘逻辑再考虑实盘,外汇贵金属高风险,别盲信收益展示。