MT5とスピードの関係 - ページ 46

 
Renat Fatkhullin:

ミリ秒タイマーは昔からある: EventSetMillisecondTimer()

完全に蚊帳の外ですね。OnTickで2つのポジションをオープンする必要があるとします。最初のOrderSendは数ミリ秒です。その後、スナップショットを作成する必要があります。そして、2回目のOrderSendが呼び出されるはずです。

OnTickのみ数百ミリ秒の実行が可能です。そして、OnTimerのスナップショットを提案されていますね。

 
Renat Fatkhullin:

また、測光ライブラリ自体にも問題があります。オーバーヘッドをはじめ、不要なものがたくさんあります。

スタジオで言い争い!?

 
Renat Fatkhullin:

以下は私のコードと安定したランタイムです:20個のグラフを並列に並べても数百、数千マイクロ秒の誤差はありません。

コア数とプロセッサーの種類は?i7-2600?

8コア

2020.10.06 02:27:59.464 Terminal        MetaTrader 5 x64 build 2630 started for MetaQuotes Software Corp.
2020.10.06 02:27:59.465 Terminal        Windows 10 build 19042, Intel Core i7-2700 K  @ 3.50 GHz, 7 / 15 Gb memory, 19 / 29 Gb disk, IE 11, Admin, GMT+3

数百万のリクエストを並行して行う、隠れたストレステストを再度実施?

コンバットアドバイザーは何度も言ったでしょう。通話回数をできる限り少なくした。理論上は(測定していませんが)OnTickあたり最大10コールです。


より透明性を高める。単純な_Bコールを数回掲載しただけで、他の主張の証拠にはなりません。突拍子もない主張をした途端、コードや実際の条件の説明を急に忘れるんですね。

頭の中で何も想像する必要はありません。実際に電話をかけてテストしたことを伝え、見せてください。未知のストレステストを実行し、世界に示すアラートを待つ」という破廉恥な結果ではなく、まさにテストの全コードを表示します。

ライブEAでの結果を公開しています。そこには、WinAPIを含む70個のmqhファイルがあります。口先だけでなく、本当に理解してくれるなら、ソースコードを差し上げます。かなり早くブレーキが再現されますよ。

 
fxsaber:

完全に蚊帳の外ですね。例えば、OnTickで2つのポジションを開く必要があるとします。最初のOrderSendは数ミリ秒です。その後、スナップショットを作成する必要があります。そして、2回目のOrderSendが呼び出されるはずです。

OnTickのみ数百ミリ秒の実行が可能です。そして、OnTimerのスナップショットを提案されていますね。

私はスナップを勧めているのではなく、ミリ秒タイマーについての 直接的な質問に答えたのです。

現在のテスターでは1秒後にトリガーされたままですが、それはあります。私たちが書いている新しいテスターでは、これを変更しようと思っています。
 
fxsaber:

8コア

何度もコンバットアドバイザーと言った。通話回数をできる限り少なくした。理論上は(測定していませんが)OnTickあたり最大10コールです。


Expert Advisorの結果を公表しています。そこには、WinAPIを含む70個のmqhファイルがあります。口先だけでなく、本当に理解してくれるなら、ソースコードを渡しますよ。ブレーキはすぐに弾けるようになりますよ。

何とかするから、ソースコードをくれ。
 
fxsaber:

テーブルの上の議論!

あなたのベンチマーク 全体はゴミで溢れかえっていますが、実はここにクリーンで理解しやすい(あなたのごちゃごちゃしたコードと違って)バージョンがあります。


//--- benchmark macros
#define _B(_function,_alert_interval)               \
          {                                         \
           ulong _latency=GetMicrosecondCount();    \
           _function;                               \
           _latency=GetMicrosecondCount()-_latency; \
           if(_latency > _alert_interval)           \
              ::Alert("Time[" + __FILE__ + " " + (string)__LINE__ + " in " + __FUNCTION__+ ": " + #_function + "] = " + (string)_latency + " mсs"); \
          }



//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   MqlTick Tick;
   
   _B(SymbolInfoTick(_Symbol,Tick),0);
   _B(SymbolInfoTick(_Symbol,Tick),0);
  }

あなたの悩みは何ですか。

  1. ふちょうコード

  2. オーバーヘッドが多いクラスへのバインディング

  3. 50個の結果をスタックに格納するコスト
      static bool Set( const string Str )
      {
        if (BENCHMARK::Amount == BENCHMARK::ReserveSize)
          BENCHMARK::ReserveSize = ::ArrayResize(BENCHMARK::Bench, BENCHMARK::ReserveSize + BENCHMARK_RESERVE);
    
        BENCHMARK::Bench[BENCHMARK::Amount++].Set(Str);
    
        return(true);
      }
    
  4. taking results - one solid overhead and rubbish in object bindings
      static ulong Get( const uint AlertInterval = 0 )
      {
        const int Pos = BENCHMARK::Amount - 1;
        const ulong Res = (Pos < 0) ? 0 : BENCHMARK::Bench[Pos].Get();
    
        if (Pos >= 0)
        {
          if (AlertInterval && (Res > AlertInterval))
            ::Alert("Time[" + BENCHMARK::Bench[Pos].Str + "] = " + (string)Res + " mсs.");
    
          BENCHMARK::Amount = Pos;
        }
    
        return(Res);
      }
    


テスト用のコード最適 化を無効にしていないでしょうか?

metaeditor.iniのグローバルパラメータOptimize= 0のことです。

 
Renat Fatkhullin:

あなたのベンチマーク 全体はゴミで溢れかえっていますが、実はここにクリーンで理解しやすい(あなたの乱雑なコードとは対照的な)バージョンがあります。

あなたのバージョンは、残念ながら、利便性を理解するための初期段階です。便利なのは、こんな風にできるときです。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

ライブラリ: ベンチマーク

fxsaber, 2020.10.01 23:49

今度は、標準バリエーションでどこにヒケがあるのかを探ってみます。ソースコードにいくつかのシンボルを追加します。

    for (long Chart = _B2(::ChartFirst()); (Chart != -1) && !Res; Chart = _B2(::ChartNext(Chart)))
      Res = (Chart != chartID) && _B2(::ChartGetInteger(Chart, CHART_IS_MAXIMIZED));

そして、すぐにその理由がわかる。

2020.10.02 00:45:14.113 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 878 mсs.
2020.10.02 00:45:14.114 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 943 mсs.
2020.10.02 00:45:14.114 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 297 mсs.
2020.10.02 00:45:14.116 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 1787 mсs.
2020.10.02 00:45:14.116 Alert: Time[Test9.mq5 35 in IsInvisible: ::ChartNext(Chart)] = 2 mсs.
2020.10.02 00:45:14.117 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 980 mсs.
2020.10.02 00:45:14.117 Alert: Time[Test9.mq5 35 in IsInvisible: ::ChartNext(Chart)] = 2 mсs.
2020.10.02 00:45:14.117 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 59 mсs.
2020.10.02 00:45:14.118 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 803 mсs.
2020.10.02 00:45:14.119 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 1059 mсs.

CHART_IS_MAXIMIZED は、他人のチャートでは遅すぎる。バグレポートが出来上がりました図書館と一緒でとても楽でした。


何が問題なのか。

  1. ふちょうコード

  2. 鳶職

  3. stack storage cost of 50 results
  4. 結果を得る - 1つの大規模なオーバーヘッドとオブジェクトバインディングのゴミ

使い勝手の良さは、わずかなオーバーヘッドを凌駕しています。実装方法をよく見ると悲惨なことになってる。例えば、ArrayResizeはオーバーヘッドであるため、その使用は最小限にとどめています。

テスト用のコード最適 化を無効にしていないでしょうか?

metaeditor.iniのグローバルパラメータOptimize= 0のことです。

スローモードには興味がない。アルゴリズムの最適化、コンパイラの最適化にももちろん気を配りながら、戦闘EAのパフォーマンスを見ています。

 
Renat Fatkhullin:

あなたのベンチマーク 全体はゴミで溢れかえっていますが、実はここにクリーンで理解しやすい(あなたのごちゃごちゃしたコードと違って)バージョンがあります。

何が問題なんだ。

  1. ふちょうコード

  2. オーバーヘッドの多いクラスとのタイアップ

  3. stack storage cost of 50 results
  4. 結果の取得 - 巨大なオーバーヘッドとオブジェクトバインディングのゴミ


テスト用のコード最適 化を無効にしていないでしょうか?

metaeditor.iniのグローバルパラメータOptimize= 0のことです。

ここではC-styleで、シンプルで本当にゴミが出ないようになっています。例を挙げていただきありがとうございます。


この接頭辞は、ライブラリやプログラムなどの開発者が使うからです。
また、重複しないように、使わない方がいいとC言語の先生が言ってました。

mql5では、自分の名前と重ねることは可能なのでしょうか?
それとも、カスタム名はMQ名から完全に遮蔽されているのでしょうか?

 
Roman:

あるC言語の先生は、ユーザー名にアンダースコア_Bを使わないことを推奨していました。
、この接頭辞はライブラリやソフトウェアなどの開発者が使うからです。
また、重複を避けるために、使わないことを推奨していました。

C言語では、"_"で始まる名前は、サービス名、システム名、特殊名として使用されます。この場合、許されると思います。この機能は、コードの保守・検討に使用されるため。

 
Edgar Akhmadeev:

で始まる名前は、C言語ではサービス名、システム名、特殊名として使われます。この場合は-許容範囲内だと思います。この機能は、コードの保守・検討に使用されるため。

そこがポイントで、mql5以外にも、開発者用のMQサービス名があるのです。