Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 132

 
Igor Makanu:

Einbindung in die Klassenberechnung des Indikators - Bindung von Puffern an Klassenfelder

Leider...
Es hat nicht geklappt. Auch wenn sich der Puffer innerhalb der Klasse und des Handles befindet, verbleiben alle erstellten internen Zwischenberechnungspuffer im RAM, auch wenn die Klasseninstanz gelöscht wird.

Der Speicher wird nur durch einen Wechsel des TF gelöscht.

Der Befehl zur Speicherbereinigung per Handle fehlt offensichtlich. Zum Beispiel MemErase( int handle);

 
Nikolai Semko:

Leider...
Es hat nicht geklappt. Auch wenn sich der Puffer innerhalb der Klasse und des Handles befindet, verbleiben alle erstellten internen Zwischenberechnungspuffer im RAM, auch wenn die Klasseninstanz gelöscht wird.

Der Speicher wird nur durch einen Wechsel des TF gelöscht.

Was offensichtlich fehlt, ist ein Befehl zum Löschen des Speichers per Handle. Zum Beispiel MemErase( int handle);

1. Haben Sie die Kombinationen aus einem Objektzeiger und einer Objektinstanz (ich meine *) überprüft?

2. haben Sie den Destruktor schreiben und löschen Sie die Array-Größe in es? (ArrayFree() und ArrayResize(arr,0,0) )

 
Nikolai Semko:

Leider...
Es hat nicht geklappt. Auch wenn sich der Puffer innerhalb der Klasse und des Handles befindet, verbleiben alle erstellten internen Zwischenberechnungspuffer im RAM, auch wenn die Klasseninstanz gelöscht wird.

Der Speicher wird nur durch einen Wechsel des TF gelöscht.

Was offensichtlich fehlt, ist ein Befehl zum Löschen des Speichers per Handle. Zum Beispiel MemErase( int handle);

Und Sie haben IndicatorRelease nicht verwendet?

Dennoch halte ich es für ein leeres Unterfangen. Wozu brauchen Sie es? Um Animationen zu zeichnen? Und für den Handel? Um den gleitenden Durchschnitt zu mitteln, bis er eine gerade Linie erreicht?

 
Nikolai Semko:

Leider...
Es hat nicht geklappt. Selbst wenn sich der Puffer innerhalb der Klasse und des Handles befindet, verbleiben alle intern erstellten Zwischenpuffer im RAM, auch wenn die Klasseninstanz gelöscht wird.

Der Speicher wird nur durch einen Wechsel des TF gelöscht.

Offensichtlich fehlt ein Befehl zum Löschen des Speichers per Handle. Zum Beispiel MemErase( int handle);

Das Terminal speichert Caches für einige Zeit, auch wenn das Programm sie nicht benutzt.

Sie können feststellen, wie viel Zeit der Speicher freigegeben wird.

 
Alexey Viktorov:

Haben Sie IndicatorRelease verwendet?

Trotzdem halte ich es für Zeitverschwendung. Sagen Sie mir, wofür Sie es brauchen? Um Karikaturen zu zeichnen? Und für den Handel? Um den gleitenden Durchschnitt zu mitteln, bis er eine gerade Linie erreicht?

Ja, danke, Alexey. Ich hatte diese Funktion vergessen. Ich habe es schon einmal gesehen, aber nie benutzt.

Ich habe es versucht. Irgendetwas läuft hier schief. Es wird gelöscht, dann wird es gelöscht, aber nach dem Löschen bleibt alles stehen.

Ich habe einfach eine Codezeile in die Funktion DrawSetup() vor der Berechnung des Indikators mit den folgenden Parametern eingefügt.

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);

Der Indikator funktioniert einfach nicht mehr, und ich kann den Grund dafür noch nicht verstehen.

Alexey Viktorov:

Ich halte das für eine aussichtslose Idee. Wozu brauche ich es? Um Karikaturen zu zeichnen? Und für den Handel? Um den gleitenden Durchschnitt zu mitteln, bis er eine gerade Linie erreicht?

Ich stimme Ihnen absolut zu. Es ist einfach ein nutzloses Spielzeug.

 
Andrey Khatimlianskii:

Das Terminal behält die Caches eine Zeit lang, auch wenn das Programm sie nicht benutzt.

Sie können messen, wie lange es dauert, bis der Speicher wieder frei wird.

Ich habe 6 Minuten gewartet und es wurde immer noch nichts gelöscht.

 
Igor Makanu:

1. Haben Sie die Kombinationen von Objektzeiger und Objektinstanz (ich meine *) überprüft?

2. haben Sie den Destruktor schreiben und löschen Sie die Array-Größe in es? (ArrayFree() und ArrayResize(arr,0,0) )

1. Ja, ich habe es über einen Zeiger, Neu und Löschen gemacht.

2. es gibt also kein Feld. D.h. es gibt interne Arrays, aber sie haben keine Namen. Es gibt nur die Griffnummer.

Und bei jeder Iteration der for-Schleife erhöht sich der Wert der Handle-Variablen um eins. Das heißt, dass die inneren Puffer multipliziert werden und alle vorherigen an der Berechnung des nächsten Puffers beteiligt sind.

Nach der Logik sollten wir IndicatorRelease(handle); vor einer weiteren komplett neuen Berechnung des Indikators tun, aber ich habe bereits oben geschrieben, dass es den Indikator töten wird. Es ist nicht klar, warum.

 
Nikolai Semko:

Ja, danke, Alexey. Ich hatte diese Funktion vergessen. Ich habe es schon einmal gesehen, aber nie benutzt.

Ich habe es ausprobiert. Irgendetwas läuft hier schief. Er löscht sie, aber nach dem Löschen bleibt alles stehen.

Ich habe einfach eine Codezeile in die Funktion DrawSetup() vor der Berechnung des Indikators mit den folgenden Parametern eingefügt.

Der Indikator funktioniert einfach nicht mehr, und ich kann den Grund dafür immer noch nicht verstehen.

Ich stimme Ihnen absolut zu. Es ist einfach ein nutzloses Spielzeug.

Das ist nicht das, was ich dachte. Ich denke, wir sollten ein paar Handler machen, wie einen Chart Enumerator

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

Und wenn Sie einen neuen Griff bekommen, kann der gebrauchte Griff weggeworfen werden wie der gebrauchte ...

 
Alexey Viktorov:

Das ist nicht das, was ich dachte. Ich glaube, man muss ein paar Handvoll davon machen, wie eine Graph-Suche

Und wenn Sie sich einen neuen Griff besorgen, kann der gebrauchte entsorgt werden wie der gebrauchte ...

das wird nicht funktionieren.

 
Nikolai Semko:

Auf keinen Fall

Warum nicht?