1

我的 EA 上有一个“设置”,当我的 EA 遇到错误时,我会向我发送一封电子邮件,并根据MQL4 网站文档中预先确定的 3-4 位错误代码向我提供错误代码。

/* 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 平台日志中出现新错误时,我是否需要刷新我收到的电子邮件中的错误代码(来自以前的错误),或者它是否会自动执行此操作?

4

1 回答 1

1

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

无论哪种方式,嵌入(环绕)一个部分是一种常见的做法,其中一些错误状态需要相应地处理,正确的是:

// -------------------------------------------- // 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 __________________________

这使您的代码能够抵抗任何类型的“被遗忘”(巧合地未重置)最后一个错误(这不会在出现此类错误的地方使您的代码执行崩溃但是......)这将触发以后不需要的“下一个”错误处理部分中的行为,因此在电子邮件信号不存在但_LastError系统寄存器内的“忘记”(未重置)值偶然匹配的情况下也可能向您发送电子邮件错误处理情况,导致发送所述电子邮件(就像存在电子邮件信号一样(如上所述,并非如此)。

于 2017-01-19T15:39:54.260 回答