Andiamo SetLastError!!! - pagina 5

 
vit46:

E non è un azzeramento incondizionato, ma solo se last_error_fifo == 0. In breve, è la stessa cosa delle uova nel profilo. controllare cosa ha restituito la funzione prima di controllare gli errori.

 
Roger:
Sviluppare l'argomento.

Esattamente per te, vedi :

OrderSend() opzioni di terminazione;

1. Nessun errore. Chiamate ancora GetLastError() - in linea di principio va bene se l'errore precedente viene letto, processato e resettato.

IMHO - non è necessario.

2. C'è un errore - quando si chiama GetLastError (), per quanto ho capito, si analizza un solo errore, anche se ce ne possono essere molti.

IMHO, è più corretto:

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

L'ultimo è ErrReaction(err) - questa è la gestione degli errori.

Per esempio, così:

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 funzione di elaborazione divide gli errori in "correggibili" e "irrecuperabili" - quello "correggibile" cerca di eliminare, il codice di quello irrecuperabile ritorna indietro - per l'elaborazione in una procedura esterna (chiamante).

 
sergeev:



Beh, comunque i miei scarafaggi sono più freddi perché non c'è bisogno di controllare cosa restituisce ogni funzione, quindi il codice sembra migliore... e in più potete organizzare i vostri codici di errore.
 
vit46:
e in più potete organizzare i vostri codici di errore.


in qualche modo ne abbiamo abbastanza per fare anche il nostro.

 
Roger:

Dipende dalla tua logica. Dopo tutto, si può fare l'elaborazione di ogni errore, e si possono fare solo quelli che sono importanti in questa situazione.

È auspicabile, naturalmente, avere una funzione per elaborare tutti gli errori più significativi, e poi la logica inerente all'Expert Advisor "aggiusterà" le priorità.

Separatamente, mi scuso con il topicstarter se la mia domanda porta via dalla direzione principale dell'argomento.

 
sergeev:


In qualche modo ne abbiamo abbastanza per fare anche il nostro.



Chi sono gli inventori di MQL5 che cercano così tanto di creare SetUserError... hanno riservato fino a 65535 codici di errore per se stessi, e qualsiasi cosa al di sopra di questo va bene, puoi organizzare il tuo :)
 
VladislavVG:

Solo per te, vedi :

2. C'è un errore - quando si chiama GetLastError () per quanto ho capito si analizza un solo errore, anche se ce ne possono essere molti.

IMHO - variante più corretta:

L'ultimo è ErrReaction(err) - questa è la gestione degli errori.

È questa opzione che è discutibile. Se non si resetta l'errore e non c'è nessun errore dopo OrderSend, si elaborerà ancora il vecchio errore.
 

vit46:

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

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

 
charter:

È auspicabile, naturalmente, avere una funzione per elaborare tutti gli errori più significativi, e poi la logica inerente all'Expert Advisor "correggerà" le priorità.


Per esempio, io credo che sia sufficiente provare ad aprire un ordine 5 volte e poi smettere di provare, mentre voi potreste pensare che sia necessario aprire un ordine 20 volte o "vincere".
 
Roger:

Io, per esempio, penso che sia sufficiente provare ad aprire un ordine 5 volte e poi smettere di provare, ma voi potreste pensare di dover provare 20 volte o aprire "fino a quando non si vince".

No, non sto contando nulla. Non ho una mia opinione ferma e inequivocabile, ed è per questo che vi chiedo di consigliarmi la funzione di correzione degli errori più decente.