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

 

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

오류, 버그, 질문

fxsaber , 2018.06.20 23:18

그런 팬텀 오더의 상황이 얼마나 오래 지속되는지 확인하기 위해 주문은 시스템에 있지만 터미널에는 있지 않습니다.

 // Советник отслеживает длительность ситуаций, когда ордер отсутствует среди текущих и исторических

#define TOSTRING(A)   #A + " = " + ( string )(A) + "\n"
#define TOSTRING2(A) #A + " = " + EnumToString (A) + " (" + ( string )(A) + ")\n"

bool OrderIsExist( const ulong & OrderTicket )
{
   return ( OrderTicket ? OrderSelect ( OrderTicket ) || HistoryOrderSelect ( OrderTicket ) : true );
}

void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest &, const MqlTradeResult & )
{
   static bool PrevIsExist = true ;
   static ulong StartTime = 0 ;
   static ulong MaxInterval = 0 ;
  
   const ulong NowTime = GetMicrosecondCount ();
   const bool IsExist = OrderIsExist(Trans.order);
    
   if (!IsExist)
  {
     Print (TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING( OrderSelect (Trans.order)) + TOSTRING( HistoryOrderSelect (Trans.order)));       
  
     if (PrevIsExist) 
      StartTime = NowTime;
  }
   else if (!PrevIsExist)
  {
     const ulong Interval = NowTime - StartTime;
    
     Print (TOSTRING(Interval) + TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING( OrderSelect (Trans.order)) + TOSTRING( HistoryOrderSelect (Trans.order)));       
    
     if (Interval > MaxInterval)
    {
      MaxInterval = Interval;
      
       Comment (TOSTRING(MaxInterval) + TOSTRING(Trans.order)); // mcs.
    }
  }
          
  PrevIsExist = IsExist;
}


결과

 2018.06 . 21 00 : 10 : 31.047 Trans.type = TRADE_TRANSACTION_ORDER_DELETE ( 2 )
2018.06 . 21 00 : 10 : 31.047 Trans.order = 2210967406
2018.06 . 21 00 : 10 : 31.047 OrderSelect (Trans.order) = false
2018.06 . 21 00 : 10 : 31.047 HistoryOrderSelect (Trans.order) = false
2018.06 . 21 00 : 10 : 31.047 
2018.06 . 21 00 : 10 : 31.080 Interval = 32643
2018.06 . 21 00 : 10 : 31.080 Trans.type = TRADE_TRANSACTION_HISTORY_ADD ( 3 )
2018.06 . 21 00 : 10 : 31.080 Trans.order = 2210967406
2018.06 . 21 00 : 10 : 31.080 OrderSelect (Trans.order) = false
2018.06 . 21 00 : 10 : 31.080 HistoryOrderSelect (Trans.order) = true


32밀리세컨드 주문이 있는데 터미널에 없습니다! 이 간격에서 거래 로직이 실행된다면 이것이 어떤 결과를 가져올지 상상해보세요...


흥미롭게도 팬텀 주문은 TRADE_TRANSACTION_ORDER_DELETETRADE_TRANSACTION_DEAL_ADD (훨씬 덜 자주) 거래 유형 에 대해서만 존재하는 경우가 가장 많습니다.


플랫폼의 매우 나쁜 뉘앙스.


ZY 불행히도 상위 5 위의 거래 작업의 의심스러운 성능.

 
처음부터 기록을 쿼리하면 HistorySelect가 느려집니다. 따라서 다음과 같은 작업을 수행하는 것이 바람직합니다.

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

OrderCloseTime 전문가 고문 MQL5

fxsaber , 2018.07.06 09:27

 void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
   static datetime PrevTime = 0 ;
  
   if ( HistorySelect ( PrevTime , INT_MAX )) // HistorySelect(0, INT_MAX) - slow.
  {
     for ( int i = HistoryDealsTotal () - 1 ; i >= 0 ; i--)
    {
       const ulong Ticket = HistoryDealGetTicket (i);
  
       if ( HistoryDealGetInteger (Ticket, DEAL_ENTRY ) == DEAL_ENTRY_OUT )
      {
        CloseTime = ( datetime ) HistoryDealGetInteger (Ticket, DEAL_TIME );

         if ( HistorySelectByPosition ( HistoryDealGetInteger (Ticket, DEAL_POSITION_ID )))
          OpenTime = ( datetime ) HistoryDealGetInteger ( HistoryDealGetTicket ( 0 ), DEAL_TIME );
          
         break ;
      }
    }
  }
  
  PrevTime = CloseTime;
}


해결책이 목발에 달려 있다는 것은 분명합니다. 다른 구현은 그렇게 간결하지 않습니다. 일반적인 경우 브레이크를 우회하는 간단한 방법은 작동하지 않습니다.

 
fxsaber :
다중 문자 OnTick의 빠른 구현

나는 생각할 수 없다

OnTick은 Symbol 매개변수가 있고 일반적으로 OnTick은 매개변수가 없는 이유는 무엇입니까?

그리고 왜 그는 다시 댓글 아래에 있습니까

왜 메인 OnChartEvent 를 통해서만 안되나요?

 void OnTick ()
{
   OnTick ( _Symbol ); 
}

void OnChartEvent ( const int id, const long &lparam, const double &, const string & )
{
   if (id == CHARTEVENT_CUSTOM )
     OnTick (Symbols[( int )lparam]);
}

// Мультисимвольный OnTick
void OnTick ( const string &Symb )
{
}
 
fxsaber에는 멋진 코드 건조기가 있습니다. 나는 이것을 알아낼 수 없다
 
Fast528 :

왜 메인 OnChartEvent를 통해서만 안되나요?

'파리와 커틀릿'이 분리되어 있으면 편리하기 때문입니다. 다중 문자 OnTick에 모든 논리를 작성하십시오. 이름이 우연히...

 
fxsaber :

'파리와 커틀릿'이 분리되어 있으면 편리하기 때문입니다. 다중 문자 OnTick에 모든 논리를 작성하십시오. 이름이 우연히...

, 2028년까지 모두와 함께

이것은 삽입된 코드입니다. 이제 전체 코드를 찾을 수 있습니다.

Индикатор

#property indicator_chart_window
#property indicator_plots 0

input long Chart = 0 ; // идентификатор графика-получателя события
input int Index = 0 ;

int OnCalculate ( const int rates_total, const int prev_calculated, const int , const double &[] )
{
   if (prev_calculated)
     EventChartCustom (Chart, 0 , Index, 0 , NULL );
  
   return (rates_total);
}


Советник

input int AmountSymbols = 1 ;

const string Symbols[] = { "EURUSD" , "GBPUSD" , "AUDUSD" , "USDJPY" , "USDCAD" };

void OnInit ()
{
   for ( int i = 0 ; i < AmountSymbols; i++)
     if (Symbols[i] != _Symbol )
       iCustom (Symbols[i], PERIOD_W1 , "Spy.ex5" , ChartID (), i); // MQL5\Indicators\Spy.ex5
}

void OnTick ()
{
   OnTick ( _Symbol ); 
}

void OnChartEvent ( const int id, const long &lparam, const double &, const string & )
{
   if (id == CHARTEVENT_CUSTOM )
     OnTick (Symbols[( int )lparam]);
}

// Мультисимвольный OnTick
void OnTick ( const string &Symb )
{
}
 
Fast528 :

아무도 이 다중 문자 NewTick 이벤트 구현을 사용하도록 강요하지 않습니다. 이 스레드에서는 모든 것을 간단하게 설명합니다.

 
fxsaber :

아무도 이 다중 문자 NewTick 이벤트 구현을 사용하도록 강요하지 않습니다. 이 스레드에서는 모든 것을 간단하게 설명합니다.

나는 매개 변수와 함께 정확히 OnTick에 관심이 있었고 컴파일러는 삼켰습니다.

 
Fast528 :

왜 OnTick에 관심이 있습니까????

모르겠어, 그냥 우연이야.

 
fxsaber :

모르겠어, 그냥 우연이야.

말하지 마세요, 트릭을 찾았습니다. MK는 여전히 주요 기능 중 하나의 이름 차용을 수정하지 않았으며, 읽고 검색하는 데 많은 시간을 할애했습니다.

문서화되지 않은 기능을 찾고 있습니다.

사유: