Il tester nella nuova build 604 non funziona correttamente - pagina 4

 

Creato questo semplice EA da testare su 509 e 604, entrambi sul conto demo MQ 444 stesso server, backtest sulle stesse date.

  • L'EA effettua operazioni di compravendita alternate
  • SL/TP fisso. Dimensionamento del lotto basato sul saldo del conto. Codici sorgente qui sotto.
  • 509 compilato su 509 e testato su 509
  • 600 compilato su 604 e testato su 604
Rapporto del tester di strategia
Test EA 509
MetaQuotes-Nuovo MT4 Test (Build 509)

SimboloEURUSD (Euro contro Dollaro USA)
Periodo1 ora (H1) 2013.10.14 06:00 - 2013.12.30 23:00 (2013.01.01 - 2013.12.31)
ModelloOgni tick (il metodo più preciso basato su tutti i timeframe minimi disponibili)
Barre nel test1384Tick modellati1448514Qualità della modellazione46.42%
Errori di grafici non corrispondenti0
Deposito iniziale10000.00
Profitto netto totale-1199.25Profitto lordo20200.90Perdita lorda-21400.15
Fattore di profitto0.94Payoff previsto-8.75
Drawdown assoluto2515.20Disavanzo massimo3725.52 (33.23%)Prelievo relativo33.23% (3725.52)
Totale operazioni137Posizioni corte (vinto %)68 (41.18%)Posizioni lunghe (% won)69 (44.93%)
Operazioni con profitto (% del totale)59 (43.07%)Operazioni in perdita (% del totale)78 (56.93%)
Il più grandeprofitto394.33operazione in perdita-337.74
Mediadi profitto342.39commercio in perdita-274.36
Massimovittorie consecutive (profitto in denaro)4 (1494.97)perdite consecutive (perdita in denaro)12 (-3337.77)
Massimoprofitto consecutivo (conteggio delle vittorie)1494.97 (4)perdita consecutiva (conteggio delle perdite)-3337.77 (12)
Mediavittorie consecutive2perdite consecutive2
Mediavittorie consecutive2perdite consecutive2

 
Test EA 600+
MetaQuotes-Nuovo test MT4 (Build 604)

SimboloEURUSD (Euro contro Dollaro USA)
Periodo1 Ora (H1) 2013.10.14 06:00 - 2013.12.30 23:00 (2013.01.01 - 2013.12.31)
ModelloOgni tick (il metodo più preciso basato su tutti i timeframe minimi disponibili)
Barre nel test1384Tick modellati1459801Qualità della modellazione46.42%
Errori di grafici non corrispondenti0
Deposito iniziale10000.00SpreadCorrente (6)
Profitto netto totale-1985.08Profitto lordo19147.44Perdita lorda-21132.52
Fattore di profitto0.91Payoff previsto-14.81
Drawdown assoluto2677.75Dispersione massima4021.28 (35.45%)Prelievo relativo35.45% (4021.28)
Totale operazioni134Posizioni corte (% vinte)67 (40.30%)Posizioni lunghe (% won)67 (44.78%)
Operazioni con profitto (% del totale)57 (42.54%)Operazioni in perdita (% del totale)77 (57.46%)
Il più grandeprofitto394.33operazione in perdita-337.74
Mediadi profitto335.92commercio in perdita-274.45
Massimovittorie consecutive (profitto in denaro)4 (1494.97)perdite consecutive (perdita in denaro)12 (-3336.50)
Massimoprofitto consecutivo (numero di vittorie)1494.97 (4)perdita consecutiva (conteggio delle perdite)-3336.50 (12)
Mediavittorie consecutive2perdite consecutive2
 
//========================================================================
//|                                                      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 Grafico:

604 Grafico:

 

Sembrano eseguire test identici tranne che per l'ultimo trimestre, penso che sia perché stavo eseguendo una versione di beta test sullo stesso server (anche se un conto demo diverso). Probabilmente i dati live feed che potrebbero avere delle lacune stanno interferendo con il test. Ho intenzione di cancellare la cronologia dei grafici e lasciare che entrambi i terminali scarichino la stessa cronologia e poi rifare il test.

Edit: Avrei dovuto sapere che sarebbe stato un test in sé. È bello che MQ abbia dati grafici a 1 minuto che risalgono al 1974, ma non li voglio tutti! E' come se non ne avessi affatto o così tanto che hai bisogno di metà della valle di silcon nel tuo PC !!! il mio terminale ora ha 700mb di RAM *rollseyes*

 
SDC:

Sembrano eseguire test identici tranne che per l'ultimo trimestre, penso che ciò sia dovuto al fatto che stavo eseguendo una versione di beta test sullo stesso server (anche se un conto demo diverso) Probabilmente i dati live feed che potrebbero avere delle lacune stanno interferendo con il test. Ho intenzione di cancellare la cronologia dei grafici e lasciare che entrambi i terminali scarichino la stessa cronologia e poi rifare il test.

Edit: Avrei dovuto sapere che sarebbe stato un test in sé. È bello che MQ abbia dati grafici a 1 minuto che risalgono al 1974, ma non li voglio tutti! E' come se non potessi averne affatto o così tanto da aver bisogno di metà della valle di silcon nel tuo PC !!! il mio terminale ora ha 700mb di RAM *rollseyes*


ciao, puoi provare i test M15 e M1 per questo. hai convertito il codice dal vecchio mq4 al nuovo? puoi per favore provare con un vecchio EA mq4 complesso, con la conversione al nuovo mq4.

compresi altri tipi di dati, come datetime ecc. compresi gli indicatori interni e personalizzati.. non ho potuto vedere alcun indicatore utilizzato in questo codice...

Il possibile problema del 604 è che si sono perse alcune precisioni numeriche per gli indicatori e altri numeri.

Ho bisogno di sviluppare un metodo di test numerico per confrontare i valori esatti delle variabili, per due ambienti...

 

Probabilmente non è la causa principale del tuo problema, ma in 60x devi includere un ResetLastError() da qualche parte? (1° comando all'interno del ciclo while?)

 
cbalta:


Ciao, puoi provare i test M15 e M1 per questo. hai convertito il codice dal vecchio mq4 a quello nuovo? puoi per favore provare con un vecchio EA mq4 complesso, con la conversione al nuovo mq4.

inclusi altri tipi di dati, come datetime ecc. inclusi indicatori interni e personalizzati... non ho potuto vedere alcun indicatore utilizzato in questo codice...

604's possibile problema è, alcune precisioni numero perso, per gli indicatori e altri numeri.

Ho bisogno di sviluppare un metodo di test numerico per confrontare i valori esatti delle variabili, per due ambienti...


Ho usato lo stesso codice sorgente che ho postato, ho compilato il codice del test 509 sul Metaeditor 509, ho compilato il codice sorgente 600 sul Metaeditor 604, le uniche differenze tra i due sono che il nuovo usa void OnTick() il vecchio usa start()

Non ho usato nessun indicatore perché volevo che questo fosse un test di base con meno incognite possibili, possiamo modificare gli EA per usare indicatori e altri criteri di trading se vuoi ampliare i parametri del test.

 
ydrol:

Probabilmente non è la causa principale del tuo problema, ma in 60x devi includere un ResetLastError() da qualche parte? (1° comando all'interno del ciclo while?)

Non sono sicuro che sia necessario? Lo cercherò, gli EA hanno eseguito i test senza errori, quindi non ho potuto vedere come GetLastError() ha funzionato nel nuovo terminale. Il mio pesante utilizzo della RAM (massimo oltre 1 GB) era dovuto a decenni di dati grafici a 1 minuto che sono stati scaricati dal server demo di metaquotes quando ho premuto il pulsante di download nel centro storico, ho dovuto cancellarne alcuni.