Полторы минуты разницы между локальным временем и временем свежего тика. Что делать. - страница 4

 

Я для себя открыл следующее: порой событие OnTick обрабатывает тики не в том временном порядке (редко но встречается). Сначала идет более поздний тик, а потом более ранний. Поэтому в советниках взял за правило самому учитывать тики, самому считать индикаторы (которые мне нужны). А "непорядочные тики" просто отбрасываю. 

PS: заметил это благодаря "странному" поведению моих роботов (иногда и такое бывает). Смотришь на график и "на свою логику" - нету правила открытия, а советник открыл. Начинаешь ковыряться и искать. Обнаруживаю "такие странные тики". Если их убрать, то советник начинает работать "правильно", т.е. по моей логике. 

 
Alexey Kozitsyn:

Кусок кода приведите пожалуйста, который ловит задержки. Прямо тут, через кнопку вставки кода.

//+----------------------------------------------------------------------------+
//|  Проверяем не установлили ли новые рекорды.                                |
//+----------------------------------------------------------------------------+
void PitaemsayObnovitRekordi(CInformaziaOPoslednemTike &InformaziaOPoslednemTike[], int NomerSimolaS_NovimTikom )
  {   
//---  1. Определяем время и символ(ипользуется только для вывода информации)  самого свещего тика по всем символам.
//---  2. Вычисляем разность. Время самого свежего тика по всем символам МИНУС время последнего тика по проверяемому символу.
//---  3. Обновляем глобальные строки для функции Comment.
//---  4. Обновляем глобальные строки для функции Comment если установлен рекорд.
   static long RekordRaznosti=        -1;
  
   static long SymmaRaznostei=       0;
   static long KolichestvoPolychenixNovixTikov= 0;
     
//---  1. Определяем время и символ(ипользуется только для вывода информации)  самого свещего тика по всем символам.
   long VremaySamogoSvegegoTikaPoVsemSimvolam= 0; 
   int IndeksSimvolaS_SamimSvegimTikom= 0;   
   for(int i=0; i<KolichestvoSimvolov; i++)     
   if( InformaziaOPoslednemTike[i].LastTick.time_msc > VremaySamogoSvegegoTikaPoVsemSimvolam ) {VremaySamogoSvegegoTikaPoVsemSimvolam= InformaziaOPoslednemTike[i].LastTick.time_msc;IndeksSimvolaS_SamimSvegimTikom=i;}
   
//---  2. Вычисляем разность. Время самого свежего тика по всем символам МИНУС время последнего тика по проверяемому символу.
   long Rasnost= VremaySamogoSvegegoTikaPoVsemSimvolam - InformaziaOPoslednemTike[NomerSimolaS_NovimTikom].LastTick.time_msc;
//---    
   SymmaRaznostei+= Rasnost;
   KolichestvoPolychenixNovixTikov++;
   
//---  3. Обновляем глобальные строки для функции Comment. 
   StringConcatenate(GStrokaDlayComment[2]," Самый свежий тик ",InformaziaOPoslednemTike[IndeksSimvolaS_SamimSvegimTikom].Simvol," time_msc ",PrintMilesekond(InformaziaOPoslednemTike[IndeksSimvolaS_SamimSvegimTikom].LastTick.time_msc));
   if( ((VremaySamogoSvegegoTikaPoVsemSimvolam-StartTimeMsc)/1000) != 0 )
     {StringConcatenate(GStrokaDlayComment[3]," Средняя разность ",SymmaRaznostei/KolichestvoPolychenixNovixTikov," милесекунд. Количество полученных новых тиков ",KolichestvoPolychenixNovixTikov," Количество новых тиков в секунду ",KolichestvoPolychenixNovixTikov/((VremaySamogoSvegegoTikaPoVsemSimvolam-StartTimeMsc)/1000) );}
     
//---  4. Обновляем глобальные строки для функции Comment если установлен рекорд.    
   if( RekordRaznosti < Rasnost ) 
     {
      RekordRaznosti= Rasnost;
      GStrokaDlayComment[4]="--------------------------------------------------------------------------------";      
      StringConcatenate(GStrokaDlayComment[5],"РЕКОРДная  Разница между временем последенго тика по ВСЕМ символам Минус только, что полученный новый тик по символу ",RekordRaznosti," милесекундa.");
      StringConcatenate(GStrokaDlayComment[6]," Получен НОВЫЙ тик по символу                     ",InformaziaOPoslednemTike[NomerSimolaS_NovimTikom].Simvol," time_msc= ",PrintMilesekond(InformaziaOPoslednemTike[NomerSimolaS_NovimTikom].LastTick.time_msc));      
      StringConcatenate(GStrokaDlayComment[7]," ХОТЯ до этого был получeн тик                        ",InformaziaOPoslednemTike[IndeksSimvolaS_SamimSvegimTikom].Simvol," time_msc ",PrintMilesekond(InformaziaOPoslednemTike[IndeksSimvolaS_SamimSvegimTikom].LastTick.time_msc));
      StringConcatenate(GStrokaDlayComment[8]," Локальное время получения нового тика по символу.                                   ",PrintMilesekond(InformaziaOPoslednemTike[NomerSimolaS_NovimTikom].PoslednieVremayRaboti));
      StringConcatenate(GStrokaDlayComment[9]," Предпоследние Локальное время попытки получить новый тик по символу    ",PrintMilesekond(InformaziaOPoslednemTike[NomerSimolaS_NovimTikom].PredPoslednieVremayRaboti));
      
      GStrokaDlayComment[10]="--------------------------------------------------------------------------------";
      
      for( int i=2; i<12; i++ )
      Print(GStrokaDlayComment[i]);      
     }
  }  

Сам советник отлавливающий задержки.

Файлы:
 
pivomoe:

Сам советник отлавливающий задержки.

Сразу бросается в глаза: Вы хотите понять запаздывает ли терминал с выдачей тиков, так? Дак почему Вы берете время по всем символам, а не по конкретному символу? Почему нельзя написать проще:

#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- Получаем время последней котировки по символу
   const datetime lastTime=(datetime)SymbolInfoInteger(_Symbol,SYMBOL_TIME);
//--- Приемник данных о последнем тике
   MqlTick tick;
//--- Получение последнего тика
   if(SymbolInfoTick(_Symbol,tick))
     {
      //--- Проводим ГРУБОЕ сравнение времени последней котировки и последнего тика
      int lag=int(lastTime-tick.time);
      //---
      Print(__FILE__,": Время прихода: последней котировки = "+TimeToString(lastTime,TIME_SECONDS)+", последнего тика = "+TimeToString(tick.time,TIME_SECONDS)+". Задержка = ",lag," сек.");
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Я честно говоря не понимаю, что за время возвращает SymbolInfoInteger(_Symbol,SYMBOL_TIMЕ)  ? Что это за время последней котировки ?
Alexey Kozitsyn:

 Вы хотите понять запаздывает ли терминал с выдачей тиков, так? 

Да именно так. Задержки в полторы минуты в получении тиков не допустимы.

 
pivomoe:
Я честно говоря не понимаю, что за время возвращает SymbolInfoInteger(_Symbol,SYMBOL_TIMЕ)  ? Что это за время последней котировки ?

Да именно так. Задержки в полторы минуты в получении тиков не допустимы.

Это время прихода последней котировки по текущему (в моем примере) символу. Это же время Вы можете увидеть здесь:

А SymbolInfoInteger() возвращает свойство указанного символа. 

 
Что такое котировка ? Я вчера только смотрел эту функцию и в документации и на форуме. Что она возвращает совершенно не понятно.
 
pivomoe:
Что такое котировка ? Я вчера только смотрел эту функцию и в документации и на форуме. Что она возвращает совершенно не понятно.

Новая котировка - новое изменение цены. Т.е. изменение бида и/или аска.

 
Alexey Kozitsyn:

Новая котировка - новое изменение цены. Т.е. изменение бида и/или аска.

В обзоре рынке ещё есть столбцы "Объем" "Последняя сделка " Есть подозрения, что эта функция просто возвращает .time последнего тика. 

 
pivomoe:

В обзоре рынке ещё есть столбцы "Объем" "Последняя сделка " Есть подозрения, что эта функция просто возвращает .time последнего тика. 

А Вы знаете, что тики бывают разные? Что тики делятся на торговые/информационные?

 
Alexey Kozitsyn:

А Вы знаете, что тики бывают разные? Что тики делятся на торговые/информационные?

Знаю. К чему вы это ? 
Причина обращения: