文章 "MQL5 Cookbook: 处理 BookEvent"

 

新文章 MQL5 Cookbook: 处理 BookEvent已发布:

本文研究 BookEvent - 一个市场深度事件,以及它的处理原理。一个处理市场深度状态的 MQL 程序,作为例程。它采用面向对象方法编写。处理结果作为面板显示在屏幕上,还有市场深度级别。

正如众所周知的那样,MetaTrader 5 交易终端是一个多市场的平台,便于外汇,股市,期货和差价合约的交易。根据 自由职业 版块统计,交易者的交易数量不光在外汇市场增长。

在这篇文章中我希望给 MQL5 编程新手介绍 BookEvent 处理。这个事件与市场深度连接 - 股票资产和其衍生物的交易工具。然而,外汇交易员也发现市场深度很有用。在 ECN 账户中,流动性提供商提供订单数据,虽然只在他们的聚合模式。这些账户变得越来越流行。

1. BookEvent

根据文档,这个事件在市场深度状态变化时产生。让我们认可 BookEvent 是一个市场深度事件。

市场深度是一个订单数组,包括不同方向 (卖和买),价格和交易量。市场深度的价格接近市场,且因此认为是最佳的。

图例.1 MetaTrader 5 中的市场深度

图例.1 MetaTrader 5 中的市场深度

在 MetaTrader 5 中,一个 "订单预定" 名为 "市场深度" (图例.1)。有关市场深度的详细信息可在客户终端的用户指南里找到。

作者:Dennis Kirichenko

 

感谢您提供这篇文章。

关于错误的一点说明:

Все программы, работающие по данным стакана, по форме будут являться советниками, ведь обработчик события BookEvent есть только в советниках. Правда, можно сделать связку "советник-индикатор", где истинный индикатор сможет принимать данные от советника и обрабатывать состояние стакана.

这是不正确的,指标也可以处理 OnBookEvent。

 

angevoyageur:

关于错误:

不是这样的,指示器也可以处理 OnBookEvent。

Alain,感谢您的留言。是的,没错,我错了。它在指示器中也能工作...我在创建指标 时依赖的是处理程序列表,其中并没有OnBookEvent()。

最重要的是,文档中写道

OnBookEvent()函数是BookEvent 事件的处理函数。 只有 当市场深度状态发生变化时,智能交易系统才 会生成 BookEvent 事件


 
denkir :

阿兰,谢谢你的留言。是的,没错,我错了。它在指标中也起作用...我依赖的是创建指标 时的处理程序列表,其中没有 OnBookEvent()。

最重要的是,文档中是这么说的:

没错,文档应该更正。你会向 ServiceDesk 反映吗?
 
angevoyageur:
没错,文件需要更正。您是否正在为此事撰写 ServiceDesk?
不,还没有写...会写的,并对文章材料进行修改...
 

本文有一个小错误,仅供参考:

All programs working with Depth of Market data will have a form of an Expert Advisor, as only Expert Advisors feature the event handler of BookEvent. There is a possibility, however, to write an "Expert-Indicator" pair , where the indicator can receive data from the EA and process the Depth of Market state.

并非如此, 指示符也可以处理 BookEvent。这个错误是基于文档的错误,应该很快就会得到纠正。我们已与文章作者和服务台取得联系。

 

下午好,感谢您的文章,非常有用!

有这样一个问题,假设我处理BookEvent 事件,我的处理程序将删除、下订单,这反过来又将再次启动该事件.....,那么在下订单(删除订单)的截止日期和新的 BookEvent 事件再次形成的时刻,我最初的程序会被中断吗?因为我注意到代码执行并没有到达终点....。不是所有代码都被执行了...我希望我已经说清楚了 ))

 
thejobber:

下午好,感谢您的文章,非常有用!

有这样一个问题,假设我处理BookEvent 事件,我的处理程序将删除、下订单,这反过来又将再次启动该事件.....,那么在下订单(删除订单)的截止日期和新的 BookEvent 事件再次形成的时刻,我最初的程序会被中断吗?因为我注意到代码执行并没有到达终点....。不是所有代码都被执行了...我希望我已经说得很清楚了 ))

谢谢您的意见!

不会,当一个事件正在处理时,程序控制不会在新事件发生时自动转移到另一个处理程序...您可以使用 Print() 函数检查这一点(最好添加一个暂停的 Sleep())。

有一个 "事件队列 "的概念。

根据文档说明

程序只接收来自运行图形的事件。所有事件都会按照接收顺序一个接一个地处理。如果队列中已经有一个NewTick 事件,或者该事件正处于处理状态,则新的 NewTick 事件不会被放入 mql5 程序队列。同样,如果 mql5-program 队列中已有ChartEvent 事件或该事件正在处理中,则不会将该类型的新事件放入队列。定时器事件的处理方法与此相同--如果队列中已有定时器 事件或该事件已被处理,则不会将新的定时器事件放入队列。

事件队列的大小有限但足够大,因此对于正确编写的程序来说,队列溢出的可能性不大。如果队列溢出,新事件就会被丢弃,不会进入队列。

 

事件队列的规模有限但足够大,因此对于正确编写的程序 来说,队列溢出的可能性不大。当队列溢出时,新事件会被丢弃,而不会进入队列。

所以我的担心并非毫无根据 ))我为 usd\rub 期货写了一个传播器,让最好的价格一直保留在堆栈中....。那么队列肯定会溢出,因为赌注每秒要更新很多次,这还不包括我在那里放了一些东西、删除了一些东西......我肯定不会在时间.....,而且这只是演示...在真实市场上,有一个疯狂的赌注))

谢谢你把我的思路引向正确的方向 )

 

下午好。这篇文章信息量很大。我有以下问题。

有一项任务是根据执行订单的类型(市场订单/限价订单)过滤在交易工具上执行的交易。

如何将 OnBookEvent 事件和 OnTick 事件联系起来以完成这项任务,即如何确定交易中涉及的订单类型?据我所知,仅靠 OnBookEvent 是无法解决这个问题的。

 

Rubick:

......如何将 OnBookEvent 事件和 OnTick 事件联系起来解决这个问题,即如何确定交易中涉及哪些类型的订单?据我所知,这样的任务不能只通过 OnBookEvent 来解决。

最有可能的是,您需要的不是玻璃,而是市场操作的处理程序。