¡¡¡Vamos SetLastError!!! - página 5

 
vit46:

Y no es una puesta a cero incondicional, sino sólo si last_error_fifo == 0. En resumen, es lo mismo que los huevos en el perfil. comprobar lo que la función devuelve antes de comprobar los errores.

 
Roger:
Desarrolle el tema.

Exactamente para usted, vea :

Opciones de terminación de OrderSend();

1. No hay error. Sigue llamando a GetLastError() - en principio está bien si el error anterior es leído, procesado y reiniciado.

En mi opinión, no es necesario.

2. Hay un error - al llamar a GetLastError (), según tengo entendido, se analiza un único error, aunque puede haber muchos.

En mi opinión, es más correcto:

        ticket=OrderSend(symbol,cmd,op_v,ordprice,slippage,0,0,comment,magic,expiration,arrow_color);
        if(ticket<0)
        {
            err = GetLastError();
            int err_res = ErrReaction(err);
.........................................

El último es ErrReaction(err) - esto es el manejo de errores.

Por ejemplo, así :

int ErrReaction(int err)
{
    switch(err)
    {
        case ERR_TRADE_NOT_ALLOWED    :
                 Print("TRADE NOT ALLOWED ! SWITCH ON option \' Allow live trading\' (Необходимо включить опцию \'Разрешить советнику торговать\')");
        case ERR_INVALID_FUNCTION_PARAMSCNT :    
        case ERR_INVALID_FUNCTION_PARAMVALUE :    
        case ERR_INVALID_STOPS        : 
        case ERR_INVALID_TRADE_VOLUME : 
        case ERR_MARKET_CLOSED        : 
        case ERR_TRADE_DISABLED       : 
        case ERR_NOT_ENOUGH_MONEY     : 
                 return(-err);
        case ERR_NO_CONNECTION        :
............................................
        case ERR_BROKER_BUSY          : 
        case ERR_TRADE_CONTEXT_BUSY   : 
..............................
        case ERR_PRICE_CHANGED : 
        case ERR_OFF_QUOTES    : 
        case ERR_REQUOTE       : 
.................................................
        default: break;
    }//switch(err)
    return(0);
}//int ErrReaction(int err)

La función de procesamiento divide los errores en "reparables" e "irrecuperables" -el "reparable" intenta eliminarlo, el código del irrecuperable lo devuelve- para su procesamiento en un procedimiento externo (de llamada).

 
sergeev:



Bueno de todos modos mis cucarachas son más geniales porque no hay necesidad de comprobar lo que devolvió cada función por lo que el código se ve mejor... Además, puedes organizar tus propios códigos de error.
 
vit46:
Además, puedes organizar tus propios códigos de error.


de alguna manera tenemos lo suficiente para hacer la nuestra también.

 
Roger:

Depende de su lógica. Al fin y al cabo, se puede hacer el tratamiento de todos los errores, y se pueden hacer sólo los que son importantes en esta situación.

Es deseable, por supuesto, tener una función para procesar todos los errores más significativos, y entonces la lógica inherente al Asesor Experto "ajustará" las prioridades.

Por otra parte, pido disculpas al iniciador del tema si mi pregunta se aleja de la dirección principal del tema.

 
sergeev:


De alguna manera tenemos suficiente para hacer la nuestra también.



¿Quiénes son los inventores de MQL5 que se esfuerzan por crear SetUserError... se reservaron hasta 65535 códigos de error para ellos, y todo lo que esté por encima de eso está bien, puedes organizar el tuyo propio :)
 
VladislavVG:

Sólo para usted, vea :

2. Hay un error - al llamar a GetLastError () por lo que entiendo se analiza un solo error, aunque puede haber muchos.

IMHO - variante más correcta:

El último es ErrReaction(err) - esto es el manejo de errores.

Es esta opción la que es discutible. Si no se pone a cero el error y no hay ningún error después de OrderSend, se seguirá procesando el antiguo error.
 

vit46:

Ознакомьтесь с этим материалом. imho, не повредит.

https://www.mql5.com/ru/forum/131373

 
charter:

Es deseable, por supuesto, tener una función para procesar todos los errores más significativos, y entonces la lógica inherente al Asesor Experto "corregirá" las prioridades.


Por ejemplo, creo que es suficiente con intentar abrir una orden 5 veces y luego dejar de intentarlo, mientras que usted puede pensar que necesita abrir una orden 20 veces o "para ganar".
 
Roger:

Yo, por ejemplo, creo que es suficiente con intentar abrir una orden 5 veces y luego dejar de intentarlo, pero tú puedes pensar que tienes que intentarlo 20 veces o abrir "hasta que ganes".

No, no estoy contando nada. No tengo una opinión firme e inequívoca, por lo que le pido que me recomiende la función de corrección de errores más decente.