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

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

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 pueden producirse como consecuencia de la detención de la prueba.

Y esta es la opción que querías ver.

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

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

¿Y cómo evitamos/cancelamos la terminación forzada si ya está en marcha? Sus ejemplos son un poco diferentes.
 
Alexey Viktorov:
¿Y cómo se evita/cancela la terminación forzada si ya está en marcha? Sus ejemplos son un poco diferentes.

No provoques un despido forzoso. Entonces no hay necesidad de cancelarlo.

Probablemente, forzar la finalización que ya se está ejecutando, la cancelación no tiene sentido debido a los posibles fallos de software.
Por esta razón, es probable que no exista tal posibilidad. No puedo asegurarlo.
Esto significa que debemos organizar lógicamente nuestro código de tal manera que no necesitemos volver al código en ejecución de nuevo después de forzar la terminación.
Si renunciamos, lo hacemos explícitamente.

 
Roman:

Es poco probable que una terminación forzada que ya ha sido activada tenga sentido cancelarla debido a posibles fallos de software.
Por lo tanto, es probable que no exista tal opción. No puedo asegurarlo.
Esto significa que debemos organizar lógicamente nuestro código de tal manera que no necesitemos volver al código en ejecución de nuevo después de forzar la terminación.
Si renunciamos, lo hacemos explícitamente.

De alguna manera me da la impresión de que no has leído todo el tema. Hay algo que no coincide con tu opinión sobre el problema en cuestión.

ps; Aunque no. En tu primer post de este hilo parecías citar mis palabras exactas, pero no completamente. Tal vez por ello la idea del problema cambió.
 
Cualquiera que sea la pregunta, esa es la respuesta. Hablad con vosotros mismos, entonces. Intentas meterte en el problema y a la gente sigue sin gustarle. Buena suerte para encontrar el problema.
 
Alexey Viktorov:

Y esta es la versión que querías ver.

Así es.

Pero no es

if(недопустимый параметр)          tester_stop = TesterStop();

más sencillo y claro que...

if(недопустимый параметр)
       {
        TesterStop();
        tester_stop = true;
        return;
       }

?

Pero ahora he hecho exactamente lo que me aconsejaste.

 
Roman:
Tales preguntas y tales respuestas. Podéis discutirlo con vosotros mismos. Intentas meterte en un problema y a la gente sigue sin gustarle. Buena suerte para encontrar el problema.

No deberías ofenderte. Había que leer toda la frase para entenderla.

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

Archivo de la versión MT.

Alexey Viktorov, 2019.06.16 15:25

Sergey, no hay nada inesperado. Por el contrario, todo es lógico y coherente. Hay diferentes casos. A veces hay que completar el procesamiento del evento antes de que el Asesor Experto termine su trabajo, a veces, como en su caso, hay que terminarlo urgentemente. 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. Pero lo has omitido en mi ejemplo por alguna razón.

y sólo has sacado la segunda parte de contexto sin prestar atención a la primera.
 
Сергей Таболин:

Así es.

Pero, ¿no es

más sencillo y claro que...

?

Pero ahora he hecho exactamente lo que me aconsejaste.

Puede que sea más sencillo y claro, pero exigir a los desarrolladores algo que se puede escribir fácilmente uno mismo es un error. Por alguna razón no creo que se escriba ninguna adición al lenguaje sobre C++ y se demande. Y los comentarios, estoy seguro, son suficientes para muchos.

 
Alexey Viktorov:

Puede ser más sencillo y claro, pero es un error exigir a los desarrolladores algo que pueden escribir fácilmente ellos mismos. Por alguna razón, no creo que se escriba ninguna adición al lenguaje sobre C++ y se demande. Y los comentarios, estoy seguro, son suficientes para muchos.

Aquí tienes una comprobación de tu opción. Terminó con un mensaje como este:

2019.06.16 18:49:25.464 Core 1  TesterStop() called on 0% of testing interval

Es un callejón sin salida...

 
Alexey Viktorov:

No deberías ofenderte. Había que tener la frase completa para entenderla.

y sólo has sacado la segunda parte de contexto sin prestar atención a la primera.

Al poner un ejemplo con IsStopped(), intentaba responder a la primera parte.
A veces es necesario completar la tramitación del evento antes de completar una EA, a veces es urgente como en tu caso.
Lea la descripción de esta función IsStopped() en la documentación, tal vez le dé algunas ideas.
Pero a ti te parece que es desde otra dirección. Si es así, perdón por una posible suposición.
Pero como dicen en posibles sugerencias, y resuelve el problema.
La solución definitiva no se la dirá a nadie, porque nadie conoce toda la lógica de su código, y probablemente no profundizará en ella.