Ho scoperto quanto segue: a volte l'evento OnTick gestisce i tick nell'ordine temporale sbagliato (raro ma non raro). Prima c'è una spunta successiva e poi una precedente. Pertanto, ho fatto una regola nei miei Expert Advisors per contare i tick e gli indicatori (di cui ho bisogno). E scarto semplicemente le "zecche cattive".
PS: Ho notato questo a causa del comportamento "strano" dei miei robot (a volte succede). Guardi il grafico e "sulla tua logica" - non c'è una regola di apertura, ma l'EA ha aperto. Si comincia a frugare e a cercare. Trovo "dei tic così strani". Se li rimuovi, l'Expert Advisor inizia a funzionare "correttamente", cioè secondo la mia logica.
Si prega di fornire un pezzo di codice che cattura i ritardi. Proprio qui, attraverso il pulsante di inserimento del codice.
//+----------------------------------------------------------------------------+//| Проверяем не установлили ли новые рекорды. |//+----------------------------------------------------------------------------+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]);
}
}
Immediatamente accattivante: volete capire se il terminale è in ritardo con l'emissione di tick, giusto? Allora perché si prende il tempo per tutti i simboli e non per un simbolo particolare? Perché non puoi scriverlo in modo più semplice?
#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);
}
//+------------------------------------------------------------------+
pivomoe: Cos'è una citazione? Ho dato un'occhiata a questa funzione proprio ieri, sia nella documentazione che nel forum. Cosa restituisce non è affatto chiaro.
Una nuova quotazione è un nuovo cambiamento di prezzo. Cioè un cambiamento nell'offerta e/o nella domanda.
Una nuova quotazione è un nuovo cambiamento di prezzo. Cioè il cambiamento dell'offerta e/o della domanda.
Nella panoramica del mercato ci sono anche le colonne "Volume" "Last trade" Ho il sospetto che questa funzione restituisca semplicemente il .time dell'ultimo tick.
Nella panoramica del mercato ci sono anche le colonne "Volume" "Last trade" Ho il sospetto che questa funzione restituisca semplicemente il .time dell'ultimo tick.
Sapevate che ci sono diverse zecche? Che i tick sono divisi in tick di trading/informazione?
Consenti l'uso dei cookie per accedere al sito MQL5.com.
Abilita le impostazioni necessarie nel browser, altrimenti non sarà possibile accedere.
Hai effettuato l'accesso. L'autenticazione a due fattori è stata disattivata. Configurala di nuovo e scansiona un nuovo codice QR, oppure continua con l'autenticazione a due fattori disattivata.
Ho scoperto quanto segue: a volte l'evento OnTick gestisce i tick nell'ordine temporale sbagliato (raro ma non raro). Prima c'è una spunta successiva e poi una precedente. Pertanto, ho fatto una regola nei miei Expert Advisors per contare i tick e gli indicatori (di cui ho bisogno). E scarto semplicemente le "zecche cattive".
PS: Ho notato questo a causa del comportamento "strano" dei miei robot (a volte succede). Guardi il grafico e "sulla tua logica" - non c'è una regola di apertura, ma l'EA ha aperto. Si comincia a frugare e a cercare. Trovo "dei tic così strani". Se li rimuovi, l'Expert Advisor inizia a funzionare "correttamente", cioè secondo la mia logica.
Si prega di fornire un pezzo di codice che cattura i ritardi. Proprio qui, attraverso il pulsante di inserimento del codice.
L'EA stessa che cattura i ritardi.
L'EA in sé sta prendendo dei ritardi.
Immediatamente accattivante: volete capire se il terminale è in ritardo con l'emissione di tick, giusto? Allora perché si prende il tempo per tutti i simboli e non per un simbolo particolare? Perché non puoi scriverlo in modo più semplice?
Volete capire se il terminale è in ritardo con i tick, giusto
? Un ritardo di un minuto e mezzo nella ricezione dei tick non è accettabile.
Ad essere onesti, non capisco che tempo restituisceSymbolInfoInteger(_Symbol,SYMBOL_TIME)? Qual è l'ora dell'ultima citazione?
Sì, è così. Ritardi di un minuto e mezzo nella ricezione delle zecche non sono accettabili.
Questo è il tempo di arrivo dell'ultima quotazione per il simbolo corrente (nel mio esempio). Potete vedere la stessa ora qui:
E SymbolInfoInteger() restituisce la proprietà del simbolo specificato.
Cos'è una citazione? Ho dato un'occhiata a questa funzione proprio ieri, sia nella documentazione che nel forum. Cosa restituisce non è affatto chiaro.
Una nuova quotazione è un nuovo cambiamento di prezzo. Cioè un cambiamento nell'offerta e/o nella domanda.
Una nuova quotazione è un nuovo cambiamento di prezzo. Cioè il cambiamento dell'offerta e/o della domanda.
Nella panoramica del mercato ci sono anche le colonne "Volume" "Last trade" Ho il sospetto che questa funzione restituisca semplicemente il .time dell'ultimo tick.
Nella panoramica del mercato ci sono anche le colonne "Volume" "Last trade" Ho il sospetto che questa funzione restituisca semplicemente il .time dell'ultimo tick.
Sapevate che ci sono diverse zecche? Che i tick sono divisi in tick di trading/informazione?
Sapevi che ci sono diversi tipi di zecche? Che i tick sono divisi in tick di trading/informazione?