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

 
Alain Verleyen:

サーバーの時刻をGMTで取得したいのですが、どうすればよいですか?

スクリプトを実行すると、このようになります。TimeGMTと TimeServerGMTという2つの値の特別な出力があるので、それらが一致するかどうかを確認することができます。

同じであれば、エラーはありません。

 
fxsaber:

スクリプトを実行すると、このようになります。そこでは、TimeGMTとTimeServerGMTという2つの値が特別に出力され、それらが一致するかどうかを確認することができます。

一致すればエラーはなく、そうでなければ間違いとなる。

了解です。
 

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

ライブラリ: TypeToBytes

fxsaber さん 2018.03.31 09:24

// Кроссплатформенный пример передачи произвольных данных через пользовательское событие

#include <fxsaber\HistoryTicks\Data_String.mqh> // https://www.mql5.com/ru/code/20298

// Печать произвольных данных
template <typename T>
bool MyPrint( const T &Value )
{
  T Array[1];
  
  Array[0] = Value;
  
  ArrayPrint(Array, _Digits, NULL, 0, WHOLE_ARRAY, ARRAYPRINT_HEADER | ARRAYPRINT_ALIGN);
  
  return(true);
}

void OnChartEvent( const int id, const long &lparam, const double&, const string &sparam )
{
  // Распечатали полученные данные
  if ((id == CHARTEVENT_CUSTOM) &&
      (lparam ?  MyPrint(DATA_STRING::FromString<MqlDateTime>(sparam)) // Получили MqlDateTime
              : !MyPrint(DATA_STRING::FromString<MqlTick>(sparam))))   // Получили MqlTick
    ExpertRemove(); // Вышли из примера
}

void OnInit()
{
  MqlTick Tick;  
  MqlDateTime DateTime;
  
  // Заполнили значения
  SymbolInfoTick(_Symbol, Tick);  
  TimeCurrent(DateTime);

  // Передали
  EventChartCustom(0, 0, 0, 0, DATA_STRING::ToString(Tick));     // Передали MqlTick
  EventChartCustom(0, 0, 1, 0, DATA_STRING::ToString(DateTime)); // Передали MqlDateTime
}
 
fxsaber

スパークルは長さ制限があります。それを考慮したのでしょうか?

 
アンドレイ・バリノフ

スパークルは長さ制限があります。

はい、128バイトです。

const bool Init = EventChartCustom(0, 0, 0, 0, NULL);

void OnChartEvent( const int id, const long&, const double&, const string &sparam )
{
  static int PrevLength = -1;
  
  if (id == CHARTEVENT_CUSTOM)
  {
    const int Length = StringLen(sparam);

    bool Res = (Length != PrevLength);
    
    if (Res)
    {
      string Str;
            
      StringInit(Str, Length + 1, 1);
      
      Res = EventChartCustom(0, 0, 0, 0, Str);
    }
    
    if (!Res)
    {
      Print(PrevLength);
      
      ExpertRemove();
    }
      
    PrevLength = Length;      
  }
}

そのあたりは考慮されているのでしょうか?

いや、そこから見えてくるものがあるんです。文字列を保存する方法の一つとして、sparamの例が挙げられている。

コードをより複雑にする(チャンクで送る)ことはできますが、その場合、視覚的な分かりやすさが失われます。

 
fxsaber

具体的な事例がないと、建設的な解決策にはならないのではと思うのですが、いかがでしょうか。

こんな感じの絵を出しています。


  Print( "TimeServer: ",TimeGMT()-TimeServerGMTOffset() );
  Print( "TimeServerGMT: ",TimeServerGMT() );
  Print( "TimeCurrent: ",TimeCurrent() );
  Print( "TimeLocal: ",TimeLocal() );
  Print( "TimeGMT: ",TimeGMT() );
  Print( "TimeGMTOffset: ",TimeServerGMTOffset() );
  Print( "" );

そして、GMT+2 勤務のmt4インストーラーがこちら。

TimeServer=2018.04.01 05:54:26を 期待していました。

ファイル:
tw4setup.zip  522 kb
 
ヴィタリー・ムジチェンコ

このような絵が出ます。

念の ため、TradersWay-Demoのサーバー名を教えてください。

SZZ TradersWay-Demo。

正常に動作しています。

2018.04.01 08:36:08.858 TimeServerGMT EURUSDi,M1: TimeServerGMT() = 2018.03.30 19:59:59

持っていないかもしれません。

// Работает для FOREX-символов, когда M1-история доступна за ближайшую неделю
 
fxsaber

念の ため、取引サーバーの名前を教えてください。

ZS TradersWay-Demo。

正常に動作しています。

持っていないかもしれません。

たぶん、ないと思います。私はおそらくどの端末でも持っていない。私はM15以下のタイムフレームを切り替えたことはない。

OK、もう少し調べてみます。
 
ヴィタリー・ムジチェンコ

たぶん、ないと思います。私はおそらくどのターミナルでも持っていない、私はM15以下のタイムフレームを切り替えることはありません。

この方法で行う

datetime GetBarTime( const datetime time, const bool NextBar = false, string Symb = NULL, const ENUM_TIMEFRAMES TimeFrame = PERIOD_M15 )
 
fxsaber:

これをやってください。

やってみたが、デタラメは表示されなかった。紛らわしいのは、シフトがおそらく -720 であるべきだということです。



P.S. 繰り返しになりますが、シフト+2時間はホームページに書いてあるのですが、ロボットはそれを知らないのです。

このようなチャートでExpert Advisorを実行すると、必要な出力結果である「現在の 時刻サーバーの TimeServer() を学ぶ」が得られない可能性が高いです。もしかしたら、私のやり方が悪いのかもしれませんね。

開発者はターミナルに機能を実装すべきなのかもしれません。

理由: