[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、しっかり読みました。

さて、上記ではすでに履歴のアクセス性をチェックするバリエーションをあげていますね。完璧ではありませんが、シンプルでわかりやすい。

間合いに入る」ことについては、どこに証拠があるのですか?

じっくり読みました(以前も読みました)。データ(特に古いTF)がすぐに手に入らないこともあるのは承知しています。問題ありません。しかし、それならなぜ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時1分に電源を入れ直しました。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 );
        }
ただし、サーバー時刻とローカル時刻の差を考慮する必要があります。結果を返信してください