Отслеживание изменений в списке ордеров по событию Trade. Вопрос к разработчикам - страница 2

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Rashid Umarov
Админ
16577
Rashid Umarov  

Вот пример перебора всех отложенных ордеров на счету  - то есть ордеров, которые еще не исполнились и видны на вкладке "Торговля".

//+------------------------------------------------------------------+
//|                                        Sample_OrderGetTicket.mq5 |
//|              Copyright Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   color BuyColor=Blue;
   color SellColor=Red;
//--- request trade history
   HistorySelect(0,TimeCurrent());
//--- create objects
   string   name;
   uint     total=OrdersTotal();
   ulong    ticket=0;
   double   open_price;
   double   initial_volume;
   datetime time_setup;
   datetime time_open;
   string   symbol;
   long     type;
   long     order_magic;
   long     positionID;
//--- for all deals
   for(uint i=0;i<total;i++)
     {
      //--- try to get deals ticket
      if(ticket=OrderGetTicket(i))
        {
         //--- get orders properties
         open_price=   OrderGetDouble(ORDER_PRICE_OPEN);
         time_setup=  OrderGetInteger(ORDER_TIME_SETUP);
         time_open=OrderGetInteger(ORDER_TIME_DONE);
         symbol=        OrderGetString(ORDER_SYMBOL);
         type  =        OrderGetInteger(ORDER_TYPE);
         order_magic= OrderGetInteger(ORDER_MAGIC);
         positionID =   OrderGetInteger(ORDER_POSITION_ID);
         initial_volume=OrderGetDouble(ORDER_VOLUME_INITIAL);
         //--- print list of orders
         string order_info="#"+(string)ticket+" "+symbol+" at "+(string)open_price+
                           " was set at "+(string)time_setup;
         Print(order_info);
        }
     }
//---
  }
//+------------------------------------------------------------------+

Результат:


KlimMalgin
838
KlimMalgin  

CoreWinTT писал(а) # :

может его спать попробовать положить на неск секунд.... ну так как тест.... 

 Тоже посетила эта идея, только что попробовал - работает! Просто поставил в начале OnTrade() задержку на 0.7 секунды и все нормально отслеживается! Ну вот, можно это дело и в статью оформить :)

Кстати, если кто-нибудь подскажет, как решить эту проблему без Sleep() и вообще реально ли это - буду признателен!

 

CoreWinTT писал(а) # :

насколько я помню в мт5 есть такие веши когда колеса впереди машины мчаться

 А можно по подробней? Об этом где-то написано?

KlimMalgin
838
KlimMalgin  
Rosh писал(а) # :

Вот пример перебора всех отложенных ордеров на счету  - то есть ордеров, которые еще не исполнились и видны на вкладке "Торговля".

Rosh, извините конечно, но все же речь немного о другом: Проблема в том, что функция OnTrade() выполняется именно в тот момент, когда ордера уже нет в списке "Торговля", т.е. он выполнился и еще нет в истории, т.е. ни ордер, ни сделка нигде и никак не доступны. Таким образом не удавалось вовремя получить информацию о совершенной сделке. Проблема решилась вызовом Sleep(0.7); в начале OnTrade(). Если есть другой способ - подскажите, если нет - будем работать так :)
Документация по MQL5: Общие функции / Sleep
Документация по MQL5: Общие функции / Sleep
  • www.mql5.com
Общие функции / Sleep - Документация по MQL5
Валерий
1411
Валерий  
Да, похоже, дело в задержке, у меня тоже заработало, когда я одну лишнюю инструкцию вставил.

Rashid Umarov
Админ
16577
Rashid Umarov  
KlimMalgin писал(а) # :

 Тоже посетила эта идея, только что попробовал - работает! Просто поставил в начале OnTrade() задержку на 0.7 секунды и все нормально отслеживается! Ну вот, можно это дело и в статью оформить :)

Не нужно это еще и в статью оформлять :) Зачем искусственная задержка если мы боремся за скорость? Событие OnTrade возникает в следующих случаях:

  • постановка ордера;
  • удаление ордера;
  • совершение сделки;
  • открытие позиции;
  • закрытие позиции;

И эти события могут происходить в разное  время. Например, Вы решили открыться по рынку, для этого отправили запрос. В итоге был сформирован ордер на открытие по рынку (событие 1), свершилась сделка (событие 2), сработавший ордер ушел в историю (событие 3), открылась позиция (событие 4).

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

Посмотрите в справке Функции обработки событий, там же написано:

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



Валерий
1411
Валерий  

Rosh писал(а) # ... Вариантов развития событий может быть множество,все не предусмотреть.


В том числе: позиция уже открыта, а ордер, её открывший, всё ещё в списке, не ушел в историю.

Только что наблюдал такую ситуацию. Конечно, тут же новое событие Trade восстановило статус-кво.

Vasily
1251
Vasily  
KlimMalgin писал(а) # :

 Тоже посетила эта идея, только что попробовал - работает! Просто поставил в начале OnTrade() задержку на 0.7 секунды и все нормально отслеживается! Ну вот, можно это дело и в статью оформить :)

Кстати, если кто-нибудь подскажет, как решить эту проблему без Sleep() и вообще реально ли это - буду признателен!

 

 А можно по подробней? Об этом где-то написано?

на форуме был топик про удаление объектов

даже потом статью написали

https://www.mql5.com/ru/articles/28

хоть убейте щаз не могу найти топик

но суть заключалась в том что скрипт не успевал удалить обьекты при деинит

получается что некоторые веши мкл5 какбы посылает импульс, а что произошло дальнейшее уже неважно... а тут всетаки есть некоторые такие веши которые происходят удалённо

например мне кажется такая вешь как получение ответа с сервера является достаточно важным но по фактам разработчики не внесли в функцию ожидания результата


я думаю по твоей проблеме есть такая штука 

bool  HistoryOrderSelect(
   ulong  ticket,      // тикет ордера
   uint   timeout=0    // таймаут в миллисекундах

   );

и задать тайм аут при истечении которого выводить трабл =) ну как вариант

Порядок создания и уничтожения объектов в MQL5
Порядок создания и уничтожения объектов в MQL5
  • 2010.03.01
  • MetaQuotes Software Corp.
  • www.mql5.com
Каждый объект, будь то пользовательский объект, динамический массив или массив объектов, имеет свои особенности создания и уничтожения в программе MQL5. Зачастую одни объекты являются частью других объектов, и порядок уничтожения объектов в момент деинициализации становится особенно важен. В этой статье приводятся несколько примеров для понимания механизмов работы с объектами.
KlimMalgin
838
KlimMalgin  

Rosh писал(а) # : 

 

CoreWinTT писал(а) # :

 Спасибо, попробую все возможные варианты!

 

KlimMalgin
838
KlimMalgin  

В общем поразбирался я еще немного во всем этом и вот что получилось:

Rosh:

И эти события могут происходить в разное  время. Например, Вы решили открыться по рынку, для этого отправили запрос. В итоге был сформирован ордер на открытие по рынку (событие 1), свершилась сделка (событие 2), сработавший ордер ушел в историю (событие 3), открылась позиция (событие 4).  

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

Опытным путем выяснил, что при открытии по рынку поступает не 4, а 3 события. В этом можно убедиться, если написать в теле OnTrade() какой-нибудь Alert, например:

Alert("Поступило событие Trade");

 У меня он срабатывает только три раза при каждой установке/закрытии ордера.

Теперь, что касается отсутствия последнего исполненного ордера в истории на момент вызова OnTrade()? то проблема остается актуальной!

Rosh, теперь чтобы не быть голословным, я прикреплю код моего эксперта с обработкой события trade и отчет по его работе. Посмотрите, пожалуйста результаты. Они подтверждают то, о чем я писал ранее.

Вот отчет(читать снизу вверх): 

 

В отчете: Цифры в начале сообщения - это тикет ордера, затем описание действия и в конце номер вызова OnTrade().

Файлы:
ma_sar.mq5 8 kb
Belford
94
Belford  

Уважаемые разработчики!

Build 314, как и прежде, в истории на момент вызова OnTrade(), отсутствует последний исполненный ордер. Исправьте эту ошибку...

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий