MQL5 简介:如何编写简单的EA 交易和自定义指标(基础篇)
📘

MQL5 简介:如何编写简单的EA 交易和自定义指标(基础篇)

第 1/3 篇

◍ 从零搭一个 MT5 脚本的骨架

MQL5 是 MetaTrader 5 的 native 编程语言,用来写 EA、自定义指标和脚本。和 MQL4 比,它强制区分 OnTick / OnCalculate 等事件函数,编译通过才能挂到图表上跑。 一个最基础的 EA 只需要两个结构:#property 元信息 + OnTick() 主逻辑。下面这段是官方示例里被下载验证过 2.5 万次以上的最小可运行框架,新手照抄能直接编译。 外汇和贵金属杠杆高、滑点跳空频繁,任何自动逻辑先上策略测试器用历史数据跑,别直接挂真仓。

MQL5 / C++
class="macro">#class="kw">property strict
class="type">int OnInit() { class="kw">return(INIT_SUCCEEDED); }
class="type">void OnTick() {
   class="type">class="kw">double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   if(bid > class="num">0) Print("Bid: ", bid);
}

「MQL5 能给老 MQL4 手带来什么」

MT5 里的 MQL5 相比 MQL4 在运行性能和扩展潜力上明显更高,老 MQL4 用户转过来最先感受到的是编译后执行效率与内置函数库的差别。 本文给出的 EA 和自定义指标示例都很轻量,目的是让你直接在 MT5 里新建脚本照抄跑通,而不是啃语法手册。 MQL5 参考已经随客户端打包,按 F1 调出的帮助覆盖了绝大多数语言细节;无论你写过 MQL4 还是纯新手,都能靠这套内置文档加示例起步。

开 MT5 写第一个 EA 前先认门

MT5 和 MT4 最大的区别在交易对象模型:持仓是市场承诺合同,订单是条件触发指令,交易则是经纪商执行订单后引发的建仓、改仓或平仓事实。这三者分离后,EA 和指标的逻辑边界比 MT4 清晰得多。 平台内置的 MQL5 能写三类程序:EA 负责按算法自动下单和平仓,指标只做图表化分析,脚本跑一次性序列操作。它们都能调标准库和 DLL,也能用 #include 把别的文件代码拉进来。 新建程序不用碰鼠标太多:开 MT5 客户端后按 F4 进 MetaEditor,再按 Ctrl+N 调出向导,选好 EA / 指标 / 脚本 类型,填名称和作者,系统给的就是带事件函数骨架的模板。写完按 F7 编译,无错会生成 .ex5 文件,拖到图表就能跑。 MQL5 是事件驱动语言。新报价来触发 EA 的 OnTick、指标重算走 OnCalculate;订单成交或持仓变动会触发 EA 独有的 OnTrade,这个功能 MT4 根本没有对应物。还有 OnBookEvent(深度变更)、OnTimer(计时器)也都是 MT4 没有的。 变量必须先声明类型。MQL5 比 MT4 多出一票类型:bool 占 1 字节,double 占 8 字节且常存价格,datetime 是从 1970-01-01 00:00:00 起算的秒数占 8 字节,long 范围到约 9.22×10¹⁸ 占 8 字节。选错类型要么吃内存要么丢精度,结构(struct)可以把相关字段打包在一起用。 打开你的 MT5 按 F4 建个空 EA 模板,看一眼 OnInit 和 OnTick 的空函数长什么样,比看十遍文档都实在。外汇和贵金属杠杆高,实盘前务必先在策略测试器跑历史数据。

◍ 亚欧美时段挂单与均线追踪的实战框架

这套示例系统押注一个现象:欧洲机构早晨进场,随后美国数据把欧美走势带出来。图表周期不强制,但用分钟柱能在一屏里看完当天,方便盯盘。 服务器时间早7点,在当日价格区间上下各加一个点挂 buy stop 和 sell stop;买挂单要算点差,止损放在区间另一侧。单子成交后,止损只向盈利方向移动,锚定的是分钟图计算的简单移动平均线,周期240。 和经典追踪止损比,这种玩法不容易被带修正的尖峰扫掉;代价是趋势末尾横盘初现时会被洗出去。外汇与贵金属波动大,这类提前离场属正常概率,不是系统失效。 波动用日图 ATR(5) 量,也就是过去一周日均波幅。买单获利位 = 当日最低价 + ATR值;卖单 = 当日最高价 - ATR值。若算出的挂单价夹在止损和获利之间,当天就不下单。晚7点后清掉所有未成交挂单,已开仓继续追踪到平掉。

「用 ATR 把利润边界画到主图上」

想直接看系统能扛多少波动,就写个指标把上下轨铺在价格上。以 D1 的 ATR(5) 为基准,用当日最低价减、最高价加来推买卖止盈边界,属于价格行为里‘波动即距离’的直观用法,外汇和贵金属杠杆高,轨道只作参考,破轨不代表反转概率确定上升。 预处理指令不带分号,用 #property 挂版权、链接、说明与版本;indicator_chart_window 把图塞进主图,indicator_buffers 2 配两条线,各给 DRAW_LINE、RGB 颜色和标签。input 暴露 ATRper=5 与 ATRtimeframe=PERIOD_D1,默认值即开图就能跑。 OnInit 里 SetIndexBuffer 把 bu[]、bd[] 绑成 0/1 号缓冲区;OnCalculate 用 CopyBuffer 从 iATR 句柄抓数据,ArraySetAsSeries(atr,true) 后索引 0 是当前未完成柱、1 是昨完结柱。for(i=prev_calculated;i<rates_total;i++) 逐柱跑,用 time[]/PeriodSeconds 折算天数,新的一天重算 h_day/l_day,上轨贴最小日价、下轨贴最大日价。 编译按 F7,若报‘转换可能损失数据’多是刻意截断小数,非致命。指标挂上 MT5 主图后,你能立刻比对价格触碰上下轨的频率,从而判断该周期 ATR 参数是否过窄或过宽。

MQL5 / C++
class="macro">#class="kw">property copyright "class="num">2010, MetaQuotes Software Corp."
class="macro">#class="kw">property link      "[MQL5官方文档]
class="macro">#class="kw">property description "本指标使用平均市场波动"
class="macro">#class="kw">property description "计算获利水平. 它使用的数据是"
class="macro">#class="kw">property description "平均真实波动范围 (ATR) 指标, 根据"
class="macro">#class="kw">property description "每日价格数据计算. 指标数值的计算是"
class="macro">#class="kw">property description "使用每日价格的最大值和最小值."
class="macro">#class="kw">property version   "class="num">1.00"
class="macro">#class="kw">property indicator_chart_window
class="macro">#class="kw">property indicator_buffers class="num">2
class="macro">#class="kw">property indicator_plots  class="num">2
class="macro">#class="kw">property indicator_type1   DRAW_LINE
class="macro">#class="kw">property indicator_color1  C&class="macro">#x27;class="num">127,class="num">191,class="num">127&class="macro">#x27;
class="macro">#class="kw">property indicator_style1  STYLE_SOLID
class="macro">#class="kw">property indicator_label1  "Buy TP"
class="macro">#class="kw">property indicator_type2   DRAW_LINE
class="macro">#class="kw">property indicator_color2  C&class="macro">#x27;class="num">191,class="num">127,class="num">127&class="macro">#x27;
class="macro">#class="kw">property indicator_style2  STYLE_SOLID
class="macro">#class="kw">property indicator_label2  "Sell TP"
input class="type">int ATRper = class="num">5; class=class="str">"cmt">//ATR 周期数
input ENUM_TIMEFRAMES ATRtimeframe = PERIOD_D1; class=class="str">"cmt">//指标周期类型
class="type">class="kw">double bu[],bd[];
class="type">int hATR;
class="type">void OnInit()
  {
  SetIndexBuffer(class="num">0,bu,INDICATOR_DATA);

常见问题

先开MT5终端里的 MetaEditor,新建 EA 模板,把平仓逻辑写在 OnTick 里即可,不用先学完整语法。
事件函数和订单处理模型变了,挂单和持仓要用不同结构体分开处理,老写法直接搬会报错。
可以,把品种页打开让小布看盘口和信号,它能提示你均线追踪和挂单逻辑里的高风险时段冲突。
概率上伦敦与纽约重叠段滑点大,建议用 ATR 动态放宽追踪距离,减少无效触发。
用 ATR 算出通道后调 ObjectCreate 画横线或矩形,绑定当前品种主图窗口就能实时显示。