烟消火灭网

打开MetaEditor,新建一个EA,系统自动生成的那几十行代码里,OnTick函数是空的。这就是MQL5的起点——你不需要从零写框架,但必须理解它为什么和MQL4长得不一样。 2010年MetaQ

mql5教程

打开MetaEditor,新建一个EA,系统自动生成的那几十行代码里,OnTick函数是空的。这就是MQL5的起点——你不需要从零写框架,但必须理解它为什么和MQL4长得不一样。

2010年MetaQuotes发布MQL5时,大量MQL4开发者骂声一片。原因很简单:MQL4里写一个均线交叉策略,二十行代码搞定;MQL5里同样的逻辑,光是定义指标句柄就要多写好几行。但这不是MetaQuotes故意折腾人。MQL4的指标调用是同步的,每次tick来了重新算一遍;MQL5改成了异步句柄机制,指标在独立线程里跑,EA通过句柄拿数据。单线程变多线程,代码自然变长。

句柄这个东西绕不过去

看一段实际代码:

int maHandle = iMA(_Symbol, PERIOD_H1, 20, 0, MODE_SMA, PRICE_CLOSE); double maValues[]; ArraySetAsSeries(maValues, true); CopyBuffer(maHandle, 0, 0, 3, maValues);

iMA不返回均线值,返回一个句柄——你可以理解成指标的身份证号。真正的数值要用CopyBuffer去取。新手最常犯的错就是拿iMA的返回值当价格用,编译不报错,运行时结果全是零。

ArraySetAsSeries那行也容易漏。MQL5的数组默认索引方向跟MQL4相反,不设置的话,maValues[0]拿到的是最老的数据而不是最新的。这个坑我见过至少五个人踩过,包括我自己。

订单系统是另一个分水岭

MQL4的OrderSend参数多到离谱,十一个参数排在一起,写错一个位置编译器也不拦你。MQL5换成了MqlTradeRequest结构体,字段名明确,配合MqlTradeResult返回结果。刚转过来觉得啰嗦,用久了发现好处:字段名清晰,不会再把止损和止盈的位置搞反。

实际下单大概长这样:

MqlTradeRequest request = { }; MqlTradeResult result = { }; request.action = TRADE_ACTION_DEAL; request.symbol = _Symbol; request.volume = 0.1; request.type = ORDER_TYPE_BUY; request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK); request.deviation = 10; OrderSend(request, result);

注意request要初始化,花括号不能省。不初始化的话,结构体里那些没赋值的字段就是随机内存垃圾,OrderSend发出去的行为完全不可预测。

事件驱动模型值得花时间理解

OnTick只是入口之一。OnTimer可以做定时任务,OnTradeTransaction能监听成交变化,OnChartEvent处理鼠标键盘交互。MQL4里这些全靠轮询,MQL5给了事件回调,代码组织上干净很多。

但别滥用OnTimer。有人拿它替代OnTick做行情判断,结果回测时时间粒度对不上,实盘和回测差异巨大。OnTimer适合做账户状态检查、日志刷新这类跟行情无关的事。

该不该从MQL4转过来

如果你只写简单指标预警,MQL4够用,没必要折腾。但如果涉及多品种对冲、复杂仓位管理、或者需要跑在MT5的净持仓账户上,MQL5是唯一选择。MT4的经纪商在减少,这是事实。

学MQL5最大的障碍不是语法,是思维方式的切换。MQL4像写脚本,从上到下执行;MQL5更像写一个常驻服务,初始化、事件循环、资源释放,每个环节都要照顾到。头一百行代码会觉得别扭,写到一千行左右,回头看MQL4的代码,你会觉得那玩意儿怎么这么糙。

官方文档的示例代码质量参差不齐,有些还是2012年写的,风格跟现在差很远。建议直接看MetaQuotes后来发布的Standard Library,里面OrderInfo、PositionInfo这些类的封装方式,比早期示例靠谱得多。

访客,请您发表评论:

© 2026. sitemap