[SERVICE DESK] 타이머에서 시니어 TF의 시간을 가져오는 동안 오류가 발생했습니다! - 페이지 2

 
Alexey Kozitsyn :

다시. 이것은 어디에도 언급되지 않습니다. 처음입니다. 둘째, 오류 코드 4066을 먼저 표시한 다음 표시하지 않음으로써 오도하는 이유는 무엇입니까?

데이터는 부분적으로 펌핑 된 다음 터미널에서도 처리되며 타이머 작업을 하고 있기 때문에 잠시 멈춥니다. 예, 이것은 어디에도 분명히 언급되지 않았지만 MTF 응용 프로그램을 작성하는 많은 프로그래머는 일반적으로 이것에 대해 알고 있습니다. 저는 즉시 말했습니다.

https://docs.mql4.com/ru/series/timeseries_access 를 주의 깊게 읽으십시오.

글쎄, 위에서 그들은 이미 기록의 가용성을 확인하는 옵션을 제공했습니다. 완벽하지는 않지만 간단하고 명확합니다.

이 옵션이 작동하지 않으면 다음을 확인하십시오.

 if (iBarShift( Symbol (),PERIOD_H1, TimeCurrent (), true )==- 1 ){ Print ( "Данные истории по последнему часу отсутствуют!" );}
Организация доступа к данным - Доступ к таймсериям и индикаторам - Справочник MQL4
Организация доступа к данным - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
Прежде чем ценовые данные будут доступны в терминале MetaTrader 4, их необходимо получить и обработать. Для получения данных требуется подключение к торговому серверу MetaTrader 4. Данные поступают с сервера по запросу терминала в виде экономно упакованных блоков минутных баров. Механизм обращения к серверу за данными не зависит от того, каким...
 
Vitaly Gorbunov :

데이터는 부분적으로 펌핑 된 다음 터미널에서도 처리되며 타이머 작업을 하고 있기 때문에 잠시 멈춥니다. 예, 이것은 어디에도 분명히 언급되지 않았지만 MTF 응용 프로그램을 작성하는 많은 프로그래머는 일반적으로 이것에 대해 알고 있습니다. 저는 즉시 말했습니다.

https://docs.mql4.com/ru/series/timeseries_access 를 주의 깊게 읽으십시오.

글쎄, 위에서 그들은 이미 기록의 가용성을 확인하는 옵션을 제공했습니다. 완벽하지는 않지만 간단하고 명확합니다.

"일시 중지"를 누르는 것에 대해 증거는 어디에 있습니까?

주의 깊게 읽으십시오(그리고 전에 읽으십시오). 데이터(특히 이전 시간대)를 항상 즉시 사용할 수 있는 것은 아님을 알고 있습니다. 괜찮아요. 그런데 SeriesInfoInteger() 함수가 오류를 반환하지 않는 이유는 무엇입니까? 바로 그 질문입니다!

요청이 일종의 일시 중지/스왑/업데이트/중단 등에 해당한다고 가정합니다. 오류 코드 != 0을 반환하도록 하십시오. 그러면 문제가 없을 것입니다!

 
Vitaly Gorbunov :

글쎄, 위에서 그들은 이미 기록의 가용성을 확인하는 옵션을 제공했습니다. 완벽하지는 않지만 간단하고 명확합니다.

이 점에 대해 @Ihor Herasko 가 이미 위에서 답변했습니다.

 
Alexey Kozitsyn :

이 점에 대해 @Ihor Herasko 가 이미 위에서 답변했습니다.

위의 테스트 버전을 제공했습니다. 이것이 왜 개발자들에게 질문이지만 이 점은 아주 오래전부터 알려져 왔습니다!
 
Vitaly Gorbunov :
위의 테스트 버전을 제공했습니다. 이것이 왜 개발자들에게 질문이지만 이 점은 아주 오래전부터 알려져 왔습니다!

나는 확실히 당신의 테스트 버전을 시도하고 결과에 대해 쓸 것입니다.

 
Alexey Kozitsyn :

나는 확실히 당신의 테스트 버전을 시도하고 결과에 대해 쓸 것입니다.

구독을 꼭! 그것은 나를 위해 작동합니다! 그러나 해결되지 않으면 모든 종류의 함정이 있을 수 있습니다. 우리는 다른 무엇을 할 수 있는지 생각할 것입니다.
 

@Ihor Herasko 의 답변이 먼저입니다. 재현할 코드:

 #property version    "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//--- Время открытия текущего часа, дня и недели
datetime _m15OpenTime= 0 ;
//--- Вести лог журнала
const bool inpFileLog= true ;
//--- Количество секунд в одном дне
const int SEC_PER_DAY= 86400 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- Запускаем таймер
   if (! EventSetMillisecondTimer ( 20 ))
     {
       Print ( __FUNCTION__ , ": ОШИБКА #" , GetLastError (), ": таймер с частотой 20 ms не установлен!" );
       return ( INIT_FAILED );
     }
//--- Сбрасываем время открытия текущего бара м15, часа, дня
   _m15OpenTime = 0 ;
//---
   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[])
  {

   return ( rates_total );
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//--- Проверяем, записано ли время открытия текущего бара М15
   if (!CheckCurrentM15OpenTime())                         // Если время не записано
       return ;                                                 // Выходим                                                                                                                         // Выходим
  }
//+------------------------------------------------------------------+
//| Проверяем, записано ли время открытия текущего бара М15             |
//+------------------------------------------------------------------+
bool CheckCurrentM15OpenTime()
  {
//--- Проверяем, записано ли время
   if (_m15OpenTime== 0 ) // Если время не записано
     {
       //---
       ResetLastError ();
       iTime ( NULL , PERIOD_M15 , 1 );
       //---
       if ( GetLastError ()== ERR_NO_ERROR )
        {
         ResetLastError ();
         //--- Запоминаем время открытия бара
         _m15OpenTime= iTime ( NULL , PERIOD_M15 , 0 );
         //---
         Print ( __FILE__ , ": Актуальное время открытия бара М15 = " + TimeToString (_m15OpenTime)+ ". Ошибка #" , GetLastError ());
         //--- Возвращаем истину
         return ( true );
        }
       else
         return ( false );
     }
//--- Время открытия М15 ранее записано. Возвращаем истину
   return ( true );
  }

결과:

 2018.09 . 21 14 : 25 : 02.793 Custom indicator test_isNewDayInTimer_iTime() EURGBP.e,M1: removed
2018.09 . 21 14 : 30 : 44.120 Custom indicator test_isNewDayInTimer_iTime() EURGBP.e,M1: loaded successfully
2018.09 . 21 14 : 30 : 44.149 test_isNewDayInTimer_iTime() EURGBP.e,M1: initialized
2018.09 . 21 14 : 30 : 44.262 test_isNewDayInTimer_iTime() EURGBP.e,M1: test_isNewDayInTimer_iTime().mq4: Актуальное время открытия бара М 15 = 2018.09 . 21 12 : 15 . Ошибка # 0

로그 항목에 따르면. 터미널은 14:25에 꺼졌습니다. 또한 14:30에 켜집니다. 우리는 바 M15의 시간을 확인합니다. TF M1으로 시작하십시오. 표시기(위 코드)는 실제 개장 시간 12시 15분(터미널 시간, 내 지역보다 2시간 늦음)을 보여주었습니다. 결과는 12:30이었어야 합니다! 결론 - 오류가 있습니다. 그리고 @Ihor Herasko 가 제안한 주어진 방법이 작동하지 않습니다.

 
Vitaly Gorbunov :
구독을 꼭! 그것은 나를 위해 작동합니다! 그러나 해결되지 않으면 모든 종류의 함정이 있을 수 있습니다. 우리는 다른 무엇을 할 수 있는지 생각할 것입니다.

구독 취소합니다. 코드:

 #property version    "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//--- Время открытия текущего часа, дня и недели
datetime _m15OpenTime= 0 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- Запускаем таймер
   if (! EventSetMillisecondTimer ( 20 ))
     {
       Print ( __FUNCTION__ , ": ОШИБКА #" , GetLastError (), ": таймер с частотой 20 ms не установлен!" );
       return ( INIT_FAILED );
     }
//--- Сбрасываем время открытия текущего бара м15
   _m15OpenTime= 0 ;
//---
   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[])
  {

   return ( rates_total );
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//--- Проверяем, записано ли время открытия текущего бара М15
   if (!CheckCurrentM15OpenTime())                         // Если время не записано
       return ;                                                 // Выходим
  }
//+------------------------------------------------------------------+
//| Проверяем, записано ли время открытия текущего бара М15             |
//+------------------------------------------------------------------+
bool CheckCurrentM15OpenTime()
  {
//--- Проверяем, записано ли время
   if (_m15OpenTime== 0 ) // Если время не записано
     {
       //---
       ResetLastError ();
       if ( iBarShift ( Symbol (), PERIOD_M15 , TimeCurrent (), true )==- 1 )
        {
         Print ( __FILE__ + ": Данные истории по последнему часу отсутствуют! Ошибка #" , GetLastError ());
         return ( false );
        }
       //---
       if ( GetLastError ()== ERR_NO_ERROR )
        {
         ResetLastError ();
         //--- Запоминаем время открытия бара
         _m15OpenTime= iTime ( NULL , PERIOD_M15 , 0 );
         //---
         Print ( __FILE__ , ": Актуальное время открытия бара М15 = " + TimeToString (_m15OpenTime)+ ". Ошибка #" , GetLastError ());
         //--- Возвращаем истину
         return ( true );
        }
       else
         return ( false );
     }
//--- Время открытия недели ранее записано. Возвращаем истину
   return ( true );
  }
//+------------------------------------------------------------------+

결과:

 2018.09 . 21 14 : 48 : 46.485 Custom indicator test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: removed
2018.09 . 21 15 : 01 : 23.158 Custom indicator test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: loaded successfully
2018.09 . 21 15 : 01 : 23.175 test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: initialized
2018.09 . 21 15 : 01 : 23.295 test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: test_isNewDayInTimer_iBarShirt().mq4: Актуальное время открытия бара М 15 = 2018.09 . 21 12 : 45 . Ошибка # 0

14:48에 단말기를 껐다가 15:01에 켰습니다. 13:00시를 받았 어야 했다. 접수 - 12.45. 더 많은 질문?

TF를 M1에서 M5로 변경하면 올바른 결과가 나타납니다.

 2018.09 . 21 15 : 01 : 23.295 test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: test_isNewDayInTimer_iBarShirt().mq4: Актуальное время открытия бара М 15 = 2018.09 . 21 12 : 45 . Ошибка # 0
2018.09 . 21 15 : 05 : 50.057 test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: uninit reason 3
2018.09 . 21 15 : 05 : 50.058 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: initialized
2018.09 . 21 15 : 05 : 50.094 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: test_isNewDayInTimer_iBarShirt().mq4: Актуальное время открытия бара М 15 = 2018.09 . 21 13 : 00 . Ошибка # 0
 
다시 한 번 개발자( @Slava , @Alexander , @Renat Fatkhullin )에게 이 문제에 주의를 기울일 것을 요청합니다.
 

그리고 내가 이해한 것처럼! 칠면조는 터미널과 함께 즉시 시작합니까? 그렇다면 확인하기 전에 IsConnected() 서버와 연결이 있는지 기다리십시오. 타이머가 매우 빠르기 때문에 동기화할 시간이 없습니다!

아니면 이렇게 하세요

 if ( iBarShift ( Symbol (), PERIOD_M15 , TimeLocal (), true )==- 1 )
        {
         Print ( __FILE__ + ": Данные истории по последнему часу отсутствуют! Ошибка #" , GetLastError ());
         return ( false );
        }
그러나 서버 시간과 현지 시간의 차이를 고려해야 합니다. 결과를 구독하십시오!
사유: