Обсуждение статьи "Библиотека для простого и быстрого создания программ для MetaTrader (Часть VIII): События модификации ордеров и позиций" - страница 2

 

Артем, еще раз спасибо!
Метод "void CEventsCollection::CreateNewEvent(COrderControl* order)" служит для создания торгового события в зависимости от типа изменения ордера, тоесть он создает событие связаное с любым изменением ордера.....
А причина изменения ордера посылается в созданное событие одна:  EVENT_REASON_STOPLIMIT_TRIGGERED

//--- Создание события
   if(event!=NULL)
     {
      event.SetProperty(EVENT_PROP_TIME_EVENT,order.Time());                        // Время события
      event.SetProperty(EVENT_PROP_REASON_EVENT,EVENT_REASON_STOPLIMIT_TRIGGERED);  // Причина события (из перечисления ENUM_EVENT_REASON)

Если я прав прошу исправить, если нет прошу объяснить что не увидел.

Большое спасибо за библиотеку вы упростили мой труд в несколько раз,
особенно когда работа основная не связана с программированием.

 
BmC:

Артем, еще раз спасибо!
Метод "void CEventsCollection::CreateNewEvent(COrderControl* order)" служит для создания торгового события в зависимости от типа изменения ордера, тоесть он создает событие связаное с любым изменением ордера.....
А причина изменения ордера посылается в созданное событие одна:  EVENT_REASON_STOPLIMIT_TRIGGERED

Если я прав прошу исправить, если нет прошу объяснить что не увидел.

Большое спасибо за библиотеку вы упростили мой труд в несколько раз,
особенно когда работа основная не связана с программированием.

Без привязки к точному месту расположения цитируемых строк я не могу понять о чём именно вы говорите - просто поиском (Shift+Ctrl+F) не нашёл такого кода во всех файлах библиотеки...

event.SetProperty(EVENT_PROP_REASON_EVENT,EVENT_REASON_STOPLIMIT_TRIGGERED);

Где это находится?

 
Вот строки из описания в самой части этой статьи и соответсвенно кода в конце статьи:
//+------------------------------------------------------------------+
//| Создаёт торговое событие в зависимости от типа изменения ордера  |
//+------------------------------------------------------------------+
void CEventsCollection::CreateNewEvent(COrderControl* order)
  {
   if(!::SymbolInfoTick(order.Symbol(),this.m_tick))
     {
      Print(DFUN,TextByLanguage("Не удалось получить текущие цены по символу события ","Failed to get current prices by event symbol "),order.Symbol());
      return;
     }
   CEvent* event=NULL;
//--- Сработал отложенный StopLimit-ордер
   if(order.GetChangeType()==CHANGE_TYPE_ORDER_TYPE)
     {
      this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_PLASED;
      event=new CEventOrderPlased(this.m_trade_event_code,order.Ticket());
     }
//--- Модификация
   else
     {
      //--- Модифицирована цена отложенного ордера
      if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE;
      //--- Модифицирована цена отложенного ордера и его StopLoss
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_SL;
      //--- Модифицирована цена отложенного ордера и его TakeProfit
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_TP;
      //--- Модифицирована цена отложенного ордера, его StopLoss и TakeProfit
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
      //--- Модифицирован StopLoss отложенного ордера
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_SL;
      //--- Модифицирован TakeProfit отложенного ордера
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_TP;
      //--- Модифицирован StopLoss и TakeProfit отложенного ордера
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;

      //--- Модифицирован StopLoss позиции
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL;
      //--- Модифицирован TakeProfit позиции
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_TP;
      //--- Модифицирован StopLoss и TakeProfit позиции
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
      
      //--- Создаём событие модификации
      event=new CEventModify(this.m_trade_event_code,order.Ticket());
     }
//--- Создание события
   if(event!=NULL)
     {
      event.SetProperty(EVENT_PROP_TIME_EVENT,order.Time());                        // Время события
      event.SetProperty(EVENT_PROP_REASON_EVENT,EVENT_REASON_STOPLIMIT_TRIGGERED);  // Причина события (из перечисления ENUM_EVENT_REASON)
      event.SetProperty(EVENT_PROP_TYPE_DEAL_EVENT,PositionTypeByOrderType((ENUM_ORDER_TYPE)order.TypeOrderPrev())); // Тип ордера, срабатывание которого привело к событию
      event.SetProperty(EVENT_PROP_TICKET_DEAL_EVENT,order.Ticket());               // Тикет ордера , срабатывание которого привело к событию
      event.SetProperty(EVENT_PROP_TYPE_ORDER_EVENT,order.TypeOrder());             // Тип ордера события
      event.SetProperty(EVENT_PROP_TICKET_ORDER_EVENT,order.Ticket());              // Тикет ордера события
      event.SetProperty(EVENT_PROP_TYPE_ORDER_POSITION,order.TypeOrder());          // Тип первого ордера позиции
      event.SetProperty(EVENT_PROP_TICKET_ORDER_POSITION,order.Ticket());           // Тикет первого ордера позиции
      event.SetProperty(EVENT_PROP_POSITION_ID,order.PositionID());                 // Идентификатор позиции
      event.SetProperty(EVENT_PROP_POSITION_BY_ID,0);                               // Идентификатор встречной позиции
      event.SetProperty(EVENT_PROP_MAGIC_BY_ID,0);                                  // Магический номер встречной позиции
         
      event.SetProperty(EVENT_PROP_TYPE_ORD_POS_BEFORE,order.TypeOrderPrev());      // Тип ордера позиции до смены направления
      event.SetProperty(EVENT_PROP_TICKET_ORD_POS_BEFORE,order.Ticket());           // Тикет ордера позиции до смены направления
      event.SetProperty(EVENT_PROP_TYPE_ORD_POS_CURRENT,order.TypeOrder());         // Тип ордера текущей позиции
      event.SetProperty(EVENT_PROP_TICKET_ORD_POS_CURRENT,order.Ticket());          // Тикет ордера текущей позиции
      
      event.SetProperty(EVENT_PROP_PRICE_OPEN_BEFORE,order.PricePrev());            // Цена установки ордера до модификации
      event.SetProperty(EVENT_PROP_PRICE_SL_BEFORE,order.StopLossPrev());           // Цена StopLoss до модификации
      event.SetProperty(EVENT_PROP_PRICE_TP_BEFORE,order.TakeProfitPrev());         // Цена TakeProfit до модификации
      event.SetProperty(EVENT_PROP_PRICE_EVENT_ASK,this.m_tick.ask);                // Цена Ask в момент события
      event.SetProperty(EVENT_PROP_PRICE_EVENT_BID,this.m_tick.bid);                // Цена Bid в момент события
         
      event.SetProperty(EVENT_PROP_MAGIC_ORDER,order.Magic());                      // Магический номер ордера
      event.SetProperty(EVENT_PROP_TIME_ORDER_POSITION,order.TimePrev());           // Время первого ордера позиции
      event.SetProperty(EVENT_PROP_PRICE_EVENT,order.PricePrev());                  // Цена, на которой произошло событие
      event.SetProperty(EVENT_PROP_PRICE_OPEN,order.Price());                       // Цена установки ордера
      event.SetProperty(EVENT_PROP_PRICE_CLOSE,order.Price());                      // Цена закрытия ордера
      event.SetProperty(EVENT_PROP_PRICE_SL,order.StopLoss());                      // Цена StopLoss ордера
      event.SetProperty(EVENT_PROP_PRICE_TP,order.TakeProfit());                    // Цена TakeProfit ордера
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_INITIAL,order.Volume());            // Запрашиваемый объём ордера
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_EXECUTED,0);                        // Исполненный объём ордера
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_CURRENT,order.Volume());            // Оставшийся (неисполненный) объём ордера
      event.SetProperty(EVENT_PROP_VOLUME_POSITION_EXECUTED,0);                     // Исполненный объём позиции
      event.SetProperty(EVENT_PROP_PROFIT,0);                                       // Профит
      event.SetProperty(EVENT_PROP_SYMBOL,order.Symbol());                          // Символ ордера
      event.SetProperty(EVENT_PROP_SYMBOL_BY_ID,order.Symbol());                    // Символ встречной позиции
      //--- Установка идентификатора графика управляющей программы, расшифровка кода события и установка типа события
      event.SetChartID(this.m_chart_id);
      event.SetTypeEvent();
      //--- Если объекта-события нет в списке - добавляем
      if(!this.IsPresentEventInList(event))
        {
         this.m_list_trade_events.InsertSort(event);
         //--- Отправляем сообщение о событии и устанавливаем значение последнего торгового события
         event.SendEvent();
         this.m_trade_event=event.TradeEvent();
        }
      //--- Если это событие уже есть в списке - удаляем новый объект-событие и выводим отладочное сообщение
      else
        {
         ::Print(DFUN_ERR_LINE,TextByLanguage("Такое событие уже есть в списке","This event is already in the list."));
         delete event;
        }
     }
  }
подчеркнул эту строчку!
 
Artyom Trishkin:

Без привязки к точному месту расположения цитируемых строк я не могу понять о чём именно вы говорите - просто поиском (Shift+Ctrl+F) не нашёл такого кода во всех файлах библиотеки...

Где это находится?

Может вы это уже исправили в следующих главах описания библиотеки? Мне ваша библиотека очень подходит для моей стратегии и я ее очень доскональна разбираю, так как вы сделали помимо библиотеки еще методичку для правильного программирования.
 
BmC:
Вот строки из описания в самой части этой статьи и соответсвенно кода в конце статьи: подчеркнул эту строчку!

На данный момент - в текущей версии библиотеки, метод выглядит так:

//+------------------------------------------------------------------+
//| Создаёт торговое событие в зависимости от типа изменения ордера  |
//+------------------------------------------------------------------+
void CEventsCollection::CreateNewEvent(COrderControl* order)
  {
   ENUM_EVENT_REASON reason=WRONG_VALUE;
   if(!::SymbolInfoTick(order.Symbol(),this.m_tick))
     {
      ::Print(DFUN,CMessage::Text(MSG_LIB_SYS_NOT_GET_CURR_PRICES),order.Symbol());
      return;
     }
   CEvent* event=NULL;
//--- Сработал отложенный StopLimit-ордер
   if(order.GetChangeType()==CHANGE_TYPE_ORDER_TYPE)
     {
      reason=EVENT_REASON_STOPLIMIT_TRIGGERED;
      this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_PLASED;
      event=new CEventOrderPlased(this.m_trade_event_code,order.Ticket());
     }
//--- Модификация
   else
     {
      //--- Модифицирована цена отложенного ордера
      if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE;
      //--- Модифицирована цена отложенного ордера и его StopLoss
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_SL;
      //--- Модифицирована цена отложенного ордера и его TakeProfit
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_TP;
      //--- Модифицирована цена отложенного ордера, его StopLoss и TakeProfit
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
      //--- Модифицирован StopLoss отложенного ордера
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_SL;
      //--- Модифицирован TakeProfit отложенного ордера
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_TP;
      //--- Модифицирован StopLoss и TakeProfit отложенного ордера
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;

      //--- Модифицирован StopLoss позиции
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL;
      //--- Модифицирован TakeProfit позиции
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_TP;
      //--- Модифицирован StopLoss и TakeProfit позиции
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
      
      //--- Создаём событие модификации
      reason=EVENT_REASON_MODIFY;
      event=new CEventModify(this.m_trade_event_code,order.Ticket());
     }
//--- Создание события
   if(event!=NULL)
     {
      event.SetProperty(EVENT_PROP_TIME_EVENT,order.Time());                        // Время события
      event.SetProperty(EVENT_PROP_REASON_EVENT,reason);                            // Причина события (из перечисления ENUM_EVENT_REASON)
      event.SetProperty(EVENT_PROP_TYPE_DEAL_EVENT,PositionTypeByOrderType((ENUM_ORDER_TYPE)order.TypeOrderPrev())); // Тип ордера, срабатывание которого привело к событию
      event.SetProperty(EVENT_PROP_TICKET_DEAL_EVENT,order.Ticket());               // Тикет ордера , срабатывание которого привело к событию
      event.SetProperty(EVENT_PROP_TYPE_ORDER_EVENT,order.TypeOrder());             // Тип ордера события
      event.SetProperty(EVENT_PROP_TICKET_ORDER_EVENT,order.Ticket());              // Тикет ордера события
      event.SetProperty(EVENT_PROP_TYPE_ORDER_POSITION,order.TypeOrder());          // Тип первого ордера позиции
      event.SetProperty(EVENT_PROP_TICKET_ORDER_POSITION,order.Ticket());           // Тикет первого ордера позиции
      event.SetProperty(EVENT_PROP_POSITION_ID,order.PositionID());                 // Идентификатор позиции
      event.SetProperty(EVENT_PROP_POSITION_BY_ID,0);                               // Идентификатор встречной позиции
      event.SetProperty(EVENT_PROP_MAGIC_BY_ID,0);                                  // Магический номер встречной позиции
         
      event.SetProperty(EVENT_PROP_TYPE_ORD_POS_BEFORE,order.TypeOrderPrev());      // Тип ордера позиции до смены направления
      event.SetProperty(EVENT_PROP_TICKET_ORD_POS_BEFORE,order.Ticket());           // Тикет ордера позиции до смены направления
      event.SetProperty(EVENT_PROP_TYPE_ORD_POS_CURRENT,order.TypeOrder());         // Тип ордера текущей позиции
      event.SetProperty(EVENT_PROP_TICKET_ORD_POS_CURRENT,order.Ticket());          // Тикет ордера текущей позиции
      
      event.SetProperty(EVENT_PROP_PRICE_OPEN_BEFORE,order.PricePrev());            // Цена установки ордера до модификации
      event.SetProperty(EVENT_PROP_PRICE_SL_BEFORE,order.StopLossPrev());           // Цена StopLoss до модификации
      event.SetProperty(EVENT_PROP_PRICE_TP_BEFORE,order.TakeProfitPrev());         // Цена TakeProfit до модификации
      event.SetProperty(EVENT_PROP_PRICE_EVENT_ASK,this.m_tick.ask);                // Цена Ask в момент события
      event.SetProperty(EVENT_PROP_PRICE_EVENT_BID,this.m_tick.bid);                // Цена Bid в момент события
         
      event.SetProperty(EVENT_PROP_MAGIC_ORDER,order.Magic());                      // Магический номер ордера
      event.SetProperty(EVENT_PROP_TIME_ORDER_POSITION,order.TimePrev());           // Время первого ордера позиции
      event.SetProperty(EVENT_PROP_PRICE_EVENT,order.PricePrev());                  // Цена, на которой произошло событие
      event.SetProperty(EVENT_PROP_PRICE_OPEN,order.Price());                       // Цена установки ордера
      event.SetProperty(EVENT_PROP_PRICE_CLOSE,order.Price());                      // Цена закрытия ордера
      event.SetProperty(EVENT_PROP_PRICE_SL,order.StopLoss());                      // Цена StopLoss ордера
      event.SetProperty(EVENT_PROP_PRICE_TP,order.TakeProfit());                    // Цена TakeProfit ордера
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_INITIAL,order.Volume());            // Запрашиваемый объём ордера
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_EXECUTED,0);                        // Исполненный объём ордера
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_CURRENT,order.Volume());            // Оставшийся (неисполненный) объём ордера
      event.SetProperty(EVENT_PROP_VOLUME_POSITION_EXECUTED,0);                     // Исполненный объём позиции
      event.SetProperty(EVENT_PROP_PROFIT,0);                                       // Профит
      event.SetProperty(EVENT_PROP_SYMBOL,order.Symbol());                          // Символ ордера
      event.SetProperty(EVENT_PROP_SYMBOL_BY_ID,order.Symbol());                    // Символ встречной позиции
      //--- Расшифровка кода события и установка типа события
      event.SetTypeEvent();
      //--- Если объекта-события нет в списке - добавляем
      if(!this.IsPresentEventInList(event))
        {
         this.m_list_trade_events.InsertSort(event);
         //--- Отправляем сообщение о событии и устанавливаем значение последнего торгового события
         this.m_trade_event=event.TradeEvent();
         this.m_is_event=true;
         event.SendEvent();
         CBaseObjExt::EventAdd(this.m_trade_event,order.Ticket(),order.Price(),order.Symbol());
        }
      //--- Если это событие уже есть в списке - удаляем новый объект-событие и выводим отладочное сообщение
      else
        {
         ::Print(DFUN_ERR_LINE,CMessage::Text(MSG_LIB_SYS_EVENT_ALREADY_IN_LIST));
         delete event;
        }
     }
  }
//+------------------------------------------------------------------+

Т.е., либо то была ошибка, и она давно исправлена, либо в обсуждаемой версии библиотеки это не критично. Я уже и не вспомню как там точно всё обстояло с этим...

 
Artyom Trishkin:

На данный момент - в текущей версии библиотеки, метод выглядит так:

Т.е., либо то была ошибка, и она давно исправлена, либо в обсуждаемой версии библиотеки это не критично. Я уже и не вспомню как там точно всё обстояло с этим...

Это очень важно, от  автора это еще важнее. Если вы не отказались от вашей первоначальной идеи. Своей работой помочь начинающим программистам, таким как мне. Когда ты еще начинающий (ученик) и только познаешь язык программирования, или вообще программирование, очень много появляется сомнений и вопросов при изучении вашей работы (библиотеки). В данном случае я до последнего не был уверен, что это ошибка или вы так задумали. Прошелся не один раз по вашему коду. И для меня это очень важно: "или я не понял смысл автора, или это просто опечатка автора в его большом проекте."
И как вы утверждаете, что это не критично?! Это не правильно с вашей стороны, тем самым вы и я с вами просто путаем читателей. Которые изучают или учатся как и я, по вашей библиотеки. 

 
BmC:

Это очень важно, от  автора это еще важнее. Если вы не отказались от вашей первоначальной идеи. Своей работой помочь начинающим программистам, таким как мне. Когда ты еще начинающий (ученик) и только познаешь язык программирования, или вообще программирование, очень много появляется сомнений и вопросов при изучении вашей работы (библиотеки). В данном случае я до последнего не был уверен, что это ошибка или вы так задумали. Прошелся не один раз по вашему коду. И для меня это очень важно: "или я не понял смысл автора, или это просто опечатка автора в его большом проекте."
И как вы утверждаете, что это не критично?! Это не правильно с вашей стороны, тем самым вы и я с вами просто путаем читателей. Которые изучают или учатся как и я, по вашей библиотеки. 

:)

Я ж показал код, в котором цветом выделены исправления. Внесите их в версию библиотеки, прилагаемую к этой статье.

Конечно же я уже не помню - ошибка это моя была, или в данной версии это не критично, и поэтому прошло мимо моего взора при отладке. Ведь уже сорок с лишним статей, и эта было так давно. Скорее всего всё-таки ошибка, исправление которой было внесено в последующих статьях - очень многое в библиотеке уже создаётся "на лету". Конечно была, и не одна, тестовые версии библиотеки. Но с началом описания её создания многое было пересмотрено и добавлено. Именно поэтому цикл статей позиционируется как описание создания библиотеки. Таким образом я пытаюсь вовлечь читателя в сам процесс её создания. С пробами и ошибками, и с указанием как их исправить - чтобы был весь процесс на виду - раскрыть, так сказать, "все муки созидания" :)

Потому, прошу прощения за внесённую сумятицу в вашем осознании происходящего...
Просто внесите предложенные выше изменения. Или оставьте до той статьи, в которой это будет исправлено.

 
Я хочу получить символ последнего событья, тикет и тип (открытия, закрытия, модификация), как это правильно сделать?
 
Andrii Miknevich:
Я хочу получить символ последнего событья, тикет и тип (открытия, закрытия, модификация), как это правильно сделать?

Я смотрю Артём так занят, что вообще не появляется на форуме.))) Может у меня получится подсказать, когда-то я экспериментировал с его библиотекой. Сегодня полазил по тем экспериментам и обнаружил такую функцию. В комментарии сказано, что функция получает список всех открытых позиций.

void OrderActivated()
{
Print(__FUNCTION__, "***", ENUM_TRADE_EVENT(engine.LastTradeEvent()));
//--- Получаем список всех открытых позиций
CArrayObj* list = engine.GetListMarketPosition();
if(list == NULL || list.Total() == 0)
return;
int index = CSelect::FindOrderMax(list, ORDER_PROP_TIME_OPEN);
COrder *pos = list.At(index);
if(pos == NULL)
return;

pos.Print();
}/*******************************************************************/

К сожалению объяснить что для чего я уже не могу, всё благополучно забыл, но может сможете разобраться…

Ну… если не получится, подождите. Артём найдёт время и ответит.

 

При поступлении тика, по которому устанавливается и одновременно активируется (триггерится) отложенный ордер (я тестировал с Buy Stop) ваш движок не регистрирует все события...

Приходит событие TRADE_EVENT_PENDING_ORDER_PLASED, но не TRADE_EVENT_PENDING_ORDER_ACTIVATED.

Код у меня примерно такой:

//+------------------------------------------------------------------+
//| Process trade events                                             |
//+------------------------------------------------------------------+ 
void ProcessTradeEvents(void)
  {
   static ENUM_TRADE_EVENT last_event=WRONG_VALUE;
   static CEvent *last_processed=NULL;
   
   if(engine.LastTradeEvent()!=last_event)
     {      
      if(last_event==TRADE_EVENT_NO_EVENT)
         return;
      CArrayObj *list=engine.GetListAllOrdersEvents();
      if(list==NULL)
         return;
      list=CSelect::ByEventProperty(list,EVENT_PROP_SYMBOL,Symbol(),EQUAL);
      if(list==NULL || list.Total()<=0)
         return;      
      last_event=engine.LastTradeEvent();
      //--- get index of old event
      int index_of_old_event=0;
      if(last_processed==NULL)
         index_of_old_event=-1;
      else
        {
         for(int i=list.Total()-1;i>=0;i--)
           {
            CEvent *event=list.At(i);
            if(event==NULL)
               return;
            ENUM_TRADE_EVENT event_type=event.TypeEvent();
            if(last_processed!=NULL && event.IsEqual(last_processed))
              {
               index_of_old_event=i;
               break;
              }
           }
        }
      //--- checking all new events
      for(int i=index_of_old_event+1;i<list.Total();i++)
        {
         CEvent *event=list.At(i);
         if(event==NULL)
            break;
         if(last_processed!=NULL && event.IsEqual(last_processed))
            break; 
         Print(__FUNCTION__+": event : ",event.TypeEventDescription());
         switch(event.TypeEvent())
           {
            case TRADE_EVENT_PENDING_ORDER_PLASED:
              {
               // some code
              }
            break;
            case TRADE_EVENT_PENDING_ORDER_REMOVED:
              {
               // some code
              }
            break;
            case TRADE_EVENT_PENDING_ORDER_ACTIVATED:
              {
               // some code
              }
            break;

            case TRADE_EVENT_POSITION_CLOSED:
              {
               // some code
              }
            break;
            case TRADE_EVENT_POSITION_CLOSED_BY_SL:
              {
               // some code
              }
            break;
            case TRADE_EVENT_POSITION_CLOSED_BY_TP:
              {
                // some code
              }
            break;
            case TRADE_EVENT_MODIFY_ORDER_PRICE:
              {
                // some code
              }
            break;

            case TRADE_EVENT_MODIFY_POSITION_SL:
              {
                // some code
              }
            break;
            case TRADE_EVENT_MODIFY_POSITION_TP:
              {
                // some code
              }
            break;
           }
        }
      last_processed=list.At(list.Total()-1);
      Comment("\nLast trade event: ",last_processed.TypeEventDescription());
     }
  }

Сначала в цикле нахожу индекс старого (обработанного) события, а затем, начиная с него, перебираю все новые до конца. Так вот, в ситуации, когда по одному тику лимитный ордер установлен и стриггерен приходит одно событие об установке... Прокомментируйте, пожалуйста.

ProcessTradeEvents() вызываю в OnTick() следом за engine.OnTick(rates_data).
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Свойства ордеров - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Причина обращения: