mql5语言的特点、微妙之处以及技巧 - 页 236 1...229230231232233234235236237238239240241242243...247 新评论 Nikolai Semko 2023.11.14 19:45 #2351 更快地实现标准 PeriodSeconds() 函数: int PeriodSecondsFast(ENUM_TIMEFRAMES tf) { return (tf>>14==0)?(tf&0x0FFF)*60:(tf>>14==1)?(tf&0x0FFF)*60*60:(tf>>14==2)?60*60*24*7:2419200; } fxsaber 2023.11.14 20:09 #2352 Nikolai Semko #: 更快地实现标准 PeriodSeconds() 函数: 查看了格式。 template <typename T> bool IsCorrect( const int Index ) { ResetLastError(); return((EnumToString((T)Index) != NULL) && !_LastError); } template <typename T> string ToBits( const T Value ) { string Str = NULL; for(uint i = sizeof(T) << 3; (bool)i--;) Str += (string)(int)(!!(Value & (1 << i))); return(Str); } void OnStart() { for (int i = 0; i < 1 e7; i++) if (IsCorrect<ENUM_TIMEFRAMES>(i)) Print(ToBits(i) + " - " + EnumToString((ENUM_TIMEFRAMES)i) + ", " + (string)i); } 00000000000000000000000000000000 - PERIOD_CURRENT, 0 00000000000000000000000000000001 - PERIOD_M1, 1 00000000000000000000000000000010 - PERIOD_M2, 2 00000000000000000000000000000011 - PERIOD_M3, 3 00000000000000000000000000000100 - PERIOD_M4, 4 00000000000000000000000000000101 - PERIOD_M5, 5 00000000000000000000000000000110 - PERIOD_M6, 6 00000000000000000000000000001010 - PERIOD_M10, 10 00000000000000000000000000001100 - PERIOD_M12, 12 00000000000000000000000000001111 - PERIOD_M15, 15 00000000000000000000000000010100 - PERIOD_M20, 20 00000000000000000000000000011110 - PERIOD_M30, 30 00000000000000000100000000000001 - PERIOD_H1, 16385 00000000000000000100000000000010 - PERIOD_H2, 16386 00000000000000000100000000000011 - PERIOD_H3, 16387 00000000000000000100000000000100 - PERIOD_H4, 16388 00000000000000000100000000000110 - PERIOD_H6, 16390 00000000000000000100000000001000 - PERIOD_H8, 16392 00000000000000000100000000001100 - PERIOD_H12, 16396 00000000000000000100000000011000 - PERIOD_D1, 16408 00000000000000001000000000000001 - PERIOD_W1, 32769 00000000000000001100000000000001 - PERIOD_MN1, 49153 可能不会更快。不过我听说过 switch 的惊人速度。 int PeriodSecondsFast( const ENUM_TIMEFRAMES tf ) { switch (tf) { case PERIOD_CURRENT: return(PeriodSecondsFast(_Period)); case PERIOD_M1: return(60); case PERIOD_M2: return(120); case PERIOD_M3: return(180); case PERIOD_M4: return(240); case PERIOD_M5: return(300); case PERIOD_M6: return(360); case PERIOD_M10: return(600); case PERIOD_M12: return(720); case PERIOD_M15: return(900); case PERIOD_M20: return(1200); case PERIOD_M30: return(1800); case PERIOD_H1: return(3600); case PERIOD_H2: return(7200); case PERIOD_H3: return(10800); case PERIOD_H4: return(14400); case PERIOD_H6: return(21600); case PERIOD_H8: return(28800); case PERIOD_H12: return(43200); case PERIOD_D1: return(86400); case PERIOD_W1: return(604800); case PERIOD_MN1: return(2592000); } return(0); } Nikolai Semko 2023.11.14 20:35 #2353 fxsaber #:看了一下格式。可能不会加快速度。不过,我听说了开关的神奇速度。 它看起来更长,但我没发现性能有什么不同。 int PeriodSecondsFast2(ENUM_TIMEFRAMES tf) { ushort i_tf= ushort(tf); uchar _i =uchar(i_tf>>14); int n = i_tf & 0x0FFF; switch(_i) { case 0: // минуты return n*60; case 1: // часы return n*60*60; case 2: // недели return 60*60*24*7; case 3: // месяцы return 2592000; } return -1; } 所以我觉得还是单行版比较好。 int PeriodSecondsFast(ENUM_TIMEFRAMES tf) { return (tf>>14==0)?(tf&0x0FFF)*60:(tf>>14==1)?(tf&0x0FFF)*60*60:(tf>>14==2)?60*60*24*7:60*60*24*30; } fxsaber 2023.11.14 20:43 #2354 Nikolai Semko #:看起来更长 int PeriodSecondsFast( const ENUM_TIMEFRAMES tf ) { static const int Mult[] = {60, 60 * 60, 60 * 60 * 24 * 7, 60 * 60 * 24 * 30}; return((tf & 0xFF) * Mult[tf >> 14]); } Maxim Kuznetsov 2023.11.14 20:44 #2355 现在将所有这些转换成矩阵和 ONX :-) Nikolai Semko 2023.11.14 20:59 #2356 fxsaber #: 是的,你可以这么做。可读性更强。,在我的笔记本电脑上性能是一样的。 Nikolai Semko 2023.11.14 21:06 #2357 fxsaber #: int PeriodSecondsFast( const ENUM_TIMEFRAMES tf ) { static const int Mult[] = {60, 60 * 60, 60 * 60 * 24 * 7, 60 * 60 * 24 * 30}; return((tf & 0xFF) * Mult[tf >> 14]); } 顺便说一句,我之前的文章写错了。不知为什么,我以为一个月有 28 天,而不是 30 天。我不明白我怎么会这么想。,我再也不能修改超过 1 小时的帖子了。 所以我的正确版本是这样的: int PeriodSecondsFast(ENUM_TIMEFRAMES tf) { return (tf>>14==0)?(tf&0xFF)*60:(tf>>14==1)?(tf&0xFF)*60*60:(tf>>14==2)?60*60*24*7:60*60*24*30; } 不过,没有人需要月份的秒数,因为月份的长度是不同的 Alain Verleyen 2023.11.15 03:29 #2358 Nikolai Semko # :顺便说一句,我之前的文章写错了。不知为什么,我以为一个月有 28 天,而不是 30 天。我不明白我怎么会有这种想法。,我不能修改超过 1 小时的帖子。所以我的正确版本如下:不过没有人需要月份的秒数,因为月份的长度是不同的 你凭什么认为这比 PeriodSeconds(x) 更快? Nikolai Semko 2023.11.15 03:36 #2359 Alain Verleyen #: 你凭什么认为这比 PeriodSeconds(x) 更快? 本帖 中的测试足以比较 getStartTimeOfBar() 与 PeriodSeconds() 和 PeriodSecondsFast() 的性能。比较应在除 MN1 之外的任何 TF 上进行性能提高了约 2 倍。考虑到我们测量的是整个迭代,也许是 3 倍。还是比较这两个值就足够了2023.11.14 22:44:52.581 timeToStartMonth (EURUSD,M1) =====LOOP=10000========STEPS=100000 seconds======PERIOD_H8======== 2023.11.14 22:44:52.581 timeToStartMonth (EURUSD,M1) контрольная сумма - 12000623961600, время выполнения 1 иттерации = 6.80 наносекунд - Расчет через структуру MqlDateTime 2023.11.14 22:44:52.581 timeToStartMonth (EURUSD,M1) контрольная сумма - 12000623961600, время выполнения 1 иттерации = 3.40 наносекунд - Быстрый расчет 2023.11.14 22:44:57.734 timeToStartMonth (EURUSD,M1) контрольная сумма - 12000252960000, время выполнения 1 иттерации = 515301.20 наносекунд - Расчет через iBarShift 2023.11.14 22:44:57.734 timeToStartMonth (EURUSD,M1) ======================================================================== 2023.11.14 22:45:16.253 timeToStartMonth (EURUSD,M1) 60 ,120 ,180 ,240 ,300 ,360 ,600 ,720 ,900 ,1200 ,1800 ,3600 ,7200 ,10800 ,14400 ,21600 ,28800 ,43200 ,86400 ,604800 ,2592000 , 2023.11.14 22:45:16.253 timeToStartMonth (EURUSD,M1) =====LOOP=10000========STEPS=100000 seconds======PERIOD_M4======== 2023.11.14 22:45:16.253 timeToStartMonth (EURUSD,M1) контрольная сумма - 12000769600080, время выполнения 1 иттерации = 3.70 наносекунд - Расчет через структуру MqlDateTime 2023.11.14 22:45:16.253 timeToStartMonth (EURUSD,M1) контрольная сумма - 12000769600080, время выполнения 1 иттерации = 1.90 наносекунд - Быстрый расчет 2023.11.14 22:45:16.471 timeToStartMonth (EURUSD,M1) контрольная сумма - 12000394543440, время выполнения 1 иттерации = 21746.60 наносекунд - Расчет через iBarShift 2023.11.14 22:45:16.471 timeToStartMonth (EURUSD,M1) ======================================================================== 2023.11.14 22:45:57.038 timeToStartMonth (EURUSD,M1) 60 ,120 ,180 ,240 ,300 ,360 ,600 ,720 ,900 ,1200 ,1800 ,3600 ,7200 ,10800 ,14400 ,21600 ,28800 ,43200 ,86400 ,604800 ,2592000 , 2023.11.14 22:45:57.038 timeToStartMonth (EURUSD,M1) =====LOOP=10000========STEPS=100000 seconds======PERIOD_H1======== 2023.11.14 22:45:57.038 timeToStartMonth (EURUSD,M1) контрольная сумма - 12000751999200, время выполнения 1 иттерации = 5.30 наносекунд - Расчет через структуру MqlDateTime 2023.11.14 22:45:57.038 timeToStartMonth (EURUSD,M1) контрольная сумма - 12000751999200, время выполнения 1 иттерации = 3.00 наносекунд - Быстрый расчет 2023.11.14 22:45:57.072 timeToStartMonth (EURUSD,M1) контрольная сумма - 12000378405600, время выполнения 1 иттерации = 3410.10 наносекунд - Расчет через iBarShift 2023.11.14 22:45:57.072 timeToStartMonth (EURUSD,M1) ======================================================================== Alain Verleyen 2023.11.15 04:40 #2360 Nikolai Semko # :本帖 中的测试只需将 getStartTimeOfBar() 与PeriodSeconds() 和 PeriodSecondsFast() 的工作进行比较即可比较应在除 MN1 之外的任何 TF 上进行性能提高约 2 倍。考虑到我们测量的是整个迭代,也许是 3 倍。还是比较这两个值就足够了 我可能遗漏了什么,但我使用了您的脚本来检查 PeriodSeconds(仅)。 附加的文件: __.mq5 13 kb 1...229230231232233234235236237238239240241242243...247 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
更快地实现标准 PeriodSeconds() 函数:
查看了格式。
可能不会更快。不过我听说过 switch 的惊人速度。
看了一下格式。
可能不会加快速度。不过,我听说了开关的神奇速度。
它看起来更长,但我没发现性能有什么不同。
所以我觉得还是单行版比较好。
看起来更长
现在将所有这些转换成矩阵和 ONX :-)
是的,你可以这么做。可读性更强。
,在我的笔记本电脑上性能是一样的。
fxsaber #:
顺便说一句,我之前的文章写错了。不知为什么,我以为一个月有 28 天,而不是 30 天。我不明白我怎么会这么想。
,我再也不能修改超过 1 小时的帖子了。
所以我的正确版本是这样的:
不过,没有人需要月份的秒数,因为月份的长度是不同的
顺便说一句,我之前的文章写错了。不知为什么,我以为一个月有 28 天,而不是 30 天。我不明白我怎么会有这种想法。
,我不能修改超过 1 小时的帖子。
所以我的正确版本如下:
不过没有人需要月份的秒数,因为月份的长度是不同的
你凭什么认为这比 PeriodSeconds(x) 更快?
本帖 中的测试
足以比较 getStartTimeOfBar() 与 PeriodSeconds() 和 PeriodSecondsFast() 的性能。
比较应在除 MN1 之外的任何 TF 上进行
性能提高了约 2 倍。考虑到我们测量的是整个迭代,也许是 3 倍。
还是比较这两个值就足够了
本帖 中的测试
只需将 getStartTimeOfBar() 与PeriodSeconds() 和 PeriodSecondsFast() 的工作进行比较即可
比较应在除 MN1 之外的任何 TF 上进行
性能提高约 2 倍。考虑到我们测量的是整个迭代,也许是 3 倍。
还是比较这两个值就足够了
我可能遗漏了什么,但我使用了您的脚本来检查 PeriodSeconds(仅)。