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

 

Здравствуйте!

Пишу код для отслеживания изменений в ордерах/позициях/сделках по событию Trade. Не могу понять одну вещь. Представьте следующую ситуацию:

  • Ставим рыночный ордер, допустим, buy.  
  • Ордер появляется в списке ордеров со статусом STARTED.
  • Вызывается функция OnTrade() и мы благополучно обрабатываем появление ордера, тут все нормально.

 Затем

  • Ордер обрабатывается, совершается сделка и открывается позиция, тут тоже все понятно.
  • А ордер при всем этом исчезает из списка ордеров и должен появиться в истории ордеров (тут еще раз вызывается функция OnTrade() )
Так вот во время второго вызова OnTrade() ордер в истории не наблюдается! Соответственно Нету в истории и сделки, порожденной этим ордером! Я смотрел :)

Это нормально? Или это косяк разработчиков?

Если это нормально, тогда как иначе можно понять какая торговая операция выполнена??

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Забыл сказать. использую 261 билд
 

Совершенно верно!

Мой эксперт регистрирует событие Trade трижды при открытии-закрытии-срабатывании стопов. Первое- установка ордера, второе- открытие позиции, а вот третье событие ничего не изменяет в истории, Наверное, здесь и должна модифицироваться история сделок и ордеров. А они появляются в истории позже.

 

я ещё недошол до этого

но такая штука я заметил в описании функции

HistorySelect


Примечание

Функция HistorySelect() создает в mql5-программе список ордеров и список сделок для дальнейшего обращения к элементам списка посредством соответствующих функций. Размер списка сделок можно узнать с помощью функции HistoryDealsTotal(), размер списка ордеров в истории можно получить с HistoryOrdersTotal(). Перебор элементов списка ордеров лучше всего проводить функцией HistoryOrderGetTicket(), для элементов списка сделок соответственно подходит функция HistoryDealGetTicket().

После применения функции HistoryOrderSelect() список ордеров в истории, доступных mql5-программе, сбрасывается и заполняется заново найденным ордером, если поиск ордера по тикету завершился успешно. То же самое относится к списку сделок, доступных mql5-программе – он сбрасывается функцией HistoryDealSelect() и заполняется заново в случае успешного получения сделки по номеру тикета.

то есть возможность стоит ещё раз вызвать функцию HistorySelect для того чтобы сбросить текущий фильтр.


но опять такиже надо пробовать но я пока не добрался до этой части

 
CoreWinTT писал(а) # :

После применения функции HistoryOrderSelect() список ордеров в истории, доступных mql5-программе, сбрасывается и заполняется заново найденным ордером, если поиск ордера по тикету завершился успешно. То же самое относится к списку сделок, доступных mql5-программе – он сбрасывается функцией HistoryDealSelect() и заполняется заново в случае успешного получения сделки по номеру тикета.

то есть возможность стоит ещё раз вызвать функцию HistorySelect для того чтобы сбросить текущий фильтр.

А что означает "... список ордеров в истории, доступных mql5-программе, сбрасывается и заполняется заново найденным ордером..." . Это что, весь список сбрасываетсмя в 0 и состоит

из одного " заново найденного ордера " ?

 Для функции HistoryOrderSelect() необходим  тиккет ордера. Ну, допустим, запомнили мы его на прошлом событии Trade, когда он ещё стоял в очереди на исполнение. Но ведь таких ордеров может быть одновременно > 1. И какой из них выбирать и как ? По времени установки ? Так оно может совпадать. Запоминать тиккеты всех установленных ордеров и потом их все анализировать ?

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


 
Valmars писал(а) # :

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

Посмотрите пример для функции HistorySelect, в нем реализован перебор сделок из диапазона дат, указанных в функции HistorySelect:

void OnStart()
  {
   color BuyColor =Blue;
   color SellColor=Red;
//--- request trade history
   HistorySelect(0,TimeCurrent());
//--- create objects
   string   name;
   uint     total=HistoryDealsTotal();
   ulong    ticket=0;
   double   price;
   double   profit;
   datetime time;
   string   symbol;
   long     type;
   long     entry;
//--- for all deals
   for(uint i=0;i<total;i++)
     {
      //--- try to get deals ticket
      if(ticket=HistoryDealGetTicket(i))
        {
         //--- get deals properties
         price =HistoryDealGetDouble(ticket,DEAL_PRICE);
         time  =HistoryDealGetInteger(ticket,DEAL_TIME);
         symbol=HistoryDealGetString(ticket,DEAL_SYMBOL);
         type  =HistoryDealGetInteger(ticket,DEAL_TYPE);
         entry =HistoryDealGetInteger(ticket,DEAL_ENTRY);
         profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
         //--- only for current symbol
         if(price && time && symbol==Symbol())
           {
            //--- create price object
            name="TradeHistory_Deal_"+string(ticket);
            if(entry) ObjectCreate(0,name,OBJ_ARROW_RIGHT_PRICE,0,time,price,0,0);
            else      ObjectCreate(0,name,OBJ_ARROW_LEFT_PRICE,0,time,price,0,0);
            //--- set object properties
            ObjectSetInteger(0,name,OBJPROP_SELECTABLE,0);
            ObjectSetInteger(0,name,OBJPROP_BACK,0);
            ObjectSetInteger(0,name,OBJPROP_COLOR,type?BuyColor:SellColor);
            if(profit!=0) ObjectSetString(0,name,OBJPROP_TEXT,"Profit: "+string(profit));
           }
        }
     }
//--- apply on chart
   ChartRedraw();
  }
 
Valmars писал(а) # :

Совершенно верно!

Мой эксперт регистрирует событие Trade трижды при открытии-закрытии-срабатывании стопов. Первое- установка ордера, второе- открытие позиции, а вот третье событие ничего не изменяет в истории, Наверное, здесь и должна модифицироваться история сделок и ордеров. А они появляются в истории позже.


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

У меня Trade поступает только по два раза: когда появился и имеет тип started и когда ордер уже обработан сервером и открыта позиция. Самое прискорбное то, что во время второго появления trade я обращаюсь к истории сделок, но последней сделки там не нахожу, хотя по логике она там должна быть! И получается, что нужная сделка оказывается в истории только в следующему вызову Trade (т.е. когда я еще один ордер), вот так с запаздыванием на один ордер все и обрабатывается :)

CoreWinTT писал(а) # :

HistorySelect

 Уже пробовал в самых разных местах! С руки, с ноги из под колена.. Че только не делал, пока не прочитал примечание про "список ордеров в истории, доступных mql5-программе, сбрасывается и заполняется заново найденным ордером". Так что HistorySelect тут не поможет.

 

Valmars писал(а) # :

И какой из них выбирать и как ? По времени установки ?

 Я для обработки события беру последний ордер и последнее событие:

HistoryDealGetTicket(HistoryDealsTotal()-1);  // Последняя сделка в истории :)
HistoryOrderGetTicket(HistoryOrdersTotal()-1);  // Последний ордер 

Но и перебирать я их пробовал, когда столкнулся с описанной проблемой. Последней сделки в истории все равно нету.

 

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

 
Немного не успел :)
 
Rosh писал(а) # :

Посмотрите пример для функции HistorySelect, в нем реализован перебор сделок из диапазона дат, указанных в функции HistorySelect:

Я уже смотрел, этот код. Он, конечно, полезен. Но в данном случае бесполезен. Т.к. работа идет в функции OnTrade(), а она вызывается только при установке ордера и при его исполнении(модификацию не рассматриваю). Так вот после того как ордер исполнен, он и соответствующая сделка должны появиться в истории, но их там нету! И получается, что при каждом вызове OnTrade(), программа выдает результат предыдущей торговой операции! Чем это можно объяснить и как решить эту проблему?
 

Да, похоже я напутал: не с той строки считал события. Вот пример:

2010.04.01 23:45:01    Test (EURUSD,M1)    OrdersTotal= 0  PositionsTotal= 3  HistoryOrdersTotal= 263  HistoryDealsTotal= 264
2010.04.01 23:45:01    Test (EURUSD,M1)    POSITION_MAGIC= 123456
2010.04.01 23:45:01    Test (EURUSD,M1)    LastHistoryDealsTicket= 667912 USDCHF  DEAL_MAGIC= 123456  ENTRY= 0
2010.04.01 23:45:01    Test (EURUSD,M1)    LastHistoryOrderTicket= 608119  ORDER_MAGIC= 123456                                                              // Далее ничего не изменилось
2010.04.01 23:45:01    Test (EURUSD,M1)    Обработка события Trade...                                                                                                       // Третье событие Trade
2010.04.01 23:45:01    Test (EURUSD,M1)    OrdersTotal= 0  PositionsTotal= 3  HistoryOrdersTotal= 263  HistoryDealsTotal= 264                       // Число позиций и ордеров и сделок в истории инкрементировано
2010.04.01 23:45:01    Test (EURUSD,M1)    POSITION_MAGIC= 123456
2010.04.01 23:45:01    Test (EURUSD,M1)    LastHistoryDealsTicket= 667912 USDCHF  DEAL_MAGIC= 123456  ENTRY= 0                                    // Новая сделка добавилась в историю  
2010.04.01 23:45:01    Test (EURUSD,M1)    LastHistoryOrderTicket= 608119  ORDER_MAGIC= 123456                                                              // Новый ордер перешёл в историю
2010.04.01 23:45:01    Test (EURUSD,M1)    Обработка события Trade...                                                                                                        // Второе событи Trade
2010.04.01 23:45:01    PriceChannel_ (USDCHF,M15)    Short Position by USDCHF to be opened                                                                         // Открылась позиция
2010.04.01 23:44:58    Test (EURUSD,M1)    OrdersTotal= 1  PositionsTotal= 2  HistoryOrdersTotal= 262  HistoryDealsTotal= 263                        // Добавился ордер
2010.04.01 23:44:58    Test (EURUSD,M1)    LastHistoryDealsTicket= 667814 USDCHF  DEAL_MAGIC= 0  ENTRY= 1                                             // Старая сделка
2010.04.01 23:44:58    Test (EURUSD,M1)    LastHistoryOrderTicket= 608018  ORDER_MAGIC= 0                                                                       // Старый тиккет
2010.04.01 23:44:58    Test (EURUSD,M1)    OrderTicket= 608119  ORDER_MAGIC= 123456                                                                              // Новый ордер
2010.04.01 23:44:58    Test (EURUSD,M1)    Обработка события Trade...                                                                                                        // Первое событие Trade
2010.04.01 23:43:43    Test (EURUSD,M1)    Init: OrdersTotal= 0  PositionsTotal= 2  HistoryOrdersTotal= 262  HistoryDealsTotal= 263


Извиняюсь за неверную информацию. Но всё же , зачем нужно третье событие Trade ? Или только у меня глюк такой возникает ?

 
Valmars писал(а) # :
А что означает "... список ордеров в истории, доступных mql5-программе, сбрасывается и заполняется заново найденным ордером..." . Это что, весь список сбрасываетсмя в 0 и состоит

из одного " заново найденного ордера " ?

 Для функции HistoryOrderSelect() необходим  тиккет ордера. Ну, допустим, запомнили мы его на прошлом событии Trade, когда он ещё стоял в очереди на исполнение. Но ведь таких ордеров может быть одновременно > 1. И какой из них выбирать и как ? По времени установки ? Так оно может совпадать. Запоминать тиккеты всех установленных ордеров и потом их все анализировать ?

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


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

вроде с одной стороны поидее список истории посли применения хистору селект должен состатья из ордеров по фильтру

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

и когда я делаю перебор ордеров и возвршаю тикет мне что опять хисториселект делать????

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


Может он трайде слишком быстро прибегает недождавшись результата и поэтому невидит

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

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