Tester im neuen Build 604 funktioniert nicht korrekt - Seite 4

 

Erstellt diese einfache EA auf 509 und 604 zu testen, sowohl auf MQ Demo-Konto 444 gleichen Server, Backtest über die gleichen Daten.

  • EA macht abwechselnd Kauf-Verkauf Kauf-Verkauf Trades
  • Fester SL/TP. Die Losgröße basiert auf dem Kontostand. Quellcodes unten.
  • 509 kompiliert auf 509 und getestet auf 509
  • 600 kompiliert auf 604 und getestet auf 604
Strategie-Testbericht
Test EA 509
MetaQuotes-Neuer MT4-Test (Build 509)

SymbolEURUSD (Euro gegen US Dollar)
Zeitraum1 Stunde (H1) 2013.10.14 06:00 - 2013.12.30 23:00 (2013.01.01 - 2013.12.31)
ModellJeder Tick (die präziseste Methode auf der Grundlage aller verfügbaren Mindestzeitrahmen)
Bars im Test1384Ticks modelliert1448514Qualität der Modellierung46.42%
Fehler bei nicht übereinstimmenden Diagrammen0
Ursprüngliche Einlage10000.00
Gesamtnettogewinn-1199.25Bruttogewinn20200.90Bruttoverlust-21400.15
Gewinnfaktor0.94Erwartete Auszahlung-8.75
Absoluter Drawdown2515.20Maximale Auszahlung3725.52 (33.23%)Relative Absenkung33.23% (3725.52)
Gesamtzahl der Abschlüsse137Short-Positionen (gewonnene %)68 (41.18%)Long-Positionen (Won %)69 (44.93%)
Gewinnbringende Geschäfte (% der Gesamtsumme)59 (43.07%)Verlustgeschäfte (% der Gesamtzahl)78 (56.93%)
GrößteGewinngeschäft394.33Verlustgeschäft-337.74
DurchschnittGewinn-Handel342.39Verlusthandel-274.36
Maximalaufeinanderfolgende Gewinne (Gewinn in Geld)4 (1494.97)Verluste in Folge (Verlust in Geld)12 (-3337.77)
MaximalGewinn in Folge (Anzahl der Gewinne)1494.97 (4)Konsekutiver Verlust (Anzahl der Verluste)-3337.77 (12)
DurchschnittKonsekutive Gewinne2aufeinanderfolgende Verluste2
DurchschnittSiege in Folge2Niederlagen in Folge2

 
Test EA 600+
MetaQuotes-Neuer MT4-Test (Build 604)

SymbolEURUSD (Euro gegen US Dollar)
Zeitraum1 Stunde (H1) 2013.10.14 06:00 - 2013.12.30 23:00 (2013.01.01 - 2013.12.31)
ModellJeder Tick (die präziseste Methode auf der Grundlage aller verfügbaren Mindestzeitrahmen)
Bars im Test1384Ticks modelliert1459801Qualität der Modellierung46.42%
Fehler bei nicht übereinstimmenden Diagrammen0
Ursprüngliche Einlage10000.00StreuungAktuell (6)
Gesamtnettogewinn-1985.08Bruttogewinn19147.44Bruttoverlust-21132.52
Gewinnfaktor0.91Erwartete Auszahlung-14.81
Absoluter Drawdown2677.75Maximale Auszahlung4021.28 (35.45%)Relative Absenkung35.45% (4021.28)
Gesamte Abschlüsse134Short-Positionen (gewonnene %)67 (40.30%)Long-Positionen (Won %)67 (44.78%)
Gewinnbringende Geschäfte (% der Gesamtsumme)57 (42.54%)Verlustgeschäfte (% der Gesamtzahl)77 (57.46%)
GrößteGewinngeschäft394.33Verlustgeschäft-337.74
DurchschnittGewinn-Handel335.92Verlusthandel-274.45
Maximalaufeinanderfolgende Gewinne (Gewinn in Geld)4 (1494.97)Verluste in Folge (Verlust in Geld)12 (-3336.50)
MaximalGewinn in Folge (Anzahl der Gewinne)1494.97 (4)Konsekutiver Verlust (Anzahl der Verluste)-3336.50 (12)
DurchschnittKonsekutive Gewinne2aufeinanderfolgende Verluste2
 
//========================================================================
//|                                                      Test EA 509.mq4 |
//|                                                  Copyright 2014, SDC |
//|                                        https://www.mql5.com/en/users/sdc |
//========================================================================
#property copyright "Copyright 2014, SDC"
#property link      "https://www.mql5.com/en/users/sdc"

//========================================================================
  int start()
//========================================================================
 {
//----
  static int ticket;
//----
  if(OrderSelect(ticket,SELECT_BY_TICKET))
  {if(OrderCloseTime()<=0) //-------------------- last order is still open
   {return(0);
   }else //------------------------------------------ last order is closed
   {if(OrderType()==0) ticket = maketrade(1);
    if(OrderType()==1) ticket = maketrade(0);
  }}else //-------------------------------------- cant find previous order
  {ticket = maketrade(0);
  }
//----
  return(0);
 }
//========================================================================
  int maketrade(int op)
//========================================================================
 {
  int errcnt=0;
  int mn = 777;
  int ticket=0;
  double lot=lots();
  double price=0;
  double sl=30;
  double tp=40;
//----
  if(lot<=0)return(0);
  if(Digits == 5 || Digits ==3)
  {sl*=10;
   tp*=10;
  }
  if(op == 0)
  {price = Ask;
   tp = Bid + tp*Point;
   sl = Bid - sl*Point;
  }
  if(op == 1)
  {price = Bid;
   tp = Ask - tp*Point;
   sl = Ask + sl*Point; 
  }
  while(ticket < 1)
  {ticket=OrderSend(Symbol(),op,lot,price,0,sl,tp,"",mn,0,Gold);
   if(ticket>0)return(ticket);
   else errcnt++;
   if(errcnt>2)return(0); //-------------------------------- 3 tries abort
   if(errors(GetLastError())==1) continue; //------------------- try again
   else return(-1);
  }
//----
  return(0);
 }
//========================================================================
  double lots()                                  //---- generic lot sizing
//========================================================================
 {
  string pair    = Symbol();
  double free    = AccountFreeMargin();
  double maxlot  = MarketInfo(pair,MODE_MAXLOT);
  double minlot  = MarketInfo(pair,MODE_MINLOT);
  double onelot  = MarketInfo(pair,MODE_MARGINREQUIRED);
  double lot     = AccountBalance()/10000;
  double newlot  = 0;
  double step    = MarketInfo(pair,MODE_LOTSTEP);
//----
  if(lot*onelot < free) newlot=MathFloor(lot/step)*step;
  else newlot=MathFloor(free/onelot/step)*step;
  if(newlot > maxlot) newlot = maxlot;
  if(newlot < minlot) newlot = minlot;
  if(newlot*onelot < free) return(newlot);
//----   
  return(0);
 }
//========================================================================
  int errors(int error)                     //---- generic errror handling 
//========================================================================
 {
  Print("Test EA 509 Error: ",error);
  if(error==0) return(0);
  switch(error)
  {
//recoverable error
   case  129:  RefreshRates();               return(1); //---- wrong price    
   case  135:  RefreshRates();               return(1); //-- price changed
   case  136:  while(RefreshRates()==false)
               Sleep(1);                     return(1); //------ no quotes
   case  138:  RefreshRates();               return(1); //-------- requote     
   case  146:  Sleep(500);
               RefreshRates();               return(1); //---- system busy
//logical error
   case  130:                                return(2); //-- invalid stops
   case 4108:                                return(2); //- invalid ticket
//critical error
   case   2:                                 return(3); //--- common error
   case   5:                                 return(3); //---- version old
   case  64:                                 return(3); //---- acc blocked
   case 133:                                 return(3); //----- prohibited
   default :                                 return(3); //---- other error
  }
//----
  return(0);
 }
//========================================================================
 
//========================================================================
//|                                                     Test EA 600+.mq4 |
//|                                                  Copyright 2014, SDC |
//|                                        https://www.mql5.com/en/users/sdc |
//========================================================================
#property copyright "Copyright 2014, SDC"
#property link      "https://www.mql5.com/en/users/sdc"
#property version   "1.00"
#property strict
//========================================================================
  void OnTick()
//========================================================================
 {
//----
  static int ticket;
//----
  if(OrderSelect(ticket,SELECT_BY_TICKET))
  {if(OrderCloseTime()<=0) //-------------------- last order is still open
   {return;
   }else //------------------------------------------ last order is closed
   {if(OrderType()==0) ticket = maketrade(1);
    if(OrderType()==1) ticket = maketrade(0);
  }}else //-------------------------------------- cant find previous order
  {ticket = maketrade(0);
  }
//----
  return;
 }
//========================================================================
  int maketrade(int op)
//========================================================================
 {
  int errcnt=0;
  int mn = 777;
  int ticket=0;
  double lot=lots();
  double price=0;
  double sl=30;
  double tp=40;
//----
  if(lot<=0)return(0);
  if(Digits == 5 || Digits ==3)
  {sl*=10;
   tp*=10;
  }
  if(op == 0)
  {price = Ask;
   tp = Bid + tp*Point;
   sl = Bid - sl*Point;
  }
  if(op == 1)
  {price = Bid;
   tp = Ask - tp*Point;
   sl = Ask + sl*Point; 
  }
  while(ticket < 1)
  {ticket=OrderSend(Symbol(),op,lot,price,0,sl,tp,"",mn,0,Gold);
   if(ticket>0)return(ticket);
   else errcnt++;
   if(errcnt>2)return(0); //-------------------------------- 3 tries abort
   if(errors(GetLastError())==1) continue; //------------------- try again
   else return(-1);
  }
//----
  return(0);
 }
//========================================================================
  double lots()                                  //---- generic lot sizing
//========================================================================
 {
  string pair    = Symbol();
  double free    = AccountFreeMargin();
  double maxlot  = MarketInfo(pair,MODE_MAXLOT);
  double minlot  = MarketInfo(pair,MODE_MINLOT);
  double onelot  = MarketInfo(pair,MODE_MARGINREQUIRED);
  double lot     = AccountBalance()/10000;
  double newlot  = 0;
  double step    = MarketInfo(pair,MODE_LOTSTEP);
//----
  if(lot*onelot < free) newlot=MathFloor(lot/step)*step;
  else newlot=MathFloor(free/onelot/step)*step;
  if(newlot > maxlot) newlot = maxlot;
  if(newlot < minlot) newlot = minlot;
  if(newlot*onelot < free) return(newlot);
//----   
  return(0);
 }
//========================================================================
  int errors(int error)                     //---- generic errror handling 
//========================================================================
 {
  Print("Test EA 600+ Error: ",error);
  if(error==0) return(0);
  switch(error)
  {
//recoverable error
   case  129:  RefreshRates();               return(1); //---- wrong price    
   case  135:  RefreshRates();               return(1); //-- price changed
   case  136:  while(RefreshRates()==false)
               Sleep(1);                     return(1); //------ no quotes
   case  138:  RefreshRates();               return(1); //-------- requote     
   case  146:  Sleep(500);
               RefreshRates();               return(1); //---- system busy
//logical error
   case  130:                                return(2); //-- invalid stops
   case 4108:                                return(2); //- invalid ticket
//critical error
   case   2:                                 return(3); //--- common error
   case   5:                                 return(3); //---- version old
   case  64:                                 return(3); //---- acc blocked
   case 133:                                 return(3); //----- prohibited
   default :                                 return(3); //---- other error
  }
//----
  return(0);
 }
//========================================================================
 

509 Grafik:

604 Grafik:

 

Sie scheinen identische Tests durchzuführen, mit Ausnahme des letzten Quartals. Ich denke, das liegt daran, dass ich eine Beta-Testversion auf demselben Server laufen ließ (wenn auch ein anderes Demokonto). Ich werde die Chart-Historie löschen und beide Terminals die gleiche Chart-Historie herunterladen lassen und den Test dann wiederholen.

Edit: Ich hätte wissen können, dass das ein Versuch für sich sein würde. Schön, dass MQ 1-Minuten-Chartdaten hat, die bis ins Jahr 1974 zurückreichen, aber ich wollte sie nicht alle haben! Es ist so, als ob man gar keine Daten haben kann oder so viel, dass man das halbe Silcon Valley im PC braucht! Mein Terminal hat jetzt 700mb RAM *rollseyes*

 
SDC:

Sie scheinen identische Tests durchzuführen, mit Ausnahme des letzten Quartals. Ich denke, das liegt daran, dass ich eine Beta-Testversion auf demselben Server laufen ließ (wenn auch ein anderes Demokonto). Ich werde die Chart-Historie löschen und beide Terminals die gleiche Chart-Historie herunterladen lassen und den Test dann wiederholen.

Edit: Ich hätte wissen können, dass das ein Versuch für sich sein würde. Schön, dass MQ 1-Minuten-Chartdaten hat, die bis ins Jahr 1974 zurückreichen, aber ich wollte sie nicht alle haben! Man kann entweder gar keine Daten haben oder so viel, dass man das halbe Silcon Valley im PC braucht !! mein Terminal hat jetzt 700mb RAM *rollseyes*


Hallo, können Sie versuchen, M15 und M1 Tests für diese. haben Sie konvertiert Code von alten mq4 zu neuen? können Sie bitte versuchen, mit einem alten komplexen mq4 EA, mit der Umwandlung in neue mq4.

einschließlich anderer Datentypen, wie datetime etc. einschließlich interner und benutzerdefinierter Indikatoren... ich konnte keine Indikatoren sehen, die in diesem Code verwendet werden...

604's mögliches Problem ist, dass einige Zahlengenauigkeiten verloren gehen, für Indikatoren und andere Zahlen.

Ich muss eine Zahlentestmethode entwickeln, um genaue Werte von Variablen für zwei Umgebungen zu vergleichen...

 

Wahrscheinlich nicht die Grundursache für Ihr Problem, aber in 60x müssen Sie eine ResetLastError() irgendwo einschließen? (1. Befehl innerhalb der while-Schleife?)

 
cbalta:


Hallo, können Sie versuchen, M15 und M1 Tests für diese. haben Sie Code von alten mq4 zu neuen konvertiert? können Sie bitte versuchen, mit einem alten komplexen mq4 EA, mit der Umwandlung in neue mq4.

einschließlich anderer Datentypen, wie datetime etc. einschließlich interner und benutzerdefinierter Indikatoren. ich konnte keine Indikatoren in diesem Code sehen...

604's mögliches Problem ist, dass einige Zahlengenauigkeiten verloren gehen, für Indikatoren und andere Zahlen.

Ich muss eine Zahlentestmethode entwickeln, um genaue Werte von Variablen für zwei Umgebungen zu vergleichen...


Ich habe den gleichen Quellcode verwendet, den ich gepostet habe, ich habe den 509er Testcode auf dem 509er Metaeditor kompiliert, ich habe den 600er Quellcode auf dem 604er Metaeditor kompiliert, die einzigen Unterschiede zwischen den beiden sind, dass der neue void OnTick() verwendet, der alte verwendet start()

Ich habe keine Indikatoren verwendet, weil ich wollte, dass dies ein grundlegender Test mit so wenigen Unbekannten wie möglich ist. Wir können die EAs modifizieren, um Indikatoren und andere Handelskriterien zu verwenden, wenn Sie die Testparameter erweitern möchten.

 
ydrol:

Wahrscheinlich nicht die Grundursache für Ihr Problem, aber in 60x müssen Sie eine ResetLastError() irgendwo einschließen? (1. Befehl innerhalb der while-Schleife?)

Ich bin mir nicht sicher, ob ich das muss? Ich werde es nachschlagen, die EAs haben die Tests ohne Fehler ausgeführt, so dass ich nicht sehen konnte, wie GetLastError() im neuen Terminal funktioniert. Meine hohe RAM-Auslastung (maximal über 1 GB) war auf jahrzehntelange 1-Minuten-Diagrammdaten zurückzuführen, die vom metaquotes-Demoserver heruntergeladen wurden, als ich die Download-Schaltfläche im History Center drückte.