ローカルタイムとフレッシュティックタイムの差が1分30秒。何をするのか - ページ 5

 
pivomoe:
そうですね、何が言いたいのでしょうか?

何に対して。

pivomoe:

市場概要には、「出来高」「最後の取引」の列が残っています。この関数は、単に最後のティックの .time を返しているのではないかという疑いが あります。

SymbolInfoInteger(_Symbol,SYMBOL_TIME) 関数は、最後のティックの時間だけを返します。なぜなら、引用符の変更によって、新しい情報の目盛りが表示されるからです。

最後の気配値の到着から最後の刻みの時間までの時間を計測したい。秒単位で見ると、常に0になるようです。したがって、端末はすべてを速やかに返します。

 
Alexey Kozitsyn:

へ。

SymbolInfoInteger(_Symbol,SYMBOL_TIME) 関数は、最後のティックの時間だけを返します。引用の変更は、新しい情報の刻みにつながるからです。

最後の気配値の到着から最後の刻みの時間までの時間を計測したい。秒単位で見ると、常に0になるようです。したがって、端末は速やかにすべてを返します。

もう一度、私が問題だと思うことを。

与えられた。

ローカルタイムとサーバータイムはほぼ同期しています。つまり、新しいティックの .time_msc とローカルタイムとの差は数秒です。

現地時間18:00:00に SBERのシンボルで新しいティックをSymbolInfoTickで取得しようとすると、時刻17:57:00のティックが表示されます。

18:00:01にSymbolInfoTickで新しいティックを取得しようとすると、17:58:30という 時刻のティックが取得されます。

これは運用とは呼べないと思います。

現在、私はローカルコンピュータの時間から 離れ、代わりにマーケット概要からすべてのシンボルの最後のティックの最大時間を使用しています。

 
pivomoe:

改めて、私が問題視していること。

与えられた。

ローカルタイムとサーバータイムはほぼ同期しており、新しいティックの.time_mscとローカルタイムの差は数秒です。

現地時間18:00:00に SBERのシンボルで新しいティックをSymbolInfoTickで取得しようとすると、時刻17:57:00のティックが表示されます。

18:00:01にSymbolInfoTickで新しいティックを取得しようとすると、17:58:30という 時刻のティックが取得されます。

これは運用とは呼べないと思います。

現在、私はローカルコンピュータの時間から離れ、代わりにマーケット概要からすべてのシンボルの最後のティックの最大時間を使用しています。

コンピュータの時間を自由に設定できることを理解していますか?使用することはできません。すでに言われていることですね。これが第一のポイントです。

第二に、市場概要の全シンボルのうち、最後のティックの最大時間は使用できません。SBERシンボルの最後のティックの時間(SymbolInfoTick)とSBERシンボルの最後のクォートの時間(SymbolInfoInteger)のラグを求めたい場合です。つまり、私が書いたように大雑把にやるしかないのです(アドバイスされたように、より精度を上げるためにタンブラーを使う必要があるので大雑把に)。

3つ目は、これです。

В 18:00:00 по времени компа  пытаемся получить новый тик по символу SBER с помощью SymbolInfoTick, нам отдают тик со временем 17:57:00

В 18:00:01 по времени компа опять пытаемся получить новый тик по символу SBER с помощью SymbolInfoTick, нам отдают тик со временем 17:58:30

根拠なく主張される。自分のコードを証明と考える場合は、「2番目」を参照してください。

 
Alexey Kozitsyn:

コンピュータの時刻を何でも設定できることをご存知ですか?縛られることはありません。もう言われちゃいましたね。まず第一に。


ミリ秒や秒単位ならともかく、任意の時間に設定することはできません。数分の遅れの話も十分あり得ます。今はそれで差分を測っているのではなく、マーケット概要から全シンボルの最後のティックの最大時間.time_mscで計測しています。

アレクセイ・コジツィン

SBERシンボルの最後のティックの時間(SymbolInfoTick)とSBERシンボルの最後のクォートの時間(SymbolInfoInteger)のラグを求めたい場合です。

しないんです。

アレクセイ・コジツィン

第二に、マーケット概要からすべてのシンボルの中で最後のティックの最大時間を使用することもできません。

なぜ?私は最後のティックの時間を比較していない(コンピュータによって)、私はtime_mscを比較しています。

アレクセイ・コジツィン

証拠がないと、あなたのコードは使えない。自分のコードを証明と考えるなら-「2番目」を参照。

通常、開発者は問題を再現するためのコードを要求します。最近キャッチした2秒の遅延をご紹介します。

14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)  РЕКОРДная  Разница между временем последенго тика по ВСЕМ символам Минус только, что полученный новый тик по символу 2057 милесекундa.
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Получен НОВЫЙ тик по символу                     GAZR-3.19 time_msc= 2019.03.20 14:53:11.638
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   ХОТЯ до этого был получeн тик                        RTS-3.19 time_msc 2019.03.20 14:53:13.695
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Локальное время получения нового тика по символу.                                   2019.03.20 14:53:10.277
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Предпоследние Локальное время попытки получить новый тик по символу    2019.03.20 14:53:10.259
アレクセイ・コジツィン

(アドバイスにあったように、より精度を高めるためにタンブラーを使う必要があるため、おおよそですが)。

OnTimerの代わりにOnBookEventを使うようにアドバイスされました。実装してみました。設定により、OnTimerまたはOnBookEventのどちらでテロップを受信するかを選択できます。OnBookEventの場合はさらに悪く、新しいティックイベントの70%しか捕捉できません。
ファイル:
 

pivomoe:

14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)  РЕКОРДная  Разница между временем последенго тика по ВСЕМ символам Минус только, что полученный новый тик по символу 2057 милесекундa.
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Получен НОВЫЙ тик по символу                     GAZR-3.19 time_msc= 2019.03.20 14:53:11.638
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   ХОТЯ до этого был получeн тик                        RTS-3.19 time_msc 2019.03.20 14:53:13.695
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Локальное время получения нового тика по символу.                                   2019.03.20 14:53:10.277
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Предпоследние Локальное время попытки получить новый тик по символу    2019.03.20 14:53:10.259

このセリフだけで、あなたが何を望んでいるかがわかるような気がします。シンボル間同期のようなものに興味があるのですね。つまり、欲しい楽器のデータの一般的な関連性です。

私はこの質問に関与していないので、今のところお役に立てません。開発者に聞く。

 
Alexey Kozitsyn:

このセリフだけで、あなたが何を望んでいるかがわかるような気がします。シンボル間同期のようなものに興味があるのですね。つまり、欲しい楽器のデータの一般的な関連性です。

私はこの質問に関与していないので、今のところお役に立てません。開発者向けのアドレスです。

アレクセイ(参加したくなかったけど...)。

このスレッドの2ページ目の「関連性」(NEW_TICK)コードではないでしょうか?

//+------------------------------------------------------------------+
//|                                                         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);
} 

追加

CUR_TICKを使っても、以前と同じティックであることの確認や

新しいティックパケットに、前のティックパケットに含まれていないティックが含まれている場合。

 
prostotrader:

アレクセイ(関わりたくなかったが...。)

このスレッドの2ページ目の「関連性」(NEW_TICK)コードではないでしょうか?

どうやら違うようだ。以来。

タイムトレードサーバ

推定されるトレードサーバーの現在時刻を返します。TimeCurrent() と異なり、時刻の値はクライアント端末で計算され、ユーザのコンピュータの時刻設定に依存 する。

つまり、コンピュータの時間に依存する(測定精度のためには、そうであってはならない)。

もちろん、ここで良いことは、pivomoeの コードが正しいかどうかを チェックし、もし本当にバグがあれば、開発者に 連絡することです。

 
prostotrader:

チェックはTimeGMTOffsetで 行う必要があるようです。後で例をスケッチします。

 
Alexey Kozitsyn:

どうやら違うようだ。なぜなら


コードをよく見て いるんですねー。

TimeTradeServer()日を 決定するためだけに取られ、それだけです(このチェックは「念のため」行われます)!

TimeTradeServer() は全く行われないかもしれない!

によって追加されました。

繰り返す

"CUR_TICK "を使えば、今までと同じティックであることを確認することができますし

新しいティックパケットには 前のパケットで渡されなかったティックが 含まれて おり、パケットには1tick("old") が含まれている".

if(ulong(a_tick.time_msc) > last_tick_time)
{
  last_tick_time = ulong(a_tick.time_msc);
  return(NEW_TICK);
}
 else
{
   //Дополнительные проверки 
}
 
Alexey Kozitsyn:

ここで良いことは、もちろん、ピボモエの コードが正しいかどうかを確認し、本当にバグがあれば、開発者に連絡 することです。

マーケットレビューの文字数が数十文字ある場合と、レビューで数文字開いていても、オペラブラウザのタブが数十個ある場合のどちらかで不具合が発生します。プライベート メッセージで開発者に手紙を書きました。

先ほど書いたように、この問題は呼び出しと呼び出しの間に十分な大きさのスリープを入れることで解決します。40文字の場合はsleep(10)で十分です。文字数が増えれば増えるほど、睡眠時間が必要になってきます。