Bibliotheken: Klasse um einen Ringbuffer zu erstellen

 

Klasse um einen Ringbuffer zu erstellen:

Die Klasse ermöglicht, Mini Zeitreihen, Indikatorenminibuffer, kurzfristige Buffer so zu organisierten, dass sie Zwischendaten innerhalb des Expert Advisors oder Indikators speichern können.

Autor: Konstantin Gruzdev

 

Kann diese Klasse den vom Indikator verbrauchten Speicherplatz verringern?

Und wie sieht es mit dem Speicherbedarf eines Expert Advisors aus, der mehrere solcher Indikatoren verwendet?

Oder wurde die Aufgabe anders gestellt - nur um einen bequemen Zugriff auf Streaming-Daten zu ermöglichen?

 
komposter:

Kann diese Klasse den vom Indikator verbrauchten Speicherplatz verringern?

Und wie sieht es mit dem Speicherbedarf eines Expert Advisors aus, der mehrere solcher Indikatoren verwendet?

Oder wurde die Aufgabe anders gestellt - nur um einen bequemen Zugriff auf Streaming-Daten zu ermöglichen?

Natürlich wird sie das. Die Klasse wurde genau deshalb geschrieben, um Speicher zu sparen. In allen Puffern, einschließlich der Puffer für Zwischendaten, wird nur die Größe der letzten vom Benutzer angegebenen Daten im Speicher abgelegt.

Sie sollten Beispiele veröffentlichen.

 
Lizar:

Muss Beispiele veröffentlichen.

Beispiele

Zum Zeitpunkt der Veröffentlichung gibt es drei Beispiele für die Verwendung des Ringpuffers:

Class for building Moving Average
Class for building Average True Range
Class for building Average Directional Movement Index.

Es gibt bereits Beispiele, nur die Links 2 und 3 sind defekt.
 
fyords:
Es gibt bereits Beispiele, nur der 2. und 3. Link sind defekt.
Diese Beispiele sind noch nicht veröffentlicht worden. Sie werden noch geprüft. Die Links werden funktionieren, sobald sie veröffentlicht sind.
 

Zum besseren Verständnis eine kleine Analogie:

  • der Ringpuffer in dieser Implementierung ist ein Analogon einer Zeitreihe, d.h. die jüngsten Daten haben den Index 0, die ältesten "Puffergröße"-1
  • Die Größe des Ringpuffers ist ein Analogon zu TERMINAL_MAXBARS, aber im Gegensatz zu TERMINAL_MAXBARS wird die Puffergröße vom Benutzer während der Initialisierung festgelegt und kann während der Nutzung geändert werden, wobei die jüngsten Daten erhalten bleiben.
  • Genau wie bei TERMINAL_MAXBARS sind Daten, die über die Puffergröße hinausgehen, nicht verfügbar, aber alle aktuellen Daten innerhalb der Puffergröße sind verfügbar.
  • Indikatordaten können im Ringpuffer wie im Indikatorpuffer gespeichert werden, aber um sie auf dem Chart anzuzeigen, müssen Sie die Daten in den Indikatorpuffer kopieren.
  • Wenn die Indikatordaten nicht angezeigt werden müssen, müssen sie nicht in den Indikatorpuffer kopiert werden, sondern werden direkt aus dem Ringpuffer für die Berechnung verwendet (siehe Beispiele), was bei der Neuberechnung des Indikators erheblich Speicher und Zeit spart.

 
Lizar:
  • Indikatordaten können im Ringpuffer wie im Indikatorpuffer gespeichert werden, aber um sie auf dem Chart anzuzeigen , müssen Sie die Daten in den Indikatorpuffer kopieren.
  • Wenn die Indikatordaten nicht angezeigt werden müssen, brauchen sie nicht in den Indikatorpuffer kopiert zu werden, sondern werden direkt aus dem Ringpuffer berechnet (siehe Beispiele), was bei der Neuberechnung des Indikators viel Speicher und Zeit spart.

Das ist es, was ich wissen wollte.

Wie kann man Speicherplatz sparen, wenn man immer noch einen vollwertigen Indikatorpuffer benötigt?

Es stellt sich heraus, dass man nur dann Speicher sparen kann, wenn man Zwischenberechnungen in den Ringpuffer überträgt, und das löst nicht alle Probleme.

Was ich möchte, ist, dass ein Indikator mit 20 angezeigten Puffern, der die letzten 1000 Takte berechnet, die gleiche Menge an Speicher belegt, wenn "Max. bars in window" = 1000 und wenn "Max. bars in window" = 9999999999.

Und das ist anscheinend unmöglich =(

 
Aber trotzdem vielen Dank für Ihre öffentliche Arbeit.
 
komposter:

Das ist es, was ich gefragt habe.

Wie spart man Speicher, wenn man immer noch einen vollwertigen Indikatorpuffer braucht?

Es stellt sich heraus, dass man nur dann Speicher sparen kann, wenn man Zwischenberechnungen in den Ringpuffer überträgt, und das löst nicht alle Probleme.

Was ich möchte, ist, dass ein Indikator mit 20 angezeigten Puffern, der die letzten 1000 Takte berechnet, die gleiche Menge an Speicher belegt, wenn "Max. bars in window" = 1000 und wenn "Max. bars in window" = 9999999999.

Und das ist offensichtlich unmöglich =(

Ja, es ist möglich, nur die Daten zu speichern, die nicht im Indikatorpuffer gespeichert werden müssen.

Es gibt ein paar Ideen, wie man auch in diesem Fall den Speicherverbrauch reduzieren kann.

Indikatorpuffer werden in zwei Fällen benötigt: wenn Sie ein Bild auf dem Chart sehen wollen und wenn Sie Daten aus Indikatorpuffern in anderen Indikatoren oder Expert Advisor abrufen wollen. Zum Beispiel können Sie im Tester (nicht im Visualisierungsmodus) den Ringpuffer anstelle des Indikatorpuffers verwenden, wenn dieser nur für die Visualisierung verwendet wurde, und im normalen Modus den üblichen Indikatorpuffer. Dadurch können Sie bei der Optimierung Speicherplatz sparen. Es ist mir sogar gelungen, die Geschwindigkeit der Optimierung zu erhöhen. Ähnlich verhält es sich mit der Datenübertragung aus den Indikatorpuffern: Sie können versuchen, andere Wege zu nutzen, um Daten aus dem Indikator zu erhalten, und dann können Sie Ringpuffer anstelle der Indikatorpuffer verwenden.

 
Lizar:

Ja, es ist möglich, nur die Daten zu speichern, die nicht im Indikatorpuffer gespeichert werden müssen.

Es gibt einige Ideen, wie Sie auch in diesem Fall den Speicherverbrauch reduzieren können.

Indikatorpuffer werden in zwei Fällen benötigt: wenn Sie ein Bild auf dem Chart sehen müssen und wenn Sie Daten aus Indikatorpuffern in anderen Indikatoren oder Expert Advisor abrufen müssen. Zum Beispiel können Sie im Tester (nicht im Visualisierungsmodus) den Ringpuffer anstelle des Indikatorpuffers verwenden, wenn dieser nur für die Visualisierung verwendet wurde, und im normalen Modus den üblichen Indikatorpuffer. So können Sie bei der Optimierung Speicherplatz sparen. Es ist mir sogar gelungen, die Geschwindigkeit der Optimierung zu erhöhen. Ähnlich verhält es sich mit der Übertragung von Daten aus Indikatorpuffern. Sie können versuchen, andere Wege zu nutzen, um Daten aus dem Indikator zu erhalten, und dann können Sie Ringpuffer anstelle von Indikatorpuffern verwenden.

Das ist natürlich schade, ich hatte mich schon gefreut.

Trotzdem vielen Dank.

Ich werde auf eine normale Lösung von den Entwicklern warten.

 
komposter:

Das ist natürlich schade, ich war schon ganz aufgeregt.

Trotzdem vielen Dank.

Ich werde auf eine normale Lösung von den Entwicklern warten.

Ok.