Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 919
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Il calcolo del tuo indicatore è dall'inizio alla fine (dai dati storici più recenti ai dati attuali più recenti). Questa è un'indicazione di indicizzazione come nelle serie temporali. Quindi gli array devono essere indicizzati di conseguenza, che è quello che avete.
Cosa c'è che non va?
Funziona tutto come il mio porto in MQL5 da MQL4, ma vedo che il codice è brutto a causa diArraySetAsSeries(), ecco perché ho chiesto
Qui ci sono entrambi i codici
insegnami come scrivere questo indicatore per MT5! - Il mio codice non è bello, punto e basta! )))
ZSZ non ricordare come scrivere indicatori per MT5, seduto e riscritto in 40 minuti utilizzando la Guida, ma il risultato ... imho, non buono ((!)
Sì, tutto funziona esattamente come il mio porto in MQL5 da MQL4, ma vedo che il codice è brutto a causa diArraySetAsSeries(), così ho chiesto
Qui ci sono entrambi i codici
insegnami come scrivere questo indicatore per MT5! - Il mio codice non è bello, punto e basta! )))
Quando si inverte il ciclo, si deve necessariamente fare le serie temporali degli array, altrimenti l'indicizzazione dei buffer nel ciclo non coinciderà con l'indicizzazione dei dati richiesti - l'indice del ciclo nell'array dei buffer degli indicatori andrà dall'inizio alla fine, mentre in open[], high[], low[], close[] e altri - dalla fine all'inizio. Oppure, si può invertire il ciclo per far corrispondere la sua indicizzazione degli array open[], high[], low[], close[] e il resto con l'indicizzazione dei buffer, che è più complicato.
Se volete un'allegoria per renderlo più chiaro, ecco un'allegoria per voi:
Sei in piedi sui binari della ferrovia e guardi due treni. O vanno in una direzione - entrambi da sinistra a destra (ArraySetAsSeries(array,true) - primo treno e un ciclo da limite a 0 - secondo treno),
Oppure vanno uno verso l'altro - (ArraySetAsSeries(array,false) - da destra a sinistra - primo treno, e il ciclo dal limite a 0 - da sinistra a destra - secondo treno)
E, sì: non ho guardato il codice - non voglio scaricare, salvare (ho un sacco di codici inutili dal forum), confrontarli tra loro...
Sarebbe più facile metterli in codici nel messaggio - uno e secondo - poi sarebbe visibile subito cosa a cosa.
O capovolgere il ciclo per far corrispondere la sua indicizzazione degli array open[], high[], low[], close[] e il resto, che è più difficile.
Ho fatto l'inversione tutta la notte oggi, la mia pazienza si è esaurita (((
Per quanto ho capito il problema:
- in MT5 gli array che sono assegnati ai buffer degli indicatori sono indicizzati da sinistra a destra per impostazione predefinita;
- in MT5 le serie temporaliopen[], high[], low[], close[] disponibili da OnCalculate() sono sempre passate indicizzate da destra a sinistra
- cioè in base ai passi 1 e 2, per calcolare l'indicatore dalla fine della storia alla barra zero
a) o riassegnare l'indicizzazione degli array di buffer
b) o per fare un ciclo in cui gli elementi dell'array saranno ricalcolati da sinistra a destra, e in un altro ciclo da destra a sinistra:
cioè,non c'è una bella soluzione alla mia domanda? opzione a) - nelle mie fonti è implementata, opzione b) - non vedo il punto di fare calcoli extra
fonti:
MT5:
MT4:
Ho girato tutta la notte stasera, ma la mia pazienza è finita (((
per quanto ho capito il problema:
- in MT5 gli array che sono assegnati ai buffer degli indicatori sono indicizzati da sinistra a destra per impostazione predefinita;
- in MT5 le serie temporaliopen[], high[], low[], close[] disponibili da OnCalculate() sono sempre passate indicizzate da destra a sinistra
- cioè in base ai passi 1 e 2, per calcolare l'indicatore dalla fine della storia alla barra zero
a) o riassegnare l'indicizzazione degli array di buffer
b) o per fare un ciclo in cui gli elementi dell'array saranno ricalcolati da sinistra a destra, e in un altro ciclo da destra a sinistra:
cioè,non c'è unabella soluzione alla mia domanda? variante a) - nel mio codice sorgente è implementato, variante b) - non vedo il punto di fare calcoli extra
Tutti gli array sono indicizzati da destra a sinistra. Quindi, per rispettare pienamente il ciclo da sinistra a destra (ed è da sinistra a destra - dal limite a 0), è necessario impostare tutti gli array usati sull'indicizzazione richiesta : i buffer in OnInit(), i timeserver usati - in OnCalculate().
Oppure, fare il ciclo da 0 a limite, che non è sempre facile da fare quando mql4 è portato a mql5.
Pertanto, l'opzione ArraySetAsSeries() è migliore in questo caso.
Tutti gli array sono indicizzati da destra a sinistra. Pertanto, per rispettare pienamente il ciclo da sinistra a destra (ed è da sinistra a destra dal limite a 0), è necessario impostare tutti gli array usati sull'indicizzazione richiesta : i buffer in OnInit(), i timeserver usati - in OnCalculate().
Oppure, devi fare il ciclo da 0 a limite, che non è sempre facile da fare quando mql4 è portato a mql5.
Ecco perché in questo caso il metodo ArraySetAsSeries() funziona meglio.
Guarda, rimuovi tuttoArraySetAsSeries() dal tuo codice(sopra in Init() e OnCalculate() nelle prime righe) e correggi il ciclo:
for(i=0;i<limite;i++)
In teoria, tutto dovrebbe combaciare, ma no, i grafici sono risultati diversi, questo è quello che non riesco a capire!
Guarda, ho rimosso tuttoArraySetAsSeries() dal mio codice(in alto in Init() e in OnCalculate() nelle prime righe) e ho fissato il ciclo:
for(i=0;i<limite;i++)
In teoria, tutto dovrebbe combaciare, ma no, i grafici sono risultati diversi, ed è questo che non riesco a capire!
Ti dico che è più complicato di così. Bisogna cambiare la logica. Non basta invertire il ciclo.
Ecco un piccolo esempio: nel codice c'è
Buf_NTLine1[i+1])
Dove andrà l'indice i+1 quando gli array sono indicizzati diversamente?
E ce n'è un sacco. IHighest() - inizio e numero. Dove inizia un'indicizzazione e dove un'altra?
E così via...
e ce n'è un sacco. IHighest() - inizio e numero di... Dove inizia un'indicizzazione e l'altra?
Oh, cavolo, è vero! Ben fatto!!! sì, questa è la parte difficile!!!
Già... molte differenze in MT5, molti controlli e ogni sorta di precauzioni sulla testa del programmatore...
Quando ho visto questo messaggio qualche tempo fa, sembrava che in MT5 non sempre tuttoviene inizializzato correttamente inInit(), sembra cheInit() possa finire anche se i timeframes non sono pronti.
Ho visto un bug ieri: se questo indicatore in MT5 cambia timeframes, a volte i buffer degli indicatori potrebbero non essere vuoti - sembra che i vecchi valori rimangano se non per assegnare un valore specifico ad ogni elemento dell'array dell'indicatore in OnCalculate(), ho provatoa mettere ArrayInitialize(arr, 0.0) inInit()- funziona anche, poi no...
se ho capito bene:
- in MT5, all'inizializzazione inInit(), i buffer degli indicatori non vengono inizializzati automaticamente? (in MT4 non ricordo che sia rimasto qualcosa nei buffer)
- in MT5 inInit() le dimensioni degli array di buffer possono essere sconosciute se la storia non è caricata, ecco perchéanche ArrayInitialize(arr, 0.0) non sempre inizializza correttamente i buffer?
Accidenti, è vero, ben fatto!!! Sì, questa è la parte divertente!!!
Già... Ci sono molte differenze in MT5, il programmatore ha un sacco di controlli e ogni sorta di precauzioni...
Quando ho visto questo messaggio qualche tempo fa, sembrava che in MT5 non sempre tuttoviene inizializzato correttamente inInit(), sembra cheInit() possa finire anche se i timeframes non sono pronti.
Ho visto un bug ieri: se questo indicatore in MT5 cambia timeframes, a volte i buffer degli indicatori potrebbero non essere vuoti - sembra che i vecchi valori rimangano se non per assegnare un valore specifico ad ogni elemento dell'array dell'indicatore in OnCalculate(), ho provatoa mettere ArrayInitialize(arr, 0.0) inInit()- funziona anche, poi no...
se ho capito bene:
- in MT5, all'inizializzazione inInit(), i buffer degli indicatori non vengono inizializzati automaticamente? (in MT4 non ricordo che sia rimasto qualcosa nei buffer)
- in MT5 inInit() le dimensioni degli array di buffer possono essere sconosciute se la storia non è caricata, ecco perchéanche ArrayInitialize(arr, 0.0) non sempre inizializza correttamente i buffer?
Non è entrato nella logica della cosa.
Non è entrato nella logica della cosa.
Questo è il modo giusto di procedere: non mettere punti di entrata al prezzo max/min - meglio al prezzo di apertura.
E le linee dovrebbero essere rimosse - a cosa servono sul grafico? Se non altro per trascinare un arresto su di loro?
dichiarazione senza tipo
Se compilo un file include, non ci sono errori. Se compilo il file principale del programma dove includo questo file include, c'è una dichiarazione senza errore di tipo. Non vede l'oggetto dichiarato nel file include protected CSomeClass *object. Il file include ha la direttiva #include "SomeClass.mqh". E nel file principale, viene creato un oggetto della classe del file incluso e viene chiamato uno dei metodi.