Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 132

 
Igor Makanu:

avvolgere nel calcolo di classe dell'indicatore - legare i buffer ai campi di classe

Ahimè...
Non ha funzionato. Anche se il buffer è all'interno della classe e dell'handle, tutti i buffer di calcolo interni intermedi creati rimangono nella RAM anche dopo che l'istanza della classe è stata cancellata.

La memoria viene cancellata solo cambiando il TF.

Manca ovviamente il comando di pulizia della memoria per maniglia. Per esempio MemErase( int handle);

 
Nikolai Semko:

Ahimè...
Non ha funzionato. Anche se il buffer è all'interno della classe e dell'handle, tutti i buffer di calcolo interni intermedi creati rimangono nella RAM anche dopo che l'istanza della classe è stata cancellata.

La memoria viene cancellata solo cambiando il TF.

Ciò che ovviamente manca è un comando destinato a cancellare la memoria per handle. Per esempio MemErase( int handle);

1. avete controllato le combinazioni di un puntatore a oggetto e un'istanza di oggetto (intendo *)?

2. avete scritto il distruttore e cancellato la dimensione dell'array in esso? (ArrayFree() e ArrayResize(arr,0,0) )

 
Nikolai Semko:

Ahimè...
Non ha funzionato. Anche se il buffer è all'interno della classe e dell'handle, tutti i buffer di calcolo interni intermedi creati rimangono nella RAM anche dopo che l'istanza della classe è stata cancellata.

La memoria viene cancellata solo cambiando il TF.

Ciò che ovviamente manca è un comando destinato a cancellare la memoria per handle. Per esempio MemErase( int handle);

E non hai usato IndicatorRelease?

Ma continuo a pensare che sia un'impresa vuota. A cosa ti serve? Per disegnare animazioni? E per il commercio? Fare la media della media mobile fino a raggiungere una linea retta?

 
Nikolai Semko:

Ahimè...
Non ha funzionato. Anche se il buffer è all'interno della classe e dell'handle, tutti i buffer intermedi creati internamente rimangono nella RAM anche dopo che l'istanza della classe viene cancellata.

La memoria viene cancellata solo cambiando il TF.

Manca ovviamente il comando per cancellare la memoria per maniglia. Per esempio MemErase( int handle);

Il terminale conserva le cache per un certo tempo, anche se il programma non le usa.

È possibile catturare il tempo in cui la memoria viene rilasciata.

 
Alexey Viktorov:

Avete usato IndicatorRelease?

Ma comunque, penso che sia una perdita di tempo. Mi dica, a cosa le serve? Per disegnare cartoni animati? E per il commercio? Fare la media della media mobile fino a raggiungere una linea retta?

Sì, grazie, Alexey. Avevo dimenticato questa funzione. L'ho visto prima, ma non l'ho mai usato.

L'ho provato. Qualcosa sta andando storto. Lo cancella, ma dopo averlo cancellato, tutto si ferma.

Ho semplicemente aggiunto una linea di codice alla funzione DrawSetup() prima del calcolo dell'indicatore con i seguenti parametri.

IndicatorRelease(handle);
handle=iMA(_Symbol,_Period,per1,0,MaMethod,PriceBase);
for(int i=0;i<N;i++) handle=iMA(_Symbol,_Period,per2,0,MaMethod,handle);

L'indicatore semplicemente smette di funzionare e non riesco ancora a capirne il motivo.

Alexey Viktorov:

Penso che sia un'idea inutile. A cosa mi serve? Per disegnare cartoni animati? E per il commercio? Fare la media della media mobile fino a raggiungere una linea retta?

Sono assolutamente d'accordo con te. È solo un giocattolo inutile.

 
Andrey Khatimlianskii:

Il terminale conserva le cache per un po', anche se il programma non le usa.

Potete cronometrare quanto tempo ci vuole perché la memoria si liberi.

Ho aspettato 6 minuti e ancora niente è stato cancellato.

 
Igor Makanu:

1. avete controllato le combinazioni di puntatore di oggetto e istanza di oggetto (voglio dire *)?

2. avete scritto il distruttore e cancellato la dimensione dell'array in esso? (ArrayFree() e ArrayResize(arr,0,0) )

1. Sì, l'ho fatto attraverso un puntatore, nuovo e cancella.

2. Quindi non c'è nessuna matrice. Cioè ci sono array interni ma non hanno nomi. C'è solo il numero della maniglia.

E ad ogni iterazione del ciclo for, il valore della variabile handle aumenta di uno. Cioè, i buffer interni vengono moltiplicati e tutti quelli precedenti partecipano al calcolo di quello successivo.

Secondo la logica, dovremmo fare IndicatorRelease(handle); prima di un altro calcolo completamente nuovo dell'indicatore, ma ho già scritto sopra che ucciderà l'indicatore. Non è chiaro perché.

 
Nikolai Semko:

Sì, grazie, Alexey. Avevo dimenticato questa funzione. L'ho visto prima, ma non l'ho mai usato.

Provato. Qualcosa sta andando storto. Lo cancella, ma dopo averlo cancellato, tutto si ferma.

Ho semplicemente aggiunto una linea di codice alla funzione DrawSetup() prima del calcolo dell'indicatore con i seguenti parametri.

L'indicatore semplicemente smette di funzionare e non riesco ancora a capirne il motivo.

Sono assolutamente d'accordo con te. È solo un giocattolo inutile.

Non è quello che pensavo. Penso che dovremmo fare un paio di gestori, come un enumeratore di grafici

currChart=ChartNext(prevChart); // на основании предыдущего получим новый график

E una volta ottenuta una nuova maniglia, la maniglia usata può essere gettata via come l'usato ...

 
Alexey Viktorov:

Non è quello che pensavo. Penso che tu debba fare un paio di manciate, come una ricerca a grafo

E una volta ottenuta una nuova maniglia, quella usata può essere scartata come quella usata...

che non funziona.

 
Nikolai Semko:

Non c'è modo

Perché no?
Motivazione: