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

 
mktr8591 :

실제 예 - 가상 라이브러리에서 VIRTUAL 클래스에는 정적 const VIRTUAL_DELETE VirtualDelete가 포함되어 있습니다.

static const VIRTUAL static_Virtual로 대체할 수 있습니다.

(물론 소멸자를 VIRTUAL로 이동) .

금지되어 있습니다. 새 개체는 프로그램이 종료될 때 소멸자를 호출하지 않습니다.

 
fxsaber :

금지되어 있습니다. 새 개체는 프로그램이 종료될 때 소멸자를 호출하지 않습니다.

죄송합니다. VIRTUAL_DELETE의 새 항목이 어디에 있는지 이해하지 못했습니다.
 
mktr8591 :
죄송합니다. VIRTUAL_DELETE의 새 항목이 어디에 있는지 이해하지 못했습니다.

VIRTUAL::Create에서.


위협 지점은 가상에 관한 것이 아닙니다 ...

 

경고 창 마이닝.

 #ifdef __MQL5__
   #include <WinAPI\WinAPI.mqh>
#else // #ifdef __MQL5__
   #define long int
     #define pack(A)  
       #include <WinAPI\WinAPI.mqh>
     #undef pack
   #undef long
  
   #undef HANDLE
   #define HANDLE int
#endif // #ifdef __MQL5__ #else

uint GetProcessID( const HANDLE Handle )
{
   uint ID = 0 ;
  
  user32::GetWindowThreadProcessId(Handle, ID);
  
   return (ID);
}

// Возвращает хендл Alert-окна.
HANDLE GetAlertHandle( void )
{  
   static HANDLE Handle = 0 ;
  
   if (!Handle)
  {
     static const string AlertCaptions[] = { "Alert" , "Алерт" };
     static const uint ProcessID = GetProcessID((HANDLE):: ChartGetInteger ( 0 , CHART_WINDOW_HANDLE ));  
    
     for ( int i = 0 ; i < sizeof (AlertCaptions) / 12 ; i++)  
    {
      Handle = user32::FindWindowW( "#32770" , AlertCaptions[i]);
      
       if (Handle && (GetProcessID(Handle) == ProcessID))
         break ;
       else
        Handle = 0 ;
    }
  }
    
   return (Handle);
}
 

사용자 지정 이벤트 중 CPU 로드.

 void OnInit ()
{
   EventChartCustom ( 0 , 0 , 0 , 0 , NULL );
}

void OnChartEvent ( const int id, const long &, const double &, const string & )
{
   if (id == CHARTEVENT_CUSTOM )
  {
     Sleep ( 0 ); // Без этой строки будет 100%-я нагрузка ядра CPU.
    
     EventChartCustom ( 0 , 0 , 0 , 0 , NULL );
  }
}
 
이 주제와 관련이 없는 댓글은 " MQL4 및 MQL5에 대한 모든 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 "으로 이동되었습니다.
 

때로는 DEAL_TIME이 DEAL_ORDER_TIME_SETUP보다 작습니다. 이것은 아마도 브로커 소프트웨어 버그일 것입니다.

 // Показывает ордера, которые имеют время выставления ПОЗЖЕ сделок, которые породил.
#property script_show_inputs

input datetime inFrom = D'2021.06.01' ;

void OnStart ()
{
   if ( HistorySelect (inFrom, INT_MAX ))
     for ( int i = HistoryDealsTotal () - 1 ; i >= 0 ; i--)
    {
       const ulong Deal = HistoryDealGetTicket (i);
       const ulong Order = HistoryDealGetInteger (Deal, DEAL_ORDER );
      
       if (( HistoryOrderGetInteger (Order, ORDER_TICKET ) == Order) &&
          ( HistoryOrderGetInteger (Order, ORDER_TIME_SETUP_MSC ) > HistoryDealGetInteger (Deal, DEAL_TIME_MSC )))
         Print (( string )Order + " - " + ( string )Deal);
    }
}


이것은 GUI에서 보이는 방식입니다.


 
fxsaber :

때로는 DEAL_TIME이 DEAL_ORDER_TIME_SETUP보다 작습니다. 이것은 아마도 브로커 소프트웨어 버그일 것입니다.


이것은 GUI에서 보이는 방법입니다.


아마도 버그일 것입니다.

그러나 이것이 가능하고 정상입니까? 부분 실행 후 사용자/프로그램에 의해 제한 순서가 변경되면 ORDER_TIME_SETUP 이 업데이트됩니다.

 
mktr8591 :

그러나 이것이 가능하고 정상입니까? 부분 실행 후 사용자/프로그램에 의해 제한 순서가 변경 되면 ORDER_TIME_SETUP 이 업데이트됩니다 .

이 필드는 상수입니다. 티켓과 함께 등록되었습니다.

 
fxsaber :

이 필드는 상수입니다. 티켓과 함께 등록되었습니다.

제가 거래 상황을 잘못 이해한 것 같습니다.

내가 상상한 대로: 보류 중인 지정가 주문은 여러 거래로 채워졌습니다. 이 모든 시간 동안 그것은 실시간 주문에 매달렸고 ORDER_TIME_SETUP 필드는 상수가 아니었습니다. 마지막 거래 후 그는 역사에 기록되었습니다. 이 시점에서 ORDER_TIME_SETUP 은 상수가 되었습니다.

아니면 틀렸나요?