文章 "轻松快捷开发 MetaTrader 程序的函数库(第七部分): StopLimit 订单激活事件,为修改订单和持仓事件准备功能"

 

新文章 轻松快捷开发 MetaTrader 程序的函数库(第七部分): StopLimit 订单激活事件,为修改订单和持仓事件准备功能已发布:

在之前的文章中,我们已着手创建一个大型跨平台函数库,简化了 MetaTrader 5 和 MetaTrader 4 平台程序的开发。 在第六部分中,我们训导函数在净持结算账户上工作。 在此,我们将实现跟踪 StopLimit 订单激活,并准备跟踪修改订单和持仓事件的功能。

为了测试已实现的改进,我们将使用上一篇文章中的 EA。 只需将 TestDoEasyPart06.mq5 EA 从 \MQL5\Experts\TestDoEasy\Part06 文件夹重命名为 TestDoEasyPart07.mq5,并将其保存在新的 \MQL5\Experts\TestDoEasy\Part07 子文件夹当中。

编译 EA,在测试器中启动它,放置一笔 StopLimit 挂单,等待其激活:

作者:Artyom Trishkin

 

我希望看到使用这个库和其他库实现几个 TC。

当然,还有比较分析。特别是测试器/优化器的性能、代码大小和编写速度。

 
fxsaber:

我希望看到使用该库和替代品实现几个 TC。

当然还有比较分析。特别是测试器/优化器的性能、代码大小和编写速度。

现在还为时尚早。目前,我们还没有准备好必要的功能来实现所宣称的创建自己程序的简便性。必要的基础仍在创建中。在第八部分中,我们将实现并描述跟踪其他事件的功能,如修改订单和仓位、止损位等。下一篇文章正在准备中,它将开始最终完成与 MQL4 的兼容性。下一步将创建成熟的交易类,然后使用符号和账户。然后,我们将创建用户案例函数,以方便快捷地访问由库收集和控制的任何数据。这还不是最后阶段,因为我们正在准备一系列使用集成到库中的新图形对象的可能性,并将它们作为标准对象进行访问。也就是说,图书馆将有能力创建自己的图形对象,在画布上拥有自己的图形外壳,并有可能从这套图形对象中为自己的程序创建图形元素。这是之前计划的,但仍有实施计划。

而 TC 的实现--尤其是在创建用户案例功能之后,将成为可能。当然,现在也可以做一些事情,但并不快捷方便--因为这需要通过指针直接访问列表和库对象,而这并不是 "拿取"--不过,在文章所附的顾问示例 中,已经对这种访问进行了部分组织。

 
Artyom Trishkin:

...而且这还不是最后阶段,因为我们正在准备一套使用集成到程序库中的新图形对象的可能性,并且可以像使用标准图形对象一样使用它们。也就是说,程序库将有能力创建自己的图形对象,并在画布上拥有自己的图形外壳,还能从这套图形对象中创建自己的图形元素,用于程序....。

您会在 kanvas 上编写图形库 吗?
 
Реter Konow:
您会在画布上编写图形库吗?

当然会。不仅仅是在画布上。标准图形对象集中的一些 "复合 "对象将可供创建,此外还将提供创建自己的图形用户界面的表单,用户可以完全访问由图形库收集和控制的所有数据--一些现成的对象集,以及用它们创建自己的图形用户界面的可能性。当然,这一切都是为了让用户能够从一个库中完全获取任何需要的数据--可以说是 "开箱即用"。插入一个库,你就拥有了所有必要的功能,可以完全创建你想要的任何东西--而无需去寻找已经写好并发布的所需解决方案。

 
Artyom Trishkin:

是的,当然。不仅仅是它。用户可以从标准图形对象中创建一些 "复合 "对象,还可以创建自己的图形用户界面,完全访问由库收集和控制的所有数据--一些现成的对象集,还可以从中创建自己的图形用户界面。当然,这一切都是为了让用户能够从一个程序库中获得所有需求--可以说是 "开箱即用"。只需插入一个程序库,您就能拥有所有必要的功能,完全满足您的任何需求,而无需去寻找已编写并发布的所需解决方案。

也就是说,您将创建一个多平台软件环境,拥有创建任何 EA 的全套可能性。双平台通用库,画布图形。

这是一个大规模的想法。让我们拭目以待最后一部分的实现。之前的图形库已经写了一年半,但由于已经有了认真的基础,也许会更快。
 
Реter Konow:
也就是说,您将创建一个多平台软件环境,为创建任何 EA 提供全套可能性。适用于两个平台的通用库,可在画布上绘制图形。

一个大规模的想法。让我们拭目以待最后一部分的实现。之前的图形库编写了一年半的时间,但既然已经有了认真的基础,也许会更快。
一切都会好起来的。但是要循序渐进,一步一步来。毕竟,计划中的不仅仅是这样一个图书馆,还有教材。您不仅可以随时使用它,还可以阅读并了解一切是如何完成的。
 
Artyom Trishkin:

......却找不到所需的解决方案。

这是否意味着图书馆将成为员工图书馆?
 
Реter Konow:
这是否意味着图书馆将成为员工图书馆?
不,这意味着一个图书馆就足够了。
 
Artyom Trishkin:
不,这意味着一个图书馆就足够了。
祝你好运
 

Artem, thank you!

在该方法中

//+------------------------------------------------------------------+
//|| 更新订单列表|
//+------------------------------------------------------------------+
void CMarketCollection::Refresh(void)

动态创建一个 "市场订单

#else 
//--- 职位
   int total_positions=::PositionsTotal();
   for(int i=0; i<total_positions; i++)
     {
      ulong ticket=::PositionGetTicket(i);
      if(ticket==0) continue;
      CMarketPosition *position=new CMarketPosition(ticket);
      if(position==NULL) continue;
      //--- 在市场订单和头寸列表中添加头寸对象
      if(!this.AddToListMarket(position))
         continue;
      //--- 根据票据和位置标识符获取控制命令索引
      int index=this.IndexControlOrder(ticket,position.PositionID());
      //--- 如果订单不在控制订单列表中,则添加该订单
      if(index==WRONG_VALUE)
        {
         if(!this.AddToListControl(position))
           {
            ::Print(DFUN_ERR_LINE,TextByLanguage("添加控制位置失败","Failed to add a control position "),position.TypeDescription()," #",position.Ticket());
           }
        }
      //--- 如果订单已存在于控制订单列表中 - 检查其属性是否发生变化
      else if(index>WRONG_VALUE)
        {
         this.OnChangeEvent(position,index);
        }
     }
//--- 订单
   int total_orders=::OrdersTotal();
   for(int i=0; i<total_orders; i++)
     {
      ulong ticket=::OrderGetTicket(i);
      if(ticket==0) continue;
      ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)::OrderGetInteger(ORDER_TYPE);
      //--- 市场订单
      if(type<ORDER_TYPE_BUY_LIMIT)
        {
         CMarketOrder *order=new CMarketOrder(ticket);
         if(order==NULL) continue;
         //--- 在市场订单和头寸列表中添加市场订单对象
         if(!this.AddToListMarket(order))
            continue;
        }
      //--- 挂单
      else
        {
         CMarketPending *order=new CMarketPending(ticket);
         if(order==NULL) continue;
         //--- 在市场订单和头寸列表中添加挂单对象
         if(!this.AddToListMarket(order))
            continue;
         //--- 根据票据和位置标识符获取控制命令索引
         int index=this.IndexControlOrder(ticket,order.PositionID());
         //--- 如果订单不在控制订单列表中,则添加该订单
         if(index==WRONG_VALUE)
           {
            if(!this.AddToListControl(order))
              {
               ::Print(DFUN_ERR_LINE,TextByLanguage("添加控制命令失败","Failed to add a control order "),order.TypeDescription()," #",order.Ticket());
              }
           }
         //--- 如果订单已存在于控制订单列表中 - 检查其属性是否发生变化
         else if(index>WRONG_VALUE)
           {
            this.OnChangeEvent(order,index);
           }
        }
     }
#endif 

然后通过引用将其传递给方法 :

         //--- 在市场订单和头寸列表中添加市场订单对象
         if(!this.AddToListMarket(order))
            continue;

"AddToListMarket"方法中,"hash_sum "不考虑市场订单,那么为什么我们需要输入和控制它?
请解释一下,如果我们可以从头寸或挂单中找到所有信息,为什么我们需要它?