MT5コードプロファイラについて - ページ 5 1234567 新しいコメント Renat Fatkhullin 2021.09.10 08:03 #41 紛らわしいのは、2枚目のスレだけです。あとは、すべて揃っています。見てみよう fxsaber 2021.09.10 08:46 #42 Renat Fatkhullin #: 唯一の恥は、セカンドスリップ。あとは大丈夫です。 どうやら、数ミリ秒より速く走るコードの塊を高速化する目的には、プロファイラが向いていないようです。 fxsaber 2021.09.10 08:59 #43 #include <fxsaber\Usage\Usage.mqh> // https://www.mql5.com/ru/code/33875 const bool Init = EventSetMillisecondTimer(1); void Sleep2( uint Interval ) { const ulong StartTime = GetMicrosecondCount(); Interval *= 1000; while (GetMicrosecondCount() - StartTime < Interval) ; } #define Sleep Sleep2 void f() { Sleep(10); } void OnTimer() { _USAGE f(); Sleep(20); } EAは30msの間スリップしており、プロファイラでは13%もの間、3つの加算と2つの乗算を持つ関数に入っていたことがわかります そして、b2593が示すのは、このようなことです。 そこにはゼロがある!なぜなら、そこには確かにゼロがあるのだから。しかも、第2報では、すべてが明らかにされている。 悪態をつくのではなく、改善できるように整理しましょう。 fxsaber 2021.09.10 09:06 #44 fxsaber #: プロファイラを見ると、13%もの割合で、3つの加算と2つの乗算を 行う関数に含まれていたのだ! だから、プロファイリングで60%は「3回の加算と2回の乗算」で済むはずのEAが、OnTickのフルパスで平均3ms(計算と取引環境との連携でいっぱいいっぱい)かかるのはなぜだろうと思ったのである。このような簡潔な例を思いつきました。 MT5で古いプロファイラを使いたいのですが、ビルドでこういう踊りをさせないといけないんです。まだ実行できていません。 Ilyas 2021.09.10 11:12 #45 fxsaber #:プロファイラのデータの解釈を簡単な例で教えてください。すべてがナンセンスに見えてしまうのです。 Sleep(2)が完全に欠落しています。 なぜかUSAGEはSleep(1)の数倍も食っている。 本当にコツを掴もうとしているのですが、まだうまくいきません。 また、Sleepの交換も試しました。まだプロファイラの値が明確でない。 コールレポートの内容は? このコードは、スクリーンショットの報告とは一致しないような気がします。 プロファイラが動作している間にコードを修正したのではないのでしょうか? fxsaber 2021.09.10 11:37 #46 Ilyas #:コールレポートの中身は?与えられたコードとスクリーンショットのレポートが一致しない印象です。 プロファイラの実行中にコードを修正したのではありませんか? いいえ、そうではありません。 2021.09.10 11:46:48.616 MQL5 profiler 8064 total measurements, 0/0 errors, 2014 kb of stack memory analyzed (11256/1073741824) 2021.09.10 11:46:48.616 MQL5 profiler 49442 total function frames found (9141 mql5 code, 6461 built-in, 11590 other, 22250 system) fxsaber 2021.10.10 23:44 #47 プロファイラの結果を読み解くのに助けが必要です。 #include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006 void OnStart() { double Res = 0; const int Total = OrdersHistoryTotal(); for (int i = 0; i < Total; i++) if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) Res += OrderProfit(); } MQL Profiler Report - ୧MQL5┣゙Test19.mq5 機能 ライン CPU合計 比率 セルフCPU 比率 MT4ORDERS::GetHistoryPositionData 1093 7 50.00% 2 14.29% MT4ORDERS::Order.CloseTimeMsc = ::HistoryDealGetInteger(Ticket, DEAL_TIME_MSC)です。 1109 1 12.50% 1 50.00% } 1360 1 12.50% 1 50.00% return(Ticket && ((::HistoryOrderGetInteger(Ticket, ORDER_TICKET) == Ticket) |||) 824 2 25.00% 0 0.00% WHILE(_B2(MT4ORDERS::HistorySelectOrder(OrderTicket))) // https://www.mql5.com/ru/forum/304239#comment_10710403 1151 1 12.50% 0 0.00% StartTime = ::GetMicrosecondCount()です。 1370 1 12.50% 0 0.00% double OrderPriceOpen = ::HistoryOrderGetDouble(OrderTicket, ORDER_PRICE_OPEN) 1182 1 12.50% 0 0.00% MT4ORDERS::Order.TicketID = ::HistoryDealGetInteger(MT4ORDERS::Order.Ticket, DEAL_POSITION_ID)とします。 1096 1 12.50% 0 0.00% CHashMap<ulong,ulong>::Resize 514 1 7.14% 1 7.14% m_entries[i].next = m_buckets[bucket]; 526 1 12.50% 1 100.00% ArrayFill(m_buckets,0,new_size,-1); 518 7 87.50% 0 0.00% グローバル初期化 1 7.14% 1 7.14% クラス MT4HISTORY 428 1 50.00% 1 100.00% static constool MT4ORDERS::IsTester = ::MQLInfoInteger(MQL_TESTER); 2496 1 50.00% 0 0.00% MT4HISTORY::RefreshHistory(ヒストリーの更新 588 6 42.86% 0 0.00% this.Tickets[this.Amount - 1] = (long)TicketDeal; 626 2 28.57% 0 0.00% if (_B2(::HistorySelect(0, INT_MAX))) 590 3 42.86% 0 0.00% ::HistoryDealGetInteger((TicketDeal = ::HistoryDealGetTicket(this.LastTotalDeals)), DEAL_TIME_MSC) : LONG_MAX.LONG_MAX.LONG_MAX.LONG_MAX.LONG_MAX; 636 1 14.29% 0 0.00% return(!::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID) || (::HistoryOrderGetDouble(Ticket, ORDER_VOLUME_CURRENT) &&) 660 1 14.29% 0 0.00% CHashMap<ulong,ulong>::Add 294 1 7.14% 0 0.00% リサイズ(new_size); 600 1 50.00% 0 0.00% if((候補%divisor)==0)) 40 1 50.00% 0 0.00% オンスタート 3 13 92.86% 0 0.00% _B2(this.RefreshHistory())。 763 6 40.00% 0 0.00% _BV2(MT4ORDERS::GetHistoryPositionData(Ticket))です。 1872 7 46.67% 0 0.00% return(_B2(MT4ORDERS::MT4OrderSelect(Index, Select, Pool)); 2588 2 13.33% 0 0.00% MQL Profiler Report - ୧MQL5┣゙Test19.mq5 機能 ライン CPU合計 比率 セルフCPU 比率 HistoryOrderGetInteger 3 21.43% 3 21.43% WHILE(_B2(MT4ORDERS::HistorySelectOrder(OrderTicket))) // https://www.mql5.com/ru/forum/304239#comment_10710403 1151 1 7.14% 3 21.43% return(Ticket && ((::HistoryOrderGetInteger(Ticket, ORDER_TICKET) == Ticket) |||) 824 2 14.29% 3 21.43% ヒストリーセレクト 3 21.43% 3 21.43% if (_B2(::HistorySelect(0, INT_MAX))) 590 3 21.43% 3 21.43% HistoryOrderGetDouble 2 14.29% 2 14.29% double OrderPriceOpen = ::HistoryOrderGetDouble(OrderTicket, ORDER_PRICE_OPEN) 1182 1 7.14% 2 14.29% return(!::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID) || (::HistoryOrderGetDouble(Ticket, ORDER_VOLUME_CURRENT) &&) 660 1 7.14% 2 14.29% MT4ORDERS::GetHistoryPositionData 1093 7 50.00% 2 14.29% _BV2(MT4ORDERS::GetHistoryPositionData(Ticket))です。 1872 7 50.00% 2 14.29% GetMicrosecondCount 1 7.14% 1 7.14% StartTime = ::GetMicrosecondCount()です。 1370 1 7.14% 1 7.14% CHashMap<ulong,ulong>::Resize 514 1 7.14% 1 7.14% リサイズ(new_size); 600 1 7.14% 1 7.14% HistoryDealGetInteger 1 7.14% 1 7.14% ::HistoryDealGetInteger((TicketDeal = ::HistoryDealGetTicket(this.LastTotalDeals)), DEAL_TIME_MSC) : LONG_MAX.LONG_MAX.LONG_MAX.LONG_MAX.LONG_MAX; 636 1 7.14% 1 7.14% グローバル初期化 1 7.14% 1 7.14% CHashMap<ulong,ulong>::追加 294 1 7.14% 0 0.00% this.Tickets[this.Amount - 1] = (long)TicketDeal; 626 1 7.14% 0 0.00% void OnStart() 3 13 92.86% 0 0.00% MT4HISTORY::RefreshHistory(ヒストリーの更新 588 6 42.86% 0 0.00% _B2(this.RefreshHistory())。 763 6 42.86% 0 0.00% About the MT5 code An effective trading strategy Functions for reading deal Andrey Khatimlianskii 2021.10.11 01:15 #48 fxsaber #:プロファイラの結果を読み解くのにお役立てください。 何が明確でないのか? 私は通常、CPUの合計でソートし、全体的に最もプログラムを遅くするものを確認します。役に立つことがあります。 履歴に5700件の注文があるのですが、最初に実行するとほとんど白紙のレポートが表示され、その後、このようなものが表示されます。 HistoryDealGetInteger(全コールで36%)、HistorySelect(27%)が最も多く食われています。次にHistoryOrderGetInteger(18%)、global_initialization(9%)と続く。 残りの10%は、残りのコードに費やしました。 でも、そんな高速な1回の実行中に結果を見るのは意味がない、イミフ。 fxsaber 2021.10.11 05:39 #49 Andrey Khatimlianskii #:何が明確でないのか? 解釈の問題。何が、どこで、どのように減速しているのか、理解できていない。 私は通常、CPUの合計でソートし、全体的に最もプログラムを遅くしているものを確認します。役に立つことがあります。 履歴に5700件の注文がある初動でほぼ白紙のレポートが出たのに、この有様です。 HistoryDealGetInteger(全コールで36%)、HistorySelect(27%)が最も多く食われています。次にHistoryOrderGetInteger(18%)、global_initialization(9%)と続く。 残りの10%は残りのコードに回しました。 詳しいご回答をありがとうございました。ただ、45%-stringsとそれ以外が考慮されていないのが理解できないのですが? fxsaber 2021.10.11 05:46 #50 Andrey Khatimlianskii #:でも、こんな素早いシングルで結果を見ても意味がない、イミフ。 長い歴史の中で20倍の繰り返しを追加しました。 29.41%(理由は不明)は、returnの後に閉じ括弧があるため。解釈が難しいですね。 1234567 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
唯一の恥は、セカンドスリップ。あとは大丈夫です。
どうやら、数ミリ秒より速く走るコードの塊を高速化する目的には、プロファイラが向いていないようです。
EAは30msの間スリップしており、プロファイラでは13%もの間、3つの加算と2つの乗算を持つ関数に入っていたことがわかります
そして、b2593が示すのは、このようなことです。
そこにはゼロがある!なぜなら、そこには確かにゼロがあるのだから。しかも、第2報では、すべてが明らかにされている。
悪態をつくのではなく、改善できるように整理しましょう。
プロファイラを見ると、13%もの割合で、3つの加算と2つの乗算を 行う関数に含まれていたのだ!
だから、プロファイリングで60%は「3回の加算と2回の乗算」で済むはずのEAが、OnTickのフルパスで平均3ms(計算と取引環境との連携でいっぱいいっぱい)かかるのはなぜだろうと思ったのである。このような簡潔な例を思いつきました。
MT5で古いプロファイラを使いたいのですが、ビルドでこういう踊りをさせないといけないんです。まだ実行できていません。
プロファイラのデータの解釈を簡単な例で教えてください。
すべてがナンセンスに見えてしまうのです。
本当にコツを掴もうとしているのですが、まだうまくいきません。
また、Sleepの交換も試しました。
まだプロファイラの値が明確でない。
コールレポートの内容は?
このコードは、スクリーンショットの報告とは一致しないような気がします。
プロファイラが動作している間にコードを修正したのではないのでしょうか?
コールレポートの中身は?
与えられたコードとスクリーンショットのレポートが一致しない印象です。
プロファイラの実行中にコードを修正したのではありませんか?
いいえ、そうではありません。
プロファイラの結果を読み解くのに助けが必要です。
プロファイラの結果を読み解くのにお役立てください。
何が明確でないのか?
私は通常、CPUの合計でソートし、全体的に最もプログラムを遅くするものを確認します。役に立つことがあります。
履歴に5700件の注文があるのですが、最初に実行するとほとんど白紙のレポートが表示され、その後、このようなものが表示されます。
HistoryDealGetInteger(全コールで36%)、HistorySelect(27%)が最も多く食われています。次にHistoryOrderGetInteger(18%)、global_initialization(9%)と続く。
残りの10%は、残りのコードに費やしました。
でも、そんな高速な1回の実行中に結果を見るのは意味がない、イミフ。
何が明確でないのか?
解釈の問題。何が、どこで、どのように減速しているのか、理解できていない。
私は通常、CPUの合計でソートし、全体的に最もプログラムを遅くしているものを確認します。役に立つことがあります。
履歴に5700件の注文がある初動でほぼ白紙のレポートが出たのに、この有様です。
HistoryDealGetInteger(全コールで36%)、HistorySelect(27%)が最も多く食われています。次にHistoryOrderGetInteger(18%)、global_initialization(9%)と続く。
残りの10%は残りのコードに回しました。
詳しいご回答をありがとうございました。ただ、45%-stringsとそれ以外が考慮されていないのが理解できないのですが?
でも、こんな素早いシングルで結果を見ても意味がない、イミフ。
長い歴史の中で20倍の繰り返しを追加しました。
29.41%(理由は不明)は、returnの後に閉じ括弧があるため。解釈が難しいですね。