如何使用 MetaTrader4 错误代码刷新进行正确的错误处理?

How to use a MetaTrader4 Error Code Refresh for proper error handling?

我的 EA 上有一个 "set up",当我的 Expert Advisor 遇到错误并根据 "set up" 中预先确定的 3-4 位错误代码向我发送电子邮件时=11=].

/* technically speaking,
   error codes with 5+ digits are also possible,
   Using:
   ------                                                            */
   SetUserError( 1000000 );                                          /*

// this will set an error-state
// with a number 1065536 -- having a bit more than the said 3 ~ 4 digits
// composed as ( 1000000 + ERR_USER_ERROR_FIRST )
*/

这是为了让我能够诊断问题。

只是想澄清一下我是否需要刷新错误代码(来自以前的错误)我收到我的电子邮件,或者当我的 MT4 日志中出现新错误时它会自动执行此操作平台?

有一个有用的函数 ResetLastError() 明确地将 _LastError 设置为零。接下来,每次调用 GetLastError() 函数也会产生副作用,因为它还会将 _LastError 变量设置为零。

无论哪种方式,通常的做法是嵌入(包围)一个部分,其中一些 error-states 需要相应地处理,由 a:

// -------------------------------------------- // START_________________________
     GetLastError();                            // implicit  pre-reset _LastError
   ResetLastError();                            // explicit  pre-reset _LastError
   bool an_OK_flag = OrderModify( ... );        // XTO call  w ex-post _LastError
   int  anErrorSTATEtoHANDLE = GetLastError();  /* get a value of the  _LastError
                                                 + implicit post-reset _LastError */
// -------------------------------------------- // HANDLE ERROR-STATE(s)
   switch( anErrorSTATEtoHANDLE ){
         case ERR_NO_ERROR:                       break;
         case ERR_NO_RESULT:                      ...
                                                  break;
         case ERR_INVALID_TRADE_PARAMETERS:       ...
                                                  break;
         case ERR_SERVER_BUSY:                    ...
                                                  break;
         case ERR_BROKER_BUSY:                    ...
                                                  break;
         case ERR_TOO_MANY_REQUESTS:              ...
                                                  break;
         case ERR_TRADE_MODIFY_DENIED:            ...
                                                  break;
         ...
         default:                                 break;
   }
// -------------------------------------------- // FIN __________________________

这使您的代码能够抵抗任何类型的 "forgotten"(巧合的是 un-reset)最后一个错误(不会在出现此类错误的地方使您的 code-execution 崩溃但是 ... ) 稍后会在 "next" error-handling 部分触发不需要的行为,因此在 email-signal 不存在的情况下也可能会向您发送电子邮件,但 "forgotten" ( un-reset ) _LastError 系统寄存器 co-incidentally 中的值匹配 error-handling 的情况,导致发送上述电子邮件(就好像有一个 email-signal 存在(如上所述,不存在)。