mql5语言的特点、微妙之处以及技巧 - 页 79

 
Alain Verleyen:

我想根据格林尼治标准获得服务器的时间。

这就是你运行该脚本时得到的结果。有一个特殊的两个值的输出:TimeGMT 和TimeServerGMT,所以你可以检查它们是否重合。

如果它们是相同的,你就没有错误。

 
fxsaber:

当你运行该脚本时,你会得到这个结果。这里特别输出了两个值:TimeGMT和TimeServerGMT,这样你就可以检查它们是否匹配。

如果它们相吻合,就没有错误,否则就有错误。

明白了。
 

关于交易、自动交易系统和策略测试的论坛

图书馆: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:

Sparam有一个长度限制。你是否考虑到了这一点?

 
安德烈-巴里诺夫

Sparam有一个长度限制。

是的,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( "" );

这里是mt4安装程序的GMT+2 工作班次。

期待看到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以下切换时间框架。

好的,我再研究一下。
 
维塔利-穆齐琴科

可能不会。我可能没有任何终端,我从不在M15以下切换时间段。

这样做

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

做到这一点。

做了,没有显示任何废话。令人困惑的是,转变可能应该是-720



P.S.再次,我知道网站上写着轮班+2小时,但机器人不知道。

如果你在这样的图表上运行专家顾问,不太可能得到所需的输出结果:"学习当前的 时间服务器 TimeServer()" 我没有弄清楚,也许我做错了什么。

也许开发者应该在终端实现这个功能。