mql5言語の特徴、微妙なニュアンスとテクニック - ページ 236 1...229230231232233234235236237238239240241242243...247 新しいコメント Nikolai Semko 2023.11.14 20: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 21: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 21: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; } だから、やはり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 21: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 21:44 #2355 そして今、このすべてを行列とONXに変換する :-) Nikolai Semko 2023.11.14 21:59 #2356 fxsaber #: そうだね。、僕のラップトップでのパフォーマンスは変わらない。 Nikolai Semko 2023.11.14 22: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]); } ところで、私は以前の投稿で間違っていた。なぜか1ヶ月は30日ではなく28日だと思っていた。 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 04:29 #2358 Nikolai Semko # :ところで、私は以前の投稿で間違っていた。なぜか1ヶ月は30日ではなく28日だと思っていた。 1時間以上前の投稿は修正できません。というわけで、私の正しいバージョンは以下の通りです:月の長さが違うので、月の秒数は誰も必要としないが。 なぜこれがPeriodSeconds(x)より速いと思うのですか? Nikolai Semko 2023.11.15 04:36 #2359 Alain Verleyen #: なぜこれがPeriodSeconds(x)より速いと思うのか? この記事の テストgetStartTimeOfBar()とPeriodSeconds() および PeriodSecondsFast()のパフォーマンスを比較するのに十分です。比較は、MN1以外のどのTFでも行う必要がある。パフォーマンスは約2倍高くなる。全反復を測定することを考慮すると、3倍かもしれない。それとも、この2つの値を比較すれば十分なのだろうか?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 05:40 #2360 Nikolai Semko # :この記事の テストgetStartTimeOfBar()の動作をPeriodSeconds() と PeriodSecondsFast()で比較すれば十分です。比較は、MN1以外のどのTFでも行う必要がある。パフォーマンスは約2倍高くなる。全反復を測定することを考慮すると、3倍かもしれない。それとも、この2つの値を比較すれば十分なのだろうか? 私は何かを見逃しているかもしれませんが、私はPeriodSeconds(のみ)をチェックするためにあなたのスクリプトを使用しました。 ファイル: __.mq5 13 kb 1...229230231232233234235236237238239240241242243...247 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
標準のPeriodSeconds()関数の高速な実装:
フォーマットを見てみた。
おそらく速くはないだろう。しかし、switchの驚異的なスピードについては聞いたことがある。
フォーマットを見てみた。
おそらくスピードアップはできないだろう。スイッチの奇跡的なスピードについては聞いたことがある。
見た目は長くなったが、パフォーマンスの違いは感じなかった。
だから、やはり1行バージョンが望ましいと思う。
長く見える
そして今、このすべてを行列とONXに変換する :-)
そうだね。
、僕のラップトップでのパフォーマンスは変わらない。
fxsaber #:
ところで、私は以前の投稿で間違っていた。なぜか1ヶ月は30日ではなく28日だと思っていた。
1時間以上前の投稿はもう修正できない。
だから、私の正しいバージョンはこうだ:
月の長さが違うので、月の秒数は誰も必要としないが。
ところで、私は以前の投稿で間違っていた。なぜか1ヶ月は30日ではなく28日だと思っていた。
1時間以上前の投稿は修正できません。
というわけで、私の正しいバージョンは以下の通りです:
月の長さが違うので、月の秒数は誰も必要としないが。
なぜこれがPeriodSeconds(x)より速いと思うのか?
この記事の テスト
getStartTimeOfBar()とPeriodSeconds() および PeriodSecondsFast()のパフォーマンスを比較するのに十分です。
比較は、MN1以外のどのTFでも行う必要がある。
パフォーマンスは約2倍高くなる。全反復を測定することを考慮すると、3倍かもしれない。
それとも、この2つの値を比較すれば十分なのだろうか?
この記事の テスト
getStartTimeOfBar()の動作をPeriodSeconds() と PeriodSecondsFast()で比較すれば十分です。
比較は、MN1以外のどのTFでも行う必要がある。
パフォーマンスは約2倍高くなる。全反復を測定することを考慮すると、3倍かもしれない。
それとも、この2つの値を比較すれば十分なのだろうか?
私は何かを見逃しているかもしれませんが、私はPeriodSeconds(のみ)をチェックするためにあなたのスクリプトを使用しました。