Diskussion zum Artikel "Der Einsatz von MQL5 Standard Library Handelsklassen beim Schreiben eines Expert Advisors"

 

Neuer Artikel Der Einsatz von MQL5 Standard Library Handelsklassen beim Schreiben eines Expert Advisors :

Dieser Beitrag beschreibt die Verwendung der Hauptfunktionalitäten der MQL5 Standard Library Handelsklassen beim Schreiben des Expert Advisors, die das Schließen und die Änderung von Positions, Platzierung und Löschung von pending Orders sowie die Prüfung nach Margen vor dem Platzieren eines Handels implementieren. Es wird auch gezeigt, wie man mit Hilfe von Handelsklassen Details zu Orders und Abschlüssen bekommen kann.

Das neue MQL5 Programm besitzt eine Menge eingebauter Standardklassen-Libraries, mit deren Hilfe Trader und Entwickler MQL5 Expert Advisors, Indikatoren und Skripts sehr leicht weiterentwickeln können.

Diese Klassen-Libraries sind im \Include\ Ordner, innerhalb des MQL5 Ordners im MetaTrader 5 Client-Terminal Ordner zu finden. Die Klassen-Libraries sind in vier Kategorien unterteilt – Arrays, ChartObjekte, Charts, Dateien, Indikators, Strings und Handelsklassen.

Dieser Beitrag beschreibt en detail wie man die eingebauten Handelsklassen zum Schreiben eines Expert Advisors verwenden kann. Der Expert Advisor beruht dabei auf einer Strategie, die das Schließen und Ändern von geöffneten Positions umfasst, sobald eine vorgeschriebene Bedingung erfüllt ist.

Wenn Sie bereits eine Vorstellung davon haben, was Klassen sind und wie man mit ihnen arbeitet, dann finden Sie hier eine andere Welt an Möglichkeiten, die Ihnen die neue MQL5 Programmiersprache bietet.

Sollten Sie allerdings ein kompletter Neuling bzgl. MQL5 sein, dann empfehle ich Ihnen zunächst diese beiden Beiträge zu lesen: Schrittweiser Leitfaden zum Schreiben eines Expert Advisors MQL5 für Anfänger, Einen Expert Advisor mit Hilfe des MQL5 Objekt-orientierten Programmierungsansatzes schreiben. Oder jeden anderen Beitrag, der Ihnen eine ausreichende Einführung in die neue MQL5 Sprache bietet. Zu diesem Thema sind eine Menge Beiträge verfasst worden, die Ihnen alle das erforderliche Grundlagenwissen vermitteln werden.

Ergebnis des History-Order Skripts

Autor: Samuel Olowoyo

 

Sehr nützlicher Artikel für mich. Alles ist viel einfacher, wenn man Bibliotheken verwendet!

Bitte an die Entwickler: Schreiben Sie eine Klasse, die mit High[i] , Low[i] arbeitet. Open[i], Close[i]. Ich denke, diese Klasse wird für jeden nützlich sein! Ich habe dieses Problem für mich selbst gelöst, aber ich bin mir nicht sicher, ob es korrekt ist, da das Testen viel Zeit in Anspruch nimmt....

 
Sehen Sie sich den Abschnitt Timeseries Class Group an
 
#include <Indicators\Series.mqh>

double High[];
 CiHigh z;

warum dieser Code einen Fehler verursacht

1.mq5' 1.mq5 1 1

Reihe.mqh' Reihe.mqh 1 1

'ArrayObj.mqh' ArrayObj.mqh 1 1

'Array.mqh' Array.mqh 1 1

'Objekt.mqh' Objekt.mqh 1 1

'StdLibErr.mqh' StdLibErr.mqh 1 1

'ArrayDouble.mqh' ArrayDouble.mqh 1 1

'CiHigh' - Deklaration ohne Typ 1.mq5 12 2

1 Fehler, 0 Warnung(en) 2 1

in allen Beispielen ist es nicht notwendig, den Typ zu deklarieren...

wenn es nicht schwierig ist, zu schreiben, wie man

Print High[2], zum Beispiel.

 
dimeon:

warum dieser Code einen Fehler verursacht


es ist nicht notwendig, den Typ in allen Beispielen zu deklarieren...

wenn es nicht schwierig ist, schreiben Sie bitte, wie man

High[2] drucken, zum Beispiel.

es gibt einen Druckfehler in der Dokumentation. Diese Klasse befindet sich in der Datei TimeSeries.mqh.

Anwendungsbeispiel (das Skript druckt die letzten drei Highs des aktuellen Charts):

#include <Indicators\TimeSeries.mqh>
//+------------------------------------------------------------------+
//| Skript-Programmstartfunktion|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double High[];
   CiHigh z;
   int count=3;
   if(z.Create(_Symbol,_Period)==true)
     {
      if(z.GetData(0,count,High)==count)
        {
         for(int i=0; i<count; i++) Print(i,"=",High[i]);
        }
      else
         Print("Abruf fehlgeschlagen",count,"Zeitreihendaten".);
     }
   else Print("Fehler beim Erstellen von Zeitreihen".);
  }
//+------------------------------------------------------------------+
 
Quantum:

Es gibt einen Druckfehler in der Dokumentation. Diese Klasse befindet sich in der Datei TimeSeries.mqh.

Anwendungsbeispiel (das Skript gibt die letzten drei Highs des aktuellen Charts aus):

Herzlichen Dank! Ich habe mir das Hirn zermartert!
 

Ich verstehe, dass jeder für sich selbst und seine Bedürfnisse programmiert, aber ich mag die Gruppe der Zeitserienklassen grundsätzlich nicht, weil sie im Grunde alle aus einer Methode und einem beschreibenden Teil mehr als Funktionalität bestehen, und normalerweise ist es notwendig, alle Zeitserien für ein bestimmtes Tool zu haben, ich habe eine Klasse gemacht, in der es alle Zeitserien für das notwendige Tool gibt, in den Methoden wird durch Paging History gemacht, ungefähr so:

struct str_bars{
   datetime    time[];     // Zeitreihen-Array, das die Eröffnungszeit jedes Balkens des aktuellen Charts enthält
   double      open[];     // Zeitreihen-Array mit den Eröffnungskursen der einzelnen Balken des aktuellen Diagramms.
   double      close[];    // Zeitreihen-Array mit den Schlusskursen jedes Balkens des aktuellen Diagramms.
   double      high[];     // Zeitreihen-Array mit den Höchstpreisen der einzelnen Balken des aktuellen Diagramms.
   double      low[];      // Ein Zeitreihen-Array, das die Mindestpreise jedes Balkens des aktuellen Diagramms enthält.
};
struct str_info{
   double   point;         // Aktuelle Instrumentenpunktgröße in Kurswährung
   int      spread;        // Aktuelle Spanne
};
//____________________________________________________________________
class currency {
   public:
//---- данные      
      MqlTick TICK;        // Tickdaten
      str_bars  BAR;       // Zeitreihendaten
      str_info INFO;       // Informationen zum Werkzeug
      int error;
//---- методы      
      int create(string sym,ENUM_TIMEFRAMES period, int numbars);
      int refresh(void);
   private:
      string            symbol;
      ENUM_TIMEFRAMES   per;
      int               num;
      datetime          lastbar_time;
      int               tmpint1,tmpint2;
      int ch_load(void);
};
//____________________________________________________________________

Ich arbeite mit meiner Klasse nur in dem Teil der bereits vorbereiteten Daten, und natürlich erhält die Klasse selbst Daten durch den Aufruf der refresh()-Methode

 
Nützlicher Artikel!
 

der Artikel enthält eine Ungenauigkeit

double lot_price = myaccount.MarginCheck(_Symbol,otype,Lot); // Preis der Partie/Anzahl der erforderlichen Marge

sollte sein

   double lot_price=myaccount.MarginCheck(_Symbol,otype,Lot,price);  //--- Preis der Partie/Anzahl der erforderlichen Marge
[Gelöscht]  

Toller Artikel. Vielen Dank an den Autor. Ich möchte auch eine Überprüfung der Stop_Level vor der Platzierung einer Bestellung zu schreiben, und eine Überprüfung der Spread-Wert. Die Sache ist die, dass, wenn der Spread schwebend ist, dann bei hohen Werten kann man nicht in den Markt einsteigen, weil es nicht profitabel ist. Dies wird dem Expert Advisor helfen, nicht während der Nachrichten zu handeln. Ich würde auch gerne die Abweichung überprüfen - die Argumentation ist ähnlich. Und noch eine Frage zur Bibliothek: Was ist eine Funktion (welche Art von Prozess bezeichnet und beschreibt sie)?

FreezeLevel

Ermittelt den Abstand der Freeze-Handelsoperationen in Punkten.

int FreezeLevel() const

in einfacher Sprache - bitte erklären Sie es, wenn Sie es wissen.

Und noch eine Frage. Wir können die Limits herausfinden, z.B. das Stop_Level im aktuellen Moment (sagen wir 10 Punkte). Wir platzieren eine Pending Order mit SL=10 Punkten. Nach z.B. einer Stunde erreicht der Preis den in der Order angegebenen Preis, aber Stop_Level ist zu diesem Zeitpunkt z.B. gleich 15 Pips. Was wird passieren - wird die Pending Order funktionieren oder wird sie abgelehnt? Wenn der Kurs den in der Order angegebenen Kurs erreicht, aber der Spread sich geändert hat - bedeutet dies, dass ein Ein- oder Ausstieg zu einem schlechteren Kurs als dem erwarteten Kurs zum Zeitpunkt der Ordereröffnung möglich ist, oder wird die Order überhaupt nicht funktionieren?

 

Was mache ich falsch, warum wird das Angebot nicht gedruckt?

Hier ist das Log der Arbeit


2011.01.31 20:20:18 00(EURUSD,M1) EURUSD 0

Hier ist der Code

#include <Trade\SymbolInfo.mqh>  //--- CSymbolInfo-Klasse
CSymbolInfo    my_symbol;        //--- Objekt der Klasse CSymbolInfo
//+------------------------------------------------------------------+
//| Experteninitialisierungsfunktion|
//+------------------------------------------------------------------+
int OnInit()
  {   return(0);  }
//+------------------------------------------------------------------+
//| Experten-Deinitialisierungsfunktion|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {  }
//+------------------------------------------------------------------+
//| Experten-Tick-Funktion|
//+------------------------------------------------------------------+
void OnTick()
  {
   my_symbol.Name(_Symbol);
   my_symbol.Refresh();
   Print(_Symbol," ",my_symbol.Bid());
  }
//+------------------------------------------------------------------+