- Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici
- L'apprendimento automatico nel trading: teoria, modelli, pratica e algo-trading
- Caratteristiche del linguaggio mql4, sottigliezze e tecniche
Il problema è che l'indicatore , che disegna la linea quando cambia il TF, su cui la storia non è ancora caricata, calcola i dati, poi le barre vengono aggiunte al grafico, e calcola di nuovo i dati, rispettivamente, anche i precedenti vengono lasciati fuori.
Quindi c'è un errore nella logica dell'indicatore. Quando si carica la storia, l'opzione ideale dell'indicatore: calcolare il suo stato al momento dell'ultima barra, che non è cambiata nella storia e ricalcolare i dati sulla parte aggiornata della storia.
In realtà, questa opzione non è sempre possibile, perché restituire l'ambiente dell'indicatore su una certa barra significherebbe effettuare il calcolo dall'inizio della storia. Pertanto, negli algoritmi complessi dell'indicatore viene eseguito un ricalcolo completo della storia quando si carica anche una sola barra (da non confondere con l'apertura di una nuova barra).
In realtà il problema è che l'indicatore che disegna la linea al cambio di TF, su cui la storia non è ancora caricata, calcola i dati, poi le barre vengono aggiunte al grafico, e calcola di nuovo i dati, rispettivamente, le precedenti vengono anche lasciate fuori + saltate.
Nell'indicatore in OnCalculate() il controllo dovrebbe essere fatto:
if(prev_calculated==0) // значит история изменилась или это первый проход
L'indicatore in OnCalculate() deve controllare:
Grazie.
Ero solo confuso dal fatto che gli avvisi mi davano che la storia veniva caricata a pezzi.
Sì, proprio così.
Quindi c'è un errore nella logica dell'indicatore. Quando si carica la storia, l'opzione ideale dell'indicatore: calcolare il suo stato al momento dell'ultima barra, che non è cambiata nella storia e ricalcolare i dati sulla parte aggiornata della storia.
In realtà, questa opzione non è sempre possibile, perché restituire l'ambiente dell'indicatore su una certa barra significherebbe effettuare il calcolo dall'inizio della storia. Pertanto, con qualsiasi algoritmo sofisticato dell'indicatore viene eseguito un ricalcolo completo della storia quando si carica anche una sola barra (da non confondere con l'apertura di una nuova barra).
Quindi l'unica soluzione praticabile è solo?
for(int i=rates_total-prev_calculated;i>=0;i--)
Quindi l'unica soluzione che funziona è?
for(int i=rates_total-prev_calculated;i>=0;i--)
E se ho bisogno di ricalcolare non solo la barra corrente allora (per esempio 4)?
for(int i=rates_total-prev_calculated+4;i>=0;i--) { if(i>Bars) i=Bars;
Sì, funziona.
Quando le barre vengono caricate in chunks, vengono ricalcolate in chunks.
Il chunk corretto è solo l'ultimo ad essere caricato più a sinistra haha.
È ora di imparare a scrivere indicatori
Insegnami.
E io dico che gli sviluppatori dovrebbero fare degli aggiustamenti nei primi calcoli dell'indicatore.
È ora di imparare a scrivere indicatori
Vuoi un trucco? Indovina cosa ha restituito Alert?
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[]) { if(prev_calculated!=0) Alert(prev_calculated," M:",Period()); return(rates_total); }
Vuoi un trucco? Indovina cosa ha restituito Alert?
Non uso avvisi negli indicatori. Prevedere un ricalcolo completo se c'è un download della storia. È facile da controllare.
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso