Diskussion zum Artikel "Andere Klassen in der Bibliothek DoEasy (Teil 70): Erweiterte Funktionalität und automatisches Aktualisieren der Kollektion der Chartobjekte"

 

Neuer Artikel Andere Klassen in der Bibliothek DoEasy (Teil 70): Erweiterte Funktionalität und automatisches Aktualisieren der Kollektion der Chartobjekte :

In diesem Artikel werde ich die Funktionalität von Chartobjekten erweitern und die Navigation durch Charts, die Erstellung von Screenshots sowie das Speichern und Anwenden von Vorlagen auf Charts einrichten. Außerdem werde ich die automatische Aktualisierung der Kollektion von Chartobjekten, ihrer Fenster und der Indikatoren darin implementieren.

Nun ist es an der Zeit, das Erstellen von Screenshots des aktuellen Charts zu testen. Jeder Schaltflächenklick erzeugt einen Chart-Screenshot in einer bestimmten Größe. Erster Klick — 800x600, zweiter — 750x562, dritter — die aktuelle Chart-Größe:


Nach dem Erstellen von drei Screenshots in verschiedenen Auflösungen (begleitet von den entsprechenden Journaleinträgen),

CChartObj::ScreenShot800x600: Screenshot created: DoEasy\ScreenShots\TestDoEasyPart70_EURUSD_H1_2021.04.13_14.02.25.png (800 x 600)
CChartObj::ScreenShot750x562: Screenshot created: DoEasy\ScreenShots\TestDoEasyPart70_EURUSD_H1_2021.04.13_14.02.28.png (750 x 562)
CChartObj::ScreenShotWndSize: Screenshot created: DoEasy\ScreenShots\TestDoEasyPart70_EURUSD_H1_2021.04.13_14.02.29.png (726 x 321)

haben wir uns auch den Inhalt des Ordners angesehen, in dem diese Screenshots gespeichert sind.
Bevor ich die Screenshots erstellt habe, habe ich den Cursor über verschiedene Bereiche von zwei Fenstern des aktuellen Charts bewegt, und der Chart-Kommentar zeigt die Zeit, den Preis und den Index des Teilfensters sowie die Cursor-X/Y-Koordinaten in Pixel an. Die Cursor-Y-Koordinate hat zwei Werte. Der erste Wert zeigt die Y-Koordinate der Anfangskoordinaten des Symbolhauptfensters an. Der zweite angezeigte Wert (in Klammern) zeigt die Y-Koordinate relativ zum oberen Rand des Fensters an, in dem sich der Cursor befindet.

Autor: Artyom Trishkin

 

Limit Order über die Schaltfläche DeletePending gibt viele identische OnChartEvent-Ereignisse, aber es sollten verschiedene sein, richtig?

Oder über Bulk Operations Delete Limit Orders gibt auch viele identische Ereignisse.

Wenn Sie manuell schließen, sind die Ereignisse sequenziell.


2023.03.07 14:58:31.385 TestDoEasy131 (GBPUSD.c,H1)     - Pending order removed: 2023.03.07 14:57:59.055 -
2023.03.07 14:58:31.385 TestDoEasy131 (GBPUSD.c,H1)     GBPUSD.c Deleted 0.10 Pending order Buy Limit #89090285  at price 1.19636, sl 1.19486, tp 1.19786, Magic number 4718715 (123), G1: 8, G2: 4
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     - Pending order removed: 2023.03.07 14:57:58.395 -
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     GBPUSD.c Deleted 0.10 Pending order Buy Limit #89090282  at price 1.19640, sl 1.19490, tp 1.19790, Magic number 10223739 (123), G1: 12, G2: 9
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     - Pending order removed: 2023.03.07 14:58:00.613 -
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     GBPUSD.c Deleted 0.10 Pending order Buy Limit #89090287  at price 1.19636, sl 1.19486, tp 1.19786, Magic number 6357115 (123), G1: 1, G2: 6
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     - Pending order removed: 2023.03.07 14:57:59.669 -
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     GBPUSD.c Deleted 0.10 Pending order Buy Limit #89090286  at price 1.19636, sl 1.19486, tp 1.19786, Magic number 393339 (123), G1: 6
2023.03.07 14:58:31.392 TestDoEasy131 (GBPUSD.c,H1)     MAGIC = %d10223739
2023.03.07 14:58:31.392 TestDoEasy131 (GBPUSD.c,H1)     2023.03.07 14:58:30
2023.03.07 14:58:31.392 TestDoEasy131 (GBPUSD.c,H1)     OnChartEvent: Pending order removed
2023.03.07 14:58:31.394 TestDoEasy131 (GBPUSD.c,H1)     MAGIC = %d10223739
2023.03.07 14:58:31.394 TestDoEasy131 (GBPUSD.c,H1)     2023.03.07 14:58:30
2023.03.07 14:58:31.394 TestDoEasy131 (GBPUSD.c,H1)     OnChartEvent: Pending order removed
2023.03.07 14:58:31.395 TestDoEasy131 (GBPUSD.c,H1)     MAGIC = %d10223739
2023.03.07 14:58:31.395 TestDoEasy131 (GBPUSD.c,H1)     2023.03.07 14:58:30
2023.03.07 14:58:31.395 TestDoEasy131 (GBPUSD.c,H1)     OnChartEvent: Pending order removed
2023.03.07 14:58:31.397 TestDoEasy131 (GBPUSD.c,H1)     MAGIC = %d10223739
2023.03.07 14:58:31.397 TestDoEasy131 (GBPUSD.c,H1)     2023.03.07 14:58:30
2023.03.07 14:58:31.397 TestDoEasy131 (GBPUSD.c,H1)     OnChartEvent: Pending order removed
 
BillionerClub OnChartEvent-Ereignisse, aber es sollten verschiedene sein.

Oder über Bulk Operations Delete Limit Orders gibt viele identische Ereignisse

Wenn Sie manuell schließen, sind die Ereignisse sequenziell.

Ich verstehe nicht, was Sie meinen...
 
Artyom Trishkin OnChartEvent.
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {


//--- Wenn Sie im Prüfgerät arbeiten, beenden Sie
//if(MQLInfoInteger(MQL_TESTER))
// zurück;
   int idx=id-CHARTEVENT_CUSTOM;
//--- Extrahiere aus lparam (1) die Millisekunden der Ereigniszeit, (2) die Ursache, (3) die Quelle des Ereignisses und (4) die genaue Zeit des Ereignisses
   ushort msc=engine.EventMSC(lparam);
   ushort reason=engine.EventReason(lparam);   ushort source=engine.EventSource(lparam);
   long time=::TimeCurrent()*1000+msc;
//--- Verarbeitung von Handelsereignissen
   if(idx>TRADE_EVENT_NO_EVENT && idx<TRADE_EVENTS_NEXT_CODE)
     {
      //--- Abrufen der Liste aller Handelsereignisse
      CArrayObj *list=engine.GetListAllOrdersEvents();
      if(list==NULL)
         return;
      //--- Ermitteln des Ereignisindex-Offsets relativ zum Ende der Liste
      //--- im Tester wird der Offset mit dem Parameter lparam an den Event-Handler übergeben
      //--- nicht in der Testversion - jedes Ereignis wird einzeln gesendet und in OnChartEvent() behandelt
      int shift=(engine.IsTester() ? (int)lparam : 0);
      CEvent *event=list.At(list.Total()-1-shift);

So habe ich es korrigiert, es scheint zu funktionieren.


      int shift=(engine.IsTester() ? (int)lparam : 0);
      static int NEvents =list.Total()-1-shift;
      CEvent *event=list.At(NEvents);
      NEvents++;
 
BillionerClub OnChartEvent auf

So habe ich es behoben, es scheint zu funktionieren.


Meinten Sie, dass die Bibliothek falsche Ereignisse an den Event-Handler sendet?
 
Artyom Trishkin #:
Meinten Sie, dass die Bibliothek die falschen Ereignisse an den Event-Handler sendet?

Ja, das meinte ich. Ich glaube, ich habe es behoben, aber ich bin mir bei der Lösung nicht sicher, da ich nicht wirklich verstehe, wo die Nachteile liegen würden.


      int shift=(engine.IsTester() ? (int)lparam : 0);
      static int NEvents =list.Total()-1-shift;
      CEvent *event=list.At(NEvents);
      NEvents++;
      if(event==NULL)
      {
      event=list.At(list.Total()-1-shift);
      if(event==NULL)return;
      }
 
BillionerClub #:

Ja, genau das habe ich gemeint. Ich habe es irgendwie korrigiert, aber ich bin mir nicht sicher, was die Lösung ist, da ich nicht wirklich verstehe, wo die Nachteile liegen würden.


Danke, ich werde es mir mal ansehen.