현지 시간과 신선한 틱 시간 사이에는 1분 30초의 차이가 있습니다. 할 일. - 페이지 4

 

나는 다음을 스스로 발견했습니다. 때때로 OnTick 이벤트가 잘못된 시간 순서로 틱을 처리합니다(드물지만 발생합니다). 나중 틱이 먼저 오고 먼저 틱이 옵니다. 따라서 Expert Advisors에서는 틱을 직접 고려하여 지표를 직접 계산하는 규칙을 만들었습니다(필요한). 그리고 나는 단순히 "부정직한 틱"을 버립니다.

추신: 내 로봇의 "이상한" 동작으로 인해 이것을 알아차렸습니다(가끔 이런 일이 발생함). 차트를보고 "자신의 논리에서"-개방 규칙은 없지만 고문이 열었습니다. 당신은 이리저리 파고들기 시작합니다. 나는 "그런 이상한 틱"을 찾습니다. 제거되면 어드바이저가 "올바르게" 작동하기 시작합니다. 내 논리로.

 
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_TIME)가 반환되는 시간을 이해하지 못합니다. 마지막 견적의 시간은 무엇입니까?
Alexey Kozitsyn :

터미널이 틱 발행에 늦는지 알고 싶습니까?

네 맞습니다. 틱 수신에 1분 30초의 지연은 허용되지 않습니다.

 
pivomoe :
나는 솔직히 SymbolInfoInteger ( _Symbol , SYMBOL_TIME)가 반환되는 시간을 이해하지 못합니다. 마지막 견적의 시간은 무엇입니까?

네 맞습니다. 틱 수신에 1분 30초의 지연은 허용되지 않습니다.

이것은 현재(내 예에서) 기호에 대한 마지막 따옴표의 도착 시간입니다. 여기에서 같은 시간을 볼 수 있습니다.

그리고 SymbolInfoInteger() 는 지정된 기호의 속성을 반환합니다.

 
견적이란 무엇입니까? 어제 문서와 포럼에서 이 기능을 살펴보았습니다. 그것이 반환하는 것은 완전히 이해할 수 없습니다.
 
pivomoe :
견적이란 무엇입니까? 어제 문서와 포럼에서 이 기능을 살펴보았습니다. 그것이 반환하는 것은 완전히 이해할 수 없습니다.

새로운 견적 - 새로운 가격 변경. 저것들. 입찰 및/또는 요청 변경.

 
Alexey Kozitsyn :

새로운 견적 - 새로운 가격 변경. 저것들. 입찰 및/또는 요청 변경.

시장 시계 "Volume" "Last Traded"에도 열이 있습니다. 이 함수가 단순히 마지막 틱의 .time을 반환한다는 의혹이 있습니다.

 
pivomoe :

Market Watch "Volume" "Last Traded"에도 열이 있습니다. 이 함수가 단순히 마지막 틱의 .time을 반환한다는 의혹이 있습니다.

틱이 다르다는 사실, 알고 계셨나요? 어떤 틱이 거래/정보 틱으로 구분되나요?

 
Alexey Kozitsyn :

틱이 다르다는 사실, 알고 계셨나요? 어떤 틱이 거래/정보 틱으로 구분되나요?

알아요. 왜 이런 짓을하는?