Le testeur de la nouvelle version 604 ne fonctionne pas correctement. - page 4

 

J'ai créé cet EA simple pour le tester sur 509 et 604, tous deux sur le compte de démonstration MQ 444 du même serveur, backtest sur les mêmes dates.

  • L'EA effectue des transactions d'achat-vente alternées
  • SL/TP fixe. La taille du lot est basée sur le solde du compte. Codes sources ci-dessous.
  • 509 compilé sur 509 et testé sur 509
  • 600 compilé sur 604 et testé sur 604
Rapport du testeur de stratégie
Test EA 509
MetaQuotes-Nouveau test MT4 (Build 509)

SymboleEURUSD (Euro vs Dollar US)
Période1 Heure (H1) 2013.10.14 06:00 - 2013.12.30 23:00 (2013.01.01 - 2013.12.31)
ModèleChaque tick (la méthode la plus précise basée sur tous les délais les plus courts disponibles)
Barres dans le test1384Ticks modélisés1448514Qualité de la modélisation46.42%
Erreurs de cartes mal assorties0
Dépôt initial10000.00
Bénéfice net total-1199.25Bénéfice brut20200.90Perte brute-21400.15
Facteur de profit0.94Gain attendu-8.75
Pertes absolues2515.20Pertes maximales3725.52 (33.23%)Rabattement relatif33.23% (3725.52)
Total des transactions137Positions courtes (% gagné)68 (41.18%)Positions longues (% won)69 (44.93%)
Transactions à profit (% du total)59 (43.07%)Transactions perdantes (% du total)78 (56.93%)
Le plus grandtransaction à profit394.33transaction à perte-337.74
Moyenneprofit commercial342.39transaction à perte-274.36
Maximumvictoires consécutives (profit en argent)4 (1494.97)Pertes consécutives (perte en argent)12 (-3337.77)
Maximalgains consécutifs (nombre de victoires)1494.97 (4)Perte consécutive (nombre de pertes)-3337.77 (12)
Moyennegains consécutifs2pertes consécutives2
Moyennevictoires consécutives2défaites consécutives2

 
Test de l'EA 600
MetaQuotes-Nouveau test MT4 (Build 604)

SymboleEURUSD (Euro vs Dollar US)
Période1 Heure (H1) 2013.10.14 06:00 - 2013.12.30 23:00 (2013.01.01 - 2013.12.31)
ModèleChaque tick (la méthode la plus précise basée sur tous les délais les plus courts disponibles)
Barres dans le test1384Ticks modélisés1459801Qualité de la modélisation46.42%
Erreurs de cartes mal assorties0
Dépôt initial10000.00SpreadActuel (6)
Bénéfice net total-1985.08Bénéfice brut19147.44Perte brute-21132.52
Facteur de profit0.91Gain attendu-14.81
Pertes absolues2677.75Pertes maximales4021.28 (35.45%)Rabattement relatif35.45% (4021.28)
Total des transactions134Positions courtes (% gagné)67 (40.30%)Positions longues (% gagné)67 (44.78%)
Transactions à profit (% du total)57 (42.54%)Transactions perdantes (% du total)77 (57.46%)
Plus grand nombre de transactionstransaction à profit394.33transaction à perte-337.74
Moyenneprofit commercial335.92transaction à perte-274.45
Maximumvictoires consécutives (profit en argent)4 (1494.97)Pertes consécutives (perte en argent)12 (-3336.50)
Maximalgains consécutifs (nombre de victoires)1494.97 (4)Perte consécutive (nombre de pertes)-3336.50 (12)
Moyennegains consécutifs2pertes consécutives2
 
//========================================================================
//|                                                      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 Graph :

604 Graph :

 

Ils semblent exécuter des tests identiques, sauf pour le dernier trimestre. Je pense que c'est parce que j'exécutais une version de test bêta sur le même serveur (bien qu'avec un compte de démonstration différent). Je vais supprimer l'historique des graphiques et laisser les deux terminaux télécharger le même historique des graphiques puis refaire le test.

Edit : J'aurais dû savoir que cela serait un essai en soi. C'est bien que MQ ait des données graphiques d'une minute qui remontent à 1974, mais je n'en voulais pas toutes les données ! C'est comme si vous pouviez ne rien avoir du tout ou en avoir tellement que vous avez besoin de la moitié de Silcon Valley dans votre PC ! Mon terminal utilise maintenant 700 mb de RAM *rollseyes*.

 
SDC:

Ils semblent exécuter des tests identiques, sauf pour le dernier trimestre. Je pense que c'est parce que j'exécutais une version de test bêta sur le même serveur (bien qu'avec un compte de démonstration différent). Je vais supprimer l'historique des graphiques et laisser les deux terminaux télécharger le même historique des graphiques puis refaire le test.

Edit : J'aurais dû savoir que cela serait un essai en soi. C'est bien que MQ ait des données graphiques d'une minute qui remontent à 1974, mais je n'en voulais pas toutes les données ! C'est comme si vous pouviez ne rien avoir du tout ou en avoir tellement que vous avez besoin de la moitié de Silcon Valley dans votre PC ! mon terminal utilise maintenant 700 mb de RAM *rollseyes*.


bonjour, pouvez-vous essayer les tests M15 et M1 pour cela. avez-vous converti le code de l'ancienne mq4 à la nouvelle ? pouvez-vous s'il vous plaît essayer avec un ancien EA mq4 complexe, avec la conversion à la nouvelle mq4.

y compris d'autres types de données, comme les dates, etc. y compris les indicateurs internes et personnalisés. je n'ai pu voir aucun indicateur utilisé dans ce code...

Le problème possible de 604 est la perte de précision de certains chiffres, pour les indicateurs et d'autres chiffres.

J'ai besoin de développer une méthode de test des nombres pour comparer les valeurs exactes des variables, pour deux environnements...

 

Ce n'est probablement pas la cause première de votre problème, mais dans 60x, devez-vous inclure un ResetLastError() quelque part ? (1ère commande à l'intérieur de la boucle while ?)

 
cbalta:


Bonjour, pouvez-vous essayer les tests M15 et M1 pour cela. Avez-vous converti le code de l'ancienne mq4 à la nouvelle ? pouvez-vous s'il vous plaît essayer avec un ancien EA mq4 complexe, avec la conversion à la nouvelle mq4.

y compris d'autres types de données, comme les dates, etc. y compris les indicateurs internes et personnalisés. je n'ai pas vu d'indicateurs utilisés dans ce code...

Le problème possible de 604 est la perte de précision de certains nombres, pour les indicateurs et autres nombres.

J'ai besoin de développer une méthode de test des nombres pour comparer les valeurs exactes des variables, pour deux environnements...


J'ai utilisé le même code source que j'ai posté, j'ai compilé le code de test 509 sur le Metaeditor 509, j'ai compilé le code source 600 sur le metaeditor 604, les seules différences entre les deux sont que le nouveau utilise void OnTick() l'ancien utilise start()

Je n'ai pas utilisé d'indicateurs parce que je voulais que ce soit un test de base avec le moins d'inconnues possible ; nous pouvons modifier les EA pour utiliser des indicateurs et d'autres critères commerciaux si vous voulez élargir les paramètres du test.

 
ydrol:

Ce n'est probablement pas la cause première de votre problème, mais dans 60x, devez-vous inclure un ResetLastError() quelque part ? (1ère commande à l'intérieur de la boucle while ?)

Je ne suis pas sûr que ce soit nécessaire ? Je vais vérifier, les EA's ont exécuté les tests sans erreurs donc je n'ai pas pu voir comment le GetLastError() se comporte dans le nouveau terminal. Ma forte utilisation de la RAM (plus de 1 Go au maximum) était due à des décennies de données graphiques d'une minute qui ont été téléchargées depuis le serveur de démonstration de metaquotes lorsque j'ai appuyé sur le bouton de téléchargement dans le centre d'historique, j'ai dû en supprimer une partie.