Discussione sull’articolo "Manuale MQL5: Sviluppo di un indicatore multi-simbolo per l’analisi della divergenza dei prezzi"
È solo un errore di battitura o dovrebbe essere così?
Non importa quante volte ho provato, tutte le funzioni della "Squadra di copia" non restituiscono mai zero, ma solo -1 o >0.
//+------------------------------------------------------------------+ //| Controlla il numero di dati disponibili per tutti i caratteri || //+------------------------------------------------------------------+ bool CheckAvailableData() { int attempts=100; //--- for(int s=0; s<SYMBOLS_COUNT; s++) { //--- Se esiste un carattere di questo tipo if(symbol_names[s]!=empty_symbol) { datetime time[]; // Array per controllare il numero di barre int total_period_bars =0; // Numero di barre del periodo corrente datetime terminal_first_date =NULL; // Prima data di disponibilità dei dati del periodo corrente nel terminale //--- Ottenere la prima data dei dati del periodo corrente nel terminale terminal_first_date=(datetime)SeriesInfoInteger(symbol_names[s],Period(),SERIES_TERMINAL_FIRSTDATE); //--- Ottenere il numero di barre disponibili a partire dalla data specificata total_period_bars=Bars(symbol_names[s],Period(),terminal_first_date,TimeCurrent()); //--- Verificare la disponibilità di queste barre for(int i=0; i<attempts; i++) { //-- Copia la quantità di dati specificata if(CopyTime(symbol_names[s],Period(),0,total_period_bars,time)) { //--- Se la quantità richiesta è stata copiata, interrompere il ciclo if(ArraySize(time)>=total_period_bars) break; } } //--- Se vengono copiati meno dati, si deve fare un altro tentativo. if(ArraySize(time)==0 || ArraySize(time)<total_period_bars) { msg_last=msg_prepare_data; ShowCanvasMessage(msg_prepare_data); OC_prev_calculated=0; return(false); } } } //--- Se in modalità linea verticale per il punto di partenza della differenza di prezzo, uscire if(StartPriceDivergence==VERTICAL_LINE) return(true); else { datetime time[]; // Array per controllare il numero di barre int total_period_bars =0; // Numero di barre del periodo corrente datetime terminal_first_date =NULL; // Prima data di disponibilità dei dati del periodo corrente nel terminale //--- Ottenere la prima data dei dati del periodo corrente nel terminale for(int i=0; i<attempts; i++) if((terminal_first_date=(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_FIRSTDATE))>0) break; //--- Ottenere il numero di barre disponibili a partire dalla data specificata for(int i=0; i<attempts; i++) if((total_period_bars=(int)SeriesInfoInteger(Symbol(),timeframe_start_point,SERIES_BARS_COUNT))>0) break; //--- Verificare la disponibilità di queste barre for(int i=0; i<attempts; i++) //-- Copia la quantità di dati specificata if(CopyTime(Symbol(),timeframe_start_point, terminal_first_date+PeriodSeconds(timeframe_start_point),TimeCurrent(),time)>0) break; //--- Se vengono copiati meno dati, si deve fare un altro tentativo. if(ArraySize(time)<=0 || total_period_bars<=0) { msg_last=msg_prepare_data; ShowCanvasMessage(msg_prepare_data); OC_prev_calculated=0; return(false); } } //--- return(true); }
In generale, si dovrebbe fare >0. Ma in questo caso, i controlli successivi consentono di non farlo.
Ma questa espressione sarà sempre vera:
if(CopyTime(symbol_names[s],Period(),0,total_period_bars,time))
Ma questa espressione sarà sempre vera:
È possibile rimuovere il se. In questo caso non è critico.
In generale, il caricamento dei dati storici su un simbolo non avviene nel modo in cui è scritto nella guida.
In effetti, le cose si svolgono in questo modo:
se dal programma mql5 viene fatta una richiesta di dati di una serie temporale utilizzando, ad esempio, la funzione CopyTime
e questi dati non sono presenti nel terminale (non ancora caricati), il terminale scaricherà questi dati dal server non nella quantità richiesta (nell'esempio della guida è di 100 barre),
ma il numero di barre della serie temporale richiesta che il parametro "Max barre nel grafico" consente di "mettere" nella RAM.
È sufficiente richiedere una sola barra di un periodo superiore, ad esempio PERIODO_W1, perché l'intero storico verrà scaricato dal server.
In generale, il caricamento dei dati storici su un simbolo non avviene nel modo in cui è scritto nella guida.
In effetti, le cose si svolgono in questo modo:
se dal programma mql5 viene fatta una richiesta di dati di una serie temporale utilizzando, ad esempio, la funzione CopyTime
e questi dati non sono presenti nel terminale (non ancora caricati), il terminale scaricherà questi dati dal server non nella quantità richiesta (nell'esempio della guida è di 100 barre),
ma il numero di barre della serie temporale richiesta che il parametro "Max barre nel grafico" consente di "mettere" nella RAM.
È sufficiente richiedere una sola barra di un periodo superiore, ad esempio PERIODO_W1, poiché l'intero storico verrà scaricato dal server.
La guida può contenere tutto ciò che si desidera. Siete liberi di farlo come meglio credete. ;)
L'esempio della guida è stato discusso in un altro articolo: Come preparare le quotazioni di MetaTrader 5 per altri programmi >>>.
Il certificato può dire tutto quello che volete. Siete liberi di fare ciò che ritenete opportuno. ;)
L'esempio della guida è stato discusso in un altro articolo: Come preparare le quotazioni di MetaTrader 5 per altri programmi >>>.
Questo è ciò che ho fatto. Ho appena visto il calcolo delle rimanenti "barre scaricate" dal server nel tuo codice.
E ho pensato: al terminale non interessa, pompa quanto gli serve per formare.
Alla fine del suo articolo ha scritto:"Questo indicatore può essere sviluppato illimitatamente in meglio".
A mio parere, la contemplazione della divergenza dei prezzi è di scarsa utilità per l'occhio umano. Un umano non è un robot!
Ma è un argomento interessante per un robot.
Avete suggerito diverse opzioni di rendering:
1. dalla linea.
2. "giorno".
Attualmente sto lavorando a qualcosa di simile, solo in modalità "settimana".
Alla fine del suo articolo ha scritto:"Questo indicatore può essere sviluppato illimitatamente in meglio".
A mio parere, la contemplazione della divergenza dei prezzi è di scarsa utilità per l'occhio umano. Un umano non è un robot!
Ma è un argomento interessante per un robot.
Avete suggerito diverse opzioni di rendering:
1. dalla linea.
2. "giorno".
Attualmente sto lavorando a qualcosa di simile, solo in modalità "settimana".
Non so se sarò in grado di scrivere qualcos'altro a breve, perché sto affrontando altri problemi. Ma secondo questo articolo, lo sviluppo dovrebbe riguardare ancora i calcoli multivaluta e la visualizzazione di questi calcoli sul canvas.
Sì, l'uomo non è un robot, ma a volte è necessario guardare l'argomento di studio in un altro modo per farsi un'idea. ;)

- 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
Il nuovo articolo Manuale MQL5: Sviluppo di un indicatore multi-simbolo per l’analisi della divergenza dei prezzi è stato pubblicato:
In questo articolo, considereremo lo sviluppo di un indicatore multi-simbolo per analizzare la divergenza dei prezzi in un determinato periodo di tempo. Gli argomenti principali sono già stati discussi nel precedente articolo sulla programmazione di indicatori multi-valuta Manuale MQL5: Sviluppo di un indicatore di volatilità multi-simbolo in MQL5. Quindi questa volta ci soffermeremo solo su quelle nuove caratteristiche e funzioni che sono state cambiate radicalmente. Se sei un neofita della programmazione di indicatori multi-valuta, ti consiglio di leggere prima l'articolo precedente.
In questo articolo prenderemo in considerazione le seguenti questioni:
Autore: Anatoli Kazharski