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

 
Vitaly Muzichenko:

我把EA放在周六的图表上,但EA可以得到最后一个刻度的时间,例如在Market Watch中是23:58,而我的当地时间是04:45。服务器的时间我不知道。

我的问题是:从最后一个刻度到服务器时间(终端时间)已经过去了多少时间?

思考了一阵子。事实证明,当EA被附加到图表上时,并没有什么区别。在没有真正的滴答声之前,我们不能执行程序算法中使用服务器 实时的那一部分。

如果在滴答声到来之前需要进行计算,那么就要求提供ServerGMTOffset。

所以,即使没有ServerTradeTime(),这个问题也可以解决。

 
Ihor Herasko:

我已经考虑过这个问题了。事实证明,当EA连接到图表上时,没有任何区别。只要没有真正的勾选,我们就不能执行程序算法中使用真实服务器时间的那部分。

如果在滴答声到来之前需要进行计算,那么就要求提供ServerGMTOffset。

因此,即使没有ServerTradeTime(),这个问题也可以解决。

用户不知道服务器的Offset,他不知道。

只有两个值是已知的,这些数据不足以计算出"从最后一次打勾到服务器(终端)的 时间已经过去了多少时间"

这是一个非常奇特的任务,我没有看到解决办法,就像你一样。

 
维塔利-穆齐琴科

我把EA放在周六的图表上,但EA可以得到最后一个刻度的时间,例如在Market Watch中是23:58,而我的当地时间是04:45。服务器的时间我不知道。

问题是,从最后一个刻度到服务器时间(终端时间)过去了多少时间?

两者都不只是时间,而是日期时间。即日期和时间。因此,用这个数据进行算术运算,将得到秒的差值,这不难转化为日、时、分、秒。

另外,你需要检查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
注意服务器时间和当地时间之间的差异,然后注意当地时间和估计的服务器时间之间的精确匹配。
 
对于外汇,你可以从四方面重新制作这个代码

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

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:
你可以为外汇重新制作这段代码

谢谢,我会看看的。但话说回来,也有非外汇符号。

不方便的是,你不能在任何时间点上简单而简要地获得当前的服务器时间。

阿列克谢-维克多罗夫

两者都不只是时间,它们是日期时间。换句话说,它既是日期又是时间。因此,对这些数据进行算术运算,将得到秒的差值,这不难转化为日、时、分、秒。

此外,我们需要在周末检查TimeTradeServer 显示的内容。

注意服务器时间秒数和当地时间之间的差异,然后注意当地时间和服务器时间计算之间的精确匹配。

我以同样的方式打印了它,但它不能在周末使用。一般来说,应该对信息进行测试。

任务是最小的:"从最后一次打勾到服务器(终端)的时间过去了多少时间"

if( TimeCurrent()<TimeServer()-60 ) Alert( "нет котировок более 1-й минуты" );
 
维塔利-穆齐琴科

谢谢,我会看看的。但话说回来,也有非外汇交易的符号。

如果该经纪商至少有一个外汇符号,它将对其他的人起作用。

如果经纪人没有一个外汇符号,就会出现合理性问题。

 
Vitaly Muzichenko:

谢谢,我会看看的。但话说回来,也有非外汇符号。

你不能在任何时间点简单而简要地获得当前的服务器时间,这是不方便的。

我也印好了,但周末时怎么用呢。一般来说,你需要轮流提供信息。

任务是最小的:"从最后一次打勾到服务器(终端)时间已经过去多少时间"

当然我们需要检查,但从TimeCurrent和TimeTradeServer 之间的差异来看,我们可以认为差异会越来越大

请告诉我MQ-demo服务器时间 与莫斯科的时间 是否相同。

 
阿列克谢-维克多罗夫

这值得检查,但从TimeCurrent和TimeTradeServer 之间的差异来看,差异会扩大

请告诉我,我的MQ-demo服务器时间是否与我的莫斯科时间一致,如果服务器时间与我的本地时间不一致,会显示什么?

ロボル

我的当地时间是17:17:13

 

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

虫子,虫子,问题

fxsaber, 2017.05.19 22:35

TimeTradeServer 可以返回各种胡言乱语。例如,一个小于TimeCurrent的值。这使其实际应用完全无效。

如果我的理解正确的话,TimeTradeServer必须在接收到TimeCurrent后计算出经过的时间,并加上这个差值,有点像模拟未来的TimeCurrent值。

现在,在运行专家顾问后

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

void OnInit()
{
  EventSetTimer(1);
}

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

你可以看到任何胡言乱语。

注意日期。

 
fxsaber:

这又该怪谁呢,是终端,还是设置歪曲的DC?