全新 MetaTrader 5 和 MQL5 来袭

Yuriy Zaytsev | 19 八月, 2013

我将给出部分功能的简短描述。


图 1. 这不是 Photoshop - 这是 MQL5。

MQL5 和 MT5 的引人入胜之处几乎全部实施于一个极高的层面。

MQL5 的根本性变革在于面向对象编程 (Object Oriented Programming, OOP) 的出现。我在 OOP 方面涉猎不深 - 事实上,经验丰富的程序员能获得更大的可能性。对于那些喜爱 MQL4 而对 OOP 知之甚少的程序员来说,开发人员提供了使用 MQL4 方式而无需 OOP 在 MQL5 中编程的可能性。不同之处在于功能,这需要重新熟悉。

让我们举一个简单的例子:新版本中不再有 Ask 和 Bid 变量。要获得 Bid 值,需要调用以下函数:

SymbolInfoDouble(Symbol(),SYMBOL_BID);

新版中不再有过去频繁使用的 Low[0] 或 iLow ( Symbol(), PERIOD_D1, 0 ),但可以轻易地重新构建它们。配合历史数据使用的新函数提供了从一个点到另一个点、从某柱到另一特定的柱或从某个选定时间到另一选定时间在内存中读取历史数据的可能性。此前,读取一个数据系列需要将整个可见范围都加载到内存中。无论您是否需要,数据都将读取;若您需要读取 M1,系统将会从 1999(如果有相应历史数据可用)一直读取到当前日期、小时和分钟。

现在,仅读取必要范围的数据,如此一来大大节省了时间和内存。

MqlRates rates_arrayG[];
Int Bar=30; // read only 30 bars stating from the zero one
iCopBar=CopyRates(Symbol(),PERIOD_M1,0,Bar,rates_arrayG);

此功能节省了时间和内存。

此类功能变化并不会为我们带来多少不适。我们只需要花费一点时间了解和熟悉新的函数或类似物。

我所期待的 MQL 的一些功能创新:

让我们在此稍作展开。

如果计时器在 OnInit 预设函数中预初始化,则调用 OnTimer() 函数(EA 初始化事件处理程序)。

示例:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetTimer(1); //each second we'll refer to OnTimer()
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit()
  {
   EventKillTimer(); // canceling of timer reference must be called at exit
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTimer()
  {
   MqlDateTime str1;
   TimeGMT(str1); // new function to get GMT time
   Comment(str1.hour
           ,str1.min
           ,str1.sec
           ,str1.day
           ,str1.mon
           ,str1.year
           ,str1.day_of_year
           ,OrdersTotal()
           ,PositionsTotal()
           );
  }

因此,控制可在较早接收订单号时获得,也可从允许写入实时可管理程序的计时器获得。有了这一可能性,我们便可以创建更为复杂的系统。

我喜欢 OnTrade() 函数。此函数在以下任意交易事件触发时调用:下单、激活止损或获利、更改止损或获利水平、发出/删除挂单。

现在,监视事件及相关交易操作要容易得多。无需循环检查订单号或柱的订单状态。此类循环在 MQL4 中使用,这样一来,就极大降低了程序的性能,而这一点对于最优化而言是很重要的。

下面我们要讨论的是 OnChartEvent() 函数。该函数调用为多个事件执行。我并没有逐个测试,但结果令人印象深刻:

在一个新的功能层面管理交易和图形的可能性 - 这正是开发人员所宣称的。

新的图形对象、按钮、输入字段出现。图表管理变得极为出色,您甚至可以从文件中插入图片 - 此选项对于那些喜欢特别设计的用户而言带来了极大的可能性。这不是 Photoshop,这是 MQL5 和 MetaTrader 5 发展潜力的结果。除了一应新功能,您还可以创建自己的按钮和输入字段添加,例如,用于关闭所有未结订单的按钮,或带有预设止损和获利参数的快速“买入”和“卖出”按钮。


图 2. 图形对象可创建信息面板。

图 2. 图形对象可创建信息面板

有一个令人不快的事实是:无法从指标创建对象。这是软件开发商故意为之,以加快指标的性能。好消息是,软件开发商同样也明白这一点,并有可能提供在一个图表内启动多个 EA 交易的可能性。 这样我们便能够通过对象创建 EA 指标而无需交易。现在就可以创建此类指标 - 它们的操作方式与普通指标并无不同。现在任务得以解决,即在一个图表中启动一个交易 EA,然后 EA 在第二个图表中创建对象,接下来在两者之间实行交易。

例如,我花了几个小时设法将我的突破指标从 MQL4 转换到 MQL5。大部分时间都花在了函数的学习和调试上。在 MQL5 中,代码变得更短。

而对于终端本身而言,数量众多的时间表让我印象深刻。在我看来,这似乎稍有过多之嫌。然而,丰富的分钟时间表对某些交易人员而言是十分有用的。那么,现在离自由设置的时间表的创建仅有一步之遥。现在,所有数据已仅作为分钟时间表存储,因此,不同时间表的同步完全没有问题 - 这是一项重要的技术解决方案。

现在 HISTORY(历史数据)目录下没有不同时间表的文件



图 3. 所有历史数据存储于单一文件中。

另外一个让人惊喜的新功能的引入是现在我们可以清除日志。

图 4. 一键清除 EA 日志,删除所有不必要的消息

这只是 MetaTrader 5 的一个简短介绍。我无法在如此短小的篇幅里给出系统所有新功能的描述 - 测试从 2009 年 9 月 9 日即已开始。这是一个具有象征意义的日子,我肯定这也会是一个幸运数字。就在几天之前,我拿到了 MetaTrader 5 终端和 MQL5 的试用版。我并没有试用所有的功能,即便如此,它们也给我留下了深刻的印象。

MetaQuotes 的“魔法师”们创造出令人惊叹的产品。作为拥有 25 年经验的资深开发人员,我已经看到了众多的可能性,并且敢断言结果的实现!

此致
Yuriy Zaytsev

Skype:yurazyuraz
yzh@mail.ru