Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 614
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
Bene, avete mostrato gli errori non critici.
Come funziona la funzione, ti sei risposto da solo:
Nel tester è ok. È così che funziona in pratica.
In questo caso dovete trattare il codice, stampare( Print(...) ) tutti i valori e vedere da dove viene l'errore
Nel tester va bene. È così che funziona in pratica.
Hai appena avuto la tua risposta:
Forum sul trading, sistemi di trading automatico e test di strategie di trading
Tutte le domande dei principianti su MQL4, aiuto e discussione su algoritmi e codici
Alexey Viktorov, 2018.09.06 21:00
Direzione a cui pensare: se il profitto è inferiore a zero... quanto sarà grande l'array durante l'ordinamento???
E qual è la dimensione dell'array se non ci sono ordini?Buon pomeriggio, l'EA si chiama "Rollover", ma non funziona come previsto: raddoppia il lotto se chiude in meno, ma la successiva chiusura del TP per qualche motivo non permette di restituire i trade in meno che sono stati chiusi prima. Per favore, consigliatemi cosa c'è che non va, non riesco a capirlo. Vorrei porre la mia domanda in spagnolo.
Non capisco bene cosa faccia esattamente questa funzione. Ma, come ha detto l'autore, il suo scopo è quello di coprire gli ordini perdenti con quelli redditizi tra i simboli. Sarei felice se poteste aiutarmi a correggere e capire la funzione
Tu non capisci, e io non voglio capire cosa fa questa funzione. Lo usi. L'avete scelto per voi stessi. Come si può usare qualcosa senza capire a cosa serve.
Vi ho appena detto da dove viene l'errore, per quale motivo.
Un altro chiarimento:
Viene dichiarato un array. È evidenziato in verde. Ha lunghezza zero nella prima dimensione. La linea in blu non è chiara. Se volete azzerare la dimensione dell'array, c'è ArrayFree() Ma anche questa funzione sarà inutile, poiché l'array dinamico appena dichiarato ha lunghezza zero.
2. Se non ci sono ordini, il codice segnato in rosso non verrà eseguito. Pertanto, la dimensione dell'array rimarrà zero.
3. L'ordinamento delle matrici è fornito ad ogni tick. Segue dal codice. E cosa si può ordinare in una tasca vuota? A meno che non siano 2 uova di quaglia...?
E questo è il testo dell'errore... Cosa posso dire? Gli sviluppatori non hanno previsto che qualcuno potesse cercare di ordinare un array vuoto. Non hanno inventato un messaggio speciale per questo.
Tu non capisci, e io non voglio capire cosa fa questa funzione. Lo usi. L'avete scelto per voi stessi. Come si può usare qualcosa senza capire a cosa serve.
Vi ho appena detto da dove viene l'errore, per quale motivo.
Un altro chiarimento:
1. viene dichiarato un array. È evidenziato in verde nel codice. Ha lunghezza zero nella prima dimensione. La linea evidenziata in blu non è chiara. Se vogliamo azzerare la dimensione dell'array, c'è ArrayFree() , ma anche questa funzione sarà inutile, poiché l'array dinamico che abbiamo appena dichiarato ha lunghezza zero.
2. Se non ci sono ordini, il codice segnato in rosso non verrà eseguito. Pertanto, la dimensione dell'array rimarrà zero.
3. L'ordinamento delle matrici è fornito ad ogni tick. Segue dal codice. E cosa si può ordinare in una tasca vuota? A meno che non siano 2 uova di quaglia...?
E questo è il testo dell'errore... Cosa posso dire? Gli sviluppatori non hanno previsto che qualcuno potesse cercare di ordinare un array vuoto. Non hanno inventato un messaggio speciale per questo.
Alexey, ti sbagli. ArrayFree() serve a liberare la memoria dall'array quando non è più necessaria, il che è molto raramente necessario, e certamente non in questo caso.
ZeroMemory(a), ArrayInitialize(a,xxx) dovrebbe essere usato per azzerare l'array, e ArrayResize(a,xxx) dovrebbe essere usato per ridimensionarlo nella prima dimensione.
Tuttavia, questo emendamento non influisce sul suo ragionamento - è corretto.
Alexey, questo non è corretto. ArrayFree() è usata per liberare memoria da un array quando questo array non è più necessario, il che è molto raro, e sicuramente non in questo caso.
ZeroMemory(a), ArrayInitialize(a,xxx) dovrebbe essere usato per azzerare l'array, e ArrayResize(a,xxx) dovrebbe essere usato per ridimensionarlo nella prima dimensione.
Tuttavia, questo emendamento non influisce sul suo ragionamento - è corretto.
Secondo la documentazione
ArrayFree .
libera il buffer di qualsiasi array dinamico e imposta la dimensione della dimensione zero a 0.
Secondo la documentazione
Forse non mi sono espresso abbastanza bene e mi hai frainteso.E più indietro ancora:
Nota
L'uso della funzione ArrayFree() negli script e negli indicatori non è necessario molto spesso, poiché tutta la memoria utilizzata viene immediatamente rilasciata dopo che lo script smette di funzionare. Negli indicatori personalizzati, la maggior parte delle operazioni con gli array sono l'accesso ai buffer degli indicatori, le cui dimensioni sono gestite automaticamente dal sottosistema esecutivo del terminale client.
Se un programma ha bisogno di gestire autonomamente la memoria in condizioni dinamiche complesse, la funzione ArrayFree() permette di rilasciare esplicitamente e immediatamente la memoria occupata da un array dinamico non necessario.
Libera il buffer di qualsiasi array dinamico e imposta la dimensione della dimensione zero a 0
Hai capito? Hai letto la seconda parte e ti sei perso la prima - importante - parte? Libera la memoria allocata per l'array. E'... andato... Lo spazio di memoria allocato per l'array viene liberato e può essere occupato da altri dati. Perché, ogni volta che si rientra nella funzione, la memoria deve essere riallocata in questo array? Tu sei quello che dovrebbe liberarlo. Tutto quello che dovete fare è cambiare la dimensione - ArrayResize() o azzerare l'array - ArrayInitialize(), ZeroMemory(). E lo spazio di memoria per l'array non sarà rilasciato, e rimarrà riservato per questo array fino al completamento del programma.
E più indietro ancora:
Nota
L'uso della funzione ArrayFree() negli script e negli indicatori non è necessario molto spesso, poiché tutta la memoria utilizzata viene immediatamente rilasciata al termine dell'operazione. Negli indicatori personalizzati, la maggior parte delle operazioni con gli array sono l'accesso ai buffer degli indicatori, le cui dimensioni sono gestite automaticamente dal sottosistema esecutivo del terminale client.
Se un programma ha bisogno di gestire autonomamente la memoria in condizioni dinamiche complesse, la funzione ArrayFree() permette di rilasciare esplicitamente e immediatamente la memoria occupata da un array dinamico non necessario.
Libera il buffer di qualsiasi array dinamico e imposta la dimensione della dimensione zero a 0
Hai capito? Hai letto la seconda parte e ti sei perso la prima importante, vero? Libera la memoria allocata per l'array. Questo è tutto... andato... Lo spazio di memoria allocato per l'array viene liberato e può essere ulteriormente occupato da altri dati. Perché, ogni volta che si rientra nella funzione, la memoria deve essere riallocata in questo array? Tu sei quello che dovrebbe liberarlo. Tutto quello che dovete fare è cambiare la dimensione - ArrayResize() o azzerare l'array - ArrayInitialize(), ZeroMemory(). E lo spazio di memoria per l'array non sarà rilasciato, e rimarrà riservato per questo array fino al completamento del programma.
Ok... E se un array locale è dichiarato ad ogni chiamata di una funzione o, più improbabilmente, ad ogni tick... Ma la memoria per l'array viene allocata ogni volta che l'array viene definito. Non è così? E che differenza fa se la memoria viene liberata o meno, ma la memoria viene allocata ogni volta...
La mia idea principale era che non si dovrebbe fare così... e se lo fate, fareste meglio a farlo attraverso ArrayFree().
Ecco la cosa interessante: se un array locale viene dichiarato ogni volta che una funzione viene chiamata, corrispondentemente, la memoria viene riservata per esso ogni volta. Ma quali indirizzi si usano quando si fa questo? Lo stesso di quando si dichiara l'array per la prima volta, o cosa verrà usato?
Buon pomeriggio, l'EA si chiama "Rollover", ma non funziona come previsto: raddoppia il lotto se chiude in meno, ma la successiva chiusura del TP per qualche motivo non permette di restituire i trade in meno, che erano stati chiusi prima. Per favore, consigliatemi cosa c'è che non va, non riesco a capirlo. Vorrei ringraziare in anticipo tutti coloro che hanno commentato.
Cercate di controllare il raddoppio prima del lotto iniziale. Guarda la chiusura per tempo.