Diskussion zum Artikel "Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil VII)"

 

Neuer Artikel Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil VII): Ereignis der Aktivierung einer StopLimit-Order, Vorbereiten der Funktionsweise bei Änderungen von Aufträgen und Positionen :

In den vorherigen Artikeln haben wir begonnen, eine große plattformübergreifende Bibliothek zu erstellen, die die Entwicklung von Programmen für MetaTrader 5 und MetaTrader 4 Plattformen vereinfacht. Im sechsten Teil erweiterten wir die Bibliothek für die Arbeit mit Positionen auf Netting-Konten. Jetzt werden wir die Verfolgung der Aktivierung von StopLimit-Ordern implementieren und die Funktionsweise zur Verfolgung von Ereignissen von Order- und Positionsänderungen vorbereiten.

Um die implementierten Verbesserungen zu testen, werden wir den EA aus dem vorherigen Artikel verwenden. Benennen Sie einfach den TestDoEasyPart06.mq5 EA aus dem Ordner \MQL5\Experts\TestDoEasy\Part06 in TestDoEasyPart07.mq5 um und speichern Sie ihn im neuen Unterordner \MQL5\Experts\TestDoEasy\ Part07.

Kompilieren Sie den EA, starten Sie ihn im Tester, platzieren Sie eine StopLimit-Order und warten Sie auf die Aktivierung:

Autor: Artyom Trishkin

 

Ich würde gerne die Implementierung mehrerer TCs sehen, die diese Bibliothek und alternative Bibliotheken verwenden.

Und eine vergleichende Analyse, natürlich. Insbesondere die Leistung im Tester/Optimierer, die Codegröße und die Geschwindigkeit beim Schreiben.

 
fxsaber:

Ich würde gerne die Implementierung mehrerer TCs sehen, die diese Bibliothek und Alternativen verwenden.

Und vergleichende Analyse, natürlich. Insbesondere die Leistung im Tester/Optimierer, die Codegröße und die Geschwindigkeit beim Schreiben.

Es ist noch früh. Im Moment haben wir noch nicht die notwendige Funktionalität vorbereitet, um die erklärte Einfachheit bei der Erstellung unserer eigenen Programme zu realisieren. Die notwendige Basis wird noch geschaffen. Im achten Teil wird die Funktionalität zur Verfolgung anderer Ereignisse, wie z.B. die Änderung von Aufträgen und Positionen, deren Stop-Levels, implementiert und beschrieben. Der nächste Artikel ist in Vorbereitung, der mit der Fertigstellung für die Kompatibilität mit MQL4 beginnen wird. Der nächste Schritt wird sein, vollwertige Handelsklassen zu erstellen, dann mit Symbolen und Konten zu arbeiten. Und dann werden wir User-Case-Funktionen für den einfachen und schnellen Zugriff auf alle von der Bibliothek erfassten und kontrollierten Daten erstellen. Und dies wird nicht die letzte Phase sein, da eine Reihe von Möglichkeiten für die Verwendung neuer grafischer Objekte, die in die Bibliothek integriert sind, vorbereitet werden, wobei der Zugriff auf diese als Standardobjekte erfolgt. Das heißt, die Bibliothek wird in der Lage sein, ihre eigenen grafischen Objekte zu erstellen und ihre eigene grafische Hülle auf der Leinwand zu haben sowie die Möglichkeit, aus diesem Satz eigene grafische Elemente für ihre Programme zu erstellen. Dies ist von der bisher geplanten, aber es gibt noch Pläne für die Umsetzung.

Und die Verwirklichung von TC - es wird insbesondere nach der Schaffung von User-Case-Funktionen möglich sein. Natürlich ist es auch jetzt schon möglich, etwas zu tun, aber nicht schnell und einfach - denn es erfordert den direkten Zugriff auf Listen und Bibliotheksobjekte durch Zeiger, und das ist kein "take and get" - aber in den Beispielen von Beratern, die den Artikeln beigefügt sind, ist ein solcher Zugriff teilweise organisiert.

 
Artyom Trishkin:

... Und dies wird nicht die letzte Stufe sein, da eine Reihe von Möglichkeiten zur Verwendung neuer grafischer Objekte, die in die Bibliothek integriert sind, vorbereitet werden, mit dem üblichen Zugriff auf sie - wie auf die Standardobjekte. D.h., die Bibliothek wird die Fähigkeit haben, ihre eigenen grafischen Objekte zu erstellen und ihre eigene grafische Hülle auf der Leinwand zu haben + die Fähigkeit, aus diesem Satz von eigenen grafischen Elementen für ihre Programme zu erstellen....

Werden Sie eine grafische Bibliothek für Kanvas schreiben?
 
Реter Konow:
Werden Sie eine Grafikbibliothek für Canvas schreiben?

Ja, natürlich. Aber nicht nur auf Canvas. Es werden einige "zusammengesetzte" Objekte aus dem Satz der Standard-Grafikobjekte zur Erstellung zur Verfügung stehen, außerdem werden Formulare zur Erstellung einer eigenen GUI mit vollem Zugriff auf alle von der Bibliothek gesammelten und kontrollierten Daten angeboten - ein Satz von vorgefertigten Objekten, plus die Möglichkeit, daraus eine eigene GUI zu erstellen. Natürlich wird alles so gemacht, dass der Benutzer vollen Zugriff auf alle Bedürfnisse aus einer Bibliothek hat - "out of the box" sozusagen. Stecken Sie eine Bibliothek ein und Sie haben alle notwendigen Funktionen, um alle Ihre Wünsche zu verwirklichen - ohne nach den erforderlichen Lösungen zu suchen, die irgendwo geschrieben und veröffentlicht wurden.

 
Artyom Trishkin:

Ja, natürlich. Nicht nur darauf. Es werden einige "zusammengesetzte" Objekte aus der Menge der grafischen Standardobjekte zur Verfügung stehen, außerdem werden Formulare zur Erstellung einer eigenen grafischen Benutzeroberfläche mit vollem Zugriff auf alle von der Bibliothek gesammelten und kontrollierten Daten angeboten - eine Reihe von vorgefertigten Objekten sowie die Möglichkeit, daraus eine eigene grafische Benutzeroberfläche zu erstellen. Natürlich wird alles so gemacht, dass der Benutzer vollen Zugriff auf alle Bedürfnisse aus einer Bibliothek hat - sozusagen "out of the box". Stecken Sie eine Bibliothek ein, und Sie haben alle notwendigen Funktionen, um alle Ihre Wünsche zu verwirklichen - ohne nach den erforderlichen Lösungen zu suchen, die irgendwo geschrieben und veröffentlicht wurden.

Das heißt, Sie schaffen sich eine Multiplattform-Softwareumgebung mit allen Möglichkeiten zur Erstellung beliebiger EAs. Universelle Bibliothek für beide Plattformen, mit Grafiken auf Leinwand.

Eine groß angelegte Idee. Es wird interessant sein, die Umsetzung des letzten Teils zu sehen. Die vorherige graph. Bibliothek wurde anderthalb Jahre lang geschrieben, aber da es bereits eine ernsthafte Grundlage gibt, wird es vielleicht schneller gehen.
 
Реter Konow:
Das heißt, Sie werden eine Multiplattform-Softwareumgebung mit allen Möglichkeiten zur Erstellung beliebiger EAs schaffen. Universelle Bibliothek für beide Plattformen mit Grafiken auf Leinwand.

Eine groß angelegte Idee. Es wird interessant sein, die Umsetzung des letzten Teils zu sehen. Die vorherige graph. Bibliothek wurde anderthalb Jahre lang geschrieben, aber da es bereits eine ernsthafte Grundlage gibt, wird es vielleicht schneller gehen.
Alles wird sein. Aber allmählich - Schritt für Schritt. Schließlich ist ja nicht nur eine solche Bibliothek geplant, sondern auch Lehrmaterial. Man kann es immer nicht nur benutzen, sondern auch lesen und verstehen, wie alles gemacht wird.
 
Artyom Trishkin:

...ohne die erforderlichen Lösungen irgendwo geschrieben und veröffentlicht zu finden.

Bedeutet das, dass die Bibliothek zu einer Personalbibliothek wird?
 
Реter Konow:
Bedeutet das, dass die Bibliothek zu einer Personalbibliothek wird?
Nein. Es bedeutet, dass eine Bibliothek ausreichen wird.
 
Artyom Trishkin:
Nein. Das bedeutet, dass eine Bibliothek völlig ausreichend ist.
Viel Glück!
 

Artem, ich danke dir!

In der Methode:

//+------------------------------------------------------------------+
//|| Aktualisiert die Auftragsliste|
//+------------------------------------------------------------------+
void CMarketCollection::Refresh(void)

Eine "Market Order" wird dynamisch erstellt

#else 
//--- Positionen
   int total_positions=::PositionsTotal();
   for(int i=0; i<total_positions; i++)
     {
      ulong ticket=::PositionGetTicket(i);
      if(ticket==0) continue;
      CMarketPosition *position=new CMarketPosition(ticket);
      if(position==NULL) continue;
      //--- Hinzufügen eines Positionsobjekts zur Liste der Marktaufträge und Positionen
      if(!this.AddToListMarket(position))
         continue;
      //--- Abrufen des Index der Kontrollreihenfolge nach Ticket und Positionskennung
      int index=this.IndexControlOrder(ticket,position.PositionID());
      //--- Wenn der Auftrag nicht in der Liste der Kontrollaufträge enthalten ist, fügen Sie ihn hinzu
      if(index==WRONG_VALUE)
        {
         if(!this.AddToListControl(position))
           {
            ::Print(DFUN_ERR_LINE,TextByLanguage("Kontrollposition konnte nicht hinzugefügt werden","Failed to add a control position "),position.TypeDescription()," #",position.Ticket());
           }
        }
      //--- Wenn der Auftrag bereits in der Liste der Kontrollaufträge vorhanden ist - prüfen Sie ihn auf Eigenschaftsänderungen
      else if(index>WRONG_VALUE)
        {
         this.OnChangeEvent(position,index);
        }
     }
//--- Befehle
   int total_orders=::OrdersTotal();
   for(int i=0; i<total_orders; i++)
     {
      ulong ticket=::OrderGetTicket(i);
      if(ticket==0) continue;
      ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)::OrderGetInteger(ORDER_TYPE);
      //--- Marktauftrag
      if(type<ORDER_TYPE_BUY_LIMIT)
        {
         CMarketOrder *order=new CMarketOrder(ticket);
         if(order==NULL) continue;
         //--- Marktauftragsobjekt zur Liste der Marktaufträge und Positionen hinzufügen
         if(!this.AddToListMarket(order))
            continue;
        }
      //--- Schwebende Bestellung
      else
        {
         CMarketPending *order=new CMarketPending(ticket);
         if(order==NULL) continue;
         //--- Hinzufügen eines schwebenden Auftragsobjekts zur Liste der Marktaufträge und Positionen
         if(!this.AddToListMarket(order))
            continue;
         //--- Abrufen des Index der Kontrollreihenfolge nach Ticket und Positionskennung
         int index=this.IndexControlOrder(ticket,order.PositionID());
         //--- Wenn der Auftrag nicht in der Liste der Kontrollaufträge enthalten ist, fügen Sie ihn hinzu
         if(index==WRONG_VALUE)
           {
            if(!this.AddToListControl(order))
              {
               ::Print(DFUN_ERR_LINE,TextByLanguage("Fehler beim Hinzufügen des Kontrollauftrags","Failed to add a control order "),order.TypeDescription()," #",order.Ticket());
              }
           }
         //--- Wenn der Auftrag bereits in der Liste der Kontrollaufträge vorhanden ist - prüfen Sie ihn auf Eigenschaftsänderungen
         else if(index>WRONG_VALUE)
           {
            this.OnChangeEvent(order,index);
           }
        }
     }
#endif 

Dann wird sie per Referenz an die Methode übergeben:

         //--- Marktauftragsobjekt zur Liste der Marktaufträge und Positionen hinzufügen
         if(!this.AddToListMarket(order))
            continue;

In der Methode"AddToListMarket" wird die Marktorder nicht in der Hashsumme "hash_sum" berücksichtigt, warum müssen wir sie dann eingeben und kontrollieren?
Bitte erklären Sie, warum wir sie brauchen, wenn wir alle Informationen aus der Position oder der schwebenden Order herausfinden können?