文章 "轻松快捷开发 MetaTrader 程序的函数库(第 二十四部分):基准交易类 - 无效参数自动纠正" - 页 3

 
hsyhsy863 :
你好,我提的问题发现了吗?
I do not consider ex-files.
 

嗨,Artyom -- 在仔细研究这段代码时,我注意到了在事件处理()OnDoEasyEvent() 中实现的"shift"值的特殊性,它可以在测试器中运行时正确处理交易事件......我知道,正如您在文章中指出的,当运行实时交易 时,交易事件 会在引擎触发后逐一从OnChartEvent() 中 发送,而在测试模式 下,它们会被分组并以列表形式发送...

我的问题是:在事件处理程序中实现一个专门的函数参数,而不是牺牲包含对事件处理程序有用信息的"lparam",不是更好吗?我还认为这样会使代码更简单/更易读;你同意吗?

PS:总之,我发现这个库非常强大,但也很复杂,很难理解,不过一旦掌握了它,就能很快开发出各种由 EA 驱动的策略......除了巨大的学习曲线外,我还注意到回测性能相当缓慢,因此我希望您能在完成您为 DoEasy 设想的功能集后解决这一点。

void EventsHandling(void)
  {
//--- 如果出现交易事件
   if(engine.IsTradeEvent())
     {
      //--- 同时发生的交易事件数量
      int total = engine.GetTradeEventsTotal();
      for (int i = 0; i < total; i++)
        {
         //--- 按索引从同时发生的事件列表中获取下一个事件
         CEventBaseObj *event = engine.GetTradeEventByIndex(i);
         if(event == NULL)
            continue;
         int   shift  = i;
         long   lparam = event.LParam();
         double dparam = event.DParam();
         string sparam = event.SParam();
         OnDoEasyEvent(CHARTEVENT_CUSTOM+event.ID(), lparam, dparam, sparam, shift);
        }
     }
   //...
   //...
  }

void OnDoEasyEvent(const int id, const long &lparam, const double &dparam, const string &sparam, int shift=0)
  {
   //...
   //...
//--- 处理交易事件
   if(idx > TRADE_EVENT_NO_EVENT && idx < TRADE_EVENTS_NEXT_CODE)
     {
      //--- 获取交易事件列表
      CArrayObj *list = engine.GetListAllOrdersEvents();
      if(list == NULL) return;

      //--- get the event index shift relative to the end of the list
      //--- in the tester, the shift is passed by the lparam parameter to the event handler
      //--- outside the tester, events are sent one by one and handled in OnChartEvent()
      int shift=(testing ? (int)lparam : 0);
      
      CEvent *event=list.At(list.Total()-1-shift);
      if(event==NULL) return;
   //...
   //...
  }


 
Dima Diall :

您好,Artyom -- 在仔细研究这段代码时,我注意到在事件处理()OnDoEasyEvent() 中实现的 "shift"值有一个特殊性,即在测试模式下运行时要正确处理交易事件...我知道,正如您在文章中指出的,当运行实时交易 时,交易事件 会在引擎触发后逐一从OnChartEvent() 中 发送,而在测试模式 下,它们会被分组并以列表形式发送...

我的问题是:与其牺牲包含对事件处理有用信息的 "lparam",不如在事件处理程序中实现一个专用的函数参数,这样不是更好吗?我还认为这样可以使代码更简单/更易读;你同意吗?

PS:总之,我发现这个库非常强大,但也很复杂,很难理解,不过一旦掌握了它,就能很快开发出各种由 EA 驱动的策略......除了巨大的学习曲线外,我还注意到回测性能相当缓慢,因此我希望您能在完成您为 DoEasy 设想的功能集后解决这一点。


不,我不打算重做任何事情,而且很可能也不会重做。所有必要的数据都已经传递给了事件对象,其余数据也已经从事件被注册的对象中获取。

 
Artyom Trishkin:

不,在这里我不打算重做任何事情,而且很可能也不会重做。所有必要的数据都已经传递给了事件对象,其余的数据也已经从那些注册了事件的对象中获取。

好吧,很公平...我同意所有必要数据都在事件对象中。

 
能否给我一个代码示例,以便在获得最后一笔交易事件后,提取订单/仓位票据 和其他属性?
 
leonerd:
能否请您提供一些示例代码,以便在获得最后一个交易事件时,可以提取订单/仓位票据 和其他属性?
从现在开始一周后才能实现--不在现场。