时间处理函数
时间在大多数流程中都是一个基本要素,对于交易也扮演着重要应用角色。
我们知道,交易中的主要系统基于两个维度:价格和时间。它们分别沿纵轴和横轴显示在图表上。稍后我们将了解另一个重要的轴,其可表示为垂直于前两条轴,并在图表中体现更深的维度,在这个轴上标记交易量。但是现在我们先来了解时间。
时间度量对所有图表通用,使用相同的测量单位,虽然听起来有些奇怪,但它的特征在于恒定性(时间进程是可以预测的)。
终端内置了大量与时间计算和分析相关的工具。随着我们学习本书的各个章节,我们将由浅入深逐渐熟悉这些工具。
在本章中,我们将学习可控制时间以及将程序活动暂停指定间隔时间的函数。
在 日期和时间 一章中关于数据转换的章节,我们已经接触了与时间相关的几个函数:TimeToStruct 和 StructToTime。它们分别用于将 datetime 类型的值拆分为分量,以及从单独字段构建 datetime:别忘了,在 MqlDateTime 结构体中总结过这两个函数。
struct MqlDateTime
|
但 MQL 程序可以从哪里获取到 datetime 值呢?
例如,历史价格和时间反映在报价中,而当前实时数据记为分时报价。二者均有时间戳,我们将在关于 时间序列 和 终端事件的相关章节学习如何获取。然而,MQL 程序可以使用若干函数自行查询当前时间(不含价格或其它交易信息)。
需要多干函数,因为系统是分布式的:由位于全球任意位置的客户端终端和经纪人服务器组成,它们很可能属于不同时区。
任何时区的特征都是相对于全球参考时间格林威治标准时间 (GMT) 的临时偏移。原则上,时区偏移值是一个整数小时数 N(尽管也有半小时梯度的特异时区),因此可以表示为 GMT + N 或 GMT-N,取决于时区是在子午线以东还是以西。例如位于伦敦以东的欧洲大陆使用中欧时间 (CET) 等于 GMT + 1,或者东欧时间 (EET) 等于 GMT + 2,而在美洲则有“负”时区,诸如东部标准时间 (EST) 或 GMT-5。
需要注意的是,GMT 对应于天文(太阳)时间,该时间因地球旋转速度逐渐减慢而稍微呈现出非线性特征。最近数十年,实际上一直在向更为精确的计时系统(基于原子钟)过渡,其中全球时间称为协调世界时 (UTC)。在包括交易在内的很多应用领域,GMT 和 UTC 的差异不大,因此新的 UTC±N 和旧的 GMT±N 格式的时区名称应视为类似名称。例如,很多经纪人在其规范中已经使用 UTC 指定交易时段,而 MQL5 API 一直以来使用 GMT 标记法。
MQL5 API 支持查找终端的当前时间(即计算机的本机时间)以及服务器时间:它们分别由 TimeLocal 和 TimeCurrent 函数返回。此外,MQL 程序能够基于 Windows 时区设置获取当前 GMT 时间(TimeGMT 函数)。因此,交易员和编程人员获得本地时间与全球时间的绑定,通过本地时间和服务器时间之间的差异,即可判定服务器和报价的“时区”。但这里还有几个有趣的点。
首先,在很多国家,有实行切换到夏令时 (DST) 的习惯。通常,这表示大概从三月/四月到十月/十一月期间对标准(冬季)时间加 1 小时(在北半球,南半球则减去 1 小时)。同时,GMT/UTC 时间始终恒定,即其不进行 DST 修正,因此,客户和服务器时间之间的趋同/差异的各种选项成为潜在可能:
- 各个国家的夏令时生效日期有所不同
- 有些国家不实行夏令时
因此,如果算法是基于对当日时间的引用(例如新闻发布)而不是基于对价格变动或交易量密度的引用,一些 MQL 程序需要跟踪此类时区变化。
并且如果用户的计算机上的时间转换很容易确定(使用 TimeDaylightSavings 函数),则对于服务器时间并没有现成类似转换。
其次,遗憾的是,常规 MetaTrader 5 测试程序(用于调试或评估诸如 EA 交易和指标等类型的 MQL 程序)无法模拟交易服务器的时间。相反,所有上述三个函数 TimeLocal、TimeGMT 以及 TimeCurrent 将返回相同的时间,即时区始终是虚拟 GMT。
绝对和相对时间。
算法中的时间核算如现实生活一样,可以以绝对或相对坐标执行。在过去、现在和将来的每个时刻均一个绝对值描述,我们可以引用该值以指示会计期间的开始或者指示经济新闻发布时间。在 MQL5 中,我们正是以 datetime 类型存储该时间。同时,也经常需要从当前时刻起往将来延伸或向过去回退给定的时间单位。在此情况下,我们关注的不是绝对值,而是时间间隔。
尤其是算法有超时概念,即在一段时间内必须执行某一操作,如果因任何原因未执行,则取消操作并停止等待结果(很明显是因为出错了)。可以以不同单位测量时间间隔:小时、秒、毫秒,甚至微秒(毕竟现在的计算机速度极快)。
在 MQL5 中,某些时间相关函数处理绝对值(例如, TimeLocal、 TimeCurrent)以及时间间隔部分(例如, GetTickCount、 GetMicrosecondCount)。
然而,时间间隔的测量以及程序在指定间隔时间的激活不仅可以通过本节的函数实现,还可以使用根据众所周知的闹钟原理工作的内置计时器来实现。启用计时器后,计时器会使用特殊事件来通知 MQL 程序以及我们实现的用于处理这些事件的函数 OnTimer (它们类似于 OnStart)。我们将在单独章节中探讨时间管理的这个方面,在学习了 MQL5 中的一般事件概念之后再来探讨它们(参见 事件处理函数概述)。