Archivo de la versión MT. - página 2

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

La suposición inteligente es que la transferencia debe hacerse inmediatamente, sin ejecutar el resto del código. ¿Verdad?

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

Se espera que si se debe detener la ejecución del código sólo se escriba return y no habrá más ejecución. TesterStop(), así como ExpertRemove()

El Asesor Exper to no se detendrá inmediatamente cuando se llame a ExpertRemove(), sólo se levanta una bandera para detener el trabajo del Asesor Experto. Es decir, el Asesor Experto no manejará ningún evento siguiente, llamará a OnDeinit() y lo descargará del gráfico.

Y el segundo defecto observado es que

tester_stop = false;

no está en su sitio en absoluto.

 
Alexey Viktorov:

Se espera que si quieres detener la ejecución del código, sólo debes escribir return y no habrá más ejecución. TesterStop() así como ExpertRemove()

Y el segundo error que hemos observado es que

no está en su sitio en absoluto.

El siguiente evento es OnTick() ?

¿A dónde sale OnTick()?

¿Por qué está fuera de lugar? Se esperaba que si se disparaba TesterStop(), la ejecución no llegara a esta línea.

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

El siguiente evento es OnTick() ?

¿De dónde toma la salida OnTick()?

¿Por qué no se ha puesto en marcha? Se esperaba que si se disparaba TesterStop(), la ejecución no llegara a esta línea.

Dónde salir y qué continuar depende del desarrollador.

      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;

La bandera tester_stop en este código se pondrá en falso independientemente de que se ejecute o no TesterStop()

 
Alexey Viktorov:

Dónde ir y qué continuar depende del promotor.

En este código, la bandera tester_stop tomará false independientemente de que se ejecute o no TesterStop()

Ya lo tengo)))

La pregunta es ¿qué hacer? ¿Cómo detener la prueba? Para ser más específicos. Los desarrolladores casi maldicen cuando usanINIT_PARAMETERS_INCORRECT en OnInit() y se lleva por delante la genética.

He encontrado una salida y no he tenido problemas hasta hace poco. Y ahora... Oh, querida ))))

¿Y todavía dónde puedo salir de OnTick()?

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

Ya lo tengo)))

La pregunta es ¿qué hacer? ¿Cómo se detiene la prueba? Para ser más específicos. Los desarrolladores casi maldicen cuando usanINIT_PARAMETERS_INCORRECT en OnInit() y se lleva por delante la genética.

He encontrado una salida, pero no hemos tenido problemas recientemente. Y ahora... Oh, querida ))))

Bueno, si entiendes cuál es el problema...

         TesterStop();
      tester_stop = false;
      return;

Todo el código, después de ejecutar TesterStop, no se ejecutará. Es decir, dejará de funcionar inmediatamente. Yendo más allá, podemos ajustar la bandera tester_stop...

Otra pregunta: ¿Qué es este número? ¿Menos muchos nueves es un intento de conseguir algo de dolor adicional? Ahí es donde se pone realmente feo...

 
Alexey Viktorov:

Bueno, si entiendes cuál es el problema que queda?

Todo el código, después de ejecutar TesterStop, no se ejecutará. En otras palabras, dejará de funcionar inmediatamente. A partir de ahí, podemos regular usando la bandera tester_stop...

Otra pregunta: ¿Qué es este número? ¿Menos muchos nueves es un intento de conseguir algo de dolor adicional? Ahí es donde se pone realmente feo...

Menos un montón de nueves es determinar que la salida fue exactamente por TesterStop(). Lo uso sólo como sustituto deINIT_PARAMETERS_INCORRECT. Por eso no necesito todo lo demás después. Pero lo que ocurre ahora es que se ejecuta todo el código y el programador obtiene el error de división por cero. Claro, si una matriz tiene tamaño 1, el valor de la segunda menos el valor de la primera siempre será cero. Y no me había asegurado contra este error, o, oh, perdón, malentendido.

Intenté insertar el retorno... Sólo un poco mal ))) :

      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))
      {
         Print("Результат в OnTester() должен быть -99999999999.99");
         TesterStop();
         return;
      }

Terminé con:

DM      0       15:32:01.518    Core 1  2016.10.01 00:00:00   153128312914612747
PE      0       15:32:01.518    Core 1  2016.10.01 00:00:00   Советник получил MAGIC = 153128312914612747.
IF      0       15:32:01.518    Core 1  2016.10.03 00:00:00   Результат в OnTester() должен быть -99999999999.99
RS      3       15:32:01.518    Core 1  TesterStop() called on 0% of testing interval
GK      0       15:32:01.518    Core 1  final balance 10000.00 USD
JM      0       15:32:01.518    Core 1  OnTester result -99999999999.99001

Simplemente impresionante ))))

¡¡¡El más grande GRACIAS!!!

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

Menos un montón de nueves es determinar que la salida fue exactamente por TesterStop(). Lo uso sólo como sustituto deINIT_PARAMETERS_INCORRECT. Por eso no necesito todo lo demás después. Pero lo que ocurre ahora es que se ejecuta todo el código y el programador obtiene el error de división por cero. Claro, si una matriz tiene tamaño 1, el valor de la segunda menos el valor de la primera será siempre cero. Y no me había asegurado contra este error, o, oh, perdón, malentendido.

Intenté insertar el retorno... Sólo un poco mal ))) :

Terminé con:

Simplemente impresionante ))))

¡¡¡UN ENORME AGRADECIMIENTO!!!

Sergei Tabolin:

Gracias, ya lo tengo. Pero no resuelve el problema. Se puede resolver mediante la constanteMQL_TESTER_STOP, o cambiando el valor de retorno de void a bool.

Una solución inesperada fue sugerida porAlexey Viktorov: si se utiliza return después de TesterStop(), todo parece estar bien. Cómo y por qué sucede, personalmente no puedo entenderlo. Sin embargo...

A partir de aquí, añade este punto a la documentación o cambiavoid por bool.

P.D. He encontrado este problema en la versión 2085. Antes no había ningún problema. ¿Me dice algo? )))

Sergey, no hay nada inesperado en esto. Por el contrario, es lógico y coherente. Hay diferentes casos. A veces hay que terminar de procesar el evento antes de que termine el Asesor Experto, y a veces, como en tu caso, hay que terminarlo enseguida. Los desarrolladores se enfrentan a la pregunta de qué es lo correcto, si parar inmediatamente, provocando el descontento de los que necesitan terminar de procesar el evento, o parar después de la finalización del procesamiento del evento. Cualquier programador tiene el operador de retorno en su arsenal, mientras que no hay nada en caso de terminación forzada.

Y por qué necesitas cambiar el tipo void en el bool, pues de nuevo, en el arsenal del programador hay variables estáticas que se pueden cambiar antes o después de TesterStop (), y en principio, todo será como quieras. Y lo dejaste fuera de mi ejemplo por alguna razón.

 
Alexey Viktorov:

Sergey, no hay nada inesperado en ello. Por el contrario, todo es lógico y coherente. Hay diferentes casos. A veces hay que terminar de procesar el evento antes de que termine el Asesor Experto, y a veces, como en tu caso, hay que terminarlo enseguida. Los desarrolladores se enfrentan a la pregunta de qué es lo correcto, si parar inmediatamente, provocando el descontento de los que necesitan terminar de procesar el evento, o parar después de la finalización del procesamiento del evento. Cualquier programador tiene el operador de retorno en su arsenal, mientras que no hay nada en caso de terminación forzada.

Y por qué necesitas cambiar el tipo void en el bool, pues de nuevo, en el arsenal del programador hay variables estáticas que se pueden cambiar antes o después de TesterStop (), y en principio, todo será como quieras. Y lo dejaste fuera de mi ejemplo por alguna razón.

Alexey, muchas gracias por tu ayuda.

Entiendo el problema al que se enfrentan los desarrolladores y por eso sugiero esta solución. Ser capaz de reaccionar correctamente ante la situación.

En cuanto a las variables estáticas y tu ejemplo, que he "desechado"... Lo siento, pero no entiendo muy bien de qué estamos hablando. Explícamelo, si no te importa.

Y pide un poco de indulgencia y paciencia. Tengo una situación vital muy mala que puede hacerme muy irritable (soy consciente de ello pero no puedo hacer nada al respecto) y poco atento.

No lo entiendo en absoluto. La cabeza me da vueltas...

He aquí un ejemplo:

Mi código muestra que si el último valor de la matriz menos el primer valor de la matriz es cero temprano, el resultado debe ser -99999999999.88.

Pero durante la optimización obtengo este resultado:

2019.06.16 16:27:09.847 Core 1  final balance 9587.10 USD
2019.06.16 16:27:09.847 Core 1  OnTester result -99999999999.88

9587 - 10000 no es en absoluto igual a cero y el resultado es -9999999999999.88. ¿Cómo? Ya se me está colgando...

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

Alexey, muchas gracias por tu ayuda.

Entiendo el problema al que se enfrentan los desarrolladores y por eso sugiero esta solución. Ser capaz de reaccionar correctamente ante la situación.

En cuanto a las variables estáticas y tu ejemplo, que he "desechado"... Lo siento, pero no entiendo muy bien de qué estamos hablando. Explícamelo, si no te importa.

Y pide un poco de indulgencia y paciencia. Tengo una situación vital muy mala que puede hacerme muy irritable (soy consciente de ello pero no puedo hacer nada al respecto) y poco atento.

No lo entiendo en absoluto. La cabeza me da vueltas...

He aquí un ejemplo:

Mi código muestra que si el último valor de la matriz menos el primer valor de la matriz es cero temprano, el resultado debe ser -99999999999.88.

Pero durante la optimización obtengo este resultado:

9587 - 10000 no es en absoluto igual a cero y el resultado es -9999999999999.88. ¿Cómo? Se me está colgando...

No sé si es bueno o malo, pero nunca me meto en todo el código, por eso hablaba de una variable estática. Y a juzgar por el hecho de que la bandera tester_stop se utiliza en diferentes partes del programa, esta bandera debe ser declarada a nivel de variables globales.

Confirma que has "desechado" sin razón el cambio de valor de la bandera de mi ejemplo.

Este es el uso de

   if(tester_stop) return(-99999999999.99);

Y aparentemente esta bandera o no cambia en absoluto, o no cambia porque el cambio no se proporciona donde debería.

 
Alexey Viktorov:
A veces es necesario terminar el procesamiento de eventos antes de que el asesor termine.

Cualquier programador tiene el operador return en su arsenal, pero no hay nada en la terminación forzada.


En este contexto, ¿no podemos hacer una comprobación?

if(IsStopped())
if(!IsStopped())
Razón de la queja: