ローカルタイムとフレッシュティックタイムの差が1分30秒。何をするのか - ページ 4

 

次のようなことがわかりました。OnTick イベントが間違ったタイミング順序でティックを処理することがあります(まれですが、珍しいことではありません)。最初に後のティックがあり、次に前のティックがある。そのため、Expert Advisorでは、ティックのカウントやインジケータ(必要なもの)の計算を自分で行うことをルールにしています。そして、単純に「悪いティック」を捨てています。

追記:私のロボットの「変な」挙動により気づきました(たまにあるんです)。チャートを見て、「自分のロジックでは」-オープニングルールはないが、EAがオープンしている。詮索して探し始めるのです。そんな不思議なダニ」を見つけてしまうのです。これらを削除すると、Expert Advisorは「正しく」、つまり私のロジックに従って動作するようになります。

 
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]);      
     }
  }  

EA自体が遅延をキャッチしている。

ファイル:
 
pivomoe:

EA自体が遅延をキャッチしている。

すぐにキャッチーなのは、ティックの発行でターミナルがラグっているかどうかを把握したい、ということですね。では、なぜ特定のシンボルではなく、すべてのシンボルに時間をかけるのでしょうか?なぜもっとシンプルに書けないのか。

#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分半の遅れは許されない。

 
pivomoe:
正直なところ、SymbolInfoInteger(_Symbol,SYMBOL_TIME) がどんな時間を返すのか理解できていません。 最後の見積もりは何時 ですか?

はい、そうです。ダニの受信に1分半の遅れは許されない。

これは、現在の(私の例では)シンボルの最後の引用符の到着時刻です。こちらで同じ時間を見ることができます。

また、SymbolInfoInteger()は、指定されたシンボルのプロパティを返す。

 
引用とは何ですか?昨日、ドキュメントとフォーラムでこの機能を見たばかりです。何を返すかは全く不明です。
 
pivomoe:
引用とは何ですか?昨日、ドキュメントとフォーラムの両方でこの機能を見たところです。何を返すかは全く不明です。

新規見積もりとは、新規に価格を変更することです。すなわち、買値および/または売値の変更。

 
Alexey Kozitsyn:

新規の見積もりは、新規の価格変更です。すなわち、買値および/または売値の変化。

マーケット概要には、「ボリューム」「最後の取引」の列もあります。この関数は、単に最後のティックの.timeを返すだけだと思われます。

 
pivomoe:

マーケット概要には、「ボリューム」「最後の取引」の列もあります。この関数は、単に最後のティックの.timeを返すだけだと思われます。

ダニにも種類があることをご存知ですか?そのティックは、トレーディング/インフォメーションのティックに分かれているのですか?

 
Alexey Kozitsyn:

ダニには種類があることをご存知ですか?そのティックは、トレーディング/インフォメーションのティックに分かれているのですか?

分かってる 何が言いたいんだ?