Artyom Trishkin,感谢您的工作,感觉这是一个功能强大的库。如果不难的话,请简要说明除了订单/历史记录之外,您计划涵盖(已经涵盖并准备出版)哪些功能。我刚刚开始在标准库的基础上编写一个类似的库,但我是从技术分析工具等功能方面入手的。我的想法是将经典 TA 和 RA 中使用的所有分析工具都写入库中,并使它们与指标工具和其他工具具有互操作性。CExpertSignal.
也许,如果您的功能涵盖了我的计划,那么我应该考虑继续开发您已经编写的功能。
Artyom Trishkin,感谢您的工作,感觉这是一个功能强大的库。如果不难的话,请简要说明除了订单/历史记录之外,您计划涵盖(已经涵盖并准备出版)哪些功能。我刚刚开始在标准库的基础上编写一个类似的库,但我是从技术分析工具等功能方面入手的。我的想法是将经典 TA 和 RA 中使用的所有分析工具都写入库中,并使它们与指标工具和其他工具具有互操作性。CExpertSignal.
也许如果您的功能涵盖了我的计划,那么我应该考虑继续开发您已经编写的内容。
目前文章中所描述的一切仅仅是个开始。使用终端订单系统将非常简单。根据需要向程序提供有关任何订单、交易、头寸、曾经发生的事件等的几乎所有数据。这就是订单系统的特点。
但根据已确定的结构,价格数据、指标、图形对象的工作将准备就绪并发布,画布上将有一个完整的图形外壳,根据最初设定的范例集成到库的结构中。也就是说,只需使用一个库即可,无需与其他库对接。例如,通过点击未结头寸图标获取数据,通过点击已建立的订单获取数据,通过点击价格条获取数据,在现有集合中搜索某些数据并进行处理等。
我计划以这样一种方式组织快速便捷的访问,即用户无需考虑如何获取必要的数据,只需请求并使用准备好的众多功能中的一个即可。
有很多计划和发展。我正在准备材料。包括请求(目前还没有请求
)
文章中所描述的一切仅仅是个开始。使用终端的订单系统将非常简单。根据需要向程序提供有关任何订单、交易、头寸、曾经发生的事件等的几乎所有数据。这就是订单系统的特点。
但根据已确定的结构,价格数据、指标、图形对象的工作将准备就绪并发布,画布上将有一个完整的图形外壳,并根据最初设定的范例与库的结构相结合。也就是说,只需使用一个库即可,无需与其他库对接。例如,通过点击未平仓头寸图标获取数据,通过点击已建立订单获取数据,通过点击价格条获取数据,在现有集合中搜索某些数据并进行处理等。
我计划以这样一种方式组织快速便捷的访问,即用户无需考虑如何获取所需的数据,只需请求并使用准备好的众多功能中的一个即可。
有很多计划和发展。我正在准备材料。包括请求(目前还没有)。
非常有趣。我已经在这里看到了两个类似版本的库。通用专家顾问库和跨平台库。第一个版本并不完全跨平台。第二个版本有很多缺点,尤其是缺少很多跨平台的功能。例如,仓位/订单 的开仓时间或开仓 价格。您必须自己使用 MQL 版本的宏,并单独编写代码。但它也有很多有趣的功能,尤其是我喜欢多个止损点,追踪功能非常强大且可定制。MM 有趣的选项。这是一些意大利人在这里发表的一系列文章,我想你应该明白其中的意思。总之,看看你能得到什么很有意思,如果你能利用以前类似的开发经验,取其精华,那就更好了。谢谢。
非常有趣。我在这里已经看到了两个类似版本的库。通用智能交易系统(Universal Expert Advisor)和跨平台库。第一个并不是真正意义上的跨平台。第二个版本有很多缺点,尤其是缺少很多跨平台的功能。例如,仓位/订单 的开仓时间或开仓 价格。您必须自己使用 MQL 版本的宏,并单独编写代码。但其中也有很多有趣的东西,特别是我喜欢多个止损点的存在,追踪功能非常强大且可定制。MM 有趣的选项。这是一些意大利人在这里发表的一系列文章,我想你应该明白其中的意思。总之,看看你能得到什么很有意思,如果你能利用以前类似的开发经验,取其精华,那就太好了。谢谢。
谢谢你的意见。但我不能阅读文章和搜索我所需要的东西,因为我没有时间做这些事,但我总是欢迎大家对未来功能提出要求、进行规划并将其列入实施清单。我们会提出建议。到目前为止,我正在按原计划实施。
这个库可以与 Moex 上的库存仪器一起使用吗?
我认为,您不应该在处理订单的库中添加与资金管理无关的其他功能,最好是制作单独的库。
是的,库手册中缺少详细说明。
测试将会显示。注意到的问题将得到解决。库将会有文档。但不是马上。
阅读、编译、运行 !
如果可以打 5 分的话
Top Artyom
阅读、编译、运行 !
如果我可以打 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 逻辑!?
- www.mql5.com
新文章 轻松快捷开发 MetaTrader 程序的函数库(第四部分):交易事件已发布:
在之前的文章中,我们已着手创建一个大型跨平台函数库,简化 MetaTrader 5 和 MetaTrader 4 平台程序的开发。 我们已拥有历史订单和成交集合,在场订单和仓位的集合,以及便捷选择和订单排序的类。 在这一部分中,我们将继续开发基础对象,并教导引擎(Engine)函数库跟踪帐户上的交易事件。
我们在测试器中启动 EA 并尝试按钮:
全部正确激活,日志接收有关发生事件的消息。
目前,最后一个事件总是固定的。 换句话说,如果我们将多个仓位同时平仓,那么只有其中的最后一笔仓位才会在事件里发现自身。 可以通过历史当中的新成交或订单的数量来跟踪大规模平仓。 然后可以通过它们的编号获得所有新平仓的清单,并定义它们的完整集合。 我们为此开发一个单独的事件集合类。 它能令我们持续访问程序中所有发生的事件。
作者:Artyom Trishkin