28 !!! pares de divisas, 1 experto. Otro grial, pero este creo que nadie lo ha mostrado. + CUENTA DEMO - página 12

 
Rosh:
He probado "EURUSD sobre el rango 2007.07.10 a 2007.07.14, y por separado sobre el rango 2007.07.09 a 2007.07.14" como has pedido, no hay diferencia.


Yo también tuve que actualizar a la última compilación. :-) Efectivamente, los problemas con el tiempo han desaparecido, eso está bien. Sin embargo, resulta que la historia no termina ahí.

He ejecutado el EA en el mismo período - no hay diferencia entre el Alto y el Bajo en M1 y en H1/D1. Nota - He realizado la prueba con mis datos normales, sin daños, sin sincronización, etc. Así que no puede ser la razón de la discrepancia.

Entonces decidí probarlo en otro intervalo por si acaso (bueno, mal carácter el mío). Y resulta que aún no ha terminado.

Pruebe el intervalo de 2007.08.06 a 2007.08.11, que es en realidad la última semana. Y la comparación no es con D1, sino con H1. Hay 4 operadores en el texto del Asesor Experto que deben ser comentados, y 4 operadores que deben ser no comentados. No es que se haya demostrado la posibilidad de espiar en el futuro, no. Pero el fallo está presente.

Y puesto que parece que la ausencia de problemas en un intervalo semanal no es garantía de que no haya problemas en absoluto, tal vez deberíamos realizar la prueba en un intervalo mucho más largo, por ejemplo, un año o seis meses.

 
He revisado el código de su EA de prospección simple. Desgraciadamente, no estaba impecable, así que lo arreglé un poco:

 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {   
//----
  if (start)
   {
     curHi=NormalizeDouble(Bid,Digits);
     curLo=NormalizeDouble(Bid,Digits);
     curM1 = TimeMinute(TimeCurrent());
     curH1 = TimeHour(TimeCurrent());
     curD1 = TimeDay(TimeCurrent());
     start=false;
   }
 
  mm = TimeMinute(TimeCurrent());
  hh = TimeHour(TimeCurrent());
  dd = TimeDay(TimeCurrent());
  if (mm!=curM1)
  {  if (hh!=curH1)
     {  if (dd!=curD1)
        {  
           Print("Новые сутки наступили");
           curHi=NormalizeDouble(Bid,Digits);
           curLo=NormalizeDouble(Bid,Digits);
           curD1=dd;
        }
        //curHi=NormalizeDouble(Bid,Digits);
        //curLo=NormalizeDouble(Bid,Digits);
        curH1=hh;
     }
     curM1=mm;
  }
  if (NormalizeDouble(Bid,Digits)==0) Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS),"  Bid=",Bid);
  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
  //HiH1 = iHigh(NULL,PERIOD_H1,0);
  //LoH1 =  iLow(NULL,PERIOD_H1,0);
  HiH1 = iHigh(NULL,PERIOD_D1,0);
  LoH1 =  iLow(NULL,PERIOD_D1,0);
  HiH1 = NormalizeDouble(HiH1,Digits);
  LoH1 = NormalizeDouble(LoH1,Digits);
 
  str = TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);
  mHi = ", curHi=" + DoubleToStr(curHi,Digits);
  mLo = ", curLo=" + DoubleToStr(curLo,Digits);
  hHi = ", HiH1="  + DoubleToStr(HiH1, Digits);
  hLo = ", LoH1="  + DoubleToStr(LoH1, Digits);
  if (curLo==0) Print("Curlo=",curLo);
  if (curHi==0) Print("curHi=",curHi);
 
  if (HiH1!=curHi||LoH1!=curLo) 
  {  //Print(str,mHi,hHi,mLo,hLo);
     if (handle>0) FileWrite(handle,TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS),curHi,HiH1,curLo,LoH1);
  }
//----
   return(0);
  }
 
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{  Print("Работа закончена");
   if (handle>0)
      {FileWrite(handle,"записано ",TimeToStr(TimeLocal()));
      FileClose(handle);
      } 
//---- done
   return(0);
}
El hecho de un nuevo día se fija demasiado tarde en su código, de hecho, en el segundo día, mientras que la comprobación de la corrección de la simulación comienza justo después del inicio de la prueba. Para excluir esta asimetría, introduje una variable booleana start, con la que fijé todos los valores a comprobar al principio de la prueba.

  if (start)
   {
     curHi=NormalizeDouble(Bid,Digits);
     curLo=NormalizeDouble(Bid,Digits);
     curM1 = TimeMinute(TimeCurrent());
     curH1 = TimeHour(TimeCurrent());
     curD1 = TimeDay(TimeCurrent());
     start=false;
   }
Como puede ver, funciona sólo una vez y no afecta al EA. Más adelante, todo sucede según su algoritmo. Si no hace la inicialización primaria, entonces compruebe las cadenas

  if (curLo==0) Print("Curlo=",curLo);
  if (curHi==0) Print("curHi=",curHi);
dará el valor curLo=0, mientras que curHi no es igual a cero. La explicación es sencilla: ambas variables curLo y curHi son inicialmente iguales a cero, ya que no están inicializadas. En la primera tilde, la condición

  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
se dispara y curHi ya difiere de cero, porque la Oferta actual es mayor que cero. Al mismo tiempo, la Oferta actual no puede ser menor que cero (curLo no fue inicializado y por lo tanto es cero), y por lo tanto la condición

  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
no puede cambiar curLo de ninguna manera. Ejecute usted mismo mi versión del Asesor Experto y compruebe que el archivo de error Fu.xls sólo contiene una línea: la hora de la última cotización simulada en el probador.

Se adjunta el código completo en el post, mejor descargarlo ya que no cabe en el post.
Archivos adjuntos:
 

Gracias, por supuesto, a Rosh por su revisión, pero no creo que fuera necesaria.

Tal vez no te hayas dado cuenta, pero en mi código en la función init() hay el siguiente bloque:

  curHi=0.0;
  curLo=1000.0;
  curD1=-1;
  curH1=-1;
  curM1=-1;

Como resultado de la ejecución de este bloque, no se puede cumplir ninguna de las condiciones al inicio de la ejecución del EA.

if (mm!=curM1)
  {  if (hh!=curH1)
     {  if (dd!=curD1)
 

Por lo tanto, no importa en qué punto de la historia comience el EA, siempre será un nuevo minuto, una nueva hora o un nuevo día. Y el primer par de operadores del bloque mencionado explica el porqué de tu afirmación: "Se explica de forma sencilla: ambas variables curLo y curHi son inicialmente iguales a cero, porque no están inicializadas. Como el Bid en el primer tick es mayor que cero, pero menor que 1000, las dos sentencias condicionales correspondientes se activan necesariamente y las variables curLo y curHi obtienen los mismos valores iniciales que usted les asigna en el bloque if (start) {...}.

Su versión funciona igual de bien, pero no afecta al algoritmo de ninguna manera. Así que esta alteración no tendrá ningún efecto sobre la presencia o ausencia de errores.

Vuelve a tener en cuenta mi post anterior. El problema se produce no en la transición a un nuevo día y no en el inicio del EA, sino al probar el t/f H1. El problema se produce sólo una vez en este intervalo, el 10.08.2007 y dura 3 minutos, desde las 17:00 hasta las 17:03. Durante este tiempo se generan 28 ticks con divergencia de valores altos para M1 y H1. Le estoy mostrando la imagen apropiada.

Si no te resulta difícil, ejecuta el EA (el código que corregiste) en ese intervalo que te pedí. Sólo hay que corregir el uso de los comentarios. Ahora en tu código se compara con t/f D1 y no hay errores en este modo. Lo necesito para comparar con el H1.

 

He cambiado un poco el código, para mantener la corrección en casos especialmente patológicos (sólo tengo una vela en M1 para 2007.01.01, lo mismo para H1 y D1). Realicé la prueba desde el 01.01.2007 hasta el 08.11.2007. Obtuve 4 casos erróneos para D1 y 2 para H1. Todos los errores ocurren cuando me muevo a una nueva vela en un TF más alto. Los que quieran verlo por sí mismos.

No nos da posibilidades de mirar al futuro. Al menos en la variante mirona que he comprobado.

Archivos adjuntos:
future-2h.mq4  4 kb
 
Yurixx:

Gracias, por supuesto, a Rosh por su revisión, pero no creo que fuera necesaria.

Tal vez no te hayas dado cuenta, pero en mi código en la función init() hay el siguiente bloque:

  curHi=0.0;
  curLo=1000.0;
  curD1=-1;
  curH1=-1;
  curM1=-1;

Si no te resulta difícil, ejecuta el EA (el código que corregiste) en el intervalo que te pedí. Sólo hay que corregir el uso de los comentarios. Ahora en tu código se compara con t/f D1 y no hay errores en este modo. Lo necesito para comparar con el H1.


Si te has dado cuenta, al probar mi código en H1 los valores no se inicializan:
  if (Period()>PERIOD_M1)
  {  Print("Период тестирования не соответствует задаче");
     return(-1);
  }
  Print("Период тестирования ",Period()," минут");
  FileWrite(handle,"Date","Time","curHi","HiH1","curLo","LoH1");
  nn=D'2007.07.12 23:58:59';
  FileWrite(handle,TimeToStr(nn,TIME_DATE|TIME_SECONDS),
                   TimeSeconds(nn),TimeMinute(nn),TimeHour(nn),TimeDay(nn));
  nn=D'2007.07.13 00:58:59';
  FileWrite(handle,TimeToStr(nn,TIME_DATE|TIME_SECONDS),
                   TimeSeconds(nn),TimeMinute(nn),TimeHour(nn),TimeDay(nn));
  nn=D'2007.07.13 00:02:00';
  FileWrite(handle,TimeToStr(nn,TIME_DATE|TIME_SECONDS),
                   TimeSeconds(nn),TimeMinute(nn),TimeHour(nn),TimeDay(nn));
 
  curHi=0.0;
  curLo=1000.0;
  curD1=-1;
  curH1=-1;
  curM1=-1;

Es decir, será exactamente como lo escribí. Si te resulta difícil exponer el código para que no adivine de qué se trata, entonces tú mismo deberías entenderlo, yo tengo otras cosas que hacer, además de practicar la telepatía.
 

De verdad, no entiendo por qué te molestas.

Como escribí en la última página cuando publiqué el EA con los resultados, está pensado para hacer pruebas exclusivamente en la M1. Al mismo tiempo, compara el Máximo y el Mínimo que genera por sí mismo, con el Máximo y el Mínimo del t/f superior, que podría ser H1 o D1, dependiendo de ello, cómo están dispuestos los comentarios en el texto del procedimiento start().

Francamente, pensé que return(-1); en el procedimiento init( ) detendrá el trabajo del EA y por lo tanto será posible iniciarlo sólo en M1. Sin embargo, ahora, gracias a tu post, estoy convencido de que se puede ejecutar en cualquier TF: La idea detrás de este EA es tratar de espiar el futuro de un t/f inferior (específicamente M1) en un t/f superior (específicamente H1 o D1). Por lo tanto, sólo debe ejecutarse en M1. Lo que las pruebas en H1 podrían mostrar ni siquiera lo sé.

He publicado el código del EA justo antes de tu post. Este código se puede utilizar directamente para comparar los datos M1 con los datos H1. En el texto de la EA hay indicaciones claras de los cambios (elementales) que hay que hacer para que compare los datos M1 con los D1. Así que aquí también, no estoy seguro de qué es lo que te disgusta.

Una última cosa. Su código es tan adecuado para una prueba como el mío. Sólo es cuestión de conseguirlo.

Si tienes otras cosas que hacer, no te molestaré. No me dirigía a ti como petición personal, sino como representante de MQ en relación con el posible descubrimiento de algunos fallos en el probador.

 
Yurixx:

De verdad, no entiendo por qué te molestas.

Como escribí en la última página cuando publiqué el EA con los resultados, está pensado para hacer pruebas exclusivamente en la M1. Al mismo tiempo, compara el Máximo y el Mínimo que genera por sí mismo, con el Máximo y el Mínimo del t/f superior, que podría ser H1 o D1, dependiendo de ello, cómo están dispuestos los comentarios en el texto del procedimiento start().

Francamente, pensé que se detendrá el trabajo del Asesor Experto y será posible iniciarlo sólo en M1. Sin embargo, ahora, gracias a tu post, estoy convencido de que se puede ejecutar en cualquier TF: La idea detrás de este EA es tratar de espiar el futuro de un t/f inferior (específicamente M1) a un t/f superior (específicamente H1 o D1). Por lo tanto, sólo debe ejecutarse en M1. Lo que las pruebas en H1 podrían mostrar ni siquiera lo sé.

He publicado el código del EA justo antes de tu post. Este código se puede utilizar directamente para comparar los datos M1 con los datos H1. En el texto de la EA hay indicaciones claras de los cambios (elementales) que hay que hacer para que compare los datos M1 con los D1. Así que aquí también, no estoy seguro de qué es lo que te disgusta.

Una última cosa. Su código es tan adecuado para una prueba como el mío. Sólo es cuestión de conseguirlo.

Si tienes otras cosas que hacer, no te molestaré. No me dirigía a ti como petición personal, sino como representante de MQ en relación con el posible descubrimiento de algunos fallos en el probador.

No entiendo qué marco temporal debo utilizar para ejecutar esta prueba. Lo he ejecutado en tres plazos sin intervenir en el código.

2007.08.14 16:29:03 2007.08.10 23:59 future-2h EURUSD,Daily: Trabajo terminado
2007.08.14 16:29:03 2007.08.10 23:59 future-2h EURUSD,Daily: 2007.08.10 23:59:59, curHi=1.3693, HiH1=1.3702, curLo=1.3693, LoH1=1.3689
2007.08.14 16:29:02 2007.08.03 23:59 EURUSD,Diario: 2007.08.03 23:59:59, curHi=1.3773, HiH1=1.3787, curLo=1.3773, LoH1=1.3772
2007.08.14 16:29:02 2007.07.27 23:59 EURUSD,Diario: 2007.07.27 23:59:59, curHi=1.3635, HiH1=1.3641, curLo=1.3635, LoH1=1.3627
2007.08.14 16:29:02 2007.07.20 23:59:59 EURUSD,Diario: 2007.07.20 23:59:59, curHi=1.3826, HiH1=1.3827, curLo=1.3826, LoH1=1.3821
2007.08.14 16:29:01 2007.07.16 23:59:59 EURUSD,Diario: 2007.07.16 23:59:59, curHi=1.3772, HiH1=1.3773, curLo=1.3772, LoH1=1.3772
2007.08.14 16:29:01 2007.07.13 23:59:59 EURUSD,Diario: 2007.07.13 23:59:59, curHi=1.3782, HiH1=1.3787, curLo=1.3782, LoH1=1.3780
2007.08.14 16:29:01 2007.07.06 23:59:59 EURUSD,Diario: 2007.07.06 23:59:59, curHi=1.3625, HiH1=1.3630, curLo=1.3625, LoH1=1.3623
2007.08.14 16:29:01 2007.07.02 00:00 EURUSD,Diario: El periodo de prueba no es apropiado
2007.08.14 16:29:01 future-2h iniciado para pruebas
2007.08.14 16:28:34 2007.08.10 22:59 future-2h EURUSD,H1: Trabajo terminado
2007.08.14 16:28:32 2007.07.02 00:00 future-2h EURUSD,H1: El periodo de prueba no es apropiado
2007.08.14 16:28:32 future-2h iniciada para pruebas
2007.08.14 16:28:22 2007.08.10 22:59 future-2h EURUSD,M1: Trabajo terminado
2007.08.14 16:28:19 2007.07.02 00:00 futuro-2h EURUSD,M1: Periodo de prueba de 1 minuto
2007.08.14 16:28:19 future-2h iniciado para pruebas
2007.08.14 16:24:28 2007.08.10 22:59 future-2h EURUSD,M1: Trabajo terminado
2007.08.14 16:24:28 2007.08.06 00:00 futuro-2h EURUSD,M1: Periodo de prueba de 1 minuto
 
Ahora cambia
  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
  HiH1 = iHigh(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  LoH1 =  iLow(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  //HiH1 = iHigh(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1
  //LoH1 =  iLow(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1

a

  else if (hh!=curH1)
  {  //curHi=NormalizeDouble(Bid,Digits);  // Закомментировать при тесте D1
     //curLo=NormalizeDouble(Bid,Digits);  // Закомментировать при тесте D1
     curH1=hh;
     curM1=mm;
  }
  else if (mm!=curM1) curM1=mm;
  
  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
  //HiH1 = iHigh(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  //LoH1 =  iLow(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  HiH1 = iHigh(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1
  LoH1 =  iLow(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1
y lo probé de nuevo para tres períodos del mismo intervalo de tiempo 2007.07.01 a 2007.08.11:
<br/ translate="no">
2007.08.14 16:32:03 2007.08.10 23:59 future-2h EURUSD,Daily: Trabajo terminado
2007.08.14 16:32:03 2007.07.27 23:59 future-2h EURUSD,Daily: 2007.07.27 23:59:59, curHi=1.3753, HiH1=1.3753, curLo=1.3627, LoH1=1.3626
2007.08.14 16:32:01 2007.07.02 00:00 future-2h EURUSD,Daily: El periodo de prueba no es apropiado
2007.08.14 16:32:01 future-2h iniciado para la prueba
2007.08.14 16:31:56 2007.08.10 22:59 future-2h EURUSD,H1: Trabajo terminado
2007.08.14 16:31:54 2007.07.02 00:00 future-2h EURUSD,H1: El periodo de prueba no cumple con la tarea
2007.08.14 16:31:54 future-2h iniciado para la prueba
2007.2007.08.14 16:31:48 2007.08.10 22:59 future-2h EURUSD,M1: Trabajo finalizado
2007.08.14 16:31:46 2007.07.02 00:00 future-2h EURUSD,M1: Periodo de pruebas 1 minuto
2007.08.14 16:31:46 future-2h iniciado para pruebas
¿Qué dice? Tengo que volver a analizar el código para comprobar la presencia/ausencia de errores.
 

Ya veo. Lo has hecho todo bien. Y este EA tiene que ser ejecutado sólo en M1. Creo que lo escribí con bastante claridad. El Asesor Experto se ejecuta en M1 y probará la coincidencia de los datos altos y bajos del período M1 con el período H1 o D1. Si hubiera un vistazo al futuro, entonces los datos senior t/f le permitirían conocer el máximo y el mínimo antes de que esos máximos y mínimos se alcancen en M1. Eso es todo.

El resultado de tu prueba D1 coincide con el mío, en este intervalo para D1 tampoco obtuve errores. Pero la prueba H1 no confirma lo que obtuve y publiqué un poco antes. No es necesario analizar el código. Como ves confirma el funcionamiento normal del probador.

Si crees que es suficiente, puedes parar aquí. Si quieres asegurarte de que no es por accidente, y no porque el periodo sea demasiado pequeño, entonces haz las mismas dos pruebas en un periodo más largo. Por ejemplo, desde hace un año, o desde principios de 2007.

PS

Por si acaso, lo repetiré. Prueba sólo en el periodo M1. Sólo en el modo de todos los ticks.

Gracias por su participación.

 
Gracias por los EAs de prueba, a veces es difícil idear uno propio, ya que hay muchas opciones de prueba y no siempre se sabe qué probar. Y el fastidio... Uno se enfada más a menudo con los suyos, porque espera que lo entiendan. Te vuelves involuntariamente más duro, y donde perdonas a los demás, te frustras con los tuyos. Lo siento.

Estas pruebas realmente ayudan a mejorar el probador de MetaTrader 4. Especialmente con el código fuente.
Razón de la queja: