Diskussion zum Artikel "MQL5 Assistent: Erstellen eines Moduls zum Verfolgen offener Positionen" - Seite 2

 

Vielen Dank für Ihre große und hilfreiche Artikel,

Darf ich Sie bitten, bringen Sie ein Beispiel, wie könnte diese Klasse in das Schreiben eines Experten-Berater verwenden, mein Mittel ist, dass mit dieser Klasse in EA-Vorlage nicht EA generieren.

Nochmals vielen Dank,.

 

Guten Tag! Das Modul funktioniert nicht.

Das Protokoll zeigt, dass die Höhe des Schwellengewinns größer sein muss als die Höhe der Einstellaufträge.

Im Konstruktor initialisiere ich Variablen, die nicht leer sind und nicht gleich Null sind. Warum erhalte ich einen Fehler?

 //+------------------------------------------------------------------+
//|TrailingFixedPips.mqh |
//| Copyright 2009-2013, MetaQuotes Software Corp. | |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#include <Expert\ExpertTrailing.mqh>
// Assistentenbeschreibung Start
//+----------------------------------------------------------------------+
//| Beschreibung der Klasse|
//| Title=Trailing mit gleitendem Stop Loss (Fox104) | |
//| Type=Trailing|
//| Name=FixedPips|
//| Klasse=CTrailingFixedPips|
//| Seite=|
//| Parameter=StopLevel,int,30,Stop Loss trailing level (in Punkten) | |
//| Parameter=ProfitLevel,int,50,Nachlaufende Gewinnmitnahme (in Punkten) | |
//+----------------------------------------------------------------------+
// Beschreibung des Assistenten Ende
//+------------------------------------------------------------------+
//| Klasse CTrailingFixedPips.|
//| Zweck: Klasse von Trailing Stops mit festem Stop Level in Pips. || Zweck: Klasse von Trailing Stops mit festem Stop Level in Pips. ||
//| Abgeleitet von der Klasse CExpertTrailing.|
//+------------------------------------------------------------------+
class CTrailingFixedPips : public CExpertTrailing
  {
protected:
   //--- Eingabeparameter
   int               m_stop_level;
   int               m_profit_level;

public:
                     CTrailingFixedPips(void);
                    ~CTrailingFixedPips(void);
   //--- Methoden zur Initialisierung von geschützten Daten
   void              StopLevel(int stop_level)     { m_stop_level=stop_level;     }
   void              ProfitLevel(int profit_level) { m_profit_level=profit_level; }
   virtual bool      ValidationSettings(void);
   //---
   virtual bool      CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp);
   virtual bool      CheckTrailingStopShort(CPositionInfo *position,double &sl,double &tp);
  };
//+------------------------------------------------------------------+
//| Konstruktor|
//+------------------------------------------------------------------+
void CTrailingFixedPips::CTrailingFixedPips(void)
  {
            m_stop_level = 30;
            m_profit_level = 50;
  }
//+------------------------------------------------------------------+
//| Destruktor|
//+------------------------------------------------------------------+
CTrailingFixedPips::~CTrailingFixedPips(void)
  {
  }
//+------------------------------------------------------------------+
//|| Validierungseinstellungen geschützte Daten.
//+------------------------------------------------------------------+
bool CTrailingFixedPips::ValidationSettings(void)
  {
   if(!CExpertTrailing::ValidationSettings())
      return(false);
//--- erste Datenprüfungen
   if((m_profit_level-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit_level!=0.0)
     {
      printf(__FUNCTION__+"Der Schwellenwert für den Gewinn muss größer sein als der Auftragswert".);
      return(false);
     }
//--- ok
   return(true);
  }
//+------------------------------------------------------------------+
//| Überprüfung von Trailing-Stop und/oder Gewinn für Long-Position.
//+------------------------------------------------------------------+
bool CTrailingFixedPips::CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp)
  {
//--- prüfen
   if(position==NULL)
      return(false);
   if(m_stop_level==0)
      return(false);
//--- Parameterprüfung 
   if(m_profit_level==0.0)  return(false);
//--- bereits an der Gewinnschwelle?
   double open=position.PriceOpen();
   if(position.StopLoss()>=open) return(false);
//--- Gewinnkontrolle
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(m_symbol.Bid()-open>m_profit_level*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open+m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+
//| Überprüfung von Trailing-Stop und/oder Gewinn für Short-Position.
//+------------------------------------------------------------------+
bool CTrailingFixedPips::CheckTrailingStopShort(CPositionInfo *position,double &sl,double &tp)
  {
//--- prüfen
   if(position==NULL)
      return(false);
   if(m_stop_level==0)
      return(false);
//--- Parameterprüfung
   if(m_profit_level==0.0)  return(false);
//--- bereits an der Gewinnschwelle?
   double open=position.PriceOpen();
   if(position.StopLoss()<=open) return(false);
//--- Gewinnkontrolle
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(open-m_symbol.Ask()>m_profit_level*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open-m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
Fox104:

Guten Tag! Das Modul funktioniert nicht.

Das Protokoll zeigt, dass die Höhe des Schwellengewinns größer sein muss als die Höhe der Einstellaufträge.

Im Konstruktor initialisiere ich Variablen, die nicht leer sind und nicht gleich Null sind. Warum erhalte ich eine Fehlermeldung?

Bitte formatieren Sie den Code in Ihrer Nachricht richtig: Fügen Sie den Code korrekt im Forum ein. (Ihre Nachricht wurde bereits korrigiert).
 
Andy:

Bei der Verwendung des im Artikel genannten Moduls werden beim Laden des Expert Advisors in den Chart Fehler im Expert Advisor Log generiert:

2017.09.06 00:28:29.873 1 (EURUSD,M5) OnInit: Fehler beim Initialisieren der Indikatoren

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::SetPriceSeries: Ändern der Zeitreihe ist untersagt

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::SetOtherSeries: Ändern der Zeitreihe ist verboten

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::InitIndicators: Parameter der Einstellung werden nicht geprüft

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpert::InitIndicators: Fehler bei der Initialisierung der Indikatoren des Trailing-Objekts

2017.09.06 00:31:20.256 1 (EURUSD,M5) OnInit: Fehler bei der Initialisierung der Indikatoren

Vielleicht ist es veraltet, wo kann man ein neues bekommen oder was kann man in diesem beheben?

Nehmen Sie eine Änderung im Trailing-Modul "sampleTrailing.mqh"vor:

//+------------------------------------------------------------------+
//| Überprüfen Sie die Einstellungsparameter.|
//| INPUT: nein.|
|| OUTPUT: wahr, wenn die Einstellungen korrekt sind, sonst falsch. || OUTPUT: wahr, wenn die Einstellungen korrekt sind, sonst falsch.
//| ANMERKUNG: Nein.|
//+------------------------------------------------------------------+
bool CSampleTrailing::ValidationSettings()
  {
   if(!CExpertTrailing::ValidationSettings())
      return(false);
//--- für den Fall, dass die Init-Methode nicht aufgerufen wurde
   if(m_symbol==NULL) return(false);
//--- Parameterprüfung
   if((m_profit-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit!=0.0)
     {
      printf(__FUNCTION__+"Der Schwellenwert für den Gewinn muss größer sein als der Auftragswert".);
      return(false);
     }
//--- ok
   return(true);
  }
 
Andy:

Bei der Verwendung des im Artikel beschriebenen Moduls werden beim Laden des Expert Advisors in einen Chart Fehler im Log des Expert Advisors erzeugt:


Vielleicht ist es veraltet, wo kann man ein neues bekommen oder was kann man in diesem Fall beheben?

Vielen Dank für die Nachricht, der Artikel wurde korrigiert.

 
Andy:

Wenn ich eine Short-Position eröffne und den üblichen Stop-Loss (nicht Trailing) in den Parametern auf 0 setze, wird der Trailing-Stop nicht auf Breakeven gesetzt, aber wenn ich den üblichen Stop leicht verschiebe und auf mindestens -1 Pip setze, funktioniert alles. Beim Longing funktioniert alles normal. Bei der Überprüfung der Bedingung, dass es bereits einen Breakeven gibt (der Stop ist kleiner als der Preis), wird der Wert des Stops zunächst auf 0 gesetzt und er lässt ihn nicht weiter gehen.


Das ist richtig. Der angegebene Stop Loss ist der Auslöser dafür, dass DIESES Trailing-Modul beim Breakeven arbeitet. Das heißt, es wird angenommen, dass die Position anfangs einen Stop Loss haben MUSS.


Hinzugefügt:

Der Zweck eines jeden Artikels ist es, Lösungsansätze für ein bestimmtes Problem aufzuzeigen und bekannt zu machen. Dann sollte der Benutzer selbst seinen eigenen Code auf der Grundlage der gewonnenen Erkenntnisse entwickeln.

 
Andy:

Es sollte so ergänzt werden, dass wenn es keinen Stop gibt, der Trailing auch ist - füllen Sie die Variable mit mindestens dem Eröffnungswert.

(Ich habe eine Push-Benachrichtigung für 2 Ihrer Nachrichten, aber einer von ihnen fehlt - gelöscht)?


Wenn Sie etwas ändern müssen - das ist nicht das Problem dieses Artikels. Hier können Sie es selbst tun, basierend auf dem Wissen, das Sie gewonnen haben. Das heißt, wenn Sie eine Technische Aufgabe verfassen wollen und denken, dass der Artikel darunter umgeschrieben wird - das ist nicht so.

Wie ich Ihre Aktionen sehe: das Modul umschreiben (eine kleine Änderung) und verwenden.


Nachtrag: Zum letzten Mal, bitte benutzen Sie die Schaltfläche "Antworten". Andernfalls werde ich nicht antworten.

 
Andy:

Okay, ich werde es selbst schreiben. Haben Sie einen Ihrer Beiträge gelöscht (sagen Sie mir, wenn ja, damit ich nicht danach suchen muss)?


Sie können ein neues Thema eröffnen, so etwas wie"Modul der offenen Positionen Wartung zum Breakeven" - ich denke, ein solches Thema wird nützlich sein.

Also ja, ich habe meinen Beitrag bearbeitet und aus Versehen auf "löschen" geklickt - das heißt, ich habe tatsächlich ZWEI Beiträge geschrieben und einen gelöscht. Deshalb ist der Push richtig angekommen.