Diskussion zum Artikel "Anzeige historischer Positionen auf dem Chart als deren Gewinn/Verlust-Diagramm"

 

Neuer Artikel Anzeige historischer Positionen auf dem Chart als deren Gewinn/Verlust-Diagramm :

In diesem Artikel werde ich die Möglichkeit erörtern, Informationen über geschlossene Positionen auf der Grundlage ihrer Handelshistorie zu erhalten. Außerdem werde ich einen einfachen Indikator erstellen, der den ungefähren Gewinn/Verlust der Positionen auf jedem Balken als Diagramm anzeigt.

Die Funktion erhält den Preis (Schlusskurs des Balkens) in Bezug auf den die Anzahl der Gewinnpunkte der Position und den Zeitpunkt, zu dem das Vorhandensein der Position geprüft wird (Eröffnungszeit des Balkens). Anschließend wird der Gewinn aller Positionen, die von jedem Objekt der historischen Positionen erhalten wurden, summiert und zurückgegeben.

Nach der Kompilierung können wir den Indikator auf dem Chart eines Symbols laufen lassen, auf dem es viele offene Positionen gab, und er wird ein Gewinndiagramm aller historischen Positionen zeichnen:

Autor: Artyom Trishkin

 
Interessanter Artikel, vielen Dank!
 
Schweres Thema. MT5.
 
Ja.... ist ein wirklich interessantes und nützliches Stück Arbeit. Ich habe bisher nur einen kurzen Blick darauf geworfen. Ich werde es noch einmal gründlich lesen. Ich werde Codeabschnitte in meinen Entwicklungen verwenden.
Vielen Dank!
 
Es ist bedauerlich, dass MQ die HistoryPositionGet-Funktion nicht in die Liste der History-Funktionen aufgenommen hat. Mit ihr wäre es viel einfacher gewesen.
Документация по MQL5: Торговые функции
Документация по MQL5: Торговые функции
  • www.mql5.com
Торговые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber #:
Es ist bedauerlich, dass MQ die HistoryPositionGet-Funktion nicht in die Liste der History-Funktionen aufgenommen hat. Mit ihr wäre es viel einfacher gewesen.

Deshalb müssen wir es selbst tun

 

Hallo,

wie kann ich erreichen, dass der Indikator nicht jeden Gewinn/Verlust anzeigt, sondern eine kumulierte Summe ?

und wenn möglich - mit einer Linie ?!!

 
Roman Kutemov #:

Hallo,

wie kann ich erreichen, dass der Indikator nicht jeden Gewinn/Verlust anzeigt, sondern die kumulierte Summe?

und wenn möglich - mit einer Linie ?!!

Nach einer Vermutung und ohne es zu überprüfen, müssen Sie nur den Gewinn zu dem bereits erhaltenen addieren, und nicht jedes Mal den aus den Positionen genommenen aufzeichnen.

So ist es nun einmal:

//+------------------------------------------------------------------+
//| Benutzerdefinierte Indikator-Iterationsfunktion |
//+------------------------------------------------------------------+
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[])
  {
//--- Indizierung der Felder "close" und "time" wie in "time series" einstellen
   ArraySetAsSeries(close,true);
   ArraySetAsSeries(time,true);
//--- Kennzeichen für die erfolgreiche Erstellung der Artikelliste
   static bool done=false;
//--- Wenn das Positionsdatenobjekt erstellt wird
   if(history!=NULL)
     {
      //--- Wenn die Liste der Elemente noch nicht erstellt wurde
      if(!done)
        {
         //--- Wenn die Liste der Positionen für das aktuelle Instrument erfolgreich erstellt wurde,
         if(history.CreatePositionList(Symbol()))
           {
            //--- Druck der Positionen im Journal und Setzen des Kennzeichens für die erfolgreiche Erstellung der Liste der Positionen
            history.Print();
            done=true;
           }
        }
     }
//--- Anzahl der für die Berechnung des Indikators erforderlichen Balken
   int limit=rates_total-prev_calculated;
//--- Wenn der Grenzwert größer als 1 ist, bedeutet dies, dass es sich um den ersten Lauf oder eine Änderung der historischen Daten handelt
   if(limit>1)
     {
      //--- Setzen Sie die Anzahl der Balken für die Berechnung gleich der gesamten verfügbaren Historie und initialisieren Sie die Puffer mit "leeren" Werten
      limit=rates_total-1;
      ArrayInitialize(BufferFilling1,EMPTY_VALUE);
      ArrayInitialize(BufferFilling2,EMPTY_VALUE);
     }
//--- In der Schleife der Symbolleiste
   static double profit=0;
   for(int i=limit;i>=0;i--)
     {
      //--- den Gewinn der Positionen auf dem Balken mit dem Zyklusindex i ermitteln und den erhaltenen Wert in den ersten Puffer schreiben
      profit+= Profit(close[i],time[i]);
      BufferFilling1[i]=profit;
      //--- Schreiben Sie immer Null in den zweiten Puffer. Je nachdem, ob der Wert im ersten Puffer größer oder kleiner als Null ist,
      //--- die Farbe der gezeichneten Füllung wechselt zwischen den Feldern 1 und 2 des Indikatorpuffers
      BufferFilling2[i]=0;
     }
//--- Rückgabe des Wertes von prev_calculated für den nächsten Aufruf
   return(rates_total);
  }

Nun, und mit dem Puffer als Linie - es ist selbst. Da muss man einen zusätzlichen Puffer entfernen, weil das Füllen immer zwei Puffer braucht. Und für eine Linie braucht man einen.

 

Ich glaube, es funktioniert.

Ich habe Ihre Änderungen vorgenommen und nur den Typ - Liniengrafik - angegeben.

Ich habe die Puffer nicht entfernt.

https://www.mql5.com/ru/charts/18738352/nzdcad-d1-roboforex-ltd

График NZDCAD, D1, 2024.01.03 16:11 UTC, RoboForex Ltd, MetaTrader 5, Real
График NZDCAD, D1, 2024.01.03 16:11 UTC, RoboForex Ltd, MetaTrader 5, Real
  • www.mql5.com
Символ: NZDCAD. Период графика: D1. Брокер: RoboForex Ltd. Торговая платформа: MetaTrader 5. Режим торговли: Real. Дата: 2024.01.03 16:11 UTC.
Dateien:
 
Bei den Währungen scheint alles in Ordnung zu sein, aber beim Silber wird es aus irgendeinem Grund ständig neu gezeichnet.
 
Roman Kutemov #:
Bei den Währungen scheint alles in Ordnung zu sein, aber bei Silber wird er aus irgendeinem Grund ständig neu gezeichnet.

Es ist notwendig zu prüfen, welche Daten der Indikator erhält und warum er nicht berechnet wird. Das erneute Zeichnen kann durch einen Grenzwert von mehr als 1 verursacht werden. Dieser Wert wird als Differenz zwischen rates_total und prev_calculated berechnet. Sie müssen sich diese Werte ansehen, um zu sehen, was sie bei jedem Tick enthalten