Diskussion zum Artikel "Cross-Plattform Expert Advisor: Stopps"

 

Neuer Artikel Cross-Plattform Expert Advisor: Stopps :

Dieser Artikel beschreibt eine Implementierung von Stopps in einem Experten Advisor, die mit den beiden Plattformen MetaTrader 4 und MetaTrader 5 kompatibel ist.

Bei virtuellen Stopps ist der Expert Advisor für die Überwachung der Marktbewegungen und die Überprüfung, ob der Markt einen bestimmten Stopp erreicht hat, allein verantwortlich. Die folgende Abbildung zeigt allgemein das Vorgehen. Sobald der Markt ein Stopp erreicht, führt der Expert Advisor die entsprechende Art des Schließens der Position durch.

Prüfen von OrderStop (virtuell)

Autor: Enrico Lambino

 

Welche Methode sollte verwendet werden, um SL/TP auf einen bestimmten Wert zu setzen, aber nicht als Abstand zum Eröffnungskurs?

 
Das wären die Methoden StopLossCustom und TakeProfitCustom. Diese Methoden werden im nächsten Artikel besprochen.
 

Ich habe versucht, einige Stopps in meinem EA zu verwenden. Fügte Ihre Funktion manage_trades() hinzu und das ist, was ich nach dem letzten aktivierten Stop bekam (Position geschlossen):

2017.09.10 09:48:25.706 2017.01.03 17:50:23   failed market buy 0.00 EURUSD [Invalid volume]
2017.09.10 09:48:25.706 2017.01.03 17:50:23   CTrade::OrderSend: market buy 0.00 EURUSD [invalid volume]
2017.09.10 09:48:25.706 2017.01.03 17:50:23   position #2  is already closed, closing object..
2017.09.10 09:48:25.706 2017.01.03 17:50:23   failed market buy 0.00 EURUSD [Invalid volume]
2017.09.10 09:48:25.706 2017.01.03 17:50:23   CTrade::OrderSend: market buy 0.00 EURUSD [invalid volume]
2017.09.10 09:48:25.707 2017.01.03 17:50:23   position #2  is already closed, closing object..
2017.09.10 09:48:25.707 2017.01.03 17:50:23   failed market buy 0.00 EURUSD [Invalid volume]
2017.09.10 09:48:25.707 2017.01.03 17:50:23   CTrade::OrderSend: market buy 0.00 EURUSD [invalid volume]

Mit 3 Stopps, alle von ihnen virtuell.

Das ist etwas über das Lot. Ich benutze festes Lot 0.1. Nach der ersten Schließung das verbleibende Volumen 0,06. Nach der letzten Schließung (Hauptstopp ohne Volumenangabe) erhalte ich den oben genannten Fehler.

Wenn das Lot höher ist, ist alles in Ordnung. Das Gleiche gilt für Ihre EA-Beispiele.

 
mbjen:

Ich habe versucht, einige Stopps in meinem EA zu verwenden. Fügte Ihre Funktion manage_trades() hinzu und das ist, was ich nach dem letzten aktivierten Stop bekam (Position geschlossen):

Mit 3 Stopps, alle von ihnen virtuell.

Das ist etwas über das Lot. Ich benutze festes Lot 0.1. Nach der ersten Schließung das verbleibende Volumen 0,06. Nach der letzten Schließung (Hauptstopp ohne Volumenangabe) erhalte ich den oben genannten Fehler.

Wenn das Lot höher ist, ist alles in Ordnung. Das Gleiche gilt für Ihre EA-Beispiele.

Stellen Sie sicher, dass Sie die neueste Version der Bibliothek verwenden (die in diesem Artikel angehängte). Auch, wenn Sie den Quellcode Ihres EA hier anhängen können, das würde sehr helfen.

 
Enrico Lambino:

Stellen Sie sicher, dass Sie die neueste Version der Bibliothek verwenden (die in diesem Artikel angehängte). Auch, wenn Sie den Quellcode Ihres EA hier anhängen können, wäre das sehr hilfreich.


Ja, ich habe alle Dateien mit dem Anhang zu diesem Artikel aktualisiert. Aber ich weiß nicht, vielleicht haben Sie es noch einmal aktualisiert.

Könnten Sie es mit Ihrem Beispiel stops_ha_ma2 versuchen, indem Sie das MM auf Fixed Lot ändern und die Lotgröße auf einen kleinen Wert setzen?

 
mbjen:

Ja, ich habe alle Dateien mit dem Anhang zu diesem Artikel aktualisiert. Aber ich weiß nicht, ob Sie sie noch einmal aktualisiert haben.

Könnten Sie es mit Ihrem Beispiel stops_ha_ma2 versuchen, indem Sie das MM auf Fixed Lot ändern und die Lotgröße auf einen kleinen Wert setzen?

Könnten Sie hier den Quellcode des EA posten, bei dem das Problem auftritt? Unsere Konversation ist öffentlich, und der Fehler, den Sie oben gepostet haben, ist ein ernstes Problem für einen EA. Ich möchte, dass auch andere Leser aus dieser Unterhaltung lernen können, indem sie die Möglichkeit haben, Ihren Code zu testen.
 
Enrico Lambino:
Könnten Sie hier den Quellcode des EA posten, bei dem das Problem auftritt? Unsere Unterhaltung ist öffentlich, und der Fehler, den Sie oben gepostet haben, ist ein ernstes Problem für einen EA. Ich möchte, dass auch andere Leser aus dieser Konversation lernen können, indem sie die Möglichkeit haben, Ihren Code zu testen.

Es hat nichts mit meinem EA zu tun, da ich den gleichen Fehler mit Ihrem EA hatte. Wie auch immer, ich habe ihn auf einem anderen Terminal installiert und es sieht jetzt gut aus. Kein Fehler mehr. Vielleicht gab es einen Fehler in meiner Standardbibliothek oder etwas anderes...

Ich danke Ihnen.

 
mbjen:

Es ist nicht im Zusammenhang mit meinem EA, da ich den gleichen Fehler mit Ihrem EA bekam. Wie auch immer, ich habe es auf einem anderen Terminal Kopie installiert und es sieht gut aus jetzt. Kein Fehler mehr. Vielleicht gab es einen Fehler in meiner Standardbibliothek oder etwas anderes...

Mit einem modifizierten EA, der aus Teilen eines der Beispiel-EAs besteht. Ich habe mich zunächst gefragt, was mit Ihrem Code schief gelaufen ist. Aber da Sie erwähnt haben, dass es jetzt keine Fehler mehr gibt, bin ich mir nicht ganz sicher, was das Problem verursacht hat. Wenn das Problem erneut auftritt, lassen Sie es mich entweder hier oder per PM wissen.
 

Hallo Enrico,


Ich wollte nur darauf hinweisen, dass ich ein paar Fehler in deinem Code gefunden habe. in ExpertAdvisorBase ist die Funktion Time;

datetime CExpertAdvisorBase::Time(const int index=0)
  {
   if(index>=0)
     {
      double time[];
      if(CopyTime(m_symbol_name,m_period,index,1,time)>0)
         return(time[0]);
     }
   return(-1);
  }

Der Zeittyp oben ist double statt datetime.

datetime CExpertAdvisorBase::Time(const int index=0)
  {
   if(index>=0)
     {
      datetime time[];
      if(CopyTime(m_symbol_name,m_period,index,1,time)>0)
         return(time[0]);
     }
   return(-1);
  }

Außerdem übergibt die Funktion Evaluate von TimesBase nicht den Standardwert;

bool CTimesBase::Evaluate(datetime current) const

Wenn sie auf den unten stehenden Wert geändert wird, sollte dies der Fall sein;

bool CTimesBase::Evaluate(datetime current) const

Beim Kompilieren des Ordners Base\Order treten in den Dateien zahlreiche Fehler auf.

Zum Beispiel die Funktion CreateStops in OrderBase, unten;

void COrderBase::CreateStops(CStops *stops)
  {
   if(!CheckPointer(stops)) return;
   if(stops.Total()>0)
     {
      for(int i=0;i<stops.Total();i++)
        {
         CStop *stop=stops.At(i);
         if(CheckPointer(stop)==POINTER_INVALID) continue;
         m_order_stops.NewOrderStop(GetPointer(this),stop);
        }
     }
  }

Throws 'operator=' - keine der Überladungen kann auf den Funktionsaufruf angewendet werden OrderBase.mqh

'At' - Objektzeiger erwartet OrderBase.mqh

Die Base\Stop hat auch die gleichen Probleme mit einer Reihe von Fehlern im Zusammenhang mit Stops, Typen usw.

Vielen Dank für Ihre gute Arbeit, Shep

 
Hallo Shep,
Shephard Mukachi:

Hallo Enrico,


Ich wollte nur darauf hinweisen, dass ich ein paar Fehler in deinem Code gefunden habe. in ExpertAdvisorBase ist die Funktion Time;

Der Zeittyp oben ist double statt datetime.

Schafard Mukachi:

Hallo Enrico,


Auch die Funktion Evaluate von TimesBase übergibt nicht den Standardwert;

Wenn sie in den unten stehenden Wert geändert wird, sollte dies der Fall sein;

Vielen Dank für diesen Hinweis. Ich habe dies bis jetzt nicht bemerkt. Ich werde den Code aktualisieren.

Shephard Mukachi:

Beim Kompilieren des Ordners Base\Order treten in den Dateien viele Fehler auf.

Zum Beispiel die Funktion CreateStops in OrderBase, unten;

Throws 'operator=' - keine der Überladungen kann auf den Funktionsaufruf angewendet werden OrderBase.mqh

'At' - Objektzeiger erwartet OrderBase.mqh

Die Base\Stop hat auch die gleichen Probleme mit einer Reihe von Fehlern im Zusammenhang mit Stops, Typen usw.

Vielen Dank für Ihre gute Arbeit, Shep

Ja, ich bin mir dessen bewusst. Dies ist immer noch auf die Forward-Deklarationen zurückzuführen. CStop benötigt Instanzen von COrder und COrderStop in seinen Methoden. Das gleiche gilt auch, wenn Sie versuchen, CStop zu kompilieren. Alle diese Klassen, die sich gegenseitig benötigen, sollten zusammen kompiliert werden. Es würde Fehler geben, wenn jede für sich kompiliert wird. Zum Beispiel:

class Object1
{
public:
   Object2 *m_object2;
   Object1(){}
  ~Object1(){}
};

class Object2
{
public:
   Object1 *m_object1;
   Object2(){}
  ~Object2(){}
};

Dies wird nicht kompiliert. Sie müssen eine Vorwärtsdeklaration angeben, damit der Compiler das Klassenmitglied m_object2 innerhalb der Klasse object1 erkennt:

class Object2;
class Object1
{
public:
   Object2 *m_object2;
   Object1(){}
  ~Object1(){}
};

class Object2
{
public:
   Object1 *m_object1;
   Object2(){}
  ~Object2(){}
};

Dies ist in Ordnung, wenn sich Object1 und Object2 in derselben Datei befinden. Wenn sie sich in zwei getrennten Dateien befinden, müssen Sie eine Vorwärtsdeklaration für Object2 in der Klassendatei von Object1 und für Object1 in der Klassendatei von Object2 machen, damit der Compiler keine Fehler zurückgibt, wenn Sie eine der beiden Dateien kompilieren. Das gilt so lange, bis Sie Methoden zu einer der beiden Klassen hinzufügen.

Die aktuelle Version des Compilers erkennt zwar Forward-Deklarationen, aber nicht die aufgelisteten Methoden der forwardly deklarierten Klasse. Deshalb erhalten Sie keine Fehlermeldungen wie "CStop - declaration without type", aber Sie erhalten Compiler-Fehlermeldungen für die Methoden, wie die, die Sie oben gepostet haben. Der Compiler erkennt die Klasse, aber nicht die Methoden der Klasse, die vorwärts deklariert wurde.