Um minuto e meio de diferença entre a hora local e a hora do novo tick. O que fazer. - página 4

 

Descobri o seguinte: às vezes o evento OnTick lida com carrapatos na ordem errada (raro mas não incomum). Primeiro há um tique posterior, e depois um anterior. Portanto, fiz da contagem de carrapatos e indicadores (que eu preciso) uma regra em meus Conselheiros Especialistas. E eu simplesmente descarto "carrapatos ruins".

PS: Eu notei isto devido ao comportamento "estranho" de meus robôs (às vezes acontece). Você olha para o gráfico e "em sua lógica" - não há regra de abertura, mas a EA abriu. Você começa a bisbilhotar e procurar por ele. Acho "carrapatos tão estranhos". Se você os remover, o Expert Advisor começa a trabalhar "corretamente", ou seja, de acordo com minha lógica.

 
Alexey Kozitsyn:

Por favor, forneça um pedaço de código que captura os atrasos. Aqui mesmo, através do botão de inserção de código.

//+----------------------------------------------------------------------------+
//|  Проверяем не установлили ли новые рекорды.                                |
//+----------------------------------------------------------------------------+
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]);      
     }
  }  

A própria EA capturando os atrasos.

Arquivos anexados:
 
pivomoe:

A própria EA está pegando atrasos.

Imediatamente cativante: você quer entender se o terminal está atrasado com a emissão de carrapatos, certo? Então, por que você toma o tempo para todos os símbolos, e não para um símbolo em particular? Por que você não pode escrevê-lo de forma mais simples?

#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);
  }
//+------------------------------------------------------------------+
 
Sinceramente não entendo a que horas aSymbolInfoInteger(_Symbol,SYMBOL_TIME) retorna? Qual é a hora da última citação?
Alexey Kozitsyn:

Você quer entender se o terminal se atrasa com os carrapatos, certo

? Um atraso de um minuto e meio no recebimento de carrapatos não é aceitável.

 
pivomoe:
Para ser honesto, não entendo a que horas aSymbolInfoInteger(_Symbol,SYMBOL_TIME) retorna? Qual é a hora da última citação?

Sim, é. Atrasos de um minuto e meio no recebimento de carrapatos não são aceitáveis.

Esta é a hora de chegada da última citação do símbolo atual (no meu exemplo). Você pode ver o mesmo tempo aqui:

E SymbolInfoInteger() devolve a propriedade do símbolo especificado.

 
O que é uma citação ? Acabei de olhar para esta função ontem, tanto na documentação como no fórum. O que ele retorna não é de forma alguma claro.
 
pivomoe:
O que é uma citação ? Acabei de olhar para esta função ontem, tanto na documentação como no fórum. O que ele retorna não é de forma alguma claro.

Uma nova cotação é uma nova mudança de preço. Isto é, uma mudança na oferta e/ou na pergunta.

 
Alexey Kozitsyn:

Uma nova cotação é uma nova mudança de preço. Isto é, mudança na oferta e/ou na pergunta.

Na visão geral do mercado há também colunas "Volume" "Último comércio" Há uma suspeita de que esta função simplesmente retorna o tempo do último tick.

 
pivomoe:

Na visão geral do mercado também há colunas "Volume" "Último comércio", suspeito que esta função simplesmente retorna o tempo do último tick.

Você sabia que existem carrapatos diferentes? Que os carrapatos são divididos em carrapatos comerciais/informativos?

 
Alexey Kozitsyn:

Você sabia que existem diferentes tipos de carrapatos? Que os carrapatos são divididos em carrapatos comerciais/informativos?

Eu sei. Qual é o seu objetivo?
Razão: