현지 시간과 신선한 틱 시간 사이에는 1분 30초의 차이가 있습니다. 할 일. - 페이지 2

 
prostotrader :

주석이 있는 소스 코드가 있습니다.

보기에 너무 게으른? 아니면 뭔가 명확하지 않습니까?

보았다. 코드 없이 아이디어를 얻었습니다. 왜 나에게 조언하는지 명확하지 않습니다.

단순 상인 :

가장 유동적인 상품을 Market Watch에 추가해야 합니다.

그런 다음 이러한 도구의 안경을 추가합니다.

그리고 OnBookEvent()가 트리거되면 1틱(마지막)을 복사하면 시간이 있고 즉시 현지 시간을 가져와 비교합니다.

당신의 방법이 더 나은 이유는 무엇입니까?

 
pivomoe :

보았다. 코드 없이 아이디어를 얻었습니다. 왜 나에게 조언하는지 명확하지 않습니다.

당신의 방법이 더 나은 이유는 무엇입니까?

그가 옳기 때문입니다!

현지 시간이 아니라 서버 시간을 잘못 입력했습니다 .

1. 진드기는 일괄적으로 터미널에 도착합니다.

2. 각 후속 패키지에는 이전 패키지에 "스택"되지 않았지만 이전 패키지와 동일한 시간을 갖는 틱이 포함될 수 있습니다.

3. OnBookEvent()는 모든 틱(가격, 거래량 변경), 즉 각 틱 이 도착하면 트리거됩니다 . (당신은 타이머를 시작 - 이미 나쁜).

4. 전혀 필요하지 않은 컴퓨터의 현지 시간을 사용하고 있습니다!

 

사실 여기에 거래에 필요한 모든 것이 있습니다(거래 세션 시간 확인)

 //+------------------------------------------------------------------+
//|                                                         Time.mq5 |
//|                                                   Copyright 2019 |
//|                                                                  |
//+------------------------------------------------------------------+
int is_book;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
{
  is_book = MarketBookAdd ( Symbol ());
   if (is_book == false ) return ( INIT_FAILED );
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
   if (is_book == true ) MarketBookRelease ( Symbol ()); 
}
//+------------------------------------------------------------------+
// Expert Book event function                                        |
//+------------------------------------------------------------------+  
void OnBookEvent ( const string &symbol)
{
   if (symbol == Symbol ())
  {
     if (CheckMarketTime() == true )
    {
     //Торговое время
     //Наш код
    }
  }
}
//+------------------------------------------------------------------+
//| Expert Check Market Time function                                |
//+------------------------------------------------------------------+
bool CheckMarketTime()
{
   MqlDateTime cur_time, sv_time;
   MqlTick ticks[];
  cur_time.year = 0 ;
   TimeTradeServer (cur_time); //Возвращает расчетное текущее время торгового сервера.
   if (cur_time.year > 0 )
  {
     int result = CopyTicks ( Symbol (), ticks, COPY_TICKS_ALL , 0 , 1 );
     if (result > 0 )
    {
       if ( TimeToStruct (ticks[ 0 ].time, sv_time) == true )
      {
         if (sv_time.day_of_year == cur_time.day_of_year)       //Проверка, что это сегодняшний тик
        {
           ulong tr_time = sv_time.hour * 3600 + sv_time.min * 60 + sv_time.sec;
           if (((tr_time >= 3600 ) && (tr_time < 50370 )) ||   //10:00:00 - 13:59:30
             ((tr_time >= 50700 ) && (tr_time < 67470 )) ||   //14:05:00 - 19:44:30 
             ((tr_time >= 68700 ) && (tr_time < 85770 )))     //19:05:00 - 23:49:30
          {
             return ( true );
          }
        }
      }
    }
  }   
   return ( false );
} 

추가됨

밀리초 정밀도가 필요한 경우

 double t_msc = double (ticks[ 0 ].time_msc - ulong (ticks[ 0 ].time) * 1000)/ 1000 ; //Получаем в секундах
double tr_time = sv_time.hour * 3600 + sv_time.min * 60 + sv_time.sec + t_msc;

추가됨

그러나 이 모든 것이 원하는 결과(거래 시간 제한)를 제공하지 않습니다.

틱은 거래 세션 에 없을 수 있으며 시간은 멈추지 않습니다.

누군가 보류 중인 주문을 제거하고 주문서가 변경되었다고 가정해 보겠습니다.

신호가 있고 "오래된" 수정이 있습니다(시간은 현재가 아님).

터미널은 서버의 정확한 시간을 방송하지 않습니다 .

 

당신이 나를 이해하지 못한다. 처음부터 시작합시다.

1) 프로그램 에서 TimeCurrent() 함수 를 호출 하고 Market Watch에서 선택한 기호 중 하나에 대한 마지막 시세의 도착 시간을 가져옵니다.

18:00:00

2) 다음 명령으로 마지막 SBER 틱의 시간을 얻습니다.

17:58:00

3) 약간의 시간이 흐르고 마지막 SBER 틱의 시간을 다시 요청합니다.

17:59:00이 되자


주의 질문: 18:00:00 TimeCurrent() 에서 17:59:00 의 틱에 대해 모르는 것이 정상이라고 생각하십니까?

 
pivomoe :

당신이 나를 이해하지 못한다. 처음부터 시작합시다.

1) 프로그램에서 TimeCurrent() 함수 를 호출 하고 Market Watch에서 선택한 기호 중 하나에 대한 마지막 시세의 도착 시간을 가져옵니다.

18:00:00

2) 다음 명령으로 마지막 SBER 틱의 시간을 얻습니다.

17:58:00

3) 약간의 시간이 흐르고 마지막 SBER 틱의 시간을 다시 요청합니다.

17:59:00으로 해주세요


주의 질문: 18:00:00 TimeCurrent() 에서 17:59:00 의 틱에 대해 모르는 것이 정상이라고 생각하십니까?

내가 준 코드에서 모든 틱을 고려할 수 있습니다 (문제가 아님)

마지막 코드는 TineCurrent()를 사용하지 않지만 TimeTradeServer() 를 사용합니다.

DAY까지 눈금을 확인하고 그게 다야!

다시 시작하겠습니다.

일반적으로 무엇을 하고 싶습니까?

틱 시간을 현지 시간과 비교하기 시작한 이유는 무엇입니까?

원래 목표는 무엇입니까?

 

이제 이 문제가 실제로 어떻게 보이는지 보여 드리겠습니다. 나는 완전히 고문을 다시 했다 . OnTimer와 OnBookEvent에서 새 틱을 모두 잡을 수 있도록 했습니다.

시장 개요에는 45개의 기호가 있습니다. 대부분은 액체가 아닙니다.

다음은 OnBookEvent에서 새 틱을 포착한 결과입니다.

РЕКОРДная  Разница между временем последенго тика по ВСЕМ символам Минус только, что полученный новый тик по символу 494013 милесекундa.

CR       0        18 : 51 : 47.334     ProverkaAktyalnostiTikov (ALRS,H1)       Получен НОВЫЙ тик по символу                     SNGR- 3.19 time_msc= 2019.03 . 18 18 : 41 : 47.988

HN       0        18 : 51 : 47.335     ProverkaAktyalnostiTikov (ALRS,H1)       ХОТЯ до этого был получeн тик                        ARMD time_msc 2019.03 . 18 18 : 50 : 02.001

즉, 18:50 TimeCurrent에서 18:41의 시간으로 SNGR- 3.19 기호에 새로운 틱이 포착되었습니다 .


다음은 현재 컴퓨터의 현지 시간을 측정한 것입니다.


1) 새 틱 수신, 즉 CopyTick(또는 설정에 따라 SymbolInfo)에 대한 마지막 호출 순간에

2) 끝에서 두 번째 호출 시.

 18 : 51 : 47.335     ProverkaAktyalnostiTikov (ALRS,H1)       Локальное время получения нового тика по символу.                       2019.03 . 18 18 : 51 : 47.334

18 : 51 : 47.335     ProverkaAktyalnostiTikov (ALRS,H1)       Предпоследние Локальное время попытки получить новый тик по символу     2019.03 . 18 18 : 41 : 47.204


즉, 이 경우 단순히 10분 동안 새로운 것을 얻기 위한 함수가 호출되지 않아 문제가 발생한 것이다.... 그리고 SNGR- 3.19 심볼에 대한 OnBookEvent 이벤트가 10분 동안 발생하지 않았기 때문에 발생한 것이다.

아마도 터미널이 이벤트 대기열에 넣었을 것입니다. 이 대기열에서 어떻게든 사라졌습니다. OnTimer를 사용하면 이러한 잼이 없습니다. 예, 때때로 틱이 20초 지연됩니다.


 
pivomoe :


당신의 원래 목표는 무엇입니까?

tiv 시간을 현지 시간 과 비교해야 하는 이유는 무엇입니까?

 
prostotrader :

당신의 원래 목표는 무엇입니까?

tiv 시간을 현지 시간과 비교해야 하는 이유는 무엇입니까?

서버에서 틱이 발생하는 순간과 터미널에서 발생하는 시간 사이의 최대 지연 시간을 알고 싶습니다. 그리고 이 시간을 어떻게 최소화할 수 있습니까?

이 지식은 자신의 테스터를 작성할 때 사용할 수 있습니다. 그리고 큰 지연으로 개발자를 당황하게 할 수도 있습니다.

TimeCurrent() - 마지막 심볼 틱의 시간은 지연 시간보다 짧으므로 사용할 수 있습니다. 첫 번째 버전에서 현지 시간 을 사용하는 것은 좋은 생각이 아닙니다.

 
pivomoe :

서버에서 틱이 발생하는 순간과 터미널에서 발생하는 시간 사이의 최대 지연 시간을 알고 싶습니다. 그리고 이 시간을 어떻게 최소화할 수 있습니까?

이 지식은 자신의 테스터를 작성할 때 사용할 수 있습니다. 그리고 큰 지연으로 개발자를 당황하게 할 수도 있습니다.

분명한. 계속... 나 없이.

다른 포럼 회원의 경우

 //+------------------------------------------------------------------+
//|                                                         Time.mq5 |
//|                                                   Copyright 2019 |
//|                                                                  |
//+------------------------------------------------------------------+
enum FRESH_TICK
{
  UNKNOWN_TICK,
  NEW_TICK,
  CUR_TICK
};
//
int is_book;
ulong last_tick_time; //Время последнего тика
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
{
  last_tick_time = 0 ;
  is_book = MarketBookAdd ( Symbol ());
   if (is_book == false ) return ( INIT_FAILED );
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
   if (is_book == true ) MarketBookRelease ( Symbol ()); 
}
//+------------------------------------------------------------------+
// Expert Book event function                                        |
//+------------------------------------------------------------------+  
void OnBookEvent ( const string &symbol)
{
   if (symbol == Symbol ())
  {
     MqlTick a_ticks[];
     int result = CopyTicks (symbol, a_ticks, COPY_TICKS_ALL , 0 , 1 );
     if (result > 0 )
    {
      FRESH_TICK tick_state = CheckTickTime(a_ticks[ 0 ]);
       switch (tick_state)
      {
       case UNKNOWN_TICK:; //Тик не определен
       break ;
       case NEW_TICK:;     //Торговое время, можно отсылать ордера;
       break ;
       case CUR_TICK:;     //По усмотрению разработчика;
       break ;
      }
    }  
  }
}
//+------------------------------------------------------------------+
//| Expert Check Market Time function                                |
//+------------------------------------------------------------------+
FRESH_TICK CheckTickTime( MqlTick &a_tick)
{
   MqlDateTime cur_time, tick_time;
  cur_time.year = 0 ;
   TimeTradeServer (cur_time); //Возвращает расчетное текущее время торгового сервера.
   if (cur_time.year > 0 )
  {
     if ( TimeToStruct (a_tick.time, tick_time) == true )
    {
       if (tick_time.day_of_year == cur_time.day_of_year)       //Проверка, что это сегодняшний тик
      {
         double t_msc = double (a_tick.time_msc - ulong (a_tick.time) * 1000 )/ 1000 ;
         double tr_time = double (tick_time.hour * 3600 + tick_time.min * 60 + tick_time.sec) + t_msc;
         if (((tr_time >= 36000 ) && (tr_time < 50370 )) ||   //10:00:00 - 13:59:30
           ((tr_time >= 50700 ) && (tr_time < 67470 )) ||   //14:05:00 - 19:44:30 
           ((tr_time >= 68700 ) && (tr_time < 85770 )))     //19:05:00 - 23:49:30
        {
           if ( ulong (a_tick.time_msc) > last_tick_time)
          {
            last_tick_time = ulong (a_tick.time_msc);
             return (NEW_TICK);
          } else return (CUR_TICK);  
        }
      }
    }
  }   
   return (UNKNOWN_TICK);
} 
      
[삭제]  
pivomoe :

주의 질문: 18:00:00 TimeCurrent() 에서 17:59:00 의 틱에 대해 모르는 것이 정상이라고 생각하십니까?

나는 그 문제가 논쟁의 여지가 있다고 생각한다. 틱 시퀀스가 최소한 다음 기준을 충족하기를 원합니다.

1. 일관성이 있었다. 각 후속 틱의 시간 >= 이전 틱의 시간;

2. 관련성. 저것들. 현재 순간에 가능한 한 가깝게 마지막으로 들어오는 틱의 시간;

두 번째 요점에 문제가 있는 것 같습니다.

포인트 2의 분쟁 가능성은 다음과 같습니다. 서버에서 틱이 형성되는 시점부터 받는 시점까지의 시간(lag)을 최소화하여 남들보다 빠르게 처리하고 거래를 결정할 수 있도록 하고 싶습니다. 하지만! 지연이 모든 입찰자에게 동일하면 문제가 없습니다(내가 이해하는 한). 저것들. 브로커의 서버에 문제가 있지만 모든 것이 동등합니다. 17:59:00에 17:59:01에 누군가 진드기에 대한 정보를 받았지만 18:00에도 그것을받지 못했다면 큰 문제입니다.

그리고 여기에 질문이 있습니다. 문제는 무엇입니까(그리고 문제가 있습니까)? 오랫동안(모두에게) 틱을 주지 않는 브로커의 서버에서, 또는 오랫동안 받지 않는 MT5에서.