レッツゴーSetLastError!!!! - ページ 5

 
vit46:

また、無条件にゼロにするのではなく、last_error_fifo ==0 のときだけゼロにする。要するに、 プロファイルの卵と同じで、エラーをチェックする前に、関数が何を返したかをチェック するのだ。

 
Roger:
トピックを展開する。

まさに、あなたのために、参照してください。

OrderSend() 終了オプション。

1.エラーはありません。それでもGetLastError()を呼び出します。原理的には、前のエラーを読み込んで処理し、リセット すればOKです。

IMHO - その必要はありません。

2.エラーがある -GetLastError ()を呼び出すとき、私が理解する 限り、多くのエラーがあるかもしれませんが、1つの単一のエラーを分析します。

IMHOでは、その方が正しい。

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

最後はErrReaction(err) で、これはエラー処理です。

例えば、このように.

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)

処理機能は、エラーを「修復可能なもの」と「修復不可能なもの」に分け、「修復可能なもの」は排除しようとし、「修復不可能なもの」のコードは、外部(呼び出し)手続きでの処理のために、戻ってくる。

 
sergeev:



まあとにかく、私のゴキブリは、各関数が何を返したかをチェックする必要がないので、コードの見栄えが良くなり、よりクールになりました...。さらに、独自のエラーコードを 整理することができます。
 
vit46:
さらに、独自のエラーコードを整理することができます。


自分たちでも作れそうな量になりました。

 
Roger:

それはあなたのロジック次第です。結局のところ、すべてのエラーの 処理を行うことができ、この状況では重要なものだけを行うことができるのです。

もちろん、最も重要なエラーをすべて処理する機能があることが望ましく、その場合はExpert Advisor固有のロジックで優先順位を「調整」することになります。

別に、私の質問がトピックの主要な方向から離れるようであれば、トピックスターターには申し訳ないのですが。

 
sergeev:


私たちもどうにかして、自分たちで作れるだけの量を確保しています。



MQL5の発明者が一生懸命にSetUserErrorを作るのは誰なのか...。65535個ものエラーコードを 自分用に予約し、それ以上のものは自分でアレンジしてOK :)
 
VladislavVG:

あなたのために、ご覧ください。

2.エラーがある -GetLastError ()を呼び出したとき、私の理解では 、多くのエラーがあるかもしれませんが、1つの単一のエラーを分析します。

IMHO - より正しいバリアント。

最後はErrReaction(err) で、これはエラー処理です。

この選択肢にこそ、議論の余地があるのです。エラーをゼロに せず、OrderSend後にエラーが発生しない場合、古いエラーのまま処理されます。
 

vit46:

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

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

 
charter:

もちろん、最も重要なエラーをすべて処理する機能があることが望ましく、そうすればExpert Advisorに内在するロジックが優先順位を「修正」してくれるでしょう。


例えば、私は「5回注文を出してやめればいい」と思っていますが、皆さんは「20回注文を出せば勝てる」と思っているかもしれません。
 
Roger:

私などは、5回注文を開けてみてやめるだけで十分だと思うのですが、皆さんは20回試したり、「勝つまで」開けなければいけないと思っているのかもしれませんね。

いいえ、何も数えていません。私自身の確固とした明確な意見がないからこそ、最もまともな誤り訂正機能を推奨していただきたいのです。