WindowsのローカルタイムをMT5サーバーと同期させる

 

こんにちは。

MQL5からコンピュータの ローカルタイムを調整することは可能ですか?

GetLocalTime()、SetLocalTime()は動作しますか?

 
prostotrader:

こんにちは。

MQL5からコンピュータのローカルタイムを調整することは可能ですか?

GetLocalTime()、SetLocalTime()は動作するのでしょうか?

確認したところ、動作しています。

//+------------------------------------------------------------------+
//|                                                     TimeTest.mq5 |
//|                                      Copyright 2016 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
struct _SYSTEMTIME {
  ushort wYear;
  ushort wMonth;
  ushort wDayOfWeek;
  ushort wDay;
  ushort wHour;
  ushort wMinute;
  ushort wSecond;
  ushort wMilliseconds;
};

_SYSTEMTIME loc_time;

#import "kernel32.dll"
void GetLocalTime(_SYSTEMTIME &sys_time);
bool SetLocalTime(_SYSTEMTIME &sys_time);
#import
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
    GetLocalTime(loc_time);
    if(loc_time.wYear > 0)
    {
      loc_time.wSecond = 55;
      if(SetLocalTime(loc_time))
      {
        if(loc_time.wYear > 0)
        {
        }
      }
    }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  
  }
//+------------------------------------------------------------------+
 

あとは、ローカルタイムを 正しく同期させる方法を考えるだけです

清算時および非取引時(FORTS)にはTimeCurrent()が更新されないことを考慮し、MT5サーバー時刻を持つコンピュータを使用します。

何かアイデアはありますか?

 
prostotrader:

あとは、ローカルタイムを正しく同期させる方法を考えるだけです

の時刻をMT5サーバーの時刻に合わせる。ただし、FORTSでは清算時および非取引時にはTimeCurrent()が更新されないことを考慮する。

何かアイデアはありますか?

MT4と同じようにティックを生成する?
ファイル:
zSendTick.mq4  2 kb
 
prostotrader:

あとは、ローカルタイムを正しく同期させる方法を考えるだけです

の時刻をMT5サーバーの時刻に合わせる。ただし、FORTSでは清算時および非取引時にはTimeCurrent()が更新されないことを考慮する。

何かアイデアはありますか?

だから、アップデートはティックが入ったときだけでいいんです。したがって、OnTickの中でのみ呼び出す必要があります。面倒なことをしすぎましたね。
 
fxsaber:
だから、アップデートはティックが来たときだけでいいんです。そのため、OnTickの中だけで呼び出す。複雑すぎるのです。

何もかもがやりすぎで...。

相場がスタックに入ってくるプレマーケットがあるので、9-50から10-00まではサーバーの 時刻と同期させることができます。

追加

任意のシンボルのスタンを追加すると、フィルタリングなしで、すべての楽器からのイベントがそこに行くようになります。

Market Watchで選択されているもの。そして、CopyTicks()をとって、同期する時間を見る...。

こんな感じ。

追加

見落としがあったら訂正してください。

//+------------------------------------------------------------------+
//|                                              Time_sync_forts.mq5 |
//|                                      Copyright 2017 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
struct _SYSTEMTIME
  {
   ushort            wYear;
   ushort            wMonth;
   ushort            wDayOfWeek;
   ushort            wDay;
   ushort            wHour;
   ushort            wMinute;
   ushort            wSecond;
   ushort            wMilliseconds;
  };

_SYSTEMTIME loc_time;

#import "kernel32.dll"
void GetLocalTime(_SYSTEMTIME &sys_time);
bool SetLocalTime(_SYSTEMTIME &sys_time);
#import
//---
bool is_sync;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   is_sync=false;
   MarketBookAdd(Symbol());
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   MarketBookRelease(Symbol());
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   loc_time.wYear=0;
   GetLocalTime(loc_time);
   if(loc_time.wYear>0)
     {
      if((loc_time.wHour==9) && (loc_time.wMinute>=50) && (loc_time.wMinute<=59))
        {
         MqlTick curr_tick[1];
         if(CopyTicks(symbol,curr_tick,COPY_TICKS_ALL,0,1)==1)
           {
            MqlDateTime sv_time;
            TimeToStruct(curr_tick[0].time,sv_time);
            if(!is_sync)
              {
               loc_time.wHour=ushort(sv_time.hour);
               loc_time.wMinute = ushort(sv_time.min);
               loc_time.wSecond = ushort(sv_time.sec);
               loc_time.wMilliseconds=ushort(ulong(curr_tick[0].time_msc)-ulong(curr_tick[0].time)*1000);
               if(SetLocalTime(loc_time))
                {
                 is_sync=true;
                 Print("Local time sync is done.");
                }
              }
           }
        }
      else is_sync=false;
     }
  }
//+------------------------------------------------------------------+
 

念のため、"鮮度 "の引用を確認する。

              if(!is_sync)
              {
                if((loc_time.wDayOfWeek == ushort(sv_time.day_of_week)) &&
                   (loc_time.wHour == ushort(sv_time.hour)))
                {
                   loc_time.wMinute = ushort(sv_time.min);
                 loc_time.wSecond = ushort(sv_time.sec);
                 loc_time.wMilliseconds=ushort(ulong(curr_tick[0].time_msc)-ulong(curr_tick[0].time)*1000);
                 if(SetLocalTime(loc_time))
                 {
                  is_sync=true;
                  Print("Local time sync is done.");
                 }
                }
              }
 
prostotrader:

あとは、ローカルタイムを正しく同期させる方法を考えるだけです

清算時および非取引時(FORTS)にはTimeCurrent()が更新されないことを考慮し、MT5サーバー時刻を持つコンピュータを使用します。

何かアイデアはありますか?

もしかして、ソースと同期しやすい?取引所で発生したイベントには、そのタイムスタンプが付与されます。取引所自体の時刻は、天文時刻とミリ秒単位の誤差で同期している。ブローカー側にある)MT5サーバーへの通知の到着時刻が既に異なっているのに対し、端末へのパケット送信時刻は3番目、端末への到着時刻は4番目です。システム時刻をローカルコンピュータの天文時刻と同期させれば、常に動作し、ローカル時刻は 取引所の時刻と一致します。正確な時刻を知るためのNTPサーバーは、数百種類も公開されている(無料)。これらは、例えば、今生きて働いている。

195.234.155.123;ntp.dvconsulting.dk
85.17.207.62;ntp.edge.tillo.ch
195.34.89.227;ntp.favey.ch
195.234.155.124;ntp.gal.dk
193.226.65.36;ntp.idsi.md

 
CopyTicks[0]に、pingを追加します。
 
Vladimir:

オリジナルソースとシンクロさせる方が簡単なのでは?取引所で発生したイベントには、そのタイムスタンプが付与されます。取引所自体の時刻は、天文時刻とミリ秒単位の誤差で同期している。ブローカー側にある)MT5サーバーへの通知の到着時刻が既に異なっているのに対し、端末へのパケット送信時刻は3番目、端末への到着時刻は4番目です。システム時刻をローカルコンピュータの天文時刻と同期させれば、常に動作し、ローカル時刻は取引所の時刻と一致します。正確な時刻を知るためのNTPサーバーは、数百種類も公開されている(無料)。これらは、例えば、今生きて働いている。

195.234.155.123;ntp.dvconsulting.dk
85.17.207.62;ntp.edge.tillo.ch
195.34.89.227;ntp.favey.ch
195.234.155.124;ntp.gal.dk
193.226.65.36;ntp.idsi.md

CopyTicks()から取得した時間 これは為替時間であり、配信に遅延があることは明らかである

が、4-6msと非常に小さくなっています。

正確な時間は、交換時間がそれと一致しないかもしれないので、何も与えません、そして、我々は交換時間に正確にトレントします。

とMT5からです。

 
fxsaber:
CopyTicks[0]に、pingを追加します。
それは取るに足らないもの(ミリ秒)であり、浮遊しているので、「天気」を作ることはないと思う。