記事"MQL5とQLUAの比較ーなぜMQL5での取引操作は28倍速いのか?"についてのディスカッション - ページ 2

 
Rashid Umarov:
コードは提供されているので、誰でも自分でチェックし、結論が妥当かどうかを確認することができる。ここに問題はない。

私のコード

sinput int Interval = 30; // インターバル(秒

class BENCH
{
protected:
  MqlTick FirstTick;
  int Count;
  ulong StartTime;

  int GetAmountTicks( const ulong From = 0, const int Amount = 10000 ) const
  {
    MqlTick Ticks[];

    return(::CopyTicks(this.symbol, Ticks, COPY_TICKS_ALL, From, Amount));
  }
  void Init( void )
  {
    this.Count = 0;

    this.GetAmountTicks(); // ウォーミングアップ
    ::SymbolInfoTick(this.symbol, this.FirstTick);

    this.StartTime = ::GetMicrosecondCount();

    return;
  }

public:
  const string symbol;
  const int TimerInterval;

  BENCH( const int iTimerInterval, const string Symb = NULL ) :
         symbol((Symb == NULL) ? ::Symbol() : Symb), TimerInterval(iTimerInterval * (int)1 e6)
  {
    this.Init();

    this.StartTime = 0;
  }

  ~BENCH( void )
  {
    ::Comment("");
  }

  void Refresh( const string Symb )
  {
    if (Symb == this.symbol)
    {
      if (this.GetBenchTime() >= this.TimerInterval)
      {
        if (Count > 0)
          ::Alert(this.ToString());

        this.Init();
      }

      Count++;
    }

    return;
  }
  int GetBenchTime( void ) const
  {
    return((int)(::GetMicrosecondCount() - this.StartTime));
  }

  string ToString( void ) const
  {
    const ulong BenchTime = this.GetBenchTime();
    const int Amount = this.GetAmountTicks(this.FirstTick.time_msc);

    if ((BenchTime == 0) || (Amount == 0))
     return(NULL);

    const double Velocity1 = 1 e6 * this.Count / BenchTime;
    const double Velocity2 = 1 e6 * Amount / BenchTime;

    return((string)this.Count + "/" + (string)Amount + " = " + ::DoubleToString(100.0 * Count / Amount, 2) + "%, ExChange_History = " +
           ::DoubleToString(Velocity2, 1) + " ticks/sec, MT5_RealTime = " + ::DoubleToString(Velocity1, 1) + " units/sec, Interval = " +
           ::DoubleToString(BenchTime / 1 e6, 1) + " sec.");
  }
};

class BENCH_BOOK : public BENCH
{
public:
  BENCH_BOOK( const int iTimerInterval, const string Symb = NULL ) : BENCH(iTimerInterval, Symb)
  {
    ::MarketBookAdd(this.symbol);
  }

  ~BENCH_BOOK( void )
  {
    ::MarketBookRelease(this.symbol);
  }
};

/*
BENCH Bench(Interval);

void OnTick( void )
{
 Bench.Refresh(_Symbol);

 return;
}
*/.

BENCH_BOOK BenchBook(Interval);

void OnBookEvent(const string &symbol )
{
  BenchBook.Refresh(symbol);

  return;
}

結果

2016.09.13 17:18:35.667 Bench (Si-9.16,M1)      851/754 = 112.86%, ExChange_History = 25.1 ticks/sec, MT5_RealTime = 28.3 units/sec, Interval = 30.1 sec.
2016.09.13 17:18:05.524 Bench (Si-9.16,M1)      662/506 = 130.83%, ExChange_History = 16.9 ticks/sec, MT5_RealTime = 22.1 units/sec, Interval = 30.0 sec.
2016.09.13 17:17:35.424 Bench (Si-9.16,M1)      883/1610 = 54.84%, ExChange_History = 53.6 ticks/sec, MT5_RealTime = 29.4 units/sec, Interval = 30.0 sec.
2016.09.13 17:17:05.319 Bench (Si-9.16,M1)      834/2707 = 30.81%, ExChange_History = 90.1 ticks/sec, MT5_RealTime = 27.8 units/sec, Interval = 30.0 sec.
2016.09.13 17:16:35.196 Bench (Si-9.16,M1)      789/627 = 125.84%, ExChange_History = 20.9 ticks/sec, MT5_RealTime = 26.3 units/sec, Interval = 30.0 sec.
2016.09.13 17:16:05.110 Bench (Si-9.16,M1)      900/822 = 109.49%, ExChange_History = 27.4 ticks/sec, MT5_RealTime = 30.0 units/sec, Interval = 30.0 sec.
2016.09.13 17:15:34.993 Bench (Si-9.16,M1)      772/747 = 103.35%, ExChange_History = 24.8 ticks/sec, MT5_RealTime = 25.7 units/sec, Interval = 30.1 sec.

隣り合った半分間でさえ、どれだけ結果が異なるか、はっきりとお分かりいただけるでしょう。メガネの比較は、同時にのみ行うべきである!

削除済み  
Тестирование синхронных операций - 取引所での各取引の成功を確認しながら、 一連の 10 回の同期的な連続買取引操作を行う取引サーバーから取引所での取引の成否の確認を受信するまで、後続の操作は実行されません。 実行速度は、端末-取引サーバー-取引所-取引サーバー-端末のチェーン全体に依存します。同期取引操作の平均時間は短ければ短いほどよい。
//--- 操作ループを実行する
      for(int i=0;i<Trades;i++)
        {
         req.price  =SymbolInfoDouble(_Symbol,SYMBOL_ASK);
         req.comment=string(i+1);
         //--- アクション
         if(!OrderSend(req,res))
           {
            PrintFormat("OrderSend() failed, retcode=%d",res.retcode);
           }
         else
           {
            trades_finished++;
            PrintFormat("#%d Buy %s 1 lot",i+1,_Symbol);
           }
        }

あなたが書いている確認はどこにあるのですか?コードでは気づきませんでした。OrderSend() からのレスポンスのことなら、ヘルプから:

戻り値

基本構造チェック(ポインタ・チェック)が成功した場合、true が返さ れます 関数の実行結果をより詳細に知るには、 結果構造体のフィールドを分析する必要があります

説明してください。
 
fxsaber:

ビデオはセッションの冒頭。そして記事中のビデオはジュース。そして

がセッションを開始するには十分ではありません。何が "キュー "で何が "ウォームアップ "なのか説明してほしい。

テストの時間を見てください。セッションの開始時間ではなく、静かな日の真ん中です。ですから、少数のティックをスキップすることは合理的であり、選択されていないティックの潜在的な残留を避けるには十分です。

私たちが子供たちにテスト測定の方法を教えず、根拠に乏しいために損をさせるようなフォーラムをしているわけではない。テストはエラーがないことを確認するために何十回も行われた。公表はそのあとだ。

 
Alexey Kozitsyn:

あなたが言っている確認はどこにあるのですか?コードでは気づきませんでした。OrderSend()からの応答ということでしたら、ヘルプから:

説明してください。

OrderSendは 100%同期操作で、サーバーで完全な注文発注の結果を待ちます。

つまり、外部取引所での実行の場合、取引所での注文発注の確認を伴う処理の全サイクルとなります。

 
Renat Fatkhullin:

テストの時間を見てください。セッションの始まりではなく、静かな一日の真ん中です。

あなたの同僚はセッションについて

取引セッションの 開始前に 、スタックの単一更新が数回あることがわかります。そのため、スクリプトは最初のNティックをスキップして、スタックに注文が実際にあることを確認します。その後、ティックのカウントを開始する。


コードが前のビデオと変わっていない場合は、別の問題です。
 
fxsaber:

私のコード

結果

隣り合った半分間でさえ、結果がどれほど異なるか、はっきりとお分かりいただけるでしょう。メガネの比較は、同時に行うべきです!

同時というのは、測定値の差が10%程度しかない場合です。

しかし、数十回のテストの結果、4-5倍の安定した差がある場合、議論することはありません。

 
Alexey Kozitsyn:

あなたが言っている確認はどこにあるのですか?コードでは気づきませんでした。OrderSend()からの応答ということでしたら、ヘルプから:

説明してください。

OrderSendはOrderCheckと同じ値を返します。しかし、この場合、true を返した場合、OrderSend は取引サーバーからの応答が到着したときにのみ実行を終了します。

取引サーバー(ゲートウェイ)は取引所へのパイプであり、そこで GO のみがチェックされる。したがって、GOが間違っていれば、注文は取引所に届かない。この意味で、MqlTradeResultを チェックするのが良いというのは正しい。しかし、このケースでは GO は毎回正常であったため、すべての注文が取引所に送信された。そして、OrderSend は取引所の応答を正確に受信した後、その作業を終了した。

したがって、結果は正しい。

 
fxsaber:
あなたの同僚はセッションについて
もしコードが前のビデオと変わっていないなら、それは違う。

あなたは、3つのターミナルでのセッション開始の視覚的な比較のために提示された別のビデオと混同しています。この動画(https://www.youtube.com/watch?v=i5vvD66I3Ik)では、データ更新速度においてMT5が視覚的に明らかに優れていることが簡単にわかります。

記事https://www.mql5.com/ja/articles/2635、我々は数字上の速度の違いを証明し、特別に一日の真ん中(2016.09.12 13:57 GMT+1)を取ったので、市場の開始時に誰かのブレーキがかかる可能性についての苦情はありませんでした。記事(https://www.youtube.com/watch?v=J5nqWGQ1zh8)の動画では、3分間、途切れることなくきれいな連続計測が行われている。

3markets 25082016 blur
3markets 25082016 blur
  • 2016.08.25
  • www.youtube.com
Запись стаканов в терминалах MetaTrader 5, Quik и SmartX 25 августа 2016. Инструмент Si-9.16
 
Renat Fatkhullin:

3つのターミナルでのセッション開始の視覚的な比較のために提示された別のビデオと混同しています。この動画(https://www.youtube.com/watch?v=i5vvD66I3Ik)では、データ更新の速度においてMT5が視覚的に明らかに優れていることに簡単に気づくことができます。

記事https://www.mql5.com/ja/articles/2635、私たちは数字の上で速度の違いを証明し、市場の開始時に誰かのブレーキがかかる可能性についてのクレームがないように、意図的に日の真ん中(13:57 GMT+1)を取りました。記事(https://www.youtube.com/watch?v=J5nqWGQ1zh8)の動画では、3分間にわたってきれいな連続計測が行われている。

現在の記事へのソースにあるコメントについて質問があるだけだ。

取引、自動取引システム、取引戦略のテストに関するフォーラム

記事「MQL5とQLUAの比較 - なぜMQL5の取引操作は最大28倍も速いのか」についての議論。

fxsaber, 2016.09.13:25 pm

 //--- 最初のキューのクリアとウォームアップのために、最初のティックをスキップする。
   tickcounter++;
   if(tickcounter<ExtSkipFirstTicks)
      return;

キューイングとウォームアップがパフォーマンスに与える影響について明確にする必要がある。

もしそれが初歩的なことであれば(前のビデオより) - 1つのことであり、そうでなければ - 別のことです。
 
fxsaber:
今回の記事のソースにあるコメントについて疑問があっただけだ。
もしそれが初歩的なことであれば(以前のビデオより)-一つのことだが、そうでなければ-別のことだ。

どんなテストにもコールドスタート対策は含まれているはずだ。

つまり、Nティックをスキップするということは、私たちがこのことを認識し、考慮していることの表れなのです。ただ、明らかに予想される「なぜコールドスタートを補正しなかったのか」というクレームを避けるためだ。


3つの端末のセッション開始に関する ビデオは、セッション開始時にMT5が遅くなると主張するトレーダーの別のクレームのために2016年8月25日に作成されました。後に判明したことだが、このトレーダーはMT5をまったく使用しておらず、フォーラムからの憶測を放送したものだった。また、一部のトレーダーは、為替商品のチャートがビッドではなく、取引された最終価格によって構築されることを認識していないことも判明した。彼らは、スタック内のビッドの変化とチャート上の非表示を「MT5のブレーキ」と認識していた。

もちろん、ブレーキはありません。