Тиковая история MQL5, не все значения структуры MqlTick имеют данные....

Farkhat Guzairov  

Всем доброго!

Дошли руки до MQL5, интересует работа с тиковыми данными, сделал небольшой пример( см.ниже) но результат получил не тот, что ожидал. Быть может чего то не так понимаю, но при копировании структура MqlTick содержит не полные данные, а именно нету данных по MyTicks.volume и MyTicks.volume_real, если с MyTicks.volume_real вопросов нет (брокер), то почему MyTicks.volume не содержит данных?

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


   MqlTick MyTicks[];
   ResetLastError();
   datetime end_time = iTime(Symbol(),PERIOD_CURRENT,0);
   datetime start_time = end_time - 60*PERIOD_M1*1;
   Print(__FUNCTION__,"... start_time: ",start_time,", end_time: ",end_time);
   int coped = CopyTicksRange(Symbol(),MyTicks,COPY_TICKS_ALL,start_time*1000,end_time*1000);

Результат:

2019.04.07 14:16:17.337 Test (EURUSD,M5)        OnStart... MyTicks[40].time: 2019.04.05 20:54:59, MyTicks[40].volume: 0, MyTicks[40].volume_real: 0.0, MyTicks[40].ask: 1.1217, MyTicks[40].bid: 1.12163
2019.04.07 14:16:17.337 Test (EURUSD,M5)        OnStart... MyTicks[41].time: 2019.04.05 20:54:59, MyTicks[41].volume: 0, MyTicks[41].volume_real: 0.0, MyTicks[41].ask: 1.12171, MyTicks[41].bid: 1.12163
2019.04.07 14:16:17.337 Test (EURUSD,M5)        OnStart... MyTicks[42].time: 2019.04.05 20:54:59, MyTicks[42].volume: 0, MyTicks[42].volume_real: 0.0, MyTicks[42].ask: 1.1217, MyTicks[42].bid: 1.12161
2019.04.07 14:16:17.337 Test (EURUSD,M5)        OnStart... MyTicks[43].time: 2019.04.05 20:54:59, MyTicks[43].volume: 0, MyTicks[43].volume_real: 0.0, MyTicks[43].ask: 1.1217, MyTicks[43].bid: 1.12162
Anatolii Zainchkovskii  
Farkhat Guzairov:

Всем доброго!

Дошли руки до MQL5, интересует работа с тиковыми данными, сделал небольшой пример( см.ниже) но результат получил не тот, что ожидал. Быть может чего то не так понимаю, но при копировании структура MqlTick содержит не полные данные, а именно нету данных по MyTicks.volume и MyTicks.volume_real, если с MyTicks.volume_real вопросов нет (брокер), то почему MyTicks.volume не содержит данных?

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


Результат:

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

Farkhat Guzairov  
Anatolii Zainchkovskii:

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

Проблема в том, что оба вольюм имеют нулевое значение.

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

Anatolii Zainchkovskii  
Farkhat Guzairov:

Проблема в том, что оба вольюм имеют нулевое значение.

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

запрос правильный. тут малость в другом ситуация. по сути вольюм это количество пришедших тиков за определённый промежуток времени. тоесть за минуту или за час или за день.  а в структуре копирования тиковых данных получается по умолчанию один тик. тоесть тик пришёл (не важно в каком поле изменились данные) значит +1 тик ( вольюм)  к нынешнему бару. Потому у вас никогда на форекс котировках в тиках объёмов не будет. По сути вы сможете только цену и точное время тика использовать. А сделана эта структура для того чтобы биржевые данные тиков можно было использовать. Там за один тик могла поменяться не цена а количество (объём )заявок.  

Но как вы говорите проблеммы с тиковой историей на самом деле нету. В мт5 будут все тики которые транслировал ваш ДЦ.

Farkhat Guzairov  
Anatolii Zainchkovskii:

запрос правильный. тут малость в другом ситуация. по сути вольюм это количество пришедших тиков за определённый промежуток времени. тоесть за минуту или за час или за день.  а в структуре копирования тиковых данных получается по умолчанию один тик. тоесть тик пришёл (не важно в каком поле изменились данные) значит +1 тик ( вольюм)  к нынешнему бару. Потому у вас никогда на форекс котировках в тиках объёмов не будет. По сути вы сможете только цену и точное время тика использовать. А сделана эта структура для того чтобы биржевые данные тиков можно было использовать. Там за один тик могла поменяться не цена а количество (объём )заявок.  

Но как вы говорите проблеммы с тиковой историей на самом деле нету. В мт5 будут все тики которые транслировал ваш ДЦ.

>а в структуре копирования тиковых данных получается по умолчанию один тик. тоесть тик пришёл (не важно в каком поле изменились данные) значит +1 тик ( вольюм)  к нынешнему бару

Это ваши выводы или есть документально зафиксированная информация(без сарказма)? Я конечно еще раз прочитаю справку, но не помню подобного описания.

Farkhat Guzairov  
Farkhat Guzairov:

>а в структуре копирования тиковых данных получается по умолчанию один тик. тоесть тик пришёл (не важно в каком поле изменились данные) значит +1 тик ( вольюм)  к нынешнему бару


Это логично, но все же нужен пруф.

Anatolii Zainchkovskii  
Farkhat Guzairov:

>а в структуре копирования тиковых данных получается по умолчанию один тик. тоесть тик пришёл (не важно в каком поле изменились данные) значит +1 тик ( вольюм)  к нынешнему бару

Это ваши выводы или есть документально зафиксированная информация(без сарказма)? Я конечно еще раз прочитаю справку, но не помню подобного описания.

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

Farkhat Guzairov  
Anatolii Zainchkovskii:

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

В общем, пример из справки:

//+------------------------------------------------------------------+ 
//| возвращает строковое описание тика                               | 
//+------------------------------------------------------------------+ 
string GetTickDescription(MqlTick &tick) 
  { 
   string desc=StringFormat("%s.%03d ", 
                            TimeToString(tick.time),tick.time_msc%1000); 
//--- проверим флаги 
   bool buy_tick=((tick.flags&TICK_FLAG_BUY)==TICK_FLAG_BUY); 
   bool sell_tick=((tick.flags&TICK_FLAG_SELL)==TICK_FLAG_SELL); 
   bool ask_tick=((tick.flags&TICK_FLAG_ASK)==TICK_FLAG_ASK); 
   bool bid_tick=((tick.flags&TICK_FLAG_BID)==TICK_FLAG_BID); 
   bool last_tick=((tick.flags&TICK_FLAG_LAST)==TICK_FLAG_LAST); 
   bool volume_tick=((tick.flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME); 
//--- проверим сначала тик на торговые флаги 
   if(buy_tick || sell_tick) 
     { 
      //--- сформируем вывод для торгового тика 
      desc=desc+(buy_tick?StringFormat("Buy Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); 
      desc=desc+(sell_tick?StringFormat("Sell Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); 
      desc=desc+(ask_tick?StringFormat("Ask=%G ",tick.ask):""); 
      desc=desc+(bid_tick?StringFormat("Bid=%G ",tick.ask):""); 
      desc=desc+"(Trade tick)"; 
     } 
   else 
     { 
      //--- для инфо тика сформируем вывод немного иначе 
      desc=desc+(ask_tick?StringFormat("Ask=%G ",tick.ask):""); 
      desc=desc+(bid_tick?StringFormat("Bid=%G ",tick.ask):""); 
      desc=desc+(last_tick?StringFormat("Last=%G ",tick.last):""); 
      desc=desc+(volume_tick?StringFormat("Volume=%d ",tick.volume):""); 
      desc=desc+"(Info tick)"; 
     } 
//--- вернем описание тика 
   return desc; 
  } 

По идеи должен был получить что-то подобное:

10. 2016.09.26 10:00.000 Sell Tick: Last=65367 Volume=3 (Trade tick) 
11. 2016.09.26 10:00.000 Sell Tick: Last=65335 Volume=45 (Trade tick) 
12. 2016.09.26 10:00.000 Sell Tick: Last=65334 Volume=95 (Trade tick) 
13. 2016.09.26 10:00.191 Sell Tick: Last=65319 Volume=1 (Trade tick) 
14. 2016.09.26 10:00.191 Sell Tick: Last=65317 Volume=1 (Trade tick) 

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

2019.04.07 16:14:54.921 Test (EURUSD,M1)        OnStart... Result[34]: 2019.04.05 20:55.828 Ask=1.12167 Bid=1.12167 (Info tick)
2019.04.07 16:14:54.921 Test (EURUSD,M1)        OnStart... Result[35]: 2019.04.05 20:55.838 Ask=1.12166 Bid=1.12166 (Info tick)
2019.04.07 16:14:54.921 Test (EURUSD,M1)        OnStart... Result[36]: 2019.04.05 20:55.869 Ask=1.12164 Bid=1.12164 (Info tick)
2019.04.07 16:14:54.921 Test (EURUSD,M1)        OnStart... Result[37]: 2019.04.05 20:55.059 Bid=1.12164 (Info tick)
2019.04.07 16:14:54.921 Test (EURUSD,M1)        OnStart... Result[38]: 2019.04.05 20:55.130 Ask=1.12163 (Info tick)
2019.04.07 16:14:54.921 Test (EURUSD,M1)        OnStart... Result[39]: 2019.04.05 20:55.939 Ask=1.12165 (Info tick)
Anatolii Zainchkovskii  
Farkhat Guzairov:

В общем, пример из справки:

По идеи должен был получить что-то подобное:

Но нет, ни одного подобного сообщения не вижу.

это пример на биржевом символе, не на валютной паре.

Farkhat Guzairov  
Опять же если исходит из примера справки, то там поля tick.volume имеют значения.
Farkhat Guzairov  
Anatolii Zainchkovskii:

это пример на биржевом символе, не на валютной паре.

В примере об этом ни слова не сказано.

Причина обращения: