MT5와 속도 - 페이지 80

 
fxsaber :

위협 몇 달 동안 발생하는 동결을 없애면 좋을 것입니다. 무한 RAM이 있는 시스템에서 이 스크립트 를 실행하십시오. 예를 들어 6월 1일부터 1개의 캐릭터로 틱을 다운로드할 수 없습니다. 리소스 소비 없이 CopyTicks를 중단합니다.

b2699 - 수정했습니다. 감사합니다.

 
브레이크를 보여주는 코드의 돼지 저금통에서. 이번에는 테스터 .
 

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

SL/TP 주문 수락

fxsaber , 2020.12.11 09:17

 // Измеряет размер лага между приходом тика на MT5-сервер и MT5-Терминал.
// Запускать на той же машине, на которой установлен MT5-сервер.

100틱이 처리되었습니다. 서버와 Tick Terminal 사이의 도착 지연은 1밀리초에서 8밀리초 사이입니다. 평균적으로 - 4밀리초가 조금 넘습니다. 이것은 이 분기를 시작한 TP 주문 트리거의 지연과 정확히 같습니다.


지연 자체는 MT5 서버 내부에 있습니다. 서버 -> 터미널 채널은 그것과 아무 관련이 없습니다.


이 지연을 수정하기 위한 개발자의 큰 요청입니다. 이제 핑이 0인 증권 거래소에서 터미널뿐만 아니라 서버에도 틱이 도착하는 데 일정한 지연이 발생합니다. 특히, 영장의 수락.

 
거래 시 지연을 줄이려면 전투 터미널을 RAM 드라이브로 전환하는 것이 좋습니다.
 

Market Watch: SymbolInfoTick 에 나왔음에도 불구하고 갑자기 역사에 틱이 없는 상황에 직면했습니다.



MQL을 통해 동일한 틱을 인쇄하면 흥미로운 플래그가 생성됩니다.

                         [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
        [ 0 ] 2021.01 . 04 20 : 52 : 55 103.16300 103.16500 0.0000          0 1609793575267        4        0.00000
        [ 1 ] 2021.01 . 04 20 : 52 : 55 103.16300 103.16400 0.0000          0 1609793575788        4        0.00000
        [ 2 ] 2021.01 . 04 20 : 52 : 59 103.16400 103.16400 0.0000          0 1609793579367      130        0.00000
        [ 3 ] 2021.01 . 04 20 : 53 : 01 103.16400 103.16400 0.0000          0 1609793581817        2        0.00000
        [ 4 ] 2021.01 . 04 20 : 53 : 01 103.16300 103.16400 0.0000          0 1609793581969        2        0.00000

이 플래그는 누락된 Market Watch 틱 직전의 히스토리 틱에서 생성되었습니다. 아마도 이것은 문제가 어디에 있는지 알려줄 것입니다.


추신: 불행히도 이것은 체계적으로 발생합니다. 틱 기록에는 터미널에 오는 모든 틱이 포함되어 있지 않습니다.

 
fxsaber :

Market Watch: SymbolInfoTick에 나왔음에도 불구하고 갑자기 역사에 틱이 없는 상황에 직면했습니다.



MQL을 통해 동일한 틱을 인쇄하면 흥미로운 플래그가 생성됩니다.

이 플래그는 누락된 Market Watch 틱 직전의 히스토리 틱에서 생성되었습니다. 아마도 이것은 문제가 어디에 있는지 알려줄 것입니다.


추신: 불행히도 이것은 체계적으로 발생합니다. 틱 기록에는 터미널에 오는 모든 틱이 포함되어 있지 않습니다.

그리고 있다. EA가 하루 종일 실제 계정 으로 거래한다고 가정해 보겠습니다. 우리는 이익을 얻습니다.

다음날 테스터를 전날 실행하면 손실이 발생합니다.

브로커가 잘못된 틱을 제공하는지 아니면 다른 것이 있는지 이유는 분명하지 않습니다.

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
Информация о счете - Состояние окружения - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

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

MT5와 속도

fxsaber , 2021.01.04 20:51

Market Watch: SymbolInfoTick에 나왔음에도 불구하고 갑자기 역사에 틱이 없는 상황에 직면했습니다.


tkc가 터미널에 의해 형성되지 않고 서버에서 다운로드된 병렬 터미널을 시작했습니다.

화면에서 이 터미널은 왼쪽에 있습니다. 체크 표시가 있습니다. 그리고 다른 터미널(오른쪽) - 아니요!


터미널 자체가 들어오는 모든 틱을 틱 기록으로 푸시하지 않는 것으로 나타났습니다. 그리고 공백 없는 기록을 원하면 이제 tkc 파일을 고정하고 서버에서 가져와야 합니다.

나쁜 버그.

 
// Попытка поймать тик, который не попал в историю тиков.

// Сравнение двух тиков.
bool IsEqual( const MqlTick &Tick1, const MqlTick &Tick2 )
{
   return ((Tick1.time_msc == Tick2.time_msc) &&
         ! NormalizeDouble (Tick1.bid - Tick2.bid, _Digits ) &&
         ! NormalizeDouble (Tick1.ask - Tick2.ask, _Digits ));
}

// Проверяет наличие тика в истории.
bool IsHistory( const MqlTick &Tick )
{
   bool Res = false ;
  
   MqlTick Ticks[];
  
   const int Size = CopyTicksRange ( _Symbol , Ticks, COPY_TICKS_ALL , Tick.time_msc, Tick.time_msc + 1 );
  
   for ( int i = 0 ; !Res && (i < Size); i++)
    Res = IsEqual(Tick, Ticks[i]);
    
   return (Res);
}

void OnTick ()
{
   static MqlTick Ticks[];
   MqlTick Tick;
  
   if ( SymbolInfoTick ( _Symbol , Tick)) // Взяли текущий тик.
  {
     const int Size = ArrayResize (Ticks, ArraySize (Ticks) + 1 );
    
    Ticks[Size - 1 ] = Tick; // Дописали его в массив
    
     MqlTick HistoryTick[ 1 ];
    
     if ( CopyTicks ( _Symbol , HistoryTick, COPY_TICKS_ALL , 0 , 1 ) > 0 ) // Взяли последний исторический тик
    {
       int i = 0 ;
      
       while ((i < Size) && (Ticks[i].time_msc < HistoryTick[ 0 ].time_msc)) // Если исторический тик пришел позже проверяемого
      {
         if (!IsHistory(Ticks[i]))                                     // Если в истории тиков нет проверяемого тика,
        {
           Alert ( "!IsHistory(Ticks[i]) == true" );
           ArrayPrint (Ticks, _Digits , NULL , i, 1 , ARRAYPRINT_HEADER ); // выводим его.
        }
          
        i++;
      }
      
       ArrayRemove (Ticks, 0 , i); // Удалили тики, что проверили.
    }
  }  
}

그런 EA는 역사에서 놓친 진드기를 잡지 못했습니다. 전투 - 잡혔다. 분명히 이러한 틱은 OnTick을 시작하지 않습니다.

건너뛴 틱 자체는 10밀리초 동안 관련될 수 있습니다.

 
fxsaber :
위의 글은 출처가 있는 글이었습니다. 이제 비어 있습니다. 원인?
아마 사이트 업데이트 당시의 글일 것입니다(영어 부분에 그런 글이 2개 있습니다).
 
fxsaber :

tkc가 터미널에 의해 형성되지 않고 서버에서 다운로드되는 병렬 터미널을 시작했습니다.

화면에서 이 터미널은 왼쪽에 있습니다. 체크 표시가 있습니다. 그리고 다른 터미널(오른쪽) - 아니요!

두 터미널에서 이러한 스크립트를 시작했습니다.

 // Сохранение тиковой истории в текстовый файл.

string GetTickFlag( uint tickflag )
{
   string flag = " " + ( string )tickflag;

#define TICKFLAG_MACRO(A) flag += (( bool )(tickflag & TICK_FLAG_ ##A)) ? " TICK_FLAG_" + #A : "" ; \
                        tickflag -= tickflag & TICK_FLAG_ ##A;
TICKFLAG_MACRO(BID)
TICKFLAG_MACRO(ASK)
TICKFLAG_MACRO(LAST)
TICKFLAG_MACRO(VOLUME)
TICKFLAG_MACRO(BUY)
TICKFLAG_MACRO(SELL)
#undef TICKFLAG_MACRO

   if (tickflag)
    flag += " FLAG_UNKNOWN (" + ( string )tickflag + ")" ;

   return (flag);
}

#define TOSTRING(A) " " + #A + " = " + ( string )Tick.A
string TickToString( const MqlTick &Tick, const int FilterFlags = 0xFF )
{
   return (TOSTRING(time) + "." + :: IntegerToString (Tick.time_msc % 1000 , 3 , '0' ) +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags & FilterFlags));
}
#undef TOSTRING


void OnStart ()
{  
   MqlTick Ticks[];
   const int Size = CopyTicksRange ( _Symbol , Ticks, COPY_TICKS_ALL , D'2021.01.05 01:00' * 1000 , D'2021.01.05 10:50' * 1000 );
  
   string From = ( string )Ticks[ 0 ].time;
   string To = ( string )Ticks[Size - 1 ].time;
  
   StringReplace (From, ":" , "." );
   StringReplace (To, ":" , "." );
  
   const int handle = FileOpen ( _Symbol + "_" + From + "-" + To + ".txt" , FILE_WRITE | FILE_ANSI | FILE_TXT );

   if (handle != INVALID_HANDLE )
  {        
     for ( int i = 0 ; i < Size; i++)
       FileWrite (handle, TickToString(Ticks[i], 0x7F )); // Фильтр флагов, иначе очень много различий.

     FileClose (handle);
  }
  
   Alert ( "Done." );
}


요청하는 간격에 따라 tkc가 변경될 수 있습니다(서버와 동기화). 따라서 요청 전에 존재하지 않았던 일부 틱이 존재하기 시작할 수 있습니다.

그럼에도 불구하고 다른 기호에서 여러 개를 식별하는 것은 여전히 가능했습니다. 플래그 필터를 적용해야 했기 때문에 그들은 다른 터미널의 진드기에 대해 매우 다릅니다.

차이점은 다음과 같습니다.


EURJPY.


USDCHF


일반적으로 실시간으로 거래할 때 틱의 마감 이력에는 터미널에 와서 서버에 있는 일부 틱이 포함되지 않을 수 있습니다.

이 버그를 수정해야 합니다.