MT5コードプロファイラについて - ページ 2 1234567 新しいコメント Alain Verleyen 2021.07.13 17:44 #11 Ilyas :スクリーンショットは、SymbolInfoTick関数ではなく、呼び出し文字列の統計情報を表示しています。与えられた文字列は、一旦文字列で正確に「停止」し、SymbolInfoTickの呼び出し前または直後に、SymbolInfoTickからの戻り文字列として209回、合計210回計測されました 申し訳ないが、はっきりしない。 プロファイラの概要にはこうあります。 SymbolInfoTick() 総 CPU 数:209 (0.83%) コード自体にはこう書いてある。 SymbolInfoTick () 総 CPU 数:210 (2.57%) SymbolInfoTick () は、コード内で1回だけ発生します。この異なる価値観が何であるかは、まったくもって不明である。なるほど、209対210は、そのラインで1本「止めた」からだと(私には意味不明ですが、あまり関係ないのでしょうね)。 パーセントはどうでしょうか? 0 2021.07.10 11:52:19.032 MQL5プロファイラ 合計測定値 25039、0/0エラー、99MBスタックメモリは、(92872/1073741824)分析した。 つまり、209(0.83%)は100%=25039を意味する。よっしゃー しかし、210(2.57%)ということは、100%=8171 なのか!?Total CPUの8171とは何ですか? About the MT5 code リバーシング: エントリポイントを形式化し、裁量トレードアルゴリズムを開発する バランスグラフを使用した戦略の最適化と、結果の「バランス+最大シャープレシオ」基準との比較 Alain Verleyen 2021.07.13 17:52 #12 Alain Verleyen : これはどうでしょう(投稿1番)。 ご覧のように、SymbolInfoTick()が一番難しい部分として表示されています。どちらが不正解か。これは以下の投稿と同じコードです(SymbolInfoTickがTotal CPU = 209 (0.83%) と表示されていますが、これは正しいです)。違いは、SymbolInfoTick () が Total CPU = 1 となる行をコメントアウトしていることです。このわずかな変更で総実行時間(過去のデータによる)は変わりませんでしたが、プロファイラの結果は違っていました。 確認したい場合は、非公開でコードを提供します。 О профилировщике кода MT5 2021.07.09www.mql5.com Я начал использовать новый профайлер. В этом разделе мы могли бы централизовать информацию о том, как его правильно использовать... Ilyas 2021.07.14 10:19 #13 Alain Verleyen:申し訳ないが、はっきりしない。プロファイラの概要にはこうあります。SymbolInfoTick() 総 CPU 数:209 (0.83%)コード自体にはこう書いてある。SymbolInfoTick () 総 CPU 数:210 (2.57%)SymbolInfoTick () は、コード内で1回だけ発生します。この異なる価値観が何であるかは、まったくもって不明である。なるほど、209対210は、そのラインで1本「止めた」からだと(私には意味不明ですが、あまり関係ないのでしょうね)。パーセントはどうでしょうか? 0 2021.07.10 11:52:19.032 MQL5プロファイラ 合計測定値 25039、0/0エラー、99MBスタックメモリは、(92872/1073741824)分析した。 つまり、209(0.83%)は100%=25039を意味する。よっしゃーしかし、210(2.57%)ということは、100%=8171 なのか!?Total CPUの8171とは何ですか? あなたは、「コード行」と「関数」の統計を比較しています コード行があります。 if (! SymbolInfoTick (symbolф,tickф)) // Total CPU : 210 (2.57%) Self CPU : 1 (1.49%) このコードの行が統計に載ったのは合計210回。 SymbolInfoTickが呼び出されるコードラインとして209回目 演算子として1回 SymbolInfoTickという関数があり、この関数が209回統計にヒットしています。 この関数はこの行からしか呼ばれないので、もしかしたらカウンターと混同してしまったのかもしれません 数字については、 。 つまり、209(0.83%)は100%=25039を意味する。OK 209 / 0.83 * 100 = 25180 となります。 しかし、210(2.57%)ということは、100%=8171 なのか!?Total CPUの8171とは何ですか? 25039個の測定値のうち、8171個がSymbolInfoTickを呼び出したコードラインから得られたものです。 Ilyas 2021.07.14 10:37 #14 Alain Verleyen: バックテスト。 2021.07.10 08:00: 37.101 Core 01 EURUSD, H1: 230861 ticks, 998 bars generated.テストは、0に渡されます:03:09.367(ダニの前処理を含む0:00:00.515)。 SymbolInfoTick()の実行時間をGetMicrosecondCount()を使って計測するコードを追加しました。 ulong start= GetMicrosecondCount (); //--- Get tick information if (! SymbolInfoTick (symbol,tick)) return ( false ); BENCH += GetMicrosecondCount ()-start; 結果 2021.07.10 08:00: 37.101 Core 01 2021.05.30 23:59:59 Total = 1209572 Executed = 836973 in661874 microseconds このように、SymbolInfoTick()は、3分9秒のヒストリカルデータで合計661ミリ秒かかっているのです。しかし、プロファイラを見ると、74.71%の測定値を使用していることがわかります。これがどの程度正確で有用なのか、私には理解できない。 はっきりさせておきますが、テストはMQLコードの実行だけではありません。プロファイラは、統計情報を取得することで、実行速度を少し落とします。 。 とはいえ、レポート中の74.71%はMQLコードに対する数字であり、テスト全般の数字ではありません。 Alain Verleyen 2021.07.14 20:33 #15 こんにちは、@Ilyas です。 ありがとうございます。ご回答いただいた内容で再度確認し、ご報告させていただきます。 Ilyas 2021.07.15 09:16 #16 Ilyas:... 数字については、 。 209 / 0.83 * 100 = 25180 となります。25039個の測定値のうち、8171個がSymbolInfoTickを呼び出したコードラインから得られたものです。 数字を間違えてしまった。 実際、209は25039の0.83469%であり、これを四捨五入すると0.83となる 8171個のサンプルがSymbolInfoTickが 210回呼ばれたラインで採取されており、これは2.57%に相当します。 Alain Verleyen 2021.07.15 12:40 #17 Ilyas :数字を間違えてしまった。確かに209は25039の0.83469%で四捨五入すると0.83 8171回の実行は、SymbolInfoTickを呼び出す 行が210回実行されたプログラム実行の分岐で、これは2.57%である。 OnTimer()からの実行なので、なぜ8171なのかよくわからない?OnTimer()のTotal CPUが29683と表示された場合。 Ilyas 2021.07.15 12:58 #18 Alain Verleyen: OnTimer()からの実行なので、なぜ8171なのかよくわからない?OnTimer()のTotal CPUが29683と表示された場合。 コードを提供してください、私はカウンターの動作を再確認します Alain Verleyen 2021.07.15 15:06 #19 Ilyas :コードを提供してください、私はカウンターの動作を再確認します 時間ができ次第、プライベートで行う予定です。ありがとうございます。 Andrey Khatimlianskii 2021.07.28 15:23 #20 Ilyas: イリヤス、この件も解決してくれ。 1.なぜ空の関数呼び出しがセルフのCPUの34.5%を消費することがあるのか?同時に、それに続く関数の呼び出しは、その内部で総CPUの38.16%を占めていますが、レポートには全く表示されないのですね。 ファンクションコードです。 2.この例では、TimeCurrent()の行が関数内だけでなく、プログラム全般で不当に長い時間を要していることが2つ目の問題点として示されています。 CheckTimeSeries()の本体をコメントアウトする前は、そのTimeCurrent()の行に主な負荷がかかっていたのです。 そんなに重い機能なんですか?何に置き換えたらいいのか?あるいは、経済的な方法(プログラム実行の1ループ内でのキャッシング)は? できる限り、計算を間引いて保存しています(1小節に1回、X秒に1回、Yミリ秒に1回、など)。しかし、計算を行うかどうかのチェック自体が、かなりリソースを消費することが判明しました。 ありがとうございました。 1234567 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
スクリーンショットは、SymbolInfoTick関数ではなく、呼び出し文字列の統計情報を表示しています。
与えられた文字列は、一旦文字列で正確に「停止」し、SymbolInfoTickの呼び出し前または直後に、SymbolInfoTickからの戻り文字列として209回、合計210回計測されました
申し訳ないが、はっきりしない。
プロファイラの概要にはこうあります。
SymbolInfoTick() 総 CPU 数:209 (0.83%)
コード自体にはこう書いてある。
SymbolInfoTick () 総 CPU 数:210 (2.57%)
SymbolInfoTick () は、コード内で1回だけ発生します。この異なる価値観が何であるかは、まったくもって不明である。なるほど、209対210は、そのラインで1本「止めた」からだと(私には意味不明ですが、あまり関係ないのでしょうね)。
パーセントはどうでしょうか?
0 2021.07.10 11:52:19.032 MQL5プロファイラ 合計測定値 25039、0/0エラー、99MBスタックメモリは、(92872/1073741824)分析した。
つまり、209(0.83%)は100%=25039を意味する。よっしゃー
しかし、210(2.57%)ということは、100%=8171 なのか!?Total CPUの8171とは何ですか?
これはどうでしょう(投稿1番)。
ご覧のように、SymbolInfoTick()が一番難しい部分として表示されています。どちらが不正解か。これは以下の投稿と同じコードです(SymbolInfoTickがTotal CPU = 209 (0.83%) と表示されていますが、これは正しいです)。違いは、SymbolInfoTick () が Total CPU = 1 となる行をコメントアウトしていることです。このわずかな変更で総実行時間(過去のデータによる)は変わりませんでしたが、プロファイラの結果は違っていました。
確認したい場合は、非公開でコードを提供します。
申し訳ないが、はっきりしない。
プロファイラの概要にはこうあります。
SymbolInfoTick() 総 CPU 数:209 (0.83%)
コード自体にはこう書いてある。
SymbolInfoTick () 総 CPU 数:210 (2.57%)
SymbolInfoTick () は、コード内で1回だけ発生します。この異なる価値観が何であるかは、まったくもって不明である。なるほど、209対210は、そのラインで1本「止めた」からだと(私には意味不明ですが、あまり関係ないのでしょうね)。
パーセントはどうでしょうか?
0 2021.07.10 11:52:19.032 MQL5プロファイラ 合計測定値 25039、0/0エラー、99MBスタックメモリは、(92872/1073741824)分析した。
つまり、209(0.83%)は100%=25039を意味する。よっしゃー
しかし、210(2.57%)ということは、100%=8171 なのか!?Total CPUの8171とは何ですか?
あなたは、「コード行」と「関数」の統計を比較しています
コード行があります。
このコードの行が統計に載ったのは合計210回。
SymbolInfoTickという関数があり、この関数が209回統計にヒットしています。
この関数はこの行からしか呼ばれないので、もしかしたらカウンターと混同してしまったのかもしれません
数字については、
。
209 / 0.83 * 100 = 25180 となります。
しかし、210(2.57%)ということは、100%=8171 なのか!?Total CPUの8171とは何ですか?
25039個の測定値のうち、8171個がSymbolInfoTickを呼び出したコードラインから得られたものです。
Alain Verleyen:
バックテスト。
2021.07.10 08:00: 37.101 Core 01 EURUSD, H1: 230861 ticks, 998 bars generated.テストは、0に渡されます:03:09.367(ダニの前処理を含む0:00:00.515)。
SymbolInfoTick()の実行時間をGetMicrosecondCount()を使って計測するコードを追加しました。
結果
2021.07.10 08:00: 37.101 Core 01 2021.05.30 23:59:59 Total = 1209572 Executed = 836973 in661874 microseconds
このように、SymbolInfoTick()は、3分9秒のヒストリカルデータで合計661ミリ秒かかっているのです。しかし、プロファイラを見ると、74.71%の測定値を使用していることがわかります。これがどの程度正確で有用なのか、私には理解できない。
はっきりさせておきますが、テストはMQLコードの実行だけではありません。プロファイラは、統計情報を取得することで、実行速度を少し落とします。
。
とはいえ、レポート中の74.71%はMQLコードに対する数字であり、テスト全般の数字ではありません。
こんにちは、@Ilyas です。
ありがとうございます。ご回答いただいた内容で再度確認し、ご報告させていただきます。
数字については、
。
209 / 0.83 * 100 = 25180 となります。
25039個の測定値のうち、8171個がSymbolInfoTickを呼び出したコードラインから得られたものです。
数字を間違えてしまった。
実際、209は25039の0.83469%であり、これを四捨五入すると0.83となる
8171個のサンプルがSymbolInfoTickが 210回呼ばれたラインで採取されており、これは2.57%に相当します。
数字を間違えてしまった。
確かに209は25039の0.83469%で四捨五入すると0.83
8171回の実行は、SymbolInfoTickを呼び出す 行が210回実行されたプログラム実行の分岐で、これは2.57%である。
OnTimer()からの実行なので、なぜ8171なのかよくわからない?OnTimer()のTotal CPUが29683と表示された場合。
コードを提供してください、私はカウンターの動作を再確認します
コードを提供してください、私はカウンターの動作を再確認します
イリヤス、この件も解決してくれ。
1.なぜ空の関数呼び出しがセルフのCPUの34.5%を消費することがあるのか?同時に、それに続く関数の呼び出しは、その内部で総CPUの38.16%を占めていますが、レポートには全く表示されないのですね。
ファンクションコードです。
2.この例では、TimeCurrent()の行が関数内だけでなく、プログラム全般で不当に長い時間を要していることが2つ目の問題点として示されています。
CheckTimeSeries()の本体をコメントアウトする前は、そのTimeCurrent()の行に主な負荷がかかっていたのです。
そんなに重い機能なんですか?何に置き換えたらいいのか?あるいは、経済的な方法(プログラム実行の1ループ内でのキャッシング)は?
できる限り、計算を間引いて保存しています(1小節に1回、X秒に1回、Yミリ秒に1回、など)。しかし、計算を行うかどうかのチェック自体が、かなりリソースを消費することが判明しました。
ありがとうございました。