Обсуждение статьи "Библиотека для простого и быстрого создания программ для MetaTrader (Часть XXIV): Основной торговый класс - автоматическая коррекция ошибочных параметров" - страница 3

 
hsyhsy863 :
Здравствуйте, вы нашли проблему, о которой я говорил?
Я не рассматриваю бывшие файлы.
 

Здравствуйте Артём - при более внимательной работе с этим кодом заметил такую особенность значения'shift', реализованного в EventsHandling() и OnDoEasyEvent() для корректной обработки торговых событий при работе в тестере... Как я понимаю, как вы указываете в статье, при работе в реальном времени торговые события доставляются по одному из 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 :

Здравствуйте Артём - при более внимательной работе с этим кодом, я заметил такую особенность значения ' shift ', реализованного в EventsHandling() и OnDoEasyEvent() для корректной обработки торговых событий при работе в тестере... Как я понимаю, как вы указываете в статье, при работе в реальном времени торговые события доставляются по одному из OnChartEvent() по мере их срабатывания движком, в то время как в режиме тестирования они группируются и доставляются в виде списка...

Мой вопрос заключается в следующем: не лучше ли реализовать специальный параметр функции в обработчике событий, а не жертвовать ' lparam ', который может содержать полезную информацию для обработчика событий? Я также думаю, что это сделает код более простым / более читаемым; вы согласны?

PS: В любом случае, я нахожу эту библиотеку действительно мощной, но в то же время сложной и трудной для понимания, однако после освоения она должна позволить очень быстро разрабатывать всевозможные стратегии на базе EA... Помимо огромной кривой обучения, я также заметил, что бэк-тестирование работает довольно медленно, поэтому я надеюсь, что вы сможете решить этот вопрос, когда завершите набор функций, который вы запланировали для DoEasy.


Нет. Здесь я не планировал ничего переделывать и, скорее всего, не буду. Все необходимые данные уже доставлены в объекты событий, а остальные данные уже взяты из тех объектов, чье событие было зарегистрировано.

 
Artyom Trishkin:

Нет. Здесь я не планировал ничего переделывать и, скорее всего, не буду. Все необходимые данные уже доставлены в объекты событий, а остальные данные уже взяты из тех объектов, событие которых было зарегистрировано.

Хорошо, справедливо... Я согласен, что все необходимые данные находятся в объектах событий.

 
Не могли бы привести пример кода, чтоб, получив последнее торговое событие, вытащить тикет ордера/позиции и прочие свойства?
 
leonerd:
Не могли бы привести пример кода, чтоб, получив последнее торговое событие, вытащить тикет ордера/позиции и прочие свойства?
Не раньше, чем через неделю - не на месте.