欢迎访问 外汇EA下载与MT4/MT5自动交易资源 - 聚合外汇EA、黄金EA、量化交易工具与自动化交易实战内容。
登录 注册

高性能时间函数 (TimeUtils) - MetaTrader 5 库

author emer | 434 人阅读 | 0 人评论 |

该库包含 80 多个不同的函数来处理时间变量。主要目标是提供高性能时间函数。默认情况下禁用性能模式(可以在编译时通过 #define 进行控制)。此模式不需要将库包含到您的项目中,因为没有它也可以正常包含。

TIMEUTILS_PERFORMANCE_MODE

可选地, 性能模式可以在编译时打开通过#include之前的#defines:

// 为库启用性能模式
#定义TIMEUTILS_PERFORMANCE_MODE#包括“TimeUtils.mqh”

这会将所有调用重定向到 MQL 的内置构建时间结构到时间 功能到更有效的替代方案。

您可以使用或不使用 TIMEUTILS_PERFORMANCE_MODE 来编译脚本“performance_mode.mq5” 检查您机器上的速度差异。这将有利于高性能程序执行繁重或许多与时间相关的任务(例如,在交易周开始时扫描 H1 柱的所有报价历史记录或收集其他统计数据)。

函数名称应该是不言自明的;此外,您还可以在 TimeUtils.mqh 文件中找到特定函数的简短描述。

//+====================================================================+
//|从组件创建日期时间                                  |
//+====================================================================+
日期时间创建日期时间(
  常量 整数年,          // 年  常量 整数星期一,            // 月  常量 整数天,            // 天  常量 整数小时=0,      // 小时  常量 整数分钟=0,        // 分钟  常量 整数秒=0        // 秒   )日期时间创建日期时间(Mql日期时间&  dt_struct);  // StructToTime() 的快速替代方法

//+====================================================================+
//|将日期时间分解为组件                                     |
//+====================================================================+
布尔值快速结构时间(
  日期时间      德特,        // 要转换的日期值  Mql日期时间&  dt_struct  // 采用值的结构   )//+====================================================================+
//|提取日期时间的组成部分:星期日,yyyy.mm.dd hh:mm:ss      |
//| Get() 单位                                                      |
//+====================================================================+
整数获取第二个(日期时间t)整数获取分钟(日期时间t)整数获取时间(日期时间t)整数获取日(日期时间t)整数获取月份(日期时间t)整数获取年份(日期时间t)//+====================================================================+
//| Day() 数字                                                     |
//+====================================================================+
整数星期几(日期时间t)整数年中的某一天(日期时间t)整数日指数(日期时间t)//+====================================================================+
//|周数                                                    |
//+====================================================================+
整数每月一周(常量 日期时间t,布尔值周一开始 =错误的整数一年中的一周(常量 日期时间t,布尔值周一开始 =错误的整数周索引(日期时间t,布尔值周一开始 =错误的//+====================================================================+
//| StartOf() 单位                                                  |
//+====================================================================+
日期时间分钟开始(日期时间t)日期时间开始时间(日期时间t)日期时间一天的开始(日期时间t)日期时间一周开始(日期时间t,布尔值周一开始 =错误的日期时间月初(日期时间t)日期时间年初(日期时间t)//+====================================================================+
//| EndOf() 单位                                                    |
//+====================================================================+
日期时间分钟结束(日期时间t)日期时间结束时间(日期时间t)日期时间一天结束(日期时间t)日期时间周结束(日期时间t,布尔值周一开始=错误的日期时间月末(日期时间t)日期时间年末(日期时间t)//+====================================================================+
//| SecsElapsedOf() 单位                                           |
//+====================================================================+
整数分钟秒数(日期时间t)整数秒数已用时间(日期时间t)整数天已过秒数(日期时间t)整数周已过去秒数(日期时间t,布尔值周一开始 =错误的整数月已过去秒数(日期时间t)整数年已过去秒数(日期时间t)//+====================================================================+
//| RoundTo() / 最近() 单位                                       |
//+====================================================================+
日期时间回合到分钟(日期时间t)日期时间回合到小时(日期时间t)日期时间今天回合(日期时间t)日期时间每周循环(日期时间t,布尔值周一开始=错误的//+====================================================================+
//| CeilTo() / Next() 单位                                          |
//+====================================================================+
日期时间天花板到分钟(日期时间t)日期时间天花板到小时(日期时间t)日期时间今日天花板(日期时间t)日期时间天花板到周(日期时间t,布尔值周一开始 =错误的//+====================================================================+
//|下一个() 工作日                                                   |
//+====================================================================+
日期时间下一个工作日(日期时间t,ENUM_DAY_OF_WEEK工作日 =星期日日期时间下周日(日期时间t)日期时间下周一(日期时间t)日期时间下周二(日期时间t)日期时间下周三(日期时间t)日期时间下周四(日期时间t)日期时间下周五(日期时间t)日期时间下周六(日期时间t)//+====================================================================+
//|上一页() 工作日                                                |
//+====================================================================+
日期时间上一个工作日(日期时间t,ENUM_DAY_OF_WEEK工作日 =星期日日期时间上周日(日期时间t)日期时间上周一(日期时间t)日期时间上周二(日期时间t)日期时间上周三(日期时间t)日期时间上周四(日期时间t)日期时间上周五(日期时间t)日期时间上周六(日期时间t)//+====================================================================+
//|该月的第 N() 个工作日                                       |
//+====================================================================+
日期时间该月的第一个工作日(日期时间t,ENUM_DAY_OF_WEEK工作日 =星期日日期时间该月最后一个工作日(日期时间t,ENUM_DAY_OF_WEEK工作日 =星期日日期时间本月第 N 个工作日(日期时间t,整数第N次,ENUM_DAY_OF_WEEK工作日 =星期日//+====================================================================+
//| Add() 单位                                                       |
//+====================================================================+
日期时间添加秒数(日期时间t,整数数量)日期时间添加分钟数(日期时间t,整数数量)日期时间添加时间(日期时间t,整数数量)日期时间添加天数(日期时间t,整数数量)日期时间添加工作日(日期时间t,整数数量)日期时间添加周数(日期时间t,整数数量)日期时间添加月份(日期时间t,整数数量)日期时间添加年份(日期时间t,整数数量)//+====================================================================+
//| Sub() 单位                                                      |
//+====================================================================+
日期时间亚秒(日期时间t,整数数量)日期时间亚分​​钟(日期时间t,整数数量)日期时间低于小时数(日期时间t,整数数量)日期时间子日(日期时间t,整数数量)日期时间子营业日(日期时间t,整数数量)日期时间子周(日期时间t,整数数量)日期时间子月份(日期时间t,整数数量)日期时间子年份(日期时间t,整数数量)//+====================================================================+
//| DifferenceIn() 单位                                             |
//+====================================================================+
整数日历天数差异(日期时间开始时间,日期时间结束时间)整数工作日差异(日期时间开始时间,日期时间结束时间)整数日历周差异(日期时间开始时间,日期时间结束时间,布尔值周一开始 =错误的整数日历月份差异(日期时间开始时间,日期时间结束时间)//+====================================================================+
//| IsSame() 单位                                                    |
//+====================================================================+
布尔值是同一分钟(日期时间t1,日期时间t2)布尔值是同一时间(日期时间t1,日期时间t2)布尔值是同一天(日期时间t1,日期时间t2)布尔值是同一周(日期时间t1,日期时间t2,布尔值周一开始=错误的布尔值是同月(日期时间t1,日期时间t2)布尔值同年(日期时间t1,日期时间t2)//+====================================================================+
//| IsCurrent() 单位                                                 |
//+====================================================================+
布尔值是当前分钟(日期时间t)布尔值是当前时间(日期时间t)布尔值是当前周(日期时间t,布尔值周一开始 =错误的布尔值是当前月份(日期时间t)布尔值是当前年份(日期时间t)布尔值今天是(日期时间t)布尔值是明天(日期时间t)布尔值是昨天(日期时间t)//+====================================================================+
//|其他                                                             |
//+====================================================================+
布尔值是闰年(整数年)整数  一个月中的天数(整数年,整数月)日期时间GetNthWeekdayInYearMonth(iYear, iMonth, Nth, 工作日 =星期日日期时间GetNthSundayInYearMonth(iYear, iMonth, Nth)//+====================================================================+
//|将时间格式化为字符串                                        |
//+====================================================================+
细绳t2s(日期时间t,常量 整数模式=TIME_DATE|TIME_MINUTES细绳秒数转字符串(整数秒)细绳时间格式(日期时间t,细绳格式=“年.月.日 时:分”


//+------------------------------------------------------------------+
//|根据传递的 token 字符串获取格式化时间。 |
//|所有可用格式的列表:                                   |
//|格式  输出            说明                            |
//| ------  ----------------  ---------------------------------------------------- |
//| YY      18                两位数年份                         |
//| YYYY    2018              四位数年份                        |
//| M       1-12              月份,从 1 开始              |
//| MM      01-12             月份,2 位数字                    |
//| MMM     Jan-Dec           月份名称缩写,3 个字母  |
//| MMMM    一月至十二月  完整月份名称                    |
//| D       1-31              一月中的某一天                   |
//| DD      01-31             月份中的日期,2 位数字         |
//| DDD     周日至周六           一周中某一天的简称  |
//| DDDD    星期日至星期六   星期几的名称        |
//| h       0-23              小时                               |
//| hh      00-23             小时,2 位数字                     |
//| H       1-12              小时,12 小时制                |
//| HH      01-12             小时,12 小时制,2 位数字      |
//| m       0-59              分钟                             |
//| mm      00-59             分钟,2 位数字                   |
//| s       0-59              第二个                             |
//| ss      00-59             第二个 2 位数字                   |
//| A       上午 下午                                                   |
//| a       上午                                                   |
//+------------------------------------------------------------------+
//|示例格式:                                                 |
//| "YYYY.MM.DD hh:mm"           // "2024.12.08 22:05"  (默认)    |
//| "DDD, YYYY.MM.DD hh:mm:ss"   // "周日,2024.12.08 22:05:21"       |
//| “D MMMM YYYY,HH:mm a”       //“2024 年 12 月 8 日,晚上 10:05”      |
//| "DD/MM/YYYY"                 // "08/12/2024"                      |
//+------------------------------------------------------------------+
细绳时间格式(常量 日期时间t,常量 细绳格式=“年.月.日 时:分”);


附加的两个脚本“basic.mq5”和“advanced.mq5”显示了基本和高级用法例子。

“advanced.mq5”脚本的输出示例:

/*
 示例输出:

 1. 创建日期时间(2022, 03, 25) = 2022.03.25 00:00:00
     [年] [星期一] [日] [小时] [分钟] [秒] [星期几] [年日]
 [0]   2024    12    18     17    27    25             3           352
 2. t2s(t, TIME_DATE|TIME_SECONDS) = 星期三, 2024.12.18 18:27:25
 3. GetYear(t) = 2024
 4. 获取月份(t) = 12
 5. GetDay(t) = 18
 6. GetHour(t) = 18
 7. 获取分钟(t) = 27
 8. GetSecond(t) = 25
 9. 星期几(t) = 3
 10. 年中某日(t) = 352
 11.日指数(t) = 20075
 12. 月周(t) = 3
 13. 年周(t) = 51
 14. 周指数(t) = 2868
 15. WeekOfMonth(t, true) = 4
 16. WeekOfYear(t, true) = 51
 17. WeekIndex(t, true) = 2868
 18. 开始时间(t) = 2024.12.18 18:27:00
 19. 开始时间(t) = 2024.12.18 18:00:00
 20. StartOfDay(t) = 2024.12.18 00:00:00
 21. StartOfWeek(t) = 2024.12.15 00:00:00
 22. StartOfWeek(t, true) = 2024.12.16 00:00:00
 23. 月份开始(t) = 2024.12.01 00:00:00
 24. 年开始(t) = 2024.01.01 00:00:00
 25. EndOfMinute(t) = 2024.12.18 18:27:59
 26. 结束时间(t) = 2024.12.18 18:59:59
 27. EndOfDay(t) = 2024.12.18 23:59:59
 28. 周结束(t) = 2024.12.21 23:59:59
 29. EndOfWeek(t, true) = 2024.12.22 23:59:59
 30.月末(t) = 2024.12.31 23:59:59
 31. 年末(t) = 2024.12.31 23:59:59
 32. 秒数已用时间 (t) = 25
 33. SecsElapsedOfHour(t) = 1645
 34.SecsElapsedOfDay(t) = 66445
 35. 周秒数(t)= 325645
 36. SecsElapsedOfWeek(t, true) = 239245
 37. 月已用秒数(t) = 1535245
 38. 年历秒数(t) = 30479245
 39. RoundToMinute(t) = 2024.12.18 18:27:00
 40. RoundToHour(t) = 2024.12.18 18:00:00
 41. RoundToDay(t) = 2024.12.19 00:00:00
 42. RoundToWeek(t) = 2024.12.22 00:00:00
 43. RoundToWeek(t, true) = 2024.12.16 00:00:00
 44. CeilToMinute(t) = 2024.12.18 18:28:00
 45. CeilToHour(t) = 2024.12.18 19:00:00
 46. CeilToDay(t) = 2024.12.19 00:00:00
 47. CeilToWeek(t) = 2024.12.22 00:00:00
 48. CeilToWeek(t, true) = 2024.12.23 00:00:00
 49. 下周日(t) = 2024.12.22 00:00:00
 50. 下周一(t) = 2024.12.23 00:00:00
 51. 下周二(t) = 2024.12.24 00:00:00
 52. 下周三(t) = 2024.12.25 00:00:00
 53. 下周四(t) = 2024.12.19 00:00:00
 54. 下周五(t) = 2024.12.20 00:00:00
 55. 下周六(t) = 2024.12.21 00:00:00
 56. 上周日(t) = 2024.12.15 00:00:00
 57. 上周一(t) = 2024.12.16 00:00:00
 58. 上周二(t) = 2024.12.17 00:00:00
 59. 上周三(t) = 2024.12.11 00:00:00
 60. 上周四(t) = 2024.12.12 00:00:00
 61. 上周五(t) = 2024.12.13 00:00:00
 62. 上周六(t) = 2024.12.14 00:00:00
 63. FirstWeekdayOfTheMonth(t, 星期日) = 2024.12.01 00:00:00
 64.LastWeekdayOfTheMonth(t, 星期日) = 2024.12.29 00:00:00
 65. AddSeconds(t, 30) = 2024.12.18 18:27:55
 66. 添加分钟(t, 30) = 2024.12.18 18:57:25
 67. 添加时间(t, 2) = 2024.12.18 20:27:25
 68. AddDays(t, 10) = 2024.12.28 18:27:25
 69. AddBusinessDays(t, 10) = 2025.01.01 18:27:25
 70. 添加周(t, 4) = 2025.01.15 18:27:25
 71. 添加月份(t, 2) = 2025.02.18 18:27:25
 72. AddYears(t, 5) = 2029.12.18 18:27:25
 73. 亚秒(t, 30) = 2024.12.18 18:26:55
 74. 亚分钟(t, 30) = 2024.12.18 17:57:25
 75. 子时间(t, 2) = 2024.12.18 16:27:25
 76. 子日(t, 10) = 2024.12.08 18:27:25
 77. SubBusinessDays(t, 10) = 2024.12.04 18:27:25
 78. 子周(t, 4) = 2024.11.20 18:27:25
 79. 子月份(t, 2) = 2024.10.18 18:27:25
 80. 子年份(t, 5) = 2019.12.18 18:27:25
 81. DifferenceInCalendarDays(t, AddWeeks(t, 9)) = 63
 82.DifferenceInBusinessDays(t, AddWeeks(t, 9)) = 45
 83. DifferenceInCalendarWeeks(t, AddWeeks(t, 9)) = 9
 84. DifferenceInCalendarWeeks(t, AddWeeks(t, 9), true) = 9
 85. DifferenceInCalendarMonths(t, AddWeeks(t, 9)) = 286. IsSameMinute(t, AddHours(t, 25)) = false
 87. IsSameHour(t, AddHours(t, 25)) = false
 88. IsSameDay(t, AddHours(t, 25)) = false
 89. IsSameWeek(t, AddHours(t, 25)) = true
 90. IsSameWeek(t, AddHours(t, 25), true) = true
 91. IsSameMonth(t, AddHours(t, 25)) = true
 92. IsSameYear(t, AddHours(t, 25)) = true
 93. IsCurrentMinute(t) = false
 94. IsCurrentHour(t) = false
 95. IsCurrentWeek(t) = true
 96. IsCurrentWeek(t, true) = true
 97.IsCurrentMonth(t) = true
 98. IsCurrentYear(t) = true
 99. IsToday(t) = true
 100.IsTomorrow(t) = false
 101. IsYesterday(t) = false
 102. IsLeapYear(2100) = false
 103.月内天数(2024, 2) = 29
 104. GetNthWeekdayInYearMonth(2024, 1, 1, 星期日) = 2024.01.07 00:00:00
 105. t2s(TimeCurrent()) = 星期三,2024.12.18 17:27
 106.SecondsToString(SecsElapsedOfDay(TimeCurrent())) = 17:27:25
 107. TimeFormat(TimeCurrent(), YYYY.MM.DD 时:分) = 2024.12.18 17:27
 108. TimeFormat(TimeCurrent(), DDD, YYYY.MM.DD hh:mm:ss) = 星期三, 2024.12.18 17:27:25
 109. TimeFormat(TimeCurrent(), D MMM YYYY, HH:mm a) = 2024 年 12 月 18 日下午 05:27

*/


2024.12.03 - v.1.10:初始版本。

2024.12.05 - v.1.15:添加了工作日和该月第 N() 个工作日的功能。优化 DaysInMonth() 函数中的计算。

2024.12.09 - v.1.20:添加了 TimeFormat() 函数,用于根据传递的令牌字符串格式化时间。

2024.12.09 - v.1.25:优化 TimeToStructFast() 函数中的计算。

2024.12.10 - v.1.30:优化 TimeFormat()、StartOfYear() 和 EndOfYear() 函数。更新了一些功能的描述。

2024.12.15 - v.1.35:优化 GetNthWeekdayInYearMonth() 函数。

2024.12.18 - v.1.40 :添加了 IsCurrentXXX()、IsToday()、IsTomorrow() 和 IsYesterday() 函数。

2024.12.19 - v.1.45:优化 AddMonths() 和 GetNthWeekdayInYearMonth() 函数。

2024.12.20 - v.1.50:更多代码清理。

2024.12.21 - v.1.55:AddMonths() 中的简化计算:用更简单的总月数计算替换了调整月份和年份的复杂逻辑。


附件下载

📎 timeutils.mqh (124.27 KB)

📎 basic.mq5 (2.38 KB)

📎 advanced.mq5 (27.74 KB)

📎 performance_mode.mq5 (3.21 KB)

Source: MQL5 #53970

🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录