서비스, MT5 아키텍처의 새로운 기능인 MT4의 죽음이 코앞에 다가왔습니다. - 페이지 8

 

영어로부터.

데이터 -- 데이터

먹이 -- 먹이

datafeed -- 데이터 소스("소스"라는 단어가 의미를 제대로 전달하지는 않지만)


피더 -- 피더, 피더, 로딩 장치

 

О датафидах. Сколько встречал этот термин, сложилось ощущение, что этим словом обозначают источник данных (котировок). Буквально "заполнитель данных". Когда речь идет о собственных инструментах, понимаю так, что мы сможем вычислять котировки, например, никем не котируемого MXNRUB по известным курсам MXNUSD и USDRUB, выгруженным из терминала в .csv формат, и легализовать для терминала новые котировки, указав файл .csv как новый датафид . Возможно, будет реализовано и более изящное решение, без выгрузки в файлы, путем онлайновых операций */ над тиками (MXNRUB =  MXNUSD * USDRUB). И это будет новый датафид.

그리고 목, 당신은 이미 MT5에 대한 틱에서 .csv 따옴표의 가져오기를 완료했습니까?
 
Andrey Khatimlianskii :

토론, 버그 보고서 또는 이와 유사한 것에 대한 링크가 없습니까? 아니면 그냥 그런 느낌인데 지금은 확인하지 않았나요?

내가 기억하는 한 OnCalculate에서 수집된 틱은 CopyTix를 통해 요청된 틱과 일치했습니다.

이제 구체적으로 확인했습니다 ... 예상대로 일종의 쓰레기를 얻었지만 예상했던 것은 아닙니다. :)

 2017.05 . 22 12 : 47 : 10.591 (RTS- 6.17 ,M1)   OnCalculate : 2017.05 . 22 10 : 47 : 11.27 ms v = 1 , bid = 108320 , ask = 108330 , last = 108330 , flags = 4
2017.05 . 22 12 : 47 : 10.591 (RTS- 6.17 ,M1)   OnBookEvent : 2017.05 . 22 10 : 47 : 11.27 ms v = 1 , bid = 108320 , ask = 108330 , last = 108330 , flags = 4
2017.05 . 22 12 : 47 : 10.599 (RTS- 6.17 ,M1)   OnBookEvent : 2017.05 . 22 10 : 47 : 11.27 ms v = 1 , bid = 108320 , ask = 108330 , last = 108330 , flags = 4
2017.05 . 22 12 : 47 : 10.605 (RTS- 6.17 ,M1)   OnBookEvent : 2017.05 . 22 10 : 47 : 11.27 ms v = 1 , bid = 108320 , ask = 108330 , last = 108330 , flags = 4
2017.05 . 22 12 : 47 : 10.617 (RTS- 6.17 ,M1)   OnBookEvent : 2017.05 . 22 10 : 47 : 11.27 ms v = 1 , bid = 108320 , ask = 108330 , last = 108330 , flags = 4
2017.05 . 22 12 : 47 : 10.637 (RTS- 6.17 ,M1)   OnBookEvent : 2017.05 . 22 10 : 47 : 11.27 ms v = 1 , bid = 108320 , ask = 108330 , last = 108330 , flags = 4
2017.05 . 22 12 : 47 : 10.649 (RTS- 6.17 ,M1)   OnBookEvent : 2017.05 . 22 10 : 47 : 11.27 ms v = 1 , bid = 108320 , ask = 108330 , last = 108330 , flags = 4
2017.05 . 22 12 : 47 : 10.683 (RTS- 6.17 ,M1)   OnBookEvent : 2017.05 . 22 10 : 47 : 11.27 ms v = 1 , bid = 108320 , ask = 108330 , last = 108330 , flags = 4
2017.05 . 22 12 : 47 : 10.765 (RTS- 6.17 ,M1)   OnBookEvent : 2017.05 . 22 10 : 47 : 11.27 ms v = 1 , bid = 108320 , ask = 108330 , last = 108330 , flags = 4
2017.05 . 22 12 : 47 : 10.771 (RTS- 6.17 ,M1)   OnCalculate : 2017.05 . 22 10 : 47 : 11.193 ms v = 1 , bid = 108320 , ask = 108330 , last = 108320 , flags = 88
2017.05 . 22 12 : 47 : 10.781 (RTS- 6.17 ,M1)   OnBookEvent : 2017.05 . 22 10 : 47 : 11.193 ms v = 1 , bid = 108320 , ask = 108330 , last = 108320 , flags = 88
2017.05 . 22 12 : 47 : 10.843 (RTS- 6.17 ,M1)   OnBookEvent : 2017.05 . 22 10 : 47 : 11.244 ms v = 1 , bid = 108320 , ask = 108330 , last = 108320 , flags = 0
2017.05 . 22 12 : 47 : 10.843 (RTS- 6.17 ,M1)   OnBookEvent : Время последнего OnCalculate = 2017.05 . 22 10 : 47 : 11.193 ms ( 88 ), время последнего OnBookEvent = 2017.05 . 22 10 : 47 : 11.244 ms ( 0 )
2017.05 . 22 12 : 47 : 10.859 (RTS- 6.17 ,M1)   OnCalculate : 2017.05 . 22 10 : 47 : 11.282 ms v = 1 , bid = 108320 , ask = 108330 , last = 108320 , flags = 88
2017.05 . 22 12 : 47 : 10.863 (RTS- 6.17 ,M1)   OnBookEvent : 2017.05 . 22 10 : 47 : 11.282 ms v = 1 , bid = 108320 , ask = 108330 , last = 108320 , flags = 88

플래그가 0인 틱은 OnBookEvent()를 통해 잡힙니다...

 

그리고 다음은 내가 볼 것으로 기대한 것입니다.

 2017.05 . 22 13 : 24 : 38.242 (RTS- 6.17 ,M1)   OnCalculate : 2017.05 . 22 11 : 24 : 38.689 ms v = 2 , bid = 108540 , ask = 108560 , last = 108550 , flags = ' TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05 . 22 13 : 24 : 38.242 (RTS- 6.17 ,M1)   OnCalculate : 2017.05 . 22 11 : 24 : 38.689 ms v = 2 , bid = 108540 , ask = 108560 , last = 108550 , flags = ' TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05 . 22 13 : 24 : 38.242 (RTS- 6.17 ,M1)   OnCalculate : 2017.05 . 22 11 : 24 : 38.689 ms v = 2 , bid = 108540 , ask = 108560 , last = 108550 , flags = ' TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05 . 22 13 : 24 : 38.242 (RTS- 6.17 ,M1)   OnCalculate : 2017.05 . 22 11 : 24 : 38.689 ms v = 2 , bid = 108540 , ask = 108560 , last = 108550 , flags = ' TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05 . 22 13 : 24 : 38.242 (RTS- 6.17 ,M1)   OnBookEvent : 2017.05 . 22 11 : 24 : 38.689 ms v = 2 , bid = 108540 , ask = 108560 , last = 108550 , flags = ' TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05 . 22 13 : 24 : 38.253 (RTS- 6.17 ,M1)   OnCalculate : 2017.05 . 22 11 : 24 : 38.704 ms v = 2 , bid = 108550 , ask = 108560 , last = 108550 , flags = ' TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05 . 22 13 : 24 : 38.253 (RTS- 6.17 ,M1)   OnCalculate : Время последнего STick = 2017.05 . 22 11 : 24 : 38.704 ms ( TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME ), время последнего CopyTicks = 2017.05 . 22 11 : 24 : 38.697 ms ( TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME )
2017.05 . 22 13 : 24 : 38.253 (RTS- 6.17 ,M1)   OnCalculate : 2017.05 . 22 11 : 24 : 38.704 ms v = 2 , bid = 108550 , ask = 108560 , last = 108550 , flags = ' TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05 . 22 13 : 24 : 38.253 (RTS- 6.17 ,M1)   OnCalculate : Время последнего STick = 2017.05 . 22 11 : 24 : 38.704 ms ( TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME ), время последнего CopyTicks = 2017.05 . 22 11 : 24 : 38.697 ms ( TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME )
2017.05 . 22 13 : 24 : 38.254 (RTS- 6.17 ,M1)   OnCalculate : 2017.05 . 22 11 : 24 : 38.704 ms v = 2 , bid = 108550 , ask = 108560 , last = 108550 , flags = ' TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05 . 22 13 : 24 : 38.255 (RTS- 6.17 ,M1)   OnCalculate : 2017.05 . 22 11 : 24 : 38.704 ms v = 2 , bid = 108550 , ask = 108560 , last = 108550 , flags = ' TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05 . 22 13 : 24 : 38.255 (RTS- 6.17 ,M1)   OnCalculate : 2017.05 . 22 11 : 24 : 38.704 ms v = 2 , bid = 108550 , ask = 108560 , last = 108550 , flags = ' TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05 . 22 13 : 24 : 38.255 (RTS- 6.17 ,M1)   OnCalculate : 2017.05 . 22 11 : 24 : 38.704 ms v = 2 , bid = 108550 , ask = 108560 , last = 108550 , flags = ' TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05 . 22 13 : 24 : 38.261 (RTS- 6.17 ,M1)   OnCalculate : 2017.05 . 22 11 : 24 : 38.710 ms v = 1 , bid = 108540 , ask = 108560 , last = 108560 , flags = ' TICK_FLAG_BID '
2017.05 . 22 13 : 24 : 38.261 (RTS- 6.17 ,M1)   OnCalculate : 2017.05 . 22 11 : 24 : 38.710 ms v = 1 , bid = 108540 , ask = 108560 , last = 108560 , flags = ' TICK_FLAG_BID '
2017.05 . 22 13 : 24 : 38.261 (RTS- 6.17 ,M1)   OnCalculate : 2017.05 . 22 11 : 24 : 38.710 ms v = 1 , bid = 108540 , ask = 108560 , last = 108560 , flags = ' TICK_FLAG_BID '
2017.05 . 22 13 : 24 : 38.262 (RTS- 6.17 ,M1)   OnCalculate : 2017.05 . 22 11 : 24 : 38.710 ms v = 1 , bid = 108540 , ask = 108560 , last = 108560 , flags = ' TICK_FLAG_BID '
2017.05 . 22 13 : 24 : 38.262 (RTS- 6.17 ,M1)   OnCalculate : 2017.05 . 22 11 : 24 : 38.710 ms v = 1 , bid = 108540 , ask = 108560 , last = 108560 , flags = ' TICK_FLAG_BID '
2017.05 . 22 13 : 24 : 38.270 (RTS- 6.17 ,M1)   OnBookEvent : 2017.05 . 22 11 : 24 : 38.710 ms v = 1 , bid = 108540 , ask = 108560 , last = 108560 , flags = ' TICK_FLAG_BID '
2017.05 . 22 13 : 24 : 38.280 (RTS- 6.17 ,M1)   OnCalculate : 2017.05 . 22 11 : 24 : 38.730 ms v = 2 , bid = 108550 , ask = 108560 , last = 108560 , flags = ' TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05 . 22 13 : 24 : 38.280 (RTS- 6.17 ,M1)   OnCalculate : Время последнего STick = 2017.05 . 22 11 : 24 : 38.730 ms ( TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME ), время последнего CopyTicks = 2017.05 . 22 11 : 24 : 38.719 ms ( TICK_FLAG_BID )
2017.05 . 22 13 : 24 : 38.282 (RTS- 6.17 ,M1)   OnBookEvent : 2017.05 . 22 11 : 24 : 38.730 ms v = 2 , bid = 108550 , ask = 108560 , last = 108560 , flags = ' TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05 . 22 13 : 24 : 38.283 (RTS- 6.17 ,M1)   OnCalculate : 2017.05 . 22 11 : 24 : 38.730 ms v = 2 , bid = 108550 , ask = 108560 , last = 108560 , flags = ' TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
보시다시피 SymbolInfoTick() 함수를 사용하여 OnCalculate() 함수 에 대한 각 호출에서 마지막 눈금을 요청할 때 일부 눈금은 건너뛰고 CopyTicks()에서 반환됩니다.
 

확인할 코드:

 #property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MqlTick _tick;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- Подписываемся на стакан
   MarketBookAdd ( _Symbol );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---
   ResetLastError ();
//--- Проверяем получение параметров тика
   if (! SymbolInfoTick ( _Symbol ,_tick))
       Print ( __FUNCTION__ , ": ОШИБКА #" , GetLastError (), ": параметры тика не получены!" );
   else
       Print ( __FUNCTION__ , ": " +GetMsToStringTime(_tick.time_msc)+ " v = " ,_tick.volume, ", bid = " + DoubleToString (_tick.bid, _Digits )+
             ", ask = " + DoubleToString (_tick.ask, _Digits )+ ", last = " + DoubleToString (_tick.last, _Digits )+ ", flags = '" +GetStrFlags(_tick.flags)+ "'" );
//---
   ResetLastError ();
//---
   MqlTick t[ 1 ];
   if ( CopyTicks ( _Symbol ,t, COPY_TICKS_ALL , 0 , 1 )!= 1 )
       Print ( __FUNCTION__ , ": ОШИБКА #" , GetLastError (), ": Последний тик не получен!" );
   else
     {
       if (t[ 0 ].time_msc!=_tick.time_msc)
        {
         Print ( __FUNCTION__ , ": Время последнего STick = " +GetMsToStringTime(_tick.time_msc)+ " (" +GetStrFlags(_tick.flags)+ ")" +
               ", время последнего CopyTicks = " +GetMsToStringTime(t[ 0 ].time_msc)+ " (" +GetStrFlags(t[ 0 ].flags)+ ")" );
        }
     }
//---
   return (rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnBookEvent ( const string &symbol)
  {
//---
   if (symbol!= _Symbol )
       return ;
//--- Структура - приемник последнего тика
   MqlTick tick;
//---
   ResetLastError ();
//--- Проверяем получение параметров тика
   if (! SymbolInfoTick ( _Symbol ,tick))
       Print ( __FUNCTION__ , ": ОШИБКА #" , GetLastError (), ": параметры тика не получены!" );
   else
       Print ( __FUNCTION__ , ": " +GetMsToStringTime(tick.time_msc)+ " v = " ,tick.volume, ", bid = " + DoubleToString (tick.bid, _Digits )+
             ", ask = " + DoubleToString (tick.ask, _Digits )+ ", last = " + DoubleToString (tick.last, _Digits )+ ", flags = '" +GetStrFlags(tick.flags)+ "'" );
//--- Сравниваем последний тик OnCalculate с последним тиком OnBookEvent
   if (tick.time_msc!=_tick.time_msc)
     {
       Print ( __FUNCTION__ , ": Время последнего OnCalculate = " +GetMsToStringTime( _tick.time_msc )+ " (" +GetStrFlags( _tick.flags )+ ")" +
             ", время последнего OnBookEvent = " +GetMsToStringTime( tick.time_msc )+ " (" +GetStrFlags( tick.flags )+ ")" );
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- Отписываемся от стакана
   MarketBookRelease ( _Symbol );
  }
//+------------------------------------------------------------------+
//| Получаем строку времени из миллисекунд                                                                      |
//+------------------------------------------------------------------+
string GetMsToStringTime( const ulong ms)
  {
   const int MS_KOEF= 1000 ;               // Коэффициент перевода секунд в миллисекунды
   return ( TimeToString ( ms/MS_KOEF, TIME_DATE | TIME_SECONDS )+ "." + string ( ms%MS_KOEF )+ " ms" );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string GetStrFlags( const uint flags)
  {
   string s= "" ;
//---
   if (( flags& TICK_FLAG_ASK )== TICK_FLAG_ASK )
      s+= "TICK_FLAG_ASK " ;
   if (( flags& TICK_FLAG_BID )== TICK_FLAG_BID )
      s+= "TICK_FLAG_BID " ;
   if (( flags& TICK_FLAG_BUY )== TICK_FLAG_BUY )
      s+= "TICK_FLAG_BUY " ;
   if (( flags& TICK_FLAG_SELL )== TICK_FLAG_SELL )
      s+= "TICK_FLAG_SELL " ;
   if (( flags& TICK_FLAG_LAST )== TICK_FLAG_LAST )
      s+= "TICK_FLAG_LAST " ;
   if (( flags& TICK_FLAG_VOLUME )== TICK_FLAG_VOLUME )
      s+= "TICK_FLAG_VOLUME " ;
//---
   return ( s );
  }
//+------------------------------------------------------------------+
 
Alexey Kozitsyn :

확인할 코드:

확실히 하기 위해(OnBookEvent 및 CopyTicks 를 테스트하지 않고 OnCalculate 계획대로) OnCalculate를 호출할 때 파일에 틱 기록만 남겨둘 것입니다.

그런 다음 CopyTicks를 통해 틱을 수신하는 스크립트로 동일한 파일을 생성합니다. 차이점은 더 명확했을 것이며 OnCalculate에서 틱 건너뛰기 또는 CopyTicks의 잘못된 작동을 나타냅니다.

 
Andrey Khatimlianskii :

확실히 하기 위해(OnBookEvent 및 CopyTicks를 테스트하지 않고 OnCalculate를 계획대로) OnCalculate를 호출할 때 파일에 틱 기록만 남겨둘 것입니다.

그런 다음 스크립트는 CopyTicks를 통해 틱을 수신하여 동일한 파일을 생성합니다. 차이점은 더 명확했을 것이며 OnCalculate에서 틱 건너뛰기 또는 CopyTicks의 잘못된 작동을 나타냅니다.

그런 간단한 계산으로 더 이상 귀찮게 할 이유가 없습니다. SymbolInfoTick() 및 CopyTicks()의 두 호출 에 대한 구체적인 비교가 있습니다. 그리고 모든 SymbolInfoTick() 호출이 명확하게 표시됩니다. 그리고 CopyTicks()가 OnCalculate()에서 SymbolInfoTick()에서 요청했을 때 받지 못한 틱을 반환했음을 알 수 있습니다. 그리고 오류에 대한 두 가지 이유가 있을 수 있습니다. 1. OnCalculate()가 눈금을 건너뛰거나 2. SymbolInfoTick()이 어딘가에 있어야 하는 것과 다른 것을 반환합니다.

네, 이것은 수집하는 데 30초가 걸린 로그의 일부입니다... 그래서 놓친 틱의 수를 상상해 보십시오.

 
Alexey Kozitsyn :

서비스 데스크와의 대화:

OnCalculate에서 틱 건너뛰기
개통, 개통: 2017.05.22 14:52, #1751442

길을 잃지 않도록 https://www.mql5.com/ru/forum/190129/page8#comment_5081300 및 다음 게시물 2개를 살펴보세요.

표시기의 CopyTicks는 표시기가 OnCalculate에서 수신하지 않는 틱을 제공합니다(전도 후도 아님).

지원팀 2017.05.23 09:44
상태: 원시 열기
귀하의 신청서가 검토를 위해 수락되었습니다.
지원팀 2017.05.23 09:46

OnCalculate는 모든 틱에서 호출됩니다.

눈금은 별도의 스레드에서 베이스에 추가됩니다. 즉, 비동기식입니다. CopyTicks를 사용하면 OnCalculate라는 동일한 틱을 얻을 수 있다는 사실이 아닙니다.

Andrey Khatimlianskii 2017.05.23 14:08

그것에 관한 것이 아닙니다.

CopyTicks를 사용하면 OnCalculate에 없는 틱을 얻을 수 있습니다(누락된 것보다 시간이 더 긴 틱에 대해 OnCalculate에서 이에 대해 배웁니다).

로그를 보세요.

지원팀 2017.05.23 14:13

바로 이것에 관한 것입니다.

진드기 팩이 도착했습니다. 2개의 스레드가 이 배치 처리를 시작했습니다. 사이클의 한 스레드는 배치의 각 틱에 대해 OnCalculate를 시작합니다. 다른 스레드는 전체 팩을 티크 베이스에 넣습니다. 이 2개의 스레드는 어떤 식으로든 서로 동기화되지 않으며 어떤 스레드가 많은 틱을 더 빠르게 처리할지 알 수 없습니다.

Andrey Khatimlianskii 2017.05.23 14:26

그러나 팩의 각 틱은 OnCalculate에서 처리해야 합니다. 그리고 이것은 일어나지 않습니다.

이 시간에는 틱이 없습니다. 시간이 짧은 진드기와 시간이 긴 진드기가 있습니다. 그리고 그들 사이에는 OnCalculate 호출이 없었습니다.

지원팀 2017.05.23 14:33

퇴비

그러나 팩의 각 틱은 OnCalculate에서 처리해야 합니다. 그리고 이것은 일어나지 않습니다.

이 시간에는 틱이 없습니다. 시간이 짧은 진드기와 시간이 긴 진드기가 있습니다. 그리고 그들 사이에는 OnCalculate 호출이 없었습니다.

팩의 각 틱은 OnCalculate에서 처리됩니다. 패스가 없습니다. 싸이클은 그렇게 쓰여 있습니다.

OnCalculate에서 어떤 틱이 처리되는지 알아보려면 SymbolInfoTick 을 사용하십시오. 여기에서 모든 것이 명확합니다. 기호에 대한 정보에 틱이 적용된 다음 해당 기호의 모든 표시기가 호출되며 모두 동일한 스레드에 있습니다.

Andrey Khatimlianskii 2017.05.23 14:36

링크의 로그를 참조하십시오.

OnCalculate의 SymbolInfoTick에는 CopyTicks에서 얻을 수 있는 눈금이 표시되지 않습니다.

그래서 내가 쓴

지원팀 2017.05.23 14:40

https://www.mql5.com/ru/forum/190129/page8#comment_5082755 에서 제안한 대로 정확히 수행해야 합니다.

확실히 하기 위해(OnBookEvent 및 CopyTicks를 테스트하지 않고 OnCalculate를 계획대로) OnCalculate를 호출할 때 파일에 틱 기록만 남겨둘 것입니다.

그런 다음 CopyTicks를 통해 틱을 수신하는 스크립트로 동일한 파일을 생성합니다. 차이점은 더 명확했을 것이며 OnCalculate에서 틱 건너뛰기 또는 CopyTicks의 잘못된 작동을 나타냅니다.

이것이 바로 우리가 한 번에 CopyTicks의 정확성을 확인하는 방법입니다. 테스트 스크립트 및 지표가 남아 있으며 다시 확인하겠습니다.

 

모든 틱 에 생성됩니다. 따라서 지표에 대한 틱 대기열이 있습니다. 일정량에 도달하면 표시기가 너무 느리다는 경고가 로그에 전송됩니다.

막대 자체는 본질적으로 지표이며 계산 이벤트를 기반으로 형성됩니다. 따라서 TF M1이 여전히 10:15:00.020이고 버스트가 50ms 동안 도착하면 첫 번째 틱의 시간은 여전히 10:14:59.970입니다. 그리고 모든 표시기는 이 계산 이벤트에서 먼저 호출됩니다. 먼저 시계열 표시기를 호출한 다음 이러한 시계열이 있는 사용자 지정 표시기를 호출합니다. 저것들. 이 시나리오에서 10:15 막대는 아직 0으로 형성되지 않았습니다. 그리고 0 - 10:14.


또한, 계산 이벤트를 통해 팩이 풀리기 시작하면 10:15 막대도 나타납니다. 디테일한 것 같습니다.

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

mql5 언어의 특징, 미묘함 및 작업 방법

fxsaber , 2017.03.29 22:41

결과적으로 EA가 아직 형성되지 않은 막대의 틱을받는 것은 매우 정상입니다. 그러나 이것은 특별히 재현되는 미묘한 순간입니다. 시도해야합니다. 일반적으로 실제보다 이론에 가깝습니다.


추신: 속도가 편집증적인 경우 표시기(물론 막대 포함)를 사용하는 것은 선택 사항이 아닙니다. 모든 것은 고문에 있습니다.

 
Andrey Khatimlianskii :

서비스 데스크와의 대화:

불행히도 서비스 데스크는 레퍼토리에 있습니다. 토론에 관한 경우 링크를 던질 필요가 없습니다. 그리고 손가락에 대한 구체적인 예를 들어보십시오. 그들은 그것에 대해 전혀 이야기하지 않습니다. 그들은 SymbolInfoTick()이 현재 체크된 틱을 반환한다고 말하고 이론상의 OnCalculate()는 모든 틱 을 처리합니다. 출력은 모든 틱이어야 합니다. 그리고 CopyTicks()는 그 반대를 알려줍니다. 음... 그리고 그들은 CopyTicks()를 보지 말라고 말합니다 :). 그들은 또한 그 해 말에 CopyTicks()를 수정할 때 두 가지 스트림에 대해 설명했습니다. 여기에서만 그에 관한 것이 아닙니다(비록 그에게도 x가 있을 수 있음).

OnBookEvent()에서 수신할 때 플래그 0이 있는 틱에 대해 질문했습니까?

사유: