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

 

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

Дошли руки до 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
 
Farkhat Guzairov:

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

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

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


Результат:

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

 
Anatolii Zainchkovskii:

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

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

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

 
Farkhat Guzairov:

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

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

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

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

 
Anatolii Zainchkovskii:

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

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

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

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

 
Farkhat Guzairov:

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


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

 
Farkhat Guzairov:

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

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

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

 
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)
 
Farkhat Guzairov:

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

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

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

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

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

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

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