Diskussion zum Artikel "Komplexe Indikatoren mit Objekten vereinfachen"

 

Neuer Artikel Komplexe Indikatoren mit Objekten vereinfachen :

In diesem Artikel wird eine Methode zur Erstellung komplexer Indikatoren vorgestellt, bei der gleichzeitig die Probleme vermieden werden, die bei der Arbeit mit mehreren Flächen, Puffern und/oder der Kombination von Daten aus mehreren Quellen auftreten.

Das Endergebnis des Indikators sieht wie folgt aus:


Autor: Manuel Alejandro Cercos Perez

 
Ich dachte, damit seien grafische Objekte gemeint - ich war überrascht und begann zu suchen. Es stellte sich heraus, dass es sich um Klassenobjekte handelt.
 
Dmitriy Skub Klassenobjekte handelt.

Nur ein guter Ansatz zur Implementierung in dem Artikel, nichts Neues, nur keine schlechte Lösung für das Problem.

 

Ihr Artikel war sehr gut 😁 ... aber wie du erwähnt hast, gibt es ein kleines Problem mit der Leistung. Die meiste Zeit hat es keine Auswirkungen und man kann ohne Probleme damit leben. Aber in Zeiten großer Volatilität kann das System abstürzen oder sehr langsam werden, aufgrund der Anzahl der Aufrufe, die OnCalculate erhalten kann. Das Problem liegt jedoch nicht an der Funktion, sondern an den Interaktionen, die innerhalb der Funktion stattfinden. Denn bei jedem Aufruf ist MetaTrader gezwungen, den Puffer der Indikatoren zu lesen, und wenn die Anzahl groß ist, kann es zu Problemen kommen. Eine Möglichkeit, dieses Problem zu lösen, wäre die Verwendung eines Aufrufs an OnTime, um die Belastung etwas zu verringern, da die Aufrufe nicht bei jedem Berechnungsereignis, sondern über einen vordefinierten Zeitraum hinweg ausgeführt werden würden. Wenn die Idee ist, manuell oder halbautomatisch zu arbeiten, wäre das kein Problem, da jede Berechnung z.B. innerhalb von 200 Millisekunden durchgeführt werden könnte. Es ist jedoch nicht sehr geeignet, OnTime-Ereignisse in Indikatoren zu verwenden, da sie den Berechnungsfaden beeinflussen können, insbesondere wenn der Markt sehr volatil ist. Eine Möglichkeit wäre, die Berechnungen in OnCalculate selbst zu erzwingen, so dass Sie keine CopyBuffer-Aufrufe machen müssen. Eine andere Möglichkeit, den Prozessorverbrauch um einige Maschinenzyklen zu reduzieren, besteht darin, die folgende Zeile in der OnCalculate-Funktion zu ändern:

int OnCalculate(const int rates_total, 
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
//---
   int limit = MathMax(0, prev_calculated-1);

für diese:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
//---
   int limit = (prev_calculated <= 0 ? 0 : prev_calculated - 1);

Es mag nicht viel erscheinen, aber die Verwendung des ternären Operators ist in diesem Fall effizienter als ein Aufruf der Funktion. Diese kleinen Details machen in Zeiten hoher Volatilität einen großen Unterschied ... 😁👍