MT4에서 MT5로 옮기는 문제. 또는 더 정확하게는 MT5에서 일부 알고리즘의 오류 없는 실행이 불가능합니다. - 페이지 10

 
Vict :

이상하지만 전에는 할 생각이 없었습니다.

메모리 할당 과 같은 많은 오류 검사를 제거합니다.

옵션이 아닌 경우 어드바이저가 차트에서 제거되지만 프로그램의 아무 곳에서나 다음 틱 전에 "OS로 나가기"만 하면 됩니다.


대부분의 경우 현재 틱의 데이터 액세스 불가능성과 관련된 기능을 안전하게 호출해야 하는 곳이 "공백"이 되도록 매크로의 모든 것을 우아하게 래핑할 수 있습니다.

 void OnStart ()
  {
   for ( int i= 0 ;i< 10 ;i++)
     {
       double o=Open(i);
       if (o> 0.0 ) printf ( "%d : %f" ,i,o);
       else
        {
         printf ( "Error № %d " ,( int )o);
         return ;
        }
     }
  }
//+------------------------------------------------------------------+

double Open( int shift)
  {
   ResetLastError ();
   double result= iOpen ( NULL , 0 ,shift);
   int err= GetLastError ();
   if (err> 0 ) result=-err;
   return (result);
  }
//+------------------------------------------------------------------+

코드의 가독성을 위해 다음과 같이 작성하고 싶습니다.

 void OnStart ()
  {
   for ( int i= 0 ;i< 10 ;i++)
     {
       double o=Try( Open(i), "Текст сообщения" );
       printf ( "%d : %f" ,i,o);
     }
  }


이 시도는 실제로 실패할 경우 "OS를 종료"하고 래핑하는 매크로에 있습니까?

 
Igor Makanu :

이 시도는 실제로 실패할 경우 "OS를 종료"하고 래핑하는 매크로에 있습니까?

 #define Try(VAR, EXPR, MES)          \
   VAR = EXPR;                       \
   if (VAR <= 0.0 ) {                 \
     printf ( "Error: %s " , MES);      \
     return ;                         \
   }

double o;
Try(o, Open(i), "something goes wrong" );

아니다?

나는 종종 함수의 시작 부분에 모든 종류의 미니 매크로를 작성하고 마지막에는 정의를 취소합니다. 물론 동작이 자주 반복되면 의미가 없습니다.

 #define MYERR_HANDLER(INDEX)                                \
{                                                           \
   Alert ( __FILE__ , " " , __LINE__ , "-" , INDEX, ": error" );   \
   this .state = obst_error;                                 \
   return obev_no_event;                                    \
}

그리고 낙태에 관해서는 당신이 헛된 것이므로 약간의 실수는 있지만 완벽합니다.

 
Vict :

아니다?

예!

그러나 이상적으로는 대신 다음을 원합니다.

 double o;
Try(o, Open(i), "something goes wrong" );

그래서:

 double o = Try(Open(i), "something goes wrong" );

Open() 함수의 서명을 변경해야 하는 경우 질문이 아닙니다... 하지만 이 형식으로 내가 정말 원하는 것을 얻을 수 있습니다! ;)

----------------------

추신: 옵션으로, 전역적으로 선언된변수 Tryerror 또는 bool Tryresult도 적합합니다. 이 호출이 오류로 종료되면 OnTick() 본문을 종료하는 한 줄의 "안전한 호출"이 목표입니다.

 
Igor Makanu :

그래서:

나는 이것이 프로에서도 가능한지 의심스럽습니다(예외를 던질 수 있지만 반환은 불가능합니다). 그러나 모든 일이 일어날 수 있습니다. 아마도 누군가가 놀랄 것입니다 ...

 

글쎄, 즉석 :

Try( double , o, Open(i), "something goes wrong" );

아마도 이것이이 상황에서 최대입니다.

 

난 바보야, 어쩌면

 double Try_helper;
#define Try(EXPR, MES)               \
   Try_helper = EXPR;                \
   if (Try_helper <= 0.0 ) {          \
     printf ( "Error: %s " , MES);      \
     return ;                         \
   }

double o = Try(Open(i), "something goes wrong" );

컴파일되지 않았지만 작동해야 합니다.

 
Vict :

난 완전히 멍청해, 어쩌면

컴파일되지 않았지만 작동해야 합니다.

사탄은 기계다!!! 획득!!!

테스트 및 시뮬레이션된 오류( shift>5 )

 double Try_helper;
#define Try(EXPR, MES)               \
   Try_helper = EXPR;                \
   if (Try_helper <= 0.0 ) {          \
     printf ( "Error: %s " , MES);      \
     return ;                         \
   }

void OnStart ()
  {
   for ( int i= 0 ;i< 10 ;i++)
     {
      
       double o = Try(Open(i), "something goes wrong" );
       printf ( "%d : %f" ,i,o);
     }
  }
//+------------------------------------------------------------------+

double Open( int shift)
  {
   ResetLastError ();
   double result= iOpen ( NULL , 0 ,shift);
   int err= GetLastError ()> 0 ;
   if (err> 0 ) result=-err;
   if (shift> 5 ) result = - 999 ;
   return (result);
  }
//+------------------------------------------------------------------+

2019.07.31 16:58:48.154 tst1 (EURUSD,H1) 0 : 1.115010

2019.07.31 16:58:48.154 tst1 (EURUSD,H1) 1 : 1.114670

2019.07.31 16:58:48.154 tst1 (EURUSD,H1) 2 : 1.114590

2019.07.31 16:58:48.154 tst1 (EURUSD,H1) 3 : 1.114400

2019.07.31 16:58:48.154 tst1 (EURUSD,H1) 4 : 1.115240

2019.07.31 16:58:48.154 tst1 (EURUSD,H1) 5 : 1.115450

2019.07.31 16:58:48.154 tst1 (EURUSD,H1) 오류: 문제가 발생했습니다.


시원한! 매크로 코드는 정말 간단했습니다.


감사하다! 당신은 확실히 마술사입니다! ;)

 

건강하게 이용하시기 바랍니다.

위의 매크로에는 한 가지 단점이 있습니다. 도우미의 유형이 하드코딩되어 있고, 문자열을 반환하는 함수를 전달한 다음 두 개의 매크로를 만들지 않고 Try를 두 배로 늘릴 수 없습니다. 나는 스포츠에 관심이 있었습니다. 이 문제를 해결하는 방법(모든 유형에 대해 하나의 매크로 작성. 옵션이 없는 µl에서, C ++에서, 비록 거기에서 실제로 필요하지는 않지만 여전히)? 아무도 자신의 버전을 제공하고 싶어하지 않습니까?

 
Vict :

건강하게 이용하시기 바랍니다.

위의 매크로에는 한 가지 단점이 있습니다. 도우미 유형이 고정되어 있으므로 문자열을 반환하는 함수를 Try에 전달할 수 없습니다.

왜 안 돼? 아무도 + 기호를 취소하지 않았습니다!

이제 매크로를 사용할 계획이므로 다음과 같이 빗질했습니다.

 int     _GetLastError;
double _Try_helper;
string _Try_FUNCSIG;
#define Try(FUNC,MSG, EXCEPT) _Try_helper=FUNC; if (_GetLastError> 0 ){ printf ( "%s : error № %d %s " ,_Try_FUNCSIG,_GetLastError,MSG);EXCEPT;}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart ()
  {
   for ( int i= 0 ;i< 10 ;i++)
     {

       double o = Try(Open(i), "something goes wrong" +Txt(), return );
       printf ( "%d : %f" ,i,o);
     }
  }
//+------------------------------------------------------------------+

double Open( int shift)
  {
   _Try_FUNCSIG= __FUNCSIG__ ;
   ResetLastError ();
   double result= iOpen ( NULL , 0 ,shift);
   _GetLastError= GetLastError ();
   if (shift> 5 )_GetLastError= 999 ;
   return (result);
  }
//+------------------------------------------------------------------+
string Txt()
{
return ( " Txt " );

이제 EXCEPT 매크로 매개변수는 예외 조치이며 리턴과 마찬가지로 잘 작동합니다. - 로그에 인쇄하기로 결정했지만 OnTick() 본문을 떠나지 않은 경우

2019.07.31 19:01:28.353 tst1 (EURUSD,H1) 0 : 1.113350

2019.07.31 19:01:28.353 tst1 (EURUSD,H1) 1 : 1.114180

2019.07.31 19:01:28.353 tst1 (EURUSD,H1) 2 : 1.115110

2019.07.31 19:01:28.353 tst1 (EURUSD,H1) 3 : 1.115010

2019.07.31 19:01:28.353 tst1 (EURUSD,H1) 4 : 1.114670

2019.07.31 19:01:28.353 tst1 (EURUSD,H1) 5 : 1.114590

2019.07.31 19:01:28.353 tst1 (EURUSD,H1) double Open(int) : 오류 번호 999 뭔가 잘못되었습니다 Txt

 
Igor Makanu :

글쎄, 나는 이것을 다음과 같이 사용하려고 한다.

 string f( int ) { return "hello world" ;}
double f( double ) { return 35 ;}

int main()
{
   double d = Try(f( 0 .), "double error" );
   string s = Try(f( 0 ), "stirng error" );
   cout << s << "-" << d << endl;   // hello world-35
   return 0 ;
}

여기 사람들이 도박을 하지 않는 것. 그래도

 template < typename T> T Try_helper;
#define Try(EXPR, MES)                                  \
   Try_helper<decltype(EXPR)> = EXPR;                   \
   if (Try_helper<decltype(EXPR)> == decltype(EXPR){}) {\
       printf ( "%s\n" , MES);                              \
       return 1 ;                                         \
   }