TimeCurrent()和iTime()的错误/问题

 

嗨,伙计们。

刚刚遇到一个有趣的问题/bug,不知道以前是否被发现过,甚至不知道是否是经纪商的问题。

尝试在一些指标代码中使用以下内容,让指标在启动时运行,并注意第一次运行MT4时的数值(确保MT4在重新启动前至少没有运行10分钟)。

Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES));
Print(TimeToStr(iTime(NULL,PERIOD_M1,0),TIME_DATE|TIME_MINUTES));

你会注意到返回的时间实际上是MT4最后运行的时间。

为了解决这个问题,我不得不在我的代码中引入一个延迟,这对一个指标来说并不理想。

我想知道是否有人有更多的解决方案。我希望每次启动时都能返回正确的MT4服务器时间

谢谢

保罗-B

 
Paul_B:

嗨,伙计们。

刚刚遇到一个有趣的问题/bug,不知道以前是否被发现过,甚至不知道是否是经纪商的问题。

尝试在一些指标代码中使用以下内容,让指标在启动时运行,并注意第一次运行MT4时的数值(确保MT4在重新启动前至少没有运行10分钟)。

你会注意到返回的时间实际上是MT4最后运行的时间。

为了解决这个问题,我不得不在我的代码中引入一个延迟,这对一个指标来说并不理想。

我想知道是否有人有更多的解决方案。我希望每次启动时都能返回正确的MT4服务器时间。

谢谢

保罗-B


这个?
Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
 

嗨,deVries。

你也可以使用TIME_SECONDS,这并不重要,只要代码是在init{}或start{}的开头。

问题是,你得到的是MT4最后运行的时间,有可能是几小时或几天前。

 
Paul_B:

嗨,伙计们。

刚刚遇到一个有趣的问题/bug,不知道以前是否被发现过,甚至不知道是否是经纪商的问题。

尝试在一些指标代码中使用以下内容,让指标在启动时运行,并注意第一次运行MT4时的数值(确保MT4在重新启动前至少没有运行10分钟)。

你会注意到返回的时间实际上是MT4最后运行的时间。

为了解决这个问题,我不得不在我的代码中引入一个延迟,这对一个指标来说并不理想。

我想知道是否有人有更多的解决方案。我希望每次启动时都能返回正确的MT4服务器时间。

谢谢

保罗-B

在这一点上,文档不是100%清楚吗?"返回最后已知的服务器时间(最新报价的传入时间),作为从1970年1月1日00:00起经过的秒数。"如果最后一次打勾是10分钟前,那么TimeCurrent()将返回一个基于该时间的数据时间 . .
 
RaptorUK:
在这一点上,文档不是100%清楚吗?

并非如此,不是的。

在EA和指标之间有一个重要的 区别,在文档中没有涉及。EAs只有在有经纪商连接和新的tick时才会被调用start(),而指标总是在经纪商连接建立之前或没有建立之前被调用start()。因此,TimeCurrent()在EA和指标中可以有不同的含义。

如果你想为指标中的TimeCurrent()获得一个肯定的刷新值,那么你可以使用IsConnected()来检查TimeCurrent()是否可能是指前一个时段的最后已知时间。

 

作为额外的一点,我甚至尝试过

https://docs.mql4.com/windows/RefreshRates

然后再调用TimeCurrent(),也没有什么不同。这当然是要记住的事情。

我把它作为一些代码的一部分来使用,以获得MT4服务器时间和GMT之间的偏移量,它使后续的计算出错。

 
cyclops993:

并非如此,不是的。

在EA和指标之间有一个重要的区别,在文档中没有涉及。EAs只有在有经纪商连接和新的tick时才会被调用start(),而指标总是在经纪商连接建立之前或没有建立之前被调用start()。因此,TimeCurrent()在EA和指标中可以有不同的含义。

我不认为这与文件中所说的有关 ......如果你在新刻度线到来之前检查 TimeCurrent(),你会得到最后一个刻度线的时间。这不正是文件中所说的吗?
 
RaptorUK:
我不认为这与文件中所说的有关 ......如果你在新刻度线到来之前检查TimeCurrent(),你会得到最后一个刻度线的时间。 这不正是文件中所说的吗?

这仍然有误导性,但如果你想迂腐一点,你可以说问题不在TimeCurrent()的定义里,而是在https://docs.mql4.com/runtime/start 的定义 它说:"在新的报价传入时,将执行所附专家和自定义指标的start()函数"。这清楚地表明,start()只在有新行情时才会被调用,就像EA一样,因此,隐含地,TimeCurrent()不能返回使用MT4软件的上一个时段的时间。

[同样,如果IsConnected()返回false,就可以忽略指标中对start()的调用。]

 
cyclops993:

这仍然有误导性,但如果你想迂腐一些[...] 。

更为迂腐的是,如果你有一个全新的MT4安装,并在第一次启动MT4之前将一个附有指标的图表文件复制到其中,那么该指标可能会得到一个start()的调用,TimeCurrent()报告为1/1/1970。因此,TimeCurrent()的文档应该说"......最后已知的服务器时间,如果没有服务器连接,则为1970年1月"。

 
cyclops993:

更为迂腐的是,如果你有一个全新的MT4安装,并在第一次启动MT4之前将一个附有指标的图表文件复制到其中,那么该指标可能会得到一个start()的调用,TimeCurrent()报告为1/1/1970。因此,TimeCurrent()的文档应该说"......最后已知的服务器时间,如果没有服务器连接,则为1970年1月"。

没有必要大惊小怪。只要等待第一个/下一个刻度,TimeCurrent()就会被更新,一切都会好起来。一个只显示历史价格的指标是没有用的。
 
angevoyageur:
没有必要大惊小怪。只要等待第一个/下一个tick,TimeCurrent()就会更新,一切都会好起来。只有历史价格的指标是没有用的。
我认为问题在于,第一次为指标调用start()时,可能不是因为新的tick ......在这种情况下,TimeCurrent()将报告错误的时间。 我还没有验证这一点 ......。

在这种情况下,我会简单地忽略第一个刻度 ... ...然后从第2个刻度开始继续正常运行。