高性能时间函数 (TimeUtils) - MetaTrader 5 库
该库包含 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
💡 精彩内容推荐
✍️ 楼主最新发布
- •
- •
- •
- •
- •
- •
🔗 您可能感兴趣
- •
- •
- •
- •
- •
- •
