Geben Sie mir SetLastError!!! - Seite 5

 
vit46:

Und es ist nicht bedingungslos Nullen, sondern nur, wenn last_error_fifo == 0. Kurz gesagt, es ist das gleiche wie Eier im Profil. überprüfen, was die Funktion zurückgegeben, bevor Sie für Fehler.

 
Roger:
Entwickeln Sie das Thema.

Genau für Sie, siehe :

OrderSend() Beendigung Optionen;

1. Kein Fehler. Sie rufen weiterhin GetLastError() auf - im Prinzip ist es in Ordnung, wenn der vorherige Fehler gelesen, verarbeitet und zurückgesetzt wird.

IMHO müssen Sie das nicht.

2. Es gibt einen Fehler - wenn Sie GetLastError () aufrufen , analysieren Sie , soweit ich weiß , einen einzigen Fehler, obwohl es viele davon geben kann.

IMHO ist das korrekter:

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

Die letzte ist ErrReaction(err) - das ist die Fehlerbehandlung.

Zum Beispiel so:

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)

Die Verarbeitungsfunktion teilt die Fehler in "behebbare" und "nicht behebbare" ein - die "behebbaren" versucht man zu beseitigen, der Code der nicht behebbaren kehrt zurück - zur Verarbeitung in einer externen (aufrufenden) Prozedur.

 
sergeev:



Wie auch immer, meine Kakerlaken sind cooler, weil es nicht notwendig ist, zu überprüfen, was jede Funktion zurückgegeben, so dass der Code besser aussieht... Außerdem können Sie Ihre eigenen Fehlercodes organisieren.
 
vit46:
Außerdem können Sie Ihre eigenen Fehlercodes organisieren.


wir haben irgendwie genug, um auch unsere eigenen zu machen.

 
Roger:

Das hängt von Ihrer Logik ab. Schließlich können Sie jeden Fehler bearbeiten, und zwar nur die, die in dieser Situation wichtig sind.

Es ist natürlich wünschenswert, eine Funktion für die Verarbeitung aller wichtigen Fehler zu haben, und dann wird die dem Expert Advisor innewohnende Logik die Prioritäten "anpassen".

Unabhängig davon möchte ich mich beim Themenstarter entschuldigen, wenn meine Frage von der Hauptrichtung des Themas ablenkt.

 
sergeev:


Irgendwie haben wir genug, um auch unsere eigenen zu machen.



Wer versuchen die Erfinder von MQL5 so sehr, SetUserError zu erstellen... sie haben bis zu 65535 Fehlercodes für sich selbst reserviert, und alles, was darüber liegt, ist in Ordnung, Sie können Ihre eigenen arrangieren :)
 
VladislavVG:

Nur für Sie, siehe :

2. Es liegt ein Fehler vor - wenn Sie GetLastError () aufrufen, analysieren Sie , soweit ich weiß, einen einzigen Fehler, obwohl es viele geben kann.

IMHO - die korrektere Variante:

Die letzte ist ErrReaction(err) - das ist die Fehlerbehandlung.

Gerade diese Option ist umstritten. Wenn Sie den Fehler nicht löschen und nach OrderSend kein Fehler auftritt, wird der alte Fehler weiterhin verarbeitet.
 

vit46:

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

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

 
charter:

Es ist natürlich wünschenswert, eine Funktion für die Verarbeitung aller wichtigen Fehler zu haben, und dann wird die dem Expert Advisor innewohnende Logik die Prioritäten "korrigieren".


Ich bin zum Beispiel der Meinung, dass es ausreicht, 5 Mal zu versuchen, einen Auftrag zu eröffnen und dann aufzuhören, während Sie vielleicht denken, dass Sie 20 Mal einen Auftrag eröffnen müssen, um zu gewinnen".
 
Roger:

Ich zum Beispiel denke, dass es ausreicht, einen Auftrag 5 Mal zu öffnen und dann aufzuhören, aber Sie denken vielleicht, dass Sie es 20 Mal versuchen müssen oder "bis Sie gewinnen".

Nein, ich zähle nichts. Ich habe keine feste und eindeutige Meinung, deshalb bitte ich Sie, mir die beste Fehlerkorrekturfunktion zu empfehlen.