Archivo de la versión MT.

 

Estimados amigos, les propongo crear aquí un archivo de versiones de MT. A veces, con las actualizaciones pueden producirse errores inesperados y hay que volver a una versión anterior...

Necesito construir el 2007 ahora. ¿Lo tienes? Compártelo, por favor.

 
Сергей Таболин:

Estimados amigos, les propongo crear aquí un archivo de versiones de MT. A veces, con las actualizaciones pueden producirse errores inesperados y hay que volver a una versión anterior...

Necesito construir el 2007 ahora. ¿Lo tienes? Compártelo, por favor.

Hay un hombre aquí que está construyendo una colección. Pero, por lo que recuerdo, a veces se borran sus posts con enlaces a los archivos de la versión MT para no ralentizar el progreso. ))

 


mi enlace fue asesinado aquí,

los desarrolladores sugieren que se descargue sólo de fuentes verificadas

si quieres arriesgarte a mi construcción, sólo tienes que escribirme.

debe mantener el trabajo estable en el portal o el archivo y actualizar conscientemente a las construcciones de prueba

debe ser muy consciente de la actualización a las últimas construcciones.

 
Fast235:

mi enlace fue asesinado aquí,

los desarrolladores sugieren que se descargue sólo de fuentes verificadas

si quieres arriesgarte a mi construcción, sólo tienes que escribirme.

debe mantener el trabajo estable en el portal o el archivo y actualizar conscientemente a las construcciones de prueba

debe mantener el trabajo estable en el portátil o en el archivo y, en general, estar al tanto de las actualizaciones de las compilaciones de prueba

Hacen bien en eliminar las versiones antiguas.

Hay que escribir programas normales. No ignore las advertencias. Inicializa las variables y no utilices las globales en la medida de lo posible. Evite los fragmentos potencialmente peligrosos en el código.

Tengo decenas de miles de líneas de código - ni una sola advertencia en modo estricto. La mitad de mis proyectos de base de código tienen advertencias incluso sin estricto, aunque ni siquiera contienen miles de líneas. Y luego empiezas a quejarte de que "todo funcionaba en la antigua compilación y dejó de funcionar en la nueva"...

 
Georgiy Merts:

Hacen bien en eliminar las versiones antiguas.

Hay que escribir los programas correctamente. No ignore las advertencias. Inicialice las variables y no utilice las globales en la medida de lo posible. Evite los fragmentos potencialmente inseguros en el código.

No tengo ni una sola advertenciaen decenas de miles de líneas de código en modo estricto. La mitad de mis proyectos de código base tienen advertencias incluso sin estricto, aunque no hay ni mil cadenas en ellos. Y luego empiezas a quejarte de que "todo funcionaba en la antigua compilación y dejó de funcionar en la nueva"...

¿Es el programa Mars Rover? ¿Qué se puede describir en tantas líneas?

 
Sergey Basov:

Hay una persona aquí que está construyendo una colección. Pero, por lo que recuerdo, sus posts con enlaces a los archivos de la versión MT se borran a veces para no ralentizar el progreso. ))

Gracias. Lo he descargado.

Fast235:

el enlace mató a mi enlace aquí,

Los desarrolladores sugieren que sólo se descargue de fuentes verificadas.

Si quieres arriesgarte con mi construcción, escríbeme.

debe mantener el trabajo estable en el portal o el archivo y actualizar conscientemente a las construcciones de prueba

Estoy en DC ahora con la construcción de 2007 tal vez.

No estoy actualizando en las construcciones de prueba. Pero ahora ahorraré))).

Georgiy Merts:

Hacen bien en eliminar las versiones antiguas.

Hay que escribir los programas correctamente. No ignore las advertencias. Inicializa las variables y no utilices las globales en la medida de lo posible. Evite los fragmentos potencialmente inseguros en el código.

Tengo decenas de miles de líneas de código y ni una sola advertencia en el modo estricto. La mitad de mis dummies de base de código muestran advertencias incluso sin estricto, aunque no contienen ni mil cadenas. Y luego empiezas a quejarte de que "todo funcionaba en la antigua compilación y dejó de funcionar en la nueva"...

George, lee mi último post en el hilo. He encontrado el origen del problema. No está en mi código.

 
Сергей Таболин:

Gracias. Descargado.

No actualizo a los de prueba. Pero ahora ahorraré))).

George, lee mi último post en el hilo. He encontrado el origen del problema. No está en mi código.

Lo he leído.

El origen del problema es que los desarrolladores y tú habéis enfocado la situación de forma ligeramente diferente. Por eso insisto en que el código debe ser siempre muy sencillo y claro, salvo en los lugares donde pueda haber ambigüedades.

Recuerdo que, en los días en que MT5 estaba abriéndose camino, me sorprendió que la gente utilizara variables sin inicializar, pensando que contendrían cero.

Uno no puede evitar recordar un chiste:

Pinocho le dio a Pinocho tres manzanas. Se comió dos. ¿Cuántas manzanas quedan?

Programador N1:
- No sabe cuántos. ¡Nadie sabe cuántas manzanas tenía antes!

Moraleja: despejar las variables iniciales.


Programador N2
- No está claro cuántos. ¿Quizás mientras Malvina regalaba las manzanas, Pierrot también las comía?

Moraleja: no utilices variables globales.

Programador N3
- Se desconoce el número. No dice que Pinocho comiera exactamente manzanas, dice que comió dos, pero no está claro cuáles. Además, dado que el nombre "Pinocho" no se declina, Pinocho y Pinocchio son variables diferentes.


Moraleja: cuida tu sintaxis

 
Сергей Таболин:

Gracias. Descargado.

No actualizo a los de prueba. Pero ahora ahorraré))).

George, lee mi último post en el hilo. He encontrado el origen del problema. No está en mi código.

Y el origen del problema fue "no leer la documentación", no la nueva compilación. Así que estás siendo astuto al decir que no es tu código.

1:

Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio

¿Qué quieres hacer ahora?

Sergey Tabolin, 2019.06.16 00:17

He encontrado la razón de esta indignación.

El asunto es este:

//--- пропустить бесполезные проходы оптимизации
//*
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(period_HMA7C == 0 && move_profit)                                                            TesterStop();
      if(period_HMA7C == 0 && move_stop)                                                              TesterStop();
      if(period_HMA7C == 0 && shift_correction_HMA7C != 5)                                            TesterStop();
      if(indent_channel_line_a0 == 0.0 && indent_channel_line_a4 != 0.0)                              TesterStop();
      if(indent_channel_line_a4 == 0.0 && indent_channel_line_a0 != 0.0)                              TesterStop();
      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))  TesterStop();
      check_init = true;
   }
//*/

Resulta que después de TesterStop(), OnTester() también se lanza en la nueva versión, aunque no debería lanzarse.

Naturalmente, no se preparan datos y eso es lo que obtenemos.

La culpa es de MT 2085.

2:

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias de comercio

¿Qué debo hacer ahora?

Sergey Tabolin, 2019.06.16 09:02

Disculpas. La descripción sólo dice que después se llama a OnTester(). (((

También tengo que hacer comprobaciones allí. Intentaré sustituirlo por ExpertRemove()...

Y entonces lo "intentaré" de nuevo. Y luego, si sus intentos son infructuosos, ¿es de nuevo culpa de MQ?

No lo recuerdo, pero creo que hay una función especial para saltarse los pases "malos". Y justo lo que quieres probar, los desarrolladores no recomendaron usar - de nuevo - si mi memoria no me falla.

Pero lo importante de mi mensaje es que antes de echar la culpa a los desarrolladores, primero hay que leer la documentación, pedir una solución en el foro, y sólo entonces, y sólo si realmente se encuentra el error, escribir un informe de error con un código mínimo que lo reproduzca. Eso sería grave, pero por lo demás...

 
Artyom Trishkin:

Y el origen del problema fue "no leer la documentación", no la nueva compilación. Así que estás mintiendo sobre que el código no es tuyo.

1:

2:

Y entonces pasas a "intentarlo" de nuevo... Y luego, si sus intentos son infructuosos, ¿es de nuevo culpa de MQ?

No lo recuerdo, pero creo que hay una función especial para saltarse los pases "malos". Y justo lo que quieres probar, los desarrolladores no recomendaron usar - de nuevo - si mi memoria no me falla.

Pero lo que es importante en mi mensaje - antes de echar la culpa a los desarrolladores, deberías primero leer la documentación, pedir una solución en el foro, y sólo entonces, y sólo en el caso de un fallo realmente encontrado - escribir un informe de fallo con la reproducción del mismo con un código mínimo. Eso sería grave, pero por lo demás...

Artyom, ¡el problema está en la nueva construcción!

Dime, aquí has escrito un código que funciona sin errores. Funciona durante mucho tiempo. Y de repente, después de la nueva versión de MT se bloquea con un montón de errores. ¿De quién es la culpa? Más aún teniendo en cuenta que la documentación, como muchos saben, no siempre está a la altura de las innovaciones.

Entonces, mi código funcionó sin errores.

Usé esto:

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias

¿Por qué sustituir INIT_PARAMETERS_INCORRECT? Encontré la solución )))

Sergey Tabolin, 2019.04.24 08:48

Encontré la respuesta a mi propia pregunta en el hilo:

Resultó ser bastante sencillo. Basta con trasladar la comprobación de parámetros no válidos de OnInit() a OnTick()

bool                 check_init              = false;                // флаг проверки входных параметров
..........
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
//*
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(period_HMA7C == 0 && move_profit)                                 ExpertRemove();
      if(period_HMA7C == 0 && move_stop)                                   ExpertRemove();
      if(period_HMA7C == 0 && shift_correction_HMA7C != 5)                 ExpertRemove();
      check_init = true;
   }
//*/ 
//+------------------------------------------------------------------+ 

¡Comprobado! Funciona. La genética no falla ))))

Ahora, tras aparecer problemas, he añadido un par de líneas más:

bool                 check_init              = false;                // флаг проверки входных параметров
bool                 tester_stop             = true;                 // флаг проверки выхода по TesterStop
.............
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
//*
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(period_HMA7C == 0 && move_profit)                                                            TesterStop();
      if(period_HMA7C == 0 && move_stop)                                                              TesterStop();
      if(period_HMA7C == 0 && shift_correction_HMA7C != 5)                                            TesterStop();
      if(indent_channel_line_a0 == 0.0 && indent_channel_line_a4 != 0.0)                              TesterStop();
      if(indent_channel_line_a4 == 0.0 && indent_channel_line_a0 != 0.0)                              TesterStop();
      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))
      {
         Print("Результат в OnTester() должен быть -99999999999.99");
         TesterStop();
      }
      check_init  = true;
      tester_stop = false;
   }
//*/
.........
}
Вызов TesterStop() считается нормальным завершением тестирования, и поэтому будет вызвана функция OnTester() 
с отдачей тестеру стратегий всей накопленной торговой статистики и значения критерия оптимизации.

Se supone, por razonamiento, que la transferencia debe ejecutarse inmediatamente, sin ejecutar el resto del código. ¿Verdad?

De hecho, TesterStop() no detiene la prueba en absoluto.

double OnTester()
{
   if(tester_stop) return(-99999999999.99);
   
   double   equity_dd_percent             = TesterStatistics(STAT_EQUITY_DDREL_PERCENT);
   if(equity_dd_percent > 0.0)
   {
      equity_dd_percent = 100.0 / equity_dd_percent;
   }
   else     equity_dd_percent    = 1.0;
   
   double   param                         = 0.0;
   double   profit                        = TesterStatistics(STAT_PROFIT);
   double   stability                     = 0.0;
   int      balance_arr_size              = ArraySize(balance_arr) - 1;
   int      alpha_size                    = balance_arr_size - 1;
   int      beta_size                     = alpha_size - 1;
   double   trade2time                    = ratioTrades2Time(TesterStatistics(STAT_TRADES));
   double   max_balance                   = balance_arr[0];
//+-------------------   
   if(balance_arr[balance_arr_size-1] - balance_arr[0] == 0.0) return(-99999999999.88);
//+-------------------   

He introducido un parámetro "no válido" y he obtenido este resultado:

LL      0       11:30:20.816    Core 1  2016.10.01 00:00:00   Советник получил MAGIC = 153128312914612747.
QN      0       11:30:20.816    Core 1  2016.10.03 00:00:00   Результат в OnTester() должен быть -99999999999.99
NJ      3       11:30:20.816    Core 1  TesterStop() called on 0% of testing interval
CD      0       11:30:20.816    Core 1  final balance 10000.00 USD
QF      0       11:30:20.816    Core 1  OnTester result -99999999999.88

¡Así que esto es un bug! Y esto es exactamente el bug de MQ.

Creo que TesterStop() yExpertRemove() deberían devolver true si no pueden pasar inmediatamente el control a OnTester(). Permitirá reaccionar de alguna manera, por ejemplo, así:

bool                 tester_stop = false;                 // флаг проверки выхода по TesterStop
.......
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(недопустимый параметр)          tester_stop = TesterStop();
........
}
double OnTester()
{
   if(tester_stop) return(-99999999999.99);

En este caso podemos obtener exactamente el resultado que lógicamente se espera, en lugar de dar vueltas y prever todos los errores que teóricamente podrían producirse como consecuencia de la detención de la prueba.

 
Сергей Таболин:

Artyom, ¡el problema está en la nueva construcción!

Dime, aquí has escrito un código que funciona sin errores. Funciona durante mucho tiempo. Y de repente, después de la nueva versión de MT se bloquea con un montón de errores. ¿De quién es la culpa? Más aún teniendo en cuenta que la documentación, como muchos saben, no siempre está a la altura de las innovaciones.

Entonces, mi código funcionó sin errores.

Usé este:

Ahora, tras algunos problemas, he añadido un par de líneas más:

La transferencia se supone, inteligentemente, que se hace inmediatamente, sin ejecutar el resto del código. ¿Verdad?

Pero en realidad TesterStop() no detiene la prueba en absoluto.

He introducido un parámetro "no válido" y he obtenido este resultado:

¡Así que esto es un bug! Y esto es exactamente el bug de MQ.

Creo que TesterStop() yExpertRemove() deberían devolver true si no pueden pasar inmediatamente el control a OnTester(). En tal caso, será posible reaccionar de alguna manera, por ejemplo, así:

En este caso, será posible obtener exactamente el resultado que lógicamente se espera, en lugar de dar vueltas y prever todos los errores que teóricamente podrían producirse como consecuencia de la detención de la prueba.

Todos sus cálculos y pruebas no deberían mostrarse a mí, y no con cierto sarcasmo e irritación, sino de forma seca y concisa en el hilo"Errores, fallos, preguntas". A no ser que, por supuesto, quieras ser escuchado y obtener una respuesta.

ZS. Y preferiblemente olvídese de palabras como "bug", "fallo", "bailar con pandereta" y otros "shitcodes" en los informes de errores - todos los humanos, y usted no está exento de errores. Y las declaraciones "psicóticas" no parecen muy serias ni constructivas.

 
Artyom Trishkin:

Todos sus cálculos y pruebas no deberían mostrarse a mí, y no con cierto sarcasmo e irritación, sino de forma seca y concisa en el hilo"bugs, bugs, questions". A no ser que, por supuesto, quieras ser escuchado y obtener una respuesta.

Lamento que te sientas así. Hay irritación, por supuesto, pero ¿cómo no iba a haberla cuando los problemas surgen de la nada? Y el sarcasmo... - Me desconcierta más lo que considero que son meteduras de pata evidentes. ))

En cuanto al tema en cuestión, me parece que la pregunta podría "perderse" fácilmente ahí. Entonces, ¿creo que un nuevo tema con un problema específico es más efectivo? ¿O no?

En cualquier caso, usted, como moderador, puede más bien llamar la atención de los desarrolladores sobre algunos problemas, si usted mismo está convencido de su existencia )))

Intentaré añadir una pregunta allí...