文章 "轻松快捷开发 MetaTrader 程序的函数库(第四部分):交易事件"

 

新文章 轻松快捷开发 MetaTrader 程序的函数库(第四部分):交易事件已发布:

在之前的文章中,我们已着手创建一个大型跨平台函数库,简化 MetaTrader 5 和 MetaTrader 4 平台程序的开发。 我们已拥有历史订单和成交集合,在场订单和仓位的集合,以及便捷选择和订单排序的类。 在这一部分中,我们将继续开发基础对象,并教导引擎(Engine)函数库跟踪帐户上的交易事件。

我们在测试器中启动 EA 并尝试按钮:

全部正确激活,日志接收有关发生事件的消息。

目前,最后一个事件总是固定的。 换句话说,如果我们将多个仓位同时平仓,那么只有其中的最后一笔仓位才会在事件里发现自身。 可以通过历史当中的新成交或订单的数量来跟踪大规模平仓。 然后可以通过它们的编号获得所有新平仓的清单,并定义它们的完整集合。 我们为此开发一个单独的事件集合类。 它能令我们持续访问程序中所有发生的事件。

作者:Artyom Trishkin

 

Artyom Trishkin,感谢您的工作,感觉这是一个功能强大的库。如果不难的话,请简要说明除了订单/历史记录之外,您计划涵盖(已经涵盖并准备出版)哪些功能。我刚刚开始在标准库的基础上编写一个类似的库,但我是从技术分析工具等功能方面入手的。我的想法是将经典 TA 和 RA 中使用的所有分析工具都写入库中,并使它们与指标工具和其他工具具有互操作性。CExpertSignal.

也许,如果您的功能涵盖了我的计划,那么我应该考虑继续开发您已经编写的功能。

 
alex_all:

Artyom Trishkin,感谢您的工作,感觉这是一个功能强大的库。如果不难的话,请简要说明除了订单/历史记录之外,您计划涵盖(已经涵盖并准备出版)哪些功能。我刚刚开始在标准库的基础上编写一个类似的库,但我是从技术分析工具等功能方面入手的。我的想法是将经典 TA 和 RA 中使用的所有分析工具都写入库中,并使它们与指标工具和其他工具具有互操作性。CExpertSignal.

也许如果您的功能涵盖了我的计划,那么我应该考虑继续开发您已经编写的内容。

目前文章中所描述的一切仅仅是个开始。使用终端订单系统将非常简单。根据需要向程序提供有关任何订单、交易、头寸、曾经发生的事件等的几乎所有数据。这就是订单系统的特点。
但根据已确定的结构,价格数据、指标、图形对象的工作将准备就绪并发布,画布上将有一个完整的图形外壳,根据最初设定的范例集成到库的结构中。也就是说,只需使用一个库即可,无需与其他库对接。例如,通过点击未结头寸图标获取数据,通过点击已建立的订单获取数据,通过点击价格条获取数据,在现有集合中搜索某些数据并进行处理等。

我计划以这样一种方式组织快速便捷的访问,即用户无需考虑如何获取必要的数据,只需请求并使用准备好的众多功能中的一个即可。

有很多计划和发展。我正在准备材料。包括请求(目前还没有请求)

 
Artyom Trishkin:

文章中所描述的一切仅仅是个开始。使用终端的订单系统将非常简单。根据需要向程序提供有关任何订单、交易、头寸、曾经发生的事件等的几乎所有数据。这就是订单系统的特点。
但根据已确定的结构,价格数据、指标、图形对象的工作将准备就绪并发布,画布上将有一个完整的图形外壳,并根据最初设定的范例与库的结构相结合。也就是说,只需使用一个库即可,无需与其他库对接。例如,通过点击未平仓头寸图标获取数据,通过点击已建立订单获取数据,通过点击价格条获取数据,在现有集合中搜索某些数据并进行处理等。

我计划以这样一种方式组织快速便捷的访问,即用户无需考虑如何获取所需的数据,只需请求并使用准备好的众多功能中的一个即可。

有很多计划和发展。我正在准备材料。包括请求(目前还没有)。

非常有趣。我已经在这里看到了两个类似版本的库。通用专家顾问库和跨平台库。第一个版本并不完全跨平台。第二个版本有很多缺点,尤其是缺少很多跨平台的功能。例如,仓位/订单 的开仓时间或开仓 价格。您必须自己使用 MQL 版本的宏,并单独编写代码。但它也有很多有趣的功能,尤其是我喜欢多个止损点,追踪功能非常强大且可定制。MM 有趣的选项。这是一些意大利人在这里发表的一系列文章,我想你应该明白其中的意思。总之,看看你能得到什么很有意思,如果你能利用以前类似的开发经验,取其精华,那就更好了。谢谢。

 
leonerd:

非常有趣。我在这里已经看到了两个类似版本的库。通用智能交易系统(Universal Expert Advisor)和跨平台库。第一个并不是真正意义上的跨平台。第二个版本有很多缺点,尤其是缺少很多跨平台的功能。例如,仓位/订单 的开仓时间或开仓 价格。您必须自己使用 MQL 版本的宏,并单独编写代码。但其中也有很多有趣的东西,特别是我喜欢多个止损点的存在,追踪功能非常强大且可定制。MM 有趣的选项。这是一些意大利人在这里发表的一系列文章,我想你应该明白其中的意思。总之,看看你能得到什么很有意思,如果你能利用以前类似的开发经验,取其精华,那就太好了。谢谢。

谢谢你的意见。但我不能阅读文章和搜索我所需要的东西,因为我没有时间做这些事,但我总是欢迎大家对未来功能提出要求、进行规划并将其列入实施清单。我们会提出建议。到目前为止,我正在按原计划实施。

 

这个库可以与Moex 上的交易所工具一起使用吗?

我认为,您不应该在处理订单的库中添加与资金管理无关的其他功能,最好是制作单独的库。

是的,该库手册中缺少详细说明。

 
Aleksey Vyazmikin:

这个库可以与 Moex 上的库存仪器一起使用吗?

我认为,您不应该在处理订单的库中添加与资金管理无关的其他功能,最好是制作单独的库。

是的,库手册中缺少详细说明。

测试将会显示。注意到的问题将得到解决。库将会有文档。但不是马上。

 

阿尔特姆,关于愿望--我是这么认为的--如果您在选择这样或那样的决定时有任何想法,什么是重要的,什么是要放弃的,等等......、

那么您可以通过民意调查等形式公布他们的想法,论坛成员会很乐意反馈他们的看法。

但是,如果有人在不了解项目 所有想法的情况下,就希望得到一些具体的东西,在我看来这是不可能的,因为你知道,就像往常一样--即使是一个已经准备就绪并记录在案的资料库,每个人的阅读方式也不尽相同,每个人都会从中汲取与自己当前相关的东西。

因此,我祝愿您的努力取得成功并坚定不移!:)

 

阅读、编译、运行 !


如果可以打 5 分的话

Top Artyom

 
Christian:

阅读、编译、运行 !


如果我可以打 5 分(满分 5 星

Top Artyom

谢谢
 

Artem, first of all. Artem, first of all. 我想说,非常感谢你 的系列文章和资料库。通过阅读您的文章,我了解了有关 OOP 的一切!您的文章真正做到了寓教于乐,帮助了需要帮助的人,也帮助了我。您在相同的地方使用不同的算法,这也是非常成功的。

现在让我来谈谈重点:::GetListByTime- 在这个方法中,你按照时间间隔选择订单,并将列表传递给调用程序,在第 3 部分 中,你写道:" 搜索和比较所需的属性是::GetListByTime":

"用于搜索和比较的 所需属性将根据列表排序的时间在订单属性中 进行设置:如果按开盘时间排序,则搜索属性为 开盘时间,如果按收盘时间排序,则订单将按收盘时间进行比较,等等"。

怎么做呢?- 在该方法中,我们无法更改订单列表的排序。

我的理解是,无论我们传递什么时间间隔(例如收盘时间),SearchGreatOrEqual()SearchLessOrEqual () 方法都将按照 MT5 开盘时间和 MT4 收盘时间搜索排序列表,但这可能是错误的。因为默认情况下,在 COrder 集合类的构造函数中,订单列表的初始化大多由订单 的开盘时间或票据指定

//+------------------------------------------------------------------+
//| 构造函数|
//+------------------------------------------------------------------+
CHistoryCollection::CHistoryCollection(void) : m_index_deal(0),m_delta_deal(0),m_index_order(0),m_delta_order(0),m_is_trade_event(false)
  {
   this.m_list_all_orders.Sort(#ifdef __MQL5__ SORT_BY_ORDER_TIME_OPEN #else  SORT_BY_ORDER_TIME_CLOSE #endif );
   this.m_list_all_orders.Clear();
   this.m_list_all_orders.Type(COLLECTION_HISTORY_ID);
  }
//+------------------------------------------------------------------+
//| 构造函数|
//+------------------------------------------------------------------+
CMarketCollection::CMarketCollection(void) : m_is_trade_event(false),m_is_change_volume(false),m_change_volume_value(0)
  {
   this.m_list_all_orders.Sort(SORT_BY_ORDER_TIME_OPEN);
   this.m_list_all_orders.Clear();
   this.m_list_all_orders.Type(COLLECTION_MARKET_ID);
   ::ZeroMemory(this.m_struct_prev_market);
   this.m_struct_prev_market.hash_sum=WRONG_VALUE;
   this.m_list_control.Clear();
   this.m_list_control.Sort();
   this.m_list_changed.Clear();
   this.m_list_changed.Sort();
   this.m_k_pow=(ulong)pow(10,6);
  }

因此, 上述方法(::GetListByTime) 将这样工作,始终按照 MT5 开盘时间或 MT4 收盘时间进行搜索。

//--- 按所有可能的属性比较 COrder 对象(按 COrder 对象的指定属性对列表进行排序
virtual int Compare(const CObject *node,const int mode=0) const;

写得非常狭隘(狭隘--并不意味着 它是错误的),在根据模板搜索订单时,它将使用标准 MQL 库中订单集合类构造函数中选择的排序模式。因此:(在第 3 部分 中)

//+------------------------------------------------------------------+
//| 选择一段时间内的订单集合 ||
//| 在从 begin_time 到 end_time 的范围内。
//+------------------------------------------------------------------+
CArrayObj *CHistoryCollection::GetListByTime(const datetime begin_time=0,const datetime end_time=0,
                                             const ENUM_SELECT_BY_TIME select_time_mode=SELECT_BY_TIME_CLOSE)
  {
   ENUM_ORDER_PROP_INTEGER property=(select_time_mode==SELECT_BY_TIME_CLOSE ? ORDER_PROP_TIME_CLOSE : ORDER_PROP_TIME_OPEN);

   CArrayObj *list=new CArrayObj();
   if(list==NULL)
     {
      ::Print(DFUN+TextByLanguage("临时列表创建错误","Error creating temporary list"));
      return NULL;
     }
   datetime begin=begin_time,end=(end_time==0 ? END_TIME : end_time);
   if(begin_time>end_time) begin=0;
   list.FreeMode(false);
   ListStorage.Add(list);
   //---
   this.m_order_instance.SetProperty(property,begin);
   int index_begin=this.m_list_all_orders.SearchGreatOrEqual(&m_order_instance);
   if(index_begin==WRONG_VALUE)
      return list;
   this.m_order_instance.SetProperty(property,end);
   int index_end=this.m_list_all_orders.SearchLessOrEqual(&m_order_instance);
   if(index_end==WRONG_VALUE)
      return list;
   for(int i=index_begin; i<=index_end; i++)
      list.Add(this.m_list_all_orders.At(i));
   return list;
  }

不需要,因为标准库(方法SearchGreatOrEqual()SearchLessOrEqual ())仍将根据构造函数中传递的排序代码进行搜索。
,您只需删除这些用红色标出的行,并添加条件编译行来设置对象的属性:

   COrder            m_order_instance;       // 用于按属性搜索的订单对象


对吗?

附注:这只是为了理解 OOP 逻辑!?

Библиотека для простого и быстрого создания программ для MetaTrader (Часть III): Коллекция рыночных ордеров и позиций, поиск и фильтрация
Библиотека для простого и быстрого создания программ для MetaTrader (Часть III): Коллекция рыночных ордеров и позиций, поиск и фильтрация
  • www.mql5.com
В первой части данного цикла статей мы начали создавать большую кроссплатформенную библиотеку, целью которой является облегчение создания программ для платформы MetaTrader 5 и MetaTrader 4. Во второй части продолжили развитие библиотеки и сделали коллекцию исторических ордеров и сделок. В данной части повествования создадим класс для удобного...