mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 169

 

그건 그렇고, Assert의 아날로그

 #define ASSERT (STD_CAssert( __LINE__ , __FUNCTION__ )).Assert

class STD_CAssert{
   string function;
   int line;
public :
   STD_CAssert( int _line, string _func):line(_line),function(_func){}
   void Assert( bool condition, string text= NULL );
  };
//--------------------------------------------------------------------------
void STD_CAssert::Assert( bool condition, string reason= NULL ){
   if (condition) return ;
   Alert ( StringFormat ( "Assert in line %i, function %s.\nReason: %s." ,line,function,reason== NULL ||reason== "" ? "Unknow" :reason));
   int a= 0 ;
   int b= 1 /a;}

void OnStart ()
{
   Test();
}

void Test(){
   ASSERT( 2 == 3 , "Some reason" );
}
 
Igor Makanu :

그래서 그는 그것을 매우 필요로합니다!

개발자가 일반 데이터를 종료/중단한 경우 예를 들어 TF - OHLC 데이터가 준비되지 않은 경우 데이터 처리를 올바르게 중단할 수 있으며 서버에 주문을 보내는 프로세스도 유용할 것입니다. ... OnTick()에서 종료하기 위해 끝없는 return()을 풀지 않고 어디에서나 코드를 중단하고 다음 틱 전에 종료하는 것이 편리합니다.

그래서 목발을 묘사하는 것은 가능하지만 거기에서 사용성이 완전히 나빠서 작동하더라도 보여주지 않을 것입니다.
 

그래도 사용성은 좋아진 것 같습니다. 일반적으로 중첩된 함수를 포함하여 가능한 종료가 있는 모든 함수 또는 메서드 호출 은 _call 매크로로 래핑되어야 합니다. 누가 신경쓰고 모든 핸들러에 대해 스스로 작성하십시오. 아이디어의 테스트로 무릎에 작성되어 테스트되지 않았습니다. 단어에서 - 전혀.

 #ifdef _DEBUG
   #define DELETE(dObj) do if ( CheckPointer (dObj)!= POINTER_INVALID ) { delete dObj; dObj= NULL ;} while ( false )
#else
   #define DELETE(dObj) do { delete dObj; dObj= NULL ;} while ( false )
#endif

#define START   class STD_CStart; void OnStart (){std_start= new STD_CStart; std_start.Main(); DELETE(std_start);}
#define ON_START  START\
static STD_CStart* std_start= NULL ;  \
class STD_CStart{   \
public : void Main();   \
};                \
void STD_CStart::Main

#define DELETE_EVENTS do if (std_start!= NULL ) DELETE(std_start); while ( false )
#define EXIT(out) do {DELETE_EVENTS; return out;} while ( false )
#define CHECK(out) do if (!std_start) EXIT(out); while ( false )
#define _call(funk,out) do {funk;CHECK(out);} while ( false )

ON_START()
{
   int x= 0 ;
   Print ( "Start" );
   _call(TestInt( 4 ),);
   Print (++x);
   _call(TestInt( 1 ),);
   Print (++x);
   _call(TestInt( 6 ),);
   Print (++x);
   TestVoid();   
}

int TestInt( int a){
   static int x= 0 ;
   Print ( "Func call " ,++x);
   if (a< 3 ) EXIT( NULL );
   return 0 ;
}

void TestVoid(){
   Print ( "Error" );}
 

MT5 에서는 터미널이 우발적으로 닫히는 것을 방지할 수 없습니다. 최근에 그런 시나리오가 있었습니다.

  • 터미널과 브라우저가 전체 창으로 확장됩니다. 나는 브라우저에 있습니다.
  • 브라우저가 멈추고 오른쪽 상단 모서리에 있는 십자가를 클릭합니다.
  • 닫히지 않고 몇 번 더 누릅니다.
  • 클릭 중 특정 지점에서 브라우저가 닫히고 창이 사라집니다. 그리고 이때 커서 아래에 있는 터미널의 십자 모양이 쏘입니다.
  • 터미널이 닫히고 너무 빨라서 눈에 띄지 않습니다. 특히 많은 터미널이 열려 있는 경우.

이것은 예를 들어 Batch Optimization 중에 매우 성가신 상황입니다. 그러나 더 나쁜 것은 전투 고문의 경우입니다. 그가 전투 터미널을 끝냈다는 사실을 어리석게도 알아차리지 못할 수 있습니다.


그러한 보호 장치를 넣으십시오.

 void OnDeinit ( const int Reason )
{
   if (Reason == REASON_CLOSE )
     MessageBox ( "Terminal is being closed!" );
}

닫을 때 5초 동안 메시지가 나타납니다. 그래서 당신은 실제로 일어난 일을 이해할 수 있습니다. 터미널에 보호 장치가 없다는 것이 이상합니다.

 
fxsaber :

MT5에서는 터미널이 우발적으로 닫히는 것을 방지할 수 없습니다. 최근에 그런 시나리오가 있었습니다.

  • 터미널과 브라우저가 전체 창으로 확장됩니다. 나는 브라우저에 있습니다.
  • 브라우저가 멈추고 오른쪽 상단 모서리에 있는 십자가를 클릭합니다.
  • 닫히지 않고 몇 번 더 누릅니다.
  • 클릭 중 특정 지점에서 브라우저가 닫히고 창이 사라집니다. 그리고 이때, 커서 아래에 있는 터미널의 십자 모양이 쏘인다.
  • 터미널이 닫히고 너무 빨라서 눈에 띄지 않습니다. 특히 많은 터미널이 열려 있는 경우.

이것은 예를 들어 Batch Optimization 중에 매우 성가신 상황입니다. 그러나 더 나쁜 것은 전투 고문의 경우입니다. 그가 전투 터미널을 끝냈다는 사실을 어리석게도 알아차리지 못할 수 있습니다.


그러한 보호 장치를 넣으십시오.

닫을 때 5초 동안 메시지가 나타납니다. 그래서 당신은 실제로 일어난 일을 이해할 수 있습니다. 터미널에 보호 장치가 없다는 것이 이상합니다.

몇 가지 더 빠른 옵션이 있습니다.

  1. 전투 터미널을 접힌 상태로 유지하십시오.
  2. VPS를 유지하는 전투 터미널
  3. 장난기 많은 펜을 묶고 컴퓨터를 멀리하십시오. )))
  4. 당신은 생각해야합니다, 아마도 뭔가가 올 것입니다 ...))))
 
Alexey Viktorov :

몇 가지 더 빠른 옵션이 있습니다.

  1. 전투 터미널을 접힌 상태로 유지하십시오.
  2. VPS를 유지하는 전투 터미널
  3. 장난기 많은 펜을 묶고 컴퓨터를 멀리하십시오. )))
  4. 당신은 아마도 뭔가가 올 것이라고 생각해야합니다 ...)))

VPS 에서는 닫힐 수도 있습니다. 거기에 푸시를 보내는 전문가가 있습니다.

그리고 Windows 인터페이스를 제동할 때 잘못된 십자가를 클릭하기가 정말 쉽습니다. 나는 달려갔고, 이제 상황에 맞는 메뉴의 작업 표시줄에서 그것을 닫습니다.

 
Alexey Viktorov :

몇 가지 더 빠른 옵션이 있습니다.

데스크탑 관리자를 설치하고 브라우저 및 모든 종류의 찌꺼기를 위한 하나의 데스크탑을 선택하고 터미널용으로 다른 데스크탑을 선택하십시오.

또는 Linux를 설치하십시오(데스크톱 관리자가 포함되어 있습니다 :))

 
Vladimir Simakov :

그건 그렇고, Assert의 아날로그

mql의 모든 명령문 구현의 경우 디버깅 모드 에 DebugBreak 함수를 사용하는 것이 좋습니다. 디버깅할 때 삶을 훨씬 쉽게 만들고 비상 비행보다 훨씬 더 유용합니다.
 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

라이브러리: MT4Orders

fxsaber , 2020.04.07 18:47

MT5에서 부분 실행을 찾는 것은 매우 쉽습니다.
 // true - сделка в результате частичного исполнения.
bool IsPartial( const ulong TicketDeal )
{
   const ulong TicketOrder = HistoryDealGetInteger (TicketDeal, DEAL_ORDER );
  
   return (( HistoryDealGetInteger (TicketDeal, DEAL_TYPE ) <= DEAL_TYPE_SELL ) &&
         (!TicketOrder ||
          ( HistoryDealGetDouble (TicketDeal, DEAL_VOLUME ) != HistoryOrderGetDouble (TicketOrder, ORDER_VOLUME_INITIAL ))));
}
 

헤지에서 포지션은 여러 IN 거래로 구성될 수 있습니다. 이것은 부분 실행에서 발생합니다.

동시에 부분적으로 실행된 주문은 ORDER_TIME_SETUP (_MSC)를 첫 번째(아마도 끝에서 두 번째) 거래 실행 시간으로 변경합니다. 저것들. 예를 들어 BuyLimit이 설정된 경우 기록에서 확인할 수 없습니다.


결과적으로 헤지 포지션은 상계에서 흔히 볼 수 있는 부분적인 공개 가격을 가질 수 있습니다.

사유: