Diskussion zum Artikel "Cross-Platform Expert Advisor: Signale" - Seite 3

 
Karl Klang:

Hallo Enrico,

Ich habe einen Weg gefunden, um die Calculate-Funktion jetzt einschließlich einer Hysterese-Funktion, die zu arbeiten scheint, wenn die MA und der TEMA-Indikator kreuzt.

Ich bin jedoch auf ein Problem mit dem Order Manager gestoßen. Es tritt auf, wenn ich den Strategietester für einige Schleifen während der Optimierung ausgeführt habe. In den ersten Schleifen funktioniert es gut, aber nach einigen Schleifen wird für jede Kerze eine Order platziert.

Hier funktioniert es gut:


Aber hier beginnt der Order Manager, mehrere Orders zu platzieren:


Als ich den folgenden Code-Teil des COrderManagers debuggt habe, wird die Anweisung orders_total = OrdersTotal(); zu 1, wenn sie funktioniert, aber zu 0, wenn sie fehlschlägt, was dazu führt, dass die if-Bedingung m_max_order>orders_total immer zu true ausgewertet wird.

Ich hoffe, Sie können mir helfen, das Problem zu lösen.

Mit freundlichen Grüßen/
Karl

Hallo Karl,

ich bin noch nie auf dieses Problem gestoßen. Die Methode OrdersTotal() zählt einfach die Anzahl der aktiven COrder-Objekte. Wenn etwas mit der kodierten Strategie nicht stimmt, muss es korrigiert werden. Wenn nicht, dann muss es ein Problem damit geben, wie die COrder-Instanzen verwaltet (erstellt/zerstört) und/oder wie sie gezählt werden. Ich werde Sie informieren, sobald ich auf dieses Problem stoße.

 

Hallo Enrico,

Googeln auf mt5 OrdersTotal() Probleme zeigt, andere haben Probleme als gut. Z.B. https://www. Strategie-Tester mit dieser Strategie ausprobieren. Das Expert Set ist ebenfalls hochgeladen, so dass Sie den Strategietester mit denselben Eingaben wie ich ausführen können.

Mit freundlichen Grüßen/
Karl

How to use the OrdersTotal() correctly?
How to use the OrdersTotal() correctly?
  • 2010.09.09
  • www.mql5.com
I tried many times to check OrdersTotal(), but I found it did not work...
 
Karl Klang:

Hallo Enrico,

Googeln auf mt5 OrdersTotal() Probleme zeigt, andere haben Probleme als gut. Z.B.: Strategietester mit dieser Strategie ausprobieren. Das Expert Set ist ebenfalls hochgeladen, damit Sie den Strategietester mit denselben Eingaben wie ich ausführen können.

Mit freundlichen Grüßen/
Karl

Danke für die Dateien, Karl. Ich bin auf das von Ihnen beschriebene Problem gestoßen.

Ändern Sie in der Haupt-Include-Datei dies (OnInit):

file.Open(savefile,FILE_READ);
if(!experts.Load(file.Handle()))
   return(INIT_FAILED);
file.Close();

in dies:

#ifdef __MQL5__
if (!(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION)))
#else
if (!(IsTesting() || IsOptimization()))
#endif
{
   file.Open(savefile,FILE_READ);
   if(!experts.Load(file.Handle()))
      return(INIT_FAILED);
   file.Close();
}


Und dies (OnDeinit):

file.Open(savefile,FILE_WRITE);
experts.OnDeinit(reason,file.Handle());
file.Close();

in dies:

#ifdef __MQL5__
if (!(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION)))
#else
if (!(IsTesting() || IsOptimization()))
#endif
{
  file.Open(savefile,FILE_WRITE);
  experts.OnDeinit(reason,file.Handle());
  file.Close();
}

Aus irgendeinem Grund werden die aus früheren Sitzungen gespeicherten Daten in zukünftige Sitzungen neu geladen. Aus diesem Grund tritt das Problem nur nach dem ersten Backtest auf, manchmal mit einem Speicherleck. Nach meinen Tests scheint das Problem nur im Netting-Modus aufzutreten, nicht im MT4 oder MT5 Hedging-Modus. Aber lassen Sie mich wissen, wenn Sie dieses Problem weiterhin haben. Der obige Code verhindert das Laden und Speichern von Daten während des Backtests und der Optimierung (ich habe vergessen, dies beim Schreiben des letzten Artikels zu erwähnen).

 

Außerdem zählt die Funktion OrdersTotal() in MT5 nur die ausstehenden Aufträge (nicht das Äquivalent zu MT4s OrdersTotal). Der Code in TradeOpen für OrderManager:

bool COrderManager::TradeOpen(const string symbol,ENUM_ORDER_TYPE type,double price,bool in_points=true)
  {
   bool ret=false;
   double lotsize=0.0;
   int trades_total =TradesTotal();
   int orders_total = OrdersTotal();

verwendet die Methode OrdersTotal() der Klasse, die nur eine Umhüllung der Methode COrders (ebenfalls mit demselben Namen) ist. COrders erweitert CArrayObj, so dass es nicht wirklich die MT5-eigene Funktion OrdersTotal() verwendet. Das obige ist auch äquivalent zu verwenden:

int orders_total = this.OrdersTotal();

Wenn wir hingegen:

int orders_total = ::OrdersTotal();

ruft dies explizit die MT5-eigene Funktion auf. Möglicherweise sind Sie damit bereits vertraut, aber nur für den Fall, dass andere Personen auf ein ähnliches Problem stoßen.

 

Vielen Dank, Enrico. Das Problem ist verschwunden.

/Karl

 
Enrico Lambino:
#ifdef __MQL5__
if (!(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION))) // MQL4-Code, nicht nur MQL5.
#else
if (!(IsTesting() || IsOptimization()))
#endif
MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION) == MQLInfoInteger(MQL_TESTER)
 
fxsaber:
Aha, ich verstehe. Ja, Sie haben Recht.
 

Hallo Enrico,

Im Github unter iceron/MQLx gibt es einen Änderungshinweis zu m_new_signal und m_new_signal_close.

m_signal_new kann mit der void CSignalsBase::NewSignal(const bool value) Methode geändert werden, aber es gibt keine Methode um m_new_signal_close zu ändern.

Könnten Sie bitte die Verwendung von m_new_signal und m_new_signal_close näher erläutern?

   if(m_invert)
     {
      CSignal::SignalInvert(m_signal_open);
      CSignal::SignalInvert(m_signal_close);
     }
   if(m_new_signal)
     {
      if(m_signal_open==m_signal_open_last)
         m_signal_open = CMD_NEUTRAL;      
     }
   if(m_new_signal_close)
     {
      if(m_signal_close==m_signal_close_last)
         m_signal_close = CMD_NEUTRAL;      
     }

Mit freundlichen Grüßen/

Karl

iceron - Overview
iceron - Overview
  • github.com
Sign up for your own profile on GitHub, the best place to host code, manage projects, and build software alongside 36 million developers. Sign up
 

Funktionieren diese Methoden mit Ihrer MT5Bridge?

 

Hallo Meister!

Ich habe ein ernsthaftes Problem mit dem Verständnis der "Kerzenzählung" (Erste, zweite, dritte = idx, idx++, ...) im folgenden Mql Signal Code, der zur SignalAC Klasse gehört.

Kann mir jemand helfen, die idx-Nummer zu durchdringen, wenn ich mich in den Codes nach unten bewege?

Vielen Dank im Voraus.

//+------------------------------------------------------------------+
//| "Abstimmen", dass der Preis steigen wird.|
//+------------------------------------------------------------------+
int CSignalAC::LongCondition(void)
  {
   int result=0;
   int idx   =StartIndex();
//--- wenn der erste analysierte Balken "rot" ist, nicht für den Kauf "stimmen"
   if(DiffAC(idx++)<0.0)
      return(result);
//--- der erste analysierte Balken ist "grün" (der Indikator hat keine Einwände gegen den Kauf)
   if(IS_PATTERN_USAGE(0))
      result=m_pattern_0;
//--- wenn der zweite analysierte Balken "rot" ist, gibt es keine Bedingung für den Kauf
   if(DiffAC(idx)<0.0)
      return(result);
//--- zweiter analysierter Balken ist "grün" (die Bedingung für den Kauf kann erfüllt sein)
//--- wenn der zweite analysierte Balken kleiner als Null ist, müssen wir den dritten Balken analysieren
   if(AC(idx++)<0.0)
     {
      //--- wenn der dritte analysierte Balken "rot" ist, gibt es keine Bedingung für den Kauf
      if(DiffAC(idx++)<0.0)
         return(result);
     }
//--- es gibt eine Bedingung für den Kauf
   if(IS_PATTERN_USAGE(1))
      result=m_pattern_1;
//--- wenn der zuvor analysierte Balken "rot" ist, ist die Bedingung für den Kauf gerade erfüllt worden
   if(IS_PATTERN_USAGE(2) && DiffAC(idx)<0.0)
      result=m_pattern_2;
//--- Rückgabe des Ergebnisses
   return(result);
  }