Donnez-moi SetLastError ! !! - page 5

 
vit46:

Et ce n'est pas une mise à zéro inconditionnelle mais seulement si last_error_fifo == 0. En bref, c'est la même chose que les œufs en profil. Vérifier ce que la fonction a retourné avant de vérifier les erreurs.

 
Roger:
Développez le sujet.

Exactement pour vous, voir :

Options de terminaison de OrderSend() ;

1. Aucune erreur. Vous appelez toujours GetLastError() - en principe, c'est OK si l'erreur précédente est lue, traitée et réinitialisée.

IMHO - vous n'êtes pas obligé de le faire.

2. Il y a une erreur - en appelant GetLastError (), d'après ce que je comprends, vous analysez une seule erreur, bien qu'il puisse y en avoir plusieurs.

IMHO, c'est plus correct :

        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);
.........................................

La dernière est ErrReaction(err) - c'est la gestion des erreurs.

Par exemple, comme ceci :

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 fonction de traitement divise les erreurs en "réparables" et "irrécupérables" - les "réparables" sont éliminées, le code des "irrécupérables" est renvoyé - pour traitement dans une procédure externe (appelante).

 
sergeev:



Bon de toute façon mes cafards sont plus cool parce qu'il n'y a pas besoin de vérifier ce que chaque fonction a retourné donc le code est plus beau.... De plus, vous pouvez organiser vos propres codes d'erreur.
 
vit46:
De plus, vous pouvez organiser vos propres codes d'erreur.


nous avons en quelque sorte assez pour faire le nôtre aussi.

 
Roger:

Cela dépend de votre logique. Après tout, vous pouvez traiter toutes les erreurs, et vous ne pouvez faire que celles qui sont importantes dans cette situation.

Il est bien sûr souhaitable de disposer d'une fonction permettant de traiter toutes les erreurs les plus importantes, puis la logique inhérente au conseiller expert "ajustera" les priorités.

Par ailleurs, je m'excuse auprès de l'auteur du sujet si ma question s'éloigne de la direction principale du sujet.

 
sergeev:


Nous en avons en quelque sorte assez pour faire le nôtre aussi.



Pourquoi les inventeurs de MQL5 s'acharnent-ils à créer SetUserError... ils se sont réservés jusqu'à 65535 codes d'erreur, et tout ce qui est au-dessus de cela est ok, vous pouvez arranger le vôtre :)
 
VladislavVG:

Juste pour vous, voir :

2. Il y a une erreur - en appelant GetLastError (), d'après ce que j'ai compris, vous analysez une seule erreur, bien qu'il puisse y en avoir plusieurs.

IMHO - variante plus correcte :

La dernière est ErrReaction(err) - c'est la gestion des erreurs.

C'est cette option qui est discutable. Si vous ne réinitialisez pas l'erreur et qu'il n'y a pas d'erreur après l'envoi de la commande, vous continuerez à traiter l'ancienne erreur.
 

vit46:

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

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

 
charter:

Il est souhaitable, bien sûr, de disposer d'une fonction permettant de traiter toutes les erreurs les plus significatives, puis la logique inhérente au conseiller expert "corrigera" les priorités.


Par exemple, je pense qu'il suffit d'essayer d'ouvrir un ordre 5 fois puis d'arrêter d'essayer, alors que vous pouvez penser qu'il faut ouvrir un ordre 20 fois ou "pour gagner".
 
Roger:

Moi, par exemple, je pense qu'il suffit d'essayer d'ouvrir un ordre 5 fois puis d'arrêter d'essayer, mais vous pouvez penser que vous devez essayer 20 fois ou ouvrir "jusqu'à ce que vous gagniez".

Non, je ne compte rien. Je n'ai pas d'opinion ferme et sans ambiguïté, c'est pourquoi je vous demande de me recommander la fonction de correction d'erreurs la plus décente.