//+----------------------------------------------------------------------------+//| Проверяем не установлили ли новые рекорды. |//+----------------------------------------------------------------------------+void PitaemsayObnovitRekordi(CInformaziaOPoslednemTike &InformaziaOPoslednemTike[], int NomerSimolaS_NovimTikom )
{
//--- 1. Определяем время и символ(ипользуется только для вывода информации) самого свещего тика по всем символам.//--- 2. Вычисляем разность. Время самого свежего тика по всем символам МИНУС время последнего тика по проверяемому символу.//--- 3. Обновляем глобальные строки для функции Comment.//--- 4. Обновляем глобальные строки для функции Comment если установлен рекорд.staticlong RekordRaznosti= -1;
staticlong SymmaRaznostei= 0;
staticlong 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]);
}
}
#property indicator_plots0//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- indicator buffers mapping//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//--- Получаем время последней котировки по символуconstdatetime 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 callreturn(rates_total);
}
//+------------------------------------------------------------------+
次のようなことがわかりました。OnTick イベントが間違ったタイミング順序でティックを処理することがあります(まれですが、珍しいことではありません)。最初に後のティックがあり、次に前のティックがある。そのため、Expert Advisorでは、ティックのカウントやインジケータ(必要なもの)の計算を自分で行うことをルールにしています。そして、単純に「悪いティック」を捨てています。
追記:私のロボットの「変な」挙動により気づきました(たまにあるんです)。チャートを見て、「自分のロジックでは」-オープニングルールはないが、EAがオープンしている。詮索して探し始めるのです。そんな不思議なダニ」を見つけてしまうのです。これらを削除すると、Expert Advisorは「正しく」、つまり私のロジックに従って動作するようになります。
遅延を捕捉するコードの一部を提供してください。ここで、コード挿入ボタンから。
EA自体が遅延をキャッチしている。
EA自体が遅延をキャッチしている。
すぐにキャッチーなのは、ティックの発行でターミナルがラグっているかどうかを把握したい、ということですね。では、なぜ特定のシンボルではなく、すべてのシンボルに時間をかけるのでしょうか?なぜもっとシンプルに書けないのか。
ターミナルがティックに遅れるかどうかを理解したいのですよね
?ダニの受信に1分半の遅れは許されない。
正直なところ、SymbolInfoInteger(_Symbol,SYMBOL_TIME) がどんな時間を返すのか理解できていません。 最後の見積もりは何時 ですか?
はい、そうです。ダニの受信に1分半の遅れは許されない。
これは、現在の(私の例では)シンボルの最後の引用符の到着時刻です。こちらで同じ時間を見ることができます。
また、SymbolInfoInteger()は、指定されたシンボルのプロパティを返す。
引用とは何ですか?昨日、ドキュメントとフォーラムの両方でこの機能を見たところです。何を返すかは全く不明です。
新規見積もりとは、新規に価格を変更することです。すなわち、買値および/または売値の変更。
新規の見積もりは、新規の価格変更です。すなわち、買値および/または売値の変化。
マーケット概要には、「ボリューム」「最後の取引」の列もあります。この関数は、単に最後のティックの.timeを返すだけだと思われます。
マーケット概要には、「ボリューム」「最後の取引」の列もあります。この関数は、単に最後のティックの.timeを返すだけだと思われます。
ダニにも種類があることをご存知ですか?そのティックは、トレーディング/インフォメーションのティックに分かれているのですか?
ダニには種類があることをご存知ですか?そのティックは、トレーディング/インフォメーションのティックに分かれているのですか?