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

时间:2017-01-19 10:11:42

标签: algorithmic-trading mql4 metatrader4 mt4

我的EA上有一个“设置”,当我的EA交易程序遇到错误时给我发电子邮件,并根据{{3}中预先确定的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平台期刊中出现新错误时,它是否会自动执行此操作?

1 个答案:

答案 0 :(得分: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 __________________________

这使您的代码能够抵御任何类型的“忘记”#34; (巧合地取消重置)最后一个错误(这并没有导致你的代码执行崩溃,这样的错误已经出现但是......),这会在以后的" next"错误处理部分,因此可能会在电子邮件信号不存在的情况下向您发送电子邮件,但是“忘记了”#34; _LastError系统寄存器内的(取消重置)值偶然匹配错误处理情况,导致发送所述电子邮件(好像存在电子邮件信号(如上所述)