mql5言語の特徴、微妙なニュアンスとテクニック - ページ 75

 
Vitaly Muzichenko:

土曜日にEAをチャート上に置いたのですが、EAは最後のティックの時間を取得することができ、それは例えばマーケットウォッチでは23:58で、私のローカル時間は04:45です。サーバーの時間はわかりません。

質問は、最後のティックからサーバー時刻(端末時刻)までの経過時間です。

しばらく考えた。EAをチャートに貼り付けても差がないことがわかりました。リアルティックがないうちは、プログラムアルゴリズムのうち、サーバーの リアルタイムを使う部分を実行することができない。

ティックが到着する前に計算が必要な場合は、ServerGMTOffsetを要求する。

そのため、ServerTradeTime()が無くても問題は解決します。

 
イホール・ヘラスコ

少し考えてみました。EAをチャートに貼り付けても差がないことが判明。リアルチックがない以上、プログラムアルゴリズムのうち、リアルサーバーの時間を使う部分は実行できない。

ティックが到着する前に計算が必要な場合は、ServerGMTOffsetを要求する。

したがって、ServerTradeTime()が無くても問題は解決する。

ユーザーはサーバーのOffsetを知らないんだよ。

2つの値しかわかっておらず、このデータだけでは計算できない"最後のティックからサーバー(端末)の時刻までどれだけ時間が経過しているか "ということです。

これは非常に特殊な作業で、皆さんのように解決策が見当たりません。

 
ヴィタリー・ムジチェンコ

土曜日にEAをチャート上に置いたのですが、EAは最後のティックの時間を取得することができ、それは例えばマーケットウォッチでは23:58で、私のローカル時間は04:45です。サーバーの時間はわかりません。

問題は、最後のティックからサーバー時刻(端末時刻)までの経過時間です

単なる時間ではなく、datetimeなのです。日付と時刻の両方が表示されます。つまり、このデータで算術演算すると秒単位の差が出るので、日、時、分、秒に換算するのは難しくない。

さらに、TimeTradeServerが 週末に何を表示するかを確認する必要があります。

2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeCurrent() = 2018.03.29 14:59:54
2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeLocal() = 2018.03.29 15:00:03
2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeGMT() = 2018.03.29 12:00:03
2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeGMTOffset() = -10800
2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeTradeServer() = 2018.03.29 15:00:03
サーバー時刻と現地時刻のズレに注意し、さらに現地時刻と推定サーバー時刻の完全一致を確認する。
 
FXの場合、このコードを4つから作り直すことができます。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

mql4言語の特徴、微妙なニュアンスとコツ

fxsaber さん 2018.03.29 14:32

#property strict

#define  HOUR 3600
#define  DAY (24 * HOUR)
#define  WEEK 7

datetime GetBarTime( const datetime time, const bool NextBar = false, string Symb = NULL, const ENUM_TIMEFRAMES TimeFrame = PERIOD_M1 )
{
  if (Symb == NULL)
    Symb = _Symbol;
    
  return(iTime(Symb, TimeFrame, iBarShift(Symb, TimeFrame, time) - (NextBar ? 1 : 0)));
}

datetime GetTimeDayOfWeek( const int Shift = 0, const ENUM_DAY_OF_WEEK Day = SUNDAY )
{
  const datetime Res = TimeCurrent() / DAY * DAY;
  
  return(Res - (((WEEK + (TimeDayOfWeek(Res) - Day)) % WEEK) + Shift * WEEK) * DAY);
}

// Аналог по серверному времени - https://www.mql5.com/ru/docs/dateandtime/timegmtoffset
// Работает для FOREX-символов, когда M1-история доступна за ближайшую неделю
int TimeServerGMTOffset( void )
{
  const datetime Sunday = GetTimeDayOfWeek();
  
  return(((int)MathRound((double)MathMin(Sunday - DAY - GetBarTime(Sunday), Sunday + DAY - GetBarTime(Sunday, true)) / HOUR) - 3) * HOUR);
}

// Аналог по серверному времени - https://www.mql5.com/ru/docs/dateandtime/timegmt
// Работает для FOREX-символов, когда M1-история доступна за ближайшую неделю
datetime TimeServerGMT( void )
{
  return(TimeCurrent() + TimeServerGMTOffset());
}
 
fxsaber
このコードをFX用に作り直すこともできます

ありがとうございます、見てみます。でもって、FX以外のシンボルもある。

不便なのは、現在のサーバーの時刻を、どの時点でも、簡単に取得できないことです。

アレクセイ・ヴィクトロフ

どちらも単なる時間ではなく、datetimeである。つまり、日付と時刻の両方が表示されます。つまり、これらのデータを使った算術演算では、日、時間、分、秒に換算することは難しくなく、秒の差が得られることになる。

さらに、週末にはTimeTradeServerが 何を示しているかを確認する必要があります。

サーバー時刻の秒数とローカル時刻のズレに注目し、ローカル時刻とサーバー時刻の計算が完全に一致することを確認します。

同じように印刷したのですが、週末には使えません。一般に、情報はテストされるべきものである。

タスクは最後のティックからサーバー(端末)の時刻までどれだけ時間が 経過しているか」という最小限のものである。

if( TimeCurrent()<TimeServer()-60 ) Alert( "нет котировок более 1-й минуты" );
 
ヴィタリー・ムジチェンコ

ありがとうございます、見てみます。でもって、FX以外のシンボルもある。

ブローカーが少なくとも1つのFXシンボルを持っている場合、それは他の人にも有効である。

ブローカーがFXのシンボルを1つも持っていない場合、合理性の問題が生じます。

 
Vitaly Muzichenko:

ありがとうございます、見てみます。でもって、FX以外のシンボルもある。

現在のサーバーの時刻を、いつでも簡単に取得できないのは不便です。

私もプリントしていますが、週末にどう使うか。一般的には、提供された情報を回転させる必要があります。

タスクは最後の刻みからサーバー(端末)の時刻までどれだけ時間が 経過しているか」という最小限のものです。

もちろん確認は必要ですが、TimeCurrentとTimeTradeServerの 差から判断すると、その差は大きく なることが想定されます。

MQ-demoのサーバーの時刻が モスクワと同じかどうか教えてください。

 
アレクセイ・ヴィクトロフ

確認する価値はありますが、TimeCurrentとTimeTradeServerの差から、その差は広がる ことが予想されます。

MQ-demoのサーバー時刻が私のモスクワ時刻と同じかどうか、またサーバー時刻が私の現地時刻と同じでない場合、どのように表示されるか教えてください。

ロボ

私の現地時間は17時17分13秒でした

 

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

バグ、バグ、質問

fxsaber, 2017.05.19 22:35

TimeTradeServerは、あらゆる種類の無意味なものを返すことができます。例えば、TimeCurrentより小さい値。これでは、実用化は全く不可能です。

もし私の考えが正しければ、TimeTradeServerはTimeCurrentを受け取った後に経過時間を計算し、この差を加えることで、将来のTimeCurrentの値をエミュレートするようなものです。

さて、Expert Advisorを実行したところ

#define  TOSTRING(A) #A + " = " + (string)(A) + "\n"

void OnInit()
{
  EventSetTimer(1);
}

void OnTimer()
{
  Comment(TOSTRING(TimeTradeServer()) + TOSTRING(TimeCurrent()));
}

どんな無意味なものでも見ることができます。

日付にご注目ください。

 
fxsaber

そして、端末と、設定が曲がったDCと、どちらが悪いのでしょうか?

理由: