El probador en la nueva compilación 604 no funciona correctamente - página 4

 

Creé este simple EA para probar en 509 y 604, ambos en la cuenta demo MQ 444 mismo servidor, backtest sobre las mismas fechas.

  • El EA realiza operaciones de compra-venta alternas
  • SL/TP fijos. El tamaño del lote se basa en el saldo de la cuenta. Códigos de la fuente a continuación.
  • 509 compilado en 509 y probado en 509
  • 600 compilado en 604 y probado en 604
Informe del probador de estrategias
Prueba de EA 509
Prueba de MetaQuotes-New MT4 (Build 509)

SímboloEURUSD (Euro vs Dólar)
Periodo1 Hora (H1) 2013.10.14 06:00 - 2013.12.30 23:00 (2013.01.01 - 2013.12.31)
ModeloCada tick (el método más preciso basado en todos los marcos temporales mínimos disponibles)
Barras en la prueba1384Ticks modelados1448514Calidad de la modelización46.42%
Errores de gráficos no coincidentes0
Depósito inicial10000.00
Beneficio neto total-1199.25Beneficio bruto20200.90Pérdida bruta-21400.15
Factor de beneficio0.94Beneficio esperado-8.75
Reducción absoluta2515.20Reducción máxima3725.52 (33.23%)Reducción relativa33.23% (3725.52)
Total de operaciones137Posiciones cortas (% de ganancias)68 (41.18%)Posiciones largas (% de won)69 (44.93%)
Operaciones con beneficios (% del total)59 (43.07%)Operaciones con pérdidas (% del total)78 (56.93%)
Mayorde beneficios394.33operación con pérdidas-337.74
Mediade beneficios342.39Comercio de pérdidas-274.36
Máximovictorias consecutivas (beneficio en dinero)4 (1494.97)Pérdidas consecutivas (pérdida en dinero)12 (-3337.77)
Máximobeneficio consecutivo (recuento de victorias)1494.97 (4)Pérdidas consecutivas (recuento de pérdidas)-3337.77 (12)
Mediaganancias consecutivas2pérdidas consecutivas2
Mediavictorias consecutivas2pérdidas consecutivas2

 
Informe del probador deestrategias
Prueba de EA 600+
MetaQuotes-Nueva prueba de MT4 (Build 604)

SímboloEURUSD (Euro vs Dólar)
Periodo1 Hora (H1) 2013.10.14 06:00 - 2013.12.30 23:00 (2013.01.01 - 2013.12.31)
ModeloCada tick (el método más preciso basado en todos los marcos temporales mínimos disponibles)
Barras en la prueba1384Ticks modelados1459801Calidad de la modelización46.42%
Errores de gráficos no coincidentes0
Depósito inicial10000.00SpreadActual (6)
Beneficio neto total-1985.08Beneficio bruto19147.44Pérdida bruta-21132.52
Factor de beneficio0.91Beneficio esperado-14.81
Reducción absoluta2677.75Reducción máxima4021.28 (35.45%)Reducción relativa35.45% (4021.28)
Total de operaciones134Posiciones cortas (% de ganancias)67 (40.30%)Posiciones largas (% de won)67 (44.78%)
Operaciones con beneficios (% del total)57 (42.54%)Operaciones con pérdidas (% del total)77 (57.46%)
Mayorde beneficios394.33operación con pérdidas-337.74
Mediade beneficios335.92Comercio de pérdidas-274.45
Máximovictorias consecutivas (beneficio en dinero)4 (1494.97)Pérdidas consecutivas (pérdida en dinero)12 (-3336.50)
Máximobeneficio consecutivo (recuento de victorias)1494.97 (4)pérdidas consecutivas (recuento de pérdidas)-3336.50 (12)
Mediaganancias consecutivas2pérdidas consecutivas2
 
//========================================================================
//|                                                      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 Gráfico:

604 Gráfico:

 

Parece que las pruebas son idénticas, excepto en el último trimestre. Creo que esto se debe a que estaba ejecutando una versión de prueba beta en el mismo servidor (aunque con una cuenta demo diferente). Voy a borrar el historial de gráficos y dejar que ambos terminales descarguen el mismo historial de gráficos y luego volver a hacer la prueba.

Editar: Podría haber sabido que sería una prueba en sí misma. Es bueno que MQ tenga datos de gráficos de 1 minuto que se remontan a 1974, pero no los quería todos. Es como si pudieras no tener nada o tener tanto que necesitaras la mitad de silcon valley en tu PC!! mi terminal esta ahora corriendo 700mb RAM *rollseyes*

 
SDC:

Parece que las pruebas son idénticas, excepto en el último trimestre, que creo que se debe a que estaba ejecutando una versión de prueba beta en el mismo servidor (aunque con una cuenta demo diferente). Voy a borrar el historial de gráficos y dejar que ambos terminales descarguen el mismo historial de gráficos y luego volver a hacer la prueba.

Editar: Podría haber sabido que sería una prueba en sí misma. Es bueno que MQ tenga datos de gráficos de 1 minuto que se remontan a 1974, pero no los quería todos. Es como si pudieras no tener nada o tener tanto que necesitaras la mitad del valle de silcon en tu PC !! mi terminal esta ahora corriendo 700mb RAM *rollseyes*


hola, puedes probar las pruebas M15 y M1 para esto. ¿convertiste el código del viejo mq4 al nuevo? puedes por favor probar con un viejo EA mq4 complejo, con la conversión al nuevo mq4.

incluyendo otros tipos de datos, como datetime etc. incluyendo indicadores internos y personalizados.. no pude ver ningún indicador usado en este código..

El posible problema del 604 es que se pierden algunas precisiones numéricas, para los indicadores y otros números.

necesito desarrollar un método de prueba de números para comparar valores exactos de variables, para dos ambientes...

 

Probablemente no sea la causa de tu problema, pero en 60x ¿necesitas incluir un ResetLastError() en algún lugar? (¿primer comando dentro del bucle while?)

 
cbalta:


hola, puedes probar con pruebas M15 y M1 para esto. ¿convertiste el código del viejo mq4 al nuevo? puedes por favor probar con un viejo EA mq4 complejo, con la conversión al nuevo mq4.

incluyendo otros tipos de datos, como datetime etc. incluyendo indicadores internos y personalizados.. no pude ver ningún indicador utilizado en este código..

El posible problema del 604 es que se pierden algunas precisiones numéricas, para los indicadores y otros números.

necesito desarrollar un método de prueba de números para comparar valores exactos de variables, para dos ambientes...


Utilicé el mismo código fuente que publiqué, compilé el código de prueba del 509 en el metaeditor 509, compilé el código fuente del 600 en el metaeditor 604, las únicas diferencias entre los dos son que el nuevo utiliza void OnTick() el antiguo utiliza start()

No utilicé ningún indicador porque quería que esto fuera una prueba básica con el menor número de incógnitas posible, podemos modificar los EA para utilizar indicadores y otros criterios de comercio si desea ampliar los parámetros de la prueba.

 
ydrol:

Probablemente no sea la causa de tu problema, pero en 60x ¿necesitas incluir un ResetLastError() en algún lugar? (¿primer comando dentro del bucle while?)

No estoy seguro de si es necesario. Lo buscaré, los EA's corrieron las pruebas sin errores así que no pude ver como funcionaba el GetLastError() en la nueva terminal. Mi uso pesado de RAM (máximo de más de 1 GB) se debió a décadas de datos de gráficos de 1 minuto que se descargaron del servidor de demostración de metaquotes cuando presioné el botón de descarga en el centro de historia, tuve que borrar algunos de ellos.