Schau, wie man Roboter kostenlos herunterladen kann
Finden Sie uns auf Facebook!
und werden Sie Mitglied unserer Fangruppe
Interessantes Skript?
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Hat Ihnen das Skript gefallen?
Bewerten Sie es im Terminal MetaTrader 5
Ansichten:
61
Rating:
(5)
Veröffentlicht:
Aktualisiert:
\MQL5\Include\fxsaber\Input_Struct\
System.mqh (0.48 KB) ansehen
Example.mqh (0.46 KB) ansehen
\MQL5\Experts\
MQL5 Freelance Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance

Diese Bibliothek reduziert Routineaktionen bei der Arbeit mit Eingabeparametern.


OOP.

Nehmen wir als Anwendungsbeispiel einen Trading Advisor. Es ist sinnvoll, beim Schreiben der Handelslogik einen OOP-Ansatz zu verwenden, weil es dadurch einfacher ist, den EA in komplexere Systeme einzubetten.


Architektonisch sieht der OOP-Advisor für den Tester wie folgt aus.

    class SYSTEM
    {
    public:
      virtual void OnTick() {}
    
      // Die Eingabedaten werden als Zeichenkette ausgegeben.
      virtual string ToString( void ) const = NULL;
      
      // Die Eingabedaten werden durch eine Zeichenkette angegeben.
      virtual int FromString( const string Str ) = NULL;
    };
    
    SYSTEM* System = NULL;
    
    void OnInit()
    {
      System = new SYSTEM;
    }
    
    void OnTick()
    {
      System.OnTick();
    }
    
    void OnDeinit( const int )
    {
      delete System;
    }

    Dieser EA tut nichts. Aber wenn es nicht um Handelslogik geht, sondern nur um die Arbeit mit Eingabeparametern, wächst der Code stark an, was die Lesbarkeit verschlechtert und die Fehlerwahrscheinlichkeit erhöht. In der Tat sind Sie verpflichtet, unangenehme Routinearbeiten durchzuführen.


    Alle Eingabeparameter als String.
    .

    Wenden wir uns nun ein wenig den im Code hervorgehobenen Zeilen zu.

    Die Praxis zeigt, dass es praktisch ist, die Eingabeparameter in Form von Strings zu speichern/auszulesen, so dass Sie schnell und übersichtlich sehen können, für welche Sätze von Eingabeparametern Sie sich interessieren (gefunden).

    Amount = 1, Count = 2, Period = 3, Koef = 4.5, Log = 6.7, Flag = true
    Amount = 2, Count = 3, Period = 4, Koef = 4.56, Log = 7.89, Flag = false

    Zum Beispiel gibt es im obigen Text zwei Gruppen von Eingabeparametern.


    OOP-Klassiker der Arbeit mit Eingabeparametern.

    input int inAmount = 1;
    input int inCount = 2;
    input int inPeriod = 3;
      
    input double inKoef = 4.56;
    input double inLog = 7.89;
      
    input bool inFlag = true;
    
    struct INPUT_STRUCT
    {
      int Amount;
      int Count;
      int Period;
      
      double Koef;
      double Log;
      
      bool Flag;
      
      string ToString( void ) const
      {
        string Str = NULL;
    
      #define  TOSTRING(A) Str += (::StringLen(Str) ? ", " : NULL ) + #A + " = " + (string)(this.A);
        TOSTRING(Amount);
        TOSTRING(Count);
        TOSTRING(Period);
    
        TOSTRING(Koef);
        TOSTRING(Log);
        
        TOSTRING(Flag);
      #undef  TOSTRING
        
        return(Str);
      }
      
      // Ich habe nicht mit dem Schreiben angefangen.
      int FromString( const string Str )
      {
        return(0);
      }  
    } inInputs = {inAmount, inCount, inPeriod, inKoef, inLog, inFlag};
    
    #include <fxsaber\Input_Struct\Example_OnTick.mqh>
    
    void EXAMPLE::OnTick( void )
    {
      // Systemcode...
     // this.Inputs enthält Eingabeparameter.
    }

    Der obige umständliche Code ist derselbe leere EA, aber nur mit dem Zusatz (hervorgehobener Text), dass mit Eingabeparametern gearbeitet wird. Der Code ist unangenehm, und zwar auch ohne die Implementierung der wichtigen Methode INPUT_STRUCT::FromString.

    Wenn Sie einen Eingabeparameter hinzufügen/entfernen wollen, müssen Sie an fünf Stellen in diesem Code entsprechende Änderungen vornehmen. Und so ist es jedes Mal!


    OOP-Alternative für die Arbeit mit Eingabeparametern.
    .

    #include <fxsaber\Input_Struct\Input_Struct.mqh> // Struktur der Eingabeparameter.
    INPUT_STRUCT inInputs;
    
    MACROS_INPUT(int, Amount, 1);
    MACROS_INPUT(int, Count, 2);
    MACROS_INPUT(int, Period, 3);
    
    MACROS_INPUT(double, Koef, 4.56);
    MACROS_INPUT(double, Log, 7.89);
    
    MACROS_INPUT(bool, Flag, true);
    
    #include <fxsaber\Input_Struct\Example_OnTick.mqh>
    
    void EXAMPLE::OnTick( void )
    {
      // Systemcode...
     // this.Inputs enthält Eingabeparameter.
    }

    Es ist deutlich weniger Text hervorgehoben. Zugleich sind alle Methoden implementiert.


    Einsatzszenarien.

    • Minimaler Zeitaufwand und minimale Fehlerwahrscheinlichkeit beim Ändern eines Satzes von Eingabeparametern.
    • Mehr Zeit für die Handelslogik als für technische Funktionen.
    • Speichern/Lesen von Eingabeparametersätzen über String.
    • Erhebliche Vereinfachung des Schreibens komplexer Systeme (Portfolios, etc.).
    • Einfache Anbindung von kundenspezifischen Optimierungsalgorithmen.

    Beachten Sie, dass mit dem OOP-Ansatz eine Menge sich wiederholender Text in mqh-Dateien versteckt werden kann - wie in den beiden obigen Beispielen geschehen. OOP kann auch prägnant sein.


    Merkmale.

    • Die vorgeschlagene Struktur der Eingabeparameter ist einfach, was die Anwendbarkeit stark erweitert.
    • "Modifizierte" Strukturen können über den Zuweisungsoperator ineinander überführt werden. Und haben immer die gleiche Größe.
    • Die Bibliothek ist plattformübergreifend.

    Übersetzt aus dem Russischen von MetaQuotes Ltd.
    Originalpublikation: https://www.mql5.com/ru/code/47932

    Sec-WebSocket-Key Generator Sec-WebSocket-Key Generator

    Sec-WebSocket-Schlüsselgenerator

    Einfache_Ausstehende_Aufträge_Zeit Einfache_Ausstehende_Aufträge_Zeit

    Der Expert Advisor arbeitet mit schwebenden Aufträgen Buy Stop und Sell Stop entsprechend der in seinen Eingabeparametern angegebenen Zeit.

    MA Preisanzeige MA Preisanzeige

    Der Indikator wird auf Anfrage im Forum geschrieben.

    Open Trade Open Trade

    Diese Funktion führt die Hauptlogik der Eröffnung eines Handels aus. Berechnet den Eröffnungskurs, die Take-Profit-Levels und den Stop-Loss auf der Grundlage von Symbolinformationen und vom Benutzer bereitgestellten Parametern. Bereitet eine Handelsanforderung (MqlTradeRequest) mit den erforderlichen Informationen vor, wie z.B. Symbol, Volumen, Ordertyp, Abweichung, Kommentar, magische Zahl usw. Ruft die Funktion OrderSend auf, um die Operationsanforderung zu senden und das Ergebnis zu erhalten. SetTypeFillingBySymbol-Funktion: Bestimmt die Art der Auftragsausführung (Fill oder Kill, Immediate oder Cancel oder Return) auf der Grundlage der Ausführungspolitik des Symbols. GetMinTradeLevel-Funktion: Berechnet das minimale Betriebsniveau auf der Grundlage des Freeze-Levels und des Stop-Levels des Symbols. Passt das minimale Niveau an, um sicherzustellen, dass es innerhalb bestimmter Grenzen liegt, und gibt das Ergebnis zurück.