실시간 틱 - 페이지 4

 
Vladimir Mikhailov :

진드기 분석 실험의 일부 요약.

1. OnTick 핸들러가 많은 수의 틱을 놓치고 있습니다.
따라서 들어오는 틱을 통해 거래 테이프를 분석하려는 경우 아무 의미가 없습니다.
이 접근 방식을 사용하면 테스터의 알고리즘 결과와 실제 거래 결과가 달라집니다.

또는 CopyTicks() 또는 CopyTicksRange() 함수를 사용하여 과거 틱을 가져와 선택한 기간 또는 특정 수의 최근 거래에 대한 거래 테이프를 분석할 수 있습니다.
이 경우 테스터에서 알고리즘을 테스트한 결과와 실제 거래 결과는 동일합니다.
마이너스 중 알고리즘 성능 저하.

예, tiki EA는 건너뛸 수 있습니다. 따라서 표시기 또는 CopyTicks 중 하나입니다.

성능 저하는 어떻습니까? 필요한 세그먼트만 복사합니다(마지막 성공적인 데이터 수집 이후에 나타남).

 
Andrey Khatimlianskii :

CopyTicks가 여전히 사용되는 경우 왜 "실시간으로" 수집합니까?

원하는 시간에 원하는 깊이로 눈금을 복사할 수 있습니다.

Andrew, 스레드 제목 읽기

추가됨

CopyTicks()를 사용하면 필요한 깊이에 도달할 수 없지만 2000틱만 사용하면 됩니다!

 
prostotrader :

Andrew, 스레드 제목을 읽으십시오.

작업이 원래 잘못 설정된 경우 어떻게 합니까?

실시간 틱 분석이 가능하지만 갭을 피하기 위해서는 인디케이터나 CopyTicks를 사용해야 합니다.


단순 상인 :

CopyTicks()를 사용하면 필요한 깊이에 도달할 수 없지만 2000틱만 사용하면 됩니다!

이러한 제한은 없습니다. 설명서 의 예를 참조하세요.

Пример вывода
Si- 12.16 : received 11048387 ticks in 4937 ms
Last tick time = 2016.09 . 26 18 : 32 : 59.775 
First tick time = 2015.06 . 18 09 : 45 : 01.000 
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
  • www.mql5.com
[in]  Количество запрашиваемых тиков. Если параметры from и count не указаны, то в массив ticks_array[] будут записаны все доступные последние тики, но не более 2000. Первый вызов CopyTicks() инициирует синхронизацию базы тиков, хранящихся на жёстком диске по данному символу. Если тиков в локальной базе не хватает, то недостающие тики...
 
Andrey Khatimlianskii :

작업이 원래 잘못 설정된 경우 어떻게 합니까?

실시간 틱 분석이 가능하지만 갭을 피하기 위해서는 인디케이터나 CopyTicks를 사용해야 합니다.


이러한 제한은 없습니다. 설명서 의 예를 참조하세요.

1. 반드시 지표는 아닙니다!

증명서를 의미하는 경우, 그것이 쓰여진 곳에

Expert Advisors 및 스크립트에서 CopyTicks() 함수는 결과를 위해 최대 45초를 기다릴 수 있습니다....

그런 다음 끝까지 읽으면 다음과 같이 나옵니다.

발행 속도 : 터미널은 빠른 액세스를 위해 각 기호 대한 마지막 4096 틱을 캐시에 저장합니다.

OnBookEvent() 이벤트는 새 틱 패킷이 터미널에 도착하면 발생하므로

EA에서 진드기를 수집할 수 있습니다. 예를 들어 확인하십시오.

 //+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link        "https://www.mql5.com"
#property version    "1.00"
//---
bool is_book;
MqlTick ticks[];
ulong last_time, mem_time;
bool is_first;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
    is_first = false ;
    is_book = MarketBookAdd ( Symbol ());
     int result = CopyTicks ( Symbol (), ticks, COPY_TICKS_ALL , 0 , 1 );
     if (result > 0 )
    {
      last_time = ticks[ 0 ].time_msc;
      is_first = true ;
    }
     else
    {
       Alert ( "No start time!" );
       return ( INIT_FAILED );
    }   
   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
     if (is_book == true ) MarketBookRelease ( Symbol ());
   
  }
void PrintResult( const int cnt)
{
   if (cnt > 0 )
  {
     for ( int i= 0 ; i<cnt; i++)
    {
       if ((ticks[i].flags& TICK_FLAG_ASK )== TICK_FLAG_ASK ) Print ( "Tick is " , "TICK_FLAG_ASK" ); else
       if ((ticks[i].flags& TICK_FLAG_BID )== TICK_FLAG_BID ) Print ( "Tick is " , "TICK_FLAG_BID" ); else
       if ((ticks[i].flags& TICK_FLAG_BUY )== TICK_FLAG_BUY ) Print ( "Tick is " , "TICK_FLAG_BUY" ); else
       if ((ticks[i].flags& TICK_FLAG_LAST )== TICK_FLAG_LAST ) Print ( "Tick is " , "TICK_FLAG_LAST" ); else
       if ((ticks[i].flags& TICK_FLAG_SELL )== TICK_FLAG_SELL ) Print ( "Tick is " , "TICK_FLAG_SELL" ); else
       if ((ticks[i].flags& TICK_FLAG_VOLUME )== TICK_FLAG_VOLUME ) Print ( "Tick is " , "TICK_FLAG_VOLUME" ); else
       Print ( "Unknown flag is " , ticks[i].flags);
    }
  }
}  
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent ( const string &symbol)
  {
     if ( Symbol () == symbol)
    {
       int result;
       if (is_first == true )
      {
         Print ( "First packet of ticks:" );
        result = CopyTicks ( Symbol (), ticks, COPY_TICKS_ALL , last_time, 0 );
         if (result > 0 )
       {
         PrintResult(result);
         is_first = false ;
         mem_time = last_time;
         last_time = ticks[ 0 ].time_msc + 1 ;
       } 
      }
       else
      {
        result = CopyTicks ( Symbol (), ticks, COPY_TICKS_ALL , mem_time, 0 );
         if (result > 0 )
        {
           for ( int i= 0 ; i<result; i++)
          {
             if (ticks[i].time_msc == mem_time)
            {
               Print ( "Tick with old time:" );
               if ((ticks[i].flags& TICK_FLAG_ASK )== TICK_FLAG_ASK ) Print ( "Tick is " , "TICK_FLAG_ASK" ); else
               if ((ticks[i].flags& TICK_FLAG_BID )== TICK_FLAG_BID ) Print ( "Tick is " , "TICK_FLAG_BID" ); else
               if ((ticks[i].flags& TICK_FLAG_BUY )== TICK_FLAG_BUY ) Print ( "Tick is " , "TICK_FLAG_BUY" ); else
               if ((ticks[i].flags& TICK_FLAG_LAST )== TICK_FLAG_LAST ) Print ( "Tick is " , "TICK_FLAG_LAST" ); else
               if ((ticks[i].flags& TICK_FLAG_SELL )== TICK_FLAG_SELL ) Print ( "Tick is " , "TICK_FLAG_SELL" ); else
               if ((ticks[i].flags& TICK_FLAG_VOLUME )== TICK_FLAG_VOLUME ) Print ( "Tick is " , "TICK_FLAG_VOLUME" ); else
               Print ( "Unknown flag is " , ticks[i].flags);
            }
          }
        }
        result = CopyTicks ( Symbol (), ticks, COPY_TICKS_ALL , last_time, 0 );
         if (result > 0 )
        {
           Print ( "Ticks with new time:" );
          PrintResult(result);
          mem_time = last_time;
          last_time = ticks[ 0 ].time_msc + 1 ;
        }
      }
    }
 }
//+------------------------------------------------------------------+


2. 그런 제한이 있으니 직접 확인하세요. ( CopyTicksRange() 에는 제한이 없습니다)


 
prostotrader :

1. 반드시 지표는 아닙니다!

OnBookEvent() 이벤트는 새 틱 패킷이 터미널에 도착하면 발생하므로

EA에서 진드기를 수집할 수 있습니다. 예를 들어 확인하십시오.

OnBookEvent는 틱이 누락되지 않는다고 보장하지 않습니다. 무거운 계산이 있을 경우 OnTick에서와 동일한 건너뛰기가 발생합니다.

CopyTicks를 통해 필요한 눈금 깊이를 복사할 위치는 중요하지 않습니다.


단순 상인 :

2. 제한이 있으니 직접 확인하세요

도움말에 직접 표시된 매개변수 0, 0에만 해당됩니다.

Если параметры from и count не указаны, то в массив ticks_array[] будут записаны все доступные последние тики, но не более 2000 .
 
Andrey Khatimlianskii :

OnBookEvent는 틱이 누락되지 않는다고 보장하지 않습니다.

반복합니다

OnBookEvent()는 새 틱 패키지 가 도착했음을 보장합니다!

도움말에서:

발행 속도 : 터미널은 빠른 액세스를 위해 각 기호에 대한 마지막 4096 틱을 캐시에 저장 합니다 .

인용 종료 ----

OnBookEvent가 작동하지 않으면 MT5의 모든 거래(교환)가 휴지통에 던져질 수 있습니다!

새 틱 패키지가 도착했습니다. - OnBookEvent는 100% 작동했으며 도착한 틱의 수는 CopyTicks()에 의해 표시됩니다.

데이터는 이미 캐시에 저장되어 있으며 액세스 가 가장 빠릅니다 !

따라서 인디케이터와 어드바이저 모두( 주문서가 실행 중일 때 )에서 실시간 틱 콜렉터를 구현하는 것이 가능합니다.

추가됨

위의 코드를 가져 와서 확인하십시오. 논쟁하는 것보다 ...

 

틱 콜렉터 코드에서 원칙은 맞는데 구현 오류가 있어 수정하겠습니다

그리고 조금 뒤에 포스팅.

추가됨

어드바이저로부터 실시간으로 모든 진드기 수집

즐기다

 //+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link        "https://www.mql5.com"
#property version    "1.00"
//---
bool is_book;
MqlTick ticks[];
ulong last_time, mem_cnt;
bool is_first;
int t_cnt, result;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
{
  is_book = MarketBookAdd ( Symbol ());
  result = CopyTicks ( Symbol (), ticks, COPY_TICKS_ALL , 0 , 1 );
   if (result > 0 )
  {
    last_time = ulong (ticks[ 0 ].time_msc);
    is_first = true ;
  }
   else
  {
    is_first = false ;
     Alert ( "No start time!" );
     return ( INIT_FAILED );
  }   
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+ 
//| возвращает строковое описание тика                               | 
//+------------------------------------------------------------------+ 
string GetTickDescription( MqlTick &tick) 
  { 
   string res = string (tick.time) + "." +   string (tick.time_msc% 1000 ); 
// 
   bool buy_tick = ((tick.flags& TICK_FLAG_BUY )== TICK_FLAG_BUY ); 
   bool sell_tick = ((tick.flags& TICK_FLAG_SELL )== TICK_FLAG_SELL ); 
   bool ask_tick = ((tick.flags& TICK_FLAG_ASK )== TICK_FLAG_ASK ); 
   bool bid_tick = ((tick.flags& TICK_FLAG_BID )== TICK_FLAG_BID ); 
   bool last_tick = ((tick.flags& TICK_FLAG_LAST )== TICK_FLAG_LAST ); 
   bool volume_tick = ((tick.flags& TICK_FLAG_VOLUME )== TICK_FLAG_VOLUME ); 
// 
   if ((buy_tick== true ) || (sell_tick == true )) 
   { 
     res = res + (buy_tick? StringFormat ( " Buy Tick: Last=%G Volume=%d " ,tick.last,tick.volume): "" ); 
     res = res + (sell_tick? StringFormat ( " Sell Tick: Last=%G Volume=%d " ,tick.last,tick.volume): "" ); 
     res = res + (ask_tick? StringFormat ( " Ask=%G " ,tick.ask): "" ); 
     res = res + (bid_tick? StringFormat ( " Bid=%G " ,tick.ask): "" ); 
   } 
   else 
   { 
     res = res + (ask_tick? StringFormat ( " Ask=%G " ,tick.ask): "" ); 
     res = res + (bid_tick? StringFormat ( " Bid=%G " ,tick.ask): "" ); 
     res = res + (last_tick? StringFormat ( " Last=%G " ,tick.last): "" ); 
     res = res + (volume_tick? StringFormat ( " Volume=%d " ,tick.volume): "" ); 
   } 
   return res; 
  } 
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
   if (is_book == true ) MarketBookRelease ( Symbol ());
}
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
//void OnTick()
void OnBookEvent ( const string &symbol)
{
   if ( Symbol () == symbol)
  {
     if (is_first == true )
    {
      result = CopyTicks ( Symbol (), ticks, COPY_TICKS_ALL , last_time, 0 );
       if (result > 0 )
      {
         Print ( "First packet of ticks:" );
        t_cnt = 0 ;
         for ( int i= 0 ; i<result; i++)
        {
           if (ticks[i].time_msc == ticks[ 0 ].time_msc) t_cnt++;
           Print (GetTickDescription(ticks[i]));
        }
        is_first = false ;
        last_time = ulong (ticks[ 0 ].time_msc);
      } 
    }
     else
    {
      result = CopyTicks ( Symbol (), ticks, COPY_TICKS_ALL , last_time, 0 );
       if (result > 0 )
      {
         if (result > t_cnt)
        {
          mem_cnt = t_cnt;
          t_cnt = 0 ;
           for ( int i= 0 ; i<(result - int (mem_cnt)); i++)
          {
             if (ticks[i].time_msc == ticks[ 0 ].time_msc) t_cnt++;
             Print (GetTickDescription(ticks[i]));
          } 
           if (last_time == ulong (ticks[ 0 ].time_msc))
          {
            t_cnt += int (mem_cnt);
          }
           else last_time = ulong (ticks[ 0 ].time_msc + 1 );
        }
         else
        {
          t_cnt = 0 ;
          last_time++;
        }
      }
       else
      {
        t_cnt = 0 ;
        last_time++;
      }
    }
  }
}
//+------------------------------------------------------------------+
 

틱 컬렉터가 작동 하는 방식을 비교하기 위해 모든 거래의 테이프로 한 번에 전환할 수 있습니다.

(두 곳에서 COPY_TICKS_ALL을 COPY_TICKS_TRADE로 대체) 거래 피드와 비교합니다.

도구의 유리에 내장.

기기가 액체 상태인 경우 인쇄가 오래 지연될 수 있습니다.

 
prostotrader :
  if ((ticks[i].flags& TICK_FLAG_ASK )== TICK_FLAG_ASK ) { Print ( "Tick is " , "TICK_FLAG_ASK" , " Tick time: " , ticks[i].time, "." , string (t_msc));} else
           if ((ticks[i].flags& TICK_FLAG_BID ) == TICK_FLAG_BID ) { Print ( "Tick is " , "TICK_FLAG_BID" , " Tick time: " , ticks[i].time,   "." , string (t_msc));} else
           if ((ticks[i].flags& TICK_FLAG_BUY )== TICK_FLAG_BUY ) { Print ( "Tick is " , "TICK_FLAG_BUY" , " Tick time: " , ticks[i].time,   "." , string (t_msc));} else
           if ((ticks[i].flags& TICK_FLAG_LAST )== TICK_FLAG_LAST ) { Print ( "Tick is " , "TICK_FLAG_LAST" , " Tick time: " , ticks[i].time,   "." , string (t_msc));} else
           if ((ticks[i].flags& TICK_FLAG_SELL )== TICK_FLAG_SELL ) { Print ( "Tick is " , "TICK_FLAG_SELL" , " Tick time: " , ticks[i].time,   "." , string (t_msc));} else
           if ((ticks[i].flags& TICK_FLAG_VOLUME )== TICK_FLAG_VOLUME ) { Print ( "Tick is " , "TICK_FLAG_VOLUME" , " Tick time: " , ticks[i].time,   "." , string (t_msc));} else

틱은 동시에 하나 이상의 플래그를 가질 수 없습니까?

 
prostotrader :

반복합니다

OnBookEvent()는 새 틱 패키지 가 도착했음을 보장합니다!


그러나 이것은 모든 OnBookEvent 이벤트를 처리한다는 보장이 있다는 것을 의미합니까?

사유: