文章 "轻松快捷开发 MetaTrader 程序的函数库(第五部分):交易事件集合类,向程序发送事件"

 

新文章 轻松快捷开发 MetaTrader 程序的函数库(第五部分):交易事件集合类,向程序发送事件已发布:

在之前的文章中,我们已着手创建一个大型跨平台函数库,简化 MetaTrader 5 和 MetaTrader 4 平台上的程序开发。 在第四部分中,我们测试了在帐户上跟踪交易事件。 在本文中,我们将开发交易事件类,并将它们置于事件集合当中。 从那里,它们将被发送到 Engine (引擎)库的基准对象,并控制程序图表。

现在我们可以编译 EA 并在测试器中启动它。 单击按钮时,测试器日志中会显示两行有关发生的帐户事件的简短消息。


EA 事件处理程序中的条目不会显示在日志中,因为它们在测试器之外工作。 如果在模拟账户上点击 EA 按钮,终端日志中会显示三行:CEvent 类方法显示两行短消息,另一行来自 EA 的 OnChartEvent() 处理程序。

下面是下单删除挂单时在日记中显示消息的示例:

- Pending order placed: 2019.04.05 23:19:55.248 -                                                              
EURUSD 0.10 Sell Limit #375419507 at price 1.14562                                                             
OnChartEvent: id=1001, event=TRADE_EVENT_PENDING_ORDER_PLASED, lparam=375419507, dparam=1.14562, sparam=EURUSD 
- Pending order removed: 2019.04.05 23:19:55.248 -                                                             
EURUSD 0.10 Sell Limit #375419507 at price 1.14562                                                             
OnChartEvent: id=1002, event=TRADE_EVENT_PENDING_ORDER_REMOVED, lparam=375419507, dparam=1.14562, sparam=EURUSD

作者:Artyom Trishkin

 
我想知道图书馆是如何处理许多交易上的细微差别的。因此,也许值得尝试至少完成初步测试

关于交易、自动交易系统和交易策略测试的论坛。

更少代码,更多滚动......编写 EA

fxsaber, 2019.03.12 21:46

这项任务 完全可以视为对在 MT5 下编写交易能力的初步测试。因此,每个人都可以一试身手。

 
fxsaber:
我想知道图书馆是如何处理许多交易上的细微差别的。因此,也许至少值得尝试通过初步测试

库中还没有交易类。目前,有关账户历史和活跃市场状态的工作即将结束--下一篇文章将介绍对净额结算账户事件的跟踪,然后介绍在 MetaTrader 4 中的账户工作,在准备好信息输出类之后,将介绍交易类的工作。

 
Artyom Trishkin:

库中还没有交易类。目前,有关账户历史和活跃市场状态的工作即将结束 - 下一篇文章将介绍对净额结算账户事件的跟踪,然后介绍在 MetaTrader 4 中的账户工作,在准备好用于信息输出的类之后,将介绍交易类的工作。

明白了吧。MT5 在这方面非常复杂,我认为我们需要一整篇文章来详细描述 MT5 上出现的交易微妙之处以及如何将其考虑在内。

 
Artyom Trishkin: 跟踪净额结算账户事件将在下一篇文章中发布,届时
库将自动检测并处理净额结算账户和对冲账户类型?
 
fxsaber:

收到。MT5 在这方面非常复杂,可能需要一整篇文章来详细描述 MT5 上出现的交易微妙之处以及如何将其考虑在内。

我正忙于处理此类情况。我希望我能正确处理所有这些情况。

还有一些有趣的事情--在所述库的基础上,将创建用户案例函数,以便轻松访问库中收集和存储的数据,使用交易类,并在此基础上简单轻松地创建程序。
虽然现在已经可以使用,但访问级别较低--通过指针访问集合列表,再通过指针访问集合中的任何数据。但这并不符合我们一开始提出的 "主张",即在程序库的基础上创建自己的程序非常容易。但这仅仅是个开始:)

 
Igor Makanu:
图书馆会自动检测并处理净额结算账户和套期保值类型的账户吗?

是的,已经完成。将在下一篇文章中发布。

 
Artyom Trishkin:

是的,已经是了。下一篇文章即将发表。

但目前只适用于账户历史和市场状态。到那时,就可以根据收集到的数据获取任何账户类型的任何头寸的历史记录。我会将其纳入我的计划。
 

作为测试工具非常强大,感谢作者分享

 

你好,Artyom,恭喜你完成了一项伟大的工作!根据文中的描述,函数 CHistoryCollection::OrderSearch(...) 中 可能 缺少 一个 断点

无论是否找到 "丢失的订单", for 循环都会完成从 start-10 的 所有迭代

也许, 在找到 "丢失的订单 "加入一个 中断会更有效

ulong CHistoryCollection::OrderSearch(const int start,ENUM_ORDER_TYPE &order_type) 
  { 
   ulong order_ticket=0; 
   for(int i=start-1;i>=0;i--) 
     { 
      ulong ticket=::HistoryOrderGetTicket(i); 
      if(ticket==0) 
         continue; 
      ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)::HistoryOrderGetInteger(ticket,ORDER_TYPE); 
      if(this.IsPresentOrderInList(ticket,type)) 
         continue; 
      order_ticket=ticket; 
      order_type=type; 
      break; 
     } 
   return order_ticket; 
  } 

您觉得呢?

Documentation on MQL5: Constants, Enumerations and Structures / Trade Constants / Order Properties
Documentation on MQL5: Constants, Enumerations and Structures / Trade Constants / Order Properties
  • www.mql5.com
Requests to execute trade operations are formalized as orders. Each order has a variety of properties for reading. Information on them can be obtained using functions Position identifier that is set to an order as soon as it is executed. Each executed order results in a deal that opens or modifies an already existing position. The identifier of...
 
Alvaro Arioni :

你好,Artyom,恭喜你完成了一项伟大的工作!根据文本中的描述,函数 CHistoryCollection::OrderSearch(...) 可能 缺少 一个 断点

无论是否找到 "丢失的订单", for 循环都会完成从 start-1 0 的 所有迭代

也许, 在找到 "丢失的顺序 "后 中断会更有效率

...

你怎么看?

丢失的订单可能不止一个