Metatrader 5 - Richiede molta memoria quando si scorre un grafico attraverso i simboli - pagina 4

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
Hai provato a impostareTERMINAL_MAXBARScon TerminalInfoInteger(..) su un valore ragionevolmente piccolo?
Oltre a questo avete:
TERMINAL_MEMORY_PHYSICAL
Memoria fisica nel sistema, Mb
int
TERMINALE_MEMORIA_TOTALE
Memoria disponibile per il processo del terminale, Mb
int
TERMINALE_MEMORIA_DISPONIBILE
Memoria libera del processo del terminale, Mb
int
TERMINALE_MEMORIA_USATA
Memoria utilizzata dal terminale, Mb
int
per controllare dov'è il nocciolo della questione.
Ho impostato TERMINAL_MAXBARS a 500 (davvero basso) ma sta ancora caricando altre barre (immaginate che sia da file?) e la memoria continua a salire.
Ho iniziato a registrare i contatori di memoria elencati sopra e avrò presto un feedback su questo.
Ok ho avuto un feedback e sembra un po' strano. Qui sotto ci sono due log "MetaTrader Log" & "PowerShell Log" sono due log che sto eseguendo e che registrano l'utilizzo della memoria. (Lo script PowerShell è in precedenza in questo thread, l'ho aggiornato per abbinare ciò che è in Task Manager). Entrambi questi log sono la prima e l'ultima volta che ho fatto l'ultima esecuzione.
Punti di interesse:
##### Log di MetaTrader
##### Questo è stato registrato dal mio logger in Metatrader. Emette tutta la memoria
#### Log PowerShell
#### Questo è stato registrato dallo script PowerShell
04/29/2016 17:31:32 Kilo Bytes in uso 128 300 K
04/29/2016 18:05:08 Kilo Bytes in uso 215 488 K
Ho impostato il TERMINAL_MAXBARS a 500 (molto basso) ma sta ancora caricando più barre (immaginate che sia da file?) e la memoria continua a salire.
Ho iniziato a registrare i contatori di memoria elencati sopra e presto avrò un feedback su questo.
Ok ho avuto qualche riscontro e sembra un po' strano. Qui sotto ci sono due log "MetaTrader Log" & "PowerShell Log" sono due log che sto eseguendo e che registrano l'utilizzo della memoria. (Lo script PowerShell è in precedenza in questo thread, l'ho aggiornato per abbinare ciò che è in Task Manager). Entrambi questi log sono la prima e l'ultima volta che ho fatto l'ultima esecuzione.
Punti di interesse:
##### Log di MetaTrader
##### Questo è stato registrato dal mio logger in Metatrader. Emette tutta la memoria
#### Log PowerShell
#### Questo è stato registrato dallo script PowerShell
04/29/2016 17:31:32 Kilo Bytes in uso 128 300 K
04/29/2016 18:05:08 Kilo Bytes in uso 215 488 K
Io (notebook, 8GB ram, Win7-64) ho un utilizzo di ram equivalente per ognuno dei miei 4 mt4.
Penso che non sia nulla di cui tu debba preoccuparti!
Quanti GB sono ancora liberi/disponibili?
Io (notebook, 8GB ram, Win7-64) ho un utilizzo di ram equivalente per ognuno dei miei 4 mt4.
Penso che non ci sia nulla di cui preoccuparsi!
Quanti GB sono ancora liberi/disponibili?
Ho un sacco di RAM ai livelli di cui sopra nei grafici. Il problema è che quando lo lascio in esecuzione spinge lentamente l'utilizzo della RAM verso l'alto.
Quindi dopo circa un'ora o due inizia a massimizzare.
Attualmente sto eseguendo l'EA su Server 2012, 7 GB di RAM, 4 core (non so quali siano), 64 bit.
Ho un sacco di RAM ai livelli di cui sopra nei grafici. Il problema è che quando lo lascio in esecuzione spinge lentamente l'utilizzo della RAM verso l'alto.
Quindi dopo circa un'ora o due inizia a massimizzare.
Attualmente sto eseguendo l'EA su Server 2012, 7 GB di RAM, 4 core (non so quali siano), 64 bit.
Una volta ho imparato che sembra essere una caratteristica di Win-Server che mantiene il più possibile in memoria.
Ho riavviato regolarmente i terminali, ma sarei curioso di sapere se questo può causare un crash o meno!
Una volta ho imparato che sembra essere una caratteristica di Win-Server che tiene il più possibile in memoria.
Ho riavviato regolarmente i terminali, ma sarei curioso di sapere se questo provoca un crash o no!
Interessante... anche se sembra avere a che fare con il caricamento dei simboli dentro e fuori il Market Watch.
Il terminale non si blocca, ma inizia a funzionare molto lentamente, in modo inutilizzabile.
Interessante... anche se sembra avere a che fare con il caricamento dei simboli dentro e fuori il Market Watch.
Il terminale non si blocca, ma inizia a funzionare molto lentamente, in modo inutilizzabile.
È un'installazione standard di Server 2012. Tuttavia la mia teoria è che non importa come è impostato. Una perdita di memoria, nel tempo, occuperà sempre tutto lo spazio sulla macchina.
Quindi non importa quanto veloce o quanta RAM abbia la scatola, se ha una perdita, a un certo punto raggiungerà il limite.
Solo per contribuire con i miei 2 centesimi su questo argomento.
Ci sono un sacco di buone idee qui sulla perdita di memoria e sull'aumento, ma per quanto riguarda l'argomento e la causa principale le mie considerazioni sono:
- il codice sorgente pubblicato non controlla diversi ritorni di funzioni rilevanti, per esempio il ritorno di SymbolSelect().
- I cicli for/while basati sul ritorno di funzioni, come SymbolsTotal() potrebbero avere qualche limite o protezione contro qualche ritorno di funzione di valore sbagliato.
Dopo aver stressato/modificato il codice e testato di nuovo, forse possiamo trovare e risolvere la causa principale del problema.
Penso che Rogerio Figurelli sia corretto, se molte chiamate a funzioni non vengono restituite la memoria allocata non verrà liberata.
Forse potete diminuire lo stacksize per vedere se dà errore di stack overflow.
Stack
In ogni programma MQL4, una speciale area di memoria chiamata stack viene allocata per memorizzare le variabili locali delle funzioni che vengono create automaticamente. Uno stack è allocato per tutte le funzioni. La dimensione predefinita dello stack è di 256 kb, la dimensione dello stack può essere gestita utilizzando la direttiva del compilatore #property stacksize.
Le variabili localistatiche sono memorizzate nello stesso posto in cui sono memorizzate le altre variabili statiche e globali - in un'area di memoria speciale, che esiste separatamente dallo stack. Anche le variabili create dinamicamente usano un'area di memoria separata dallo stack.
Con ogni chiamata di funzione, viene allocato un posto sullo stack per le variabili interne non statiche. Dopo l'uscita dalla funzione, la memoria è di nuovo disponibile per l'uso.
Se dalla prima funzione viene chiamata la seconda, allora la seconda funzione occupa la dimensione richiesta dalla rimanente memoria dello stack per le sue variabili. Così, quando si usano funzioni incluse, la memoria dello stack sarà occupata sequenzialmente per ogni funzione. Questo può portare ad una carenza di memoria durante una delle chiamate di funzione, una tale situazione è chiamata stack overflow.
Perciò, per dati locali di grandi dimensioni dovreste usare meglio la memoria dinamica - quando entrate in una funzione, allocate la memoria, che è richiesta per le necessità locali, nel sistema (new, ArrayResize()), e quando uscite dalla funzione, rilasciate la memoria (delete, ArrayFree()).
Vedere anche
Tipi di dati, Incapsulamento ed estensibilità dei tipi,Inizializzazione delle variabili, Ambito di visibilità e durata delle variabili, Creazione ed eliminazione di oggetti
Buoni punti.
Farò una prova qualche volta e darò un feedback qui con i risultati.
Grazie