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

 
fxsaber:

頻発することが判明取引関数が呼び出されていない。

SymbolInfoTickは、たまに悪いラグがありますね。HFTは、このような予期せぬ遅れを経験することが多いのかもしれません。

その理由は、開発者に聞いてみてください。一方、戦闘用EAでは、そのプロファイラーが 必須であることは明らかです。

空の」端末では、テストは何を表示するのでしょうか?

void OnStart()
  {
   MqlTick Tick;
//---
   ulong start,end,max_time=0,avr_time=0;
   int   count=100000;
   for(int i=0; i<count; i++)
     {
      start=GetMicrosecondCount();
      SymbolInfoTick(_Symbol, Tick);
      end=GetMicrosecondCount()-start;
      //--- >1 ms
      if(end>1000)
         Print(" > 1 ms for one SymbolInfoTick: ",DoubleToString(end/1000.0,2)," ms");
      //---
      if(end>max_time)
         max_time=end;
      avr_time+=end;
     }
   Print("SymbolInfoTick max time: ",DoubleToString(max_time/1000.0,3)," ms; avr time: ",DoubleToString(avr_time/1000.0/count,3)," ms; ",count," iterations");
//---
   start=GetMicrosecondCount();
   for(int i=0; i<count; i++)
      SymbolInfoTick(_Symbol, Tick);
   end=GetMicrosecondCount()-start;
   Print(count," SymbolInfoTick = ",DoubleToString(end/1000.0,2)," ms");
  }

こんな感じでいいんじゃないでしょうか。

2020.06.04 11:02:30.123 TestSymbolInfoTick (EURUSD,H1)  SymbolInfoTick max time: 0.138 ms; avr time: 0.000 ms; 100000 iterations
2020.06.04 11:02:30.138 TestSymbolInfoTick (EURUSD,H1)  100000 SymbolInfoTick = 14.85 ms
2020.06.04 11:02:31.433 TestSymbolInfoTick (EURUSD,H1)  SymbolInfoTick max time: 0.051 ms; avr time: 0.000 ms; 100000 iterations
2020.06.04 11:02:31.448 TestSymbolInfoTick (EURUSD,H1)  100000 SymbolInfoTick = 15.17 ms
2020.06.04 11:02:33.064 TestSymbolInfoTick (EURUSD,H1)  SymbolInfoTick max time: 0.035 ms; avr time: 0.000 ms; 100000 iterations
2020.06.04 11:02:33.079 TestSymbolInfoTick (EURUSD,H1)  100000 SymbolInfoTick = 15.12 ms

具体的にどのように端末に負荷をかけているのか、具体的に教えていただかないと、原因を突き止めるのは難しいです。

 
Anton:

空の」端末では、テストはどのように表示されるのでしょうか?

こんな感じでいいんじゃないでしょうか。

        SymbolInfoTick max time: 0.034 ms; avr time: 0.000 ms; 100000 iterations
        100000 SymbolInfoTick = 8.56 ms
        SymbolInfoTick max time: 0.047 ms; avr time: 0.000 ms; 100000 iterations
        100000 SymbolInfoTick = 9.04 ms
        SymbolInfoTick max time: 0.045 ms; avr time: 0.000 ms; 100000 iterations
        100000 SymbolInfoTick = 9.02 ms

どのように端末に負荷をかけているのか、具体的に教えていただかないと、原因を探るのは難しいです。

10万回の繰り返しは指標にならない。機能が常に遅くなるわけではなく、時々遅くなるので。

実際、制動が止まるまで戦闘用EAの塊を無効化する必要があります。そうすれば、コードを提供することができます。待つしかないのです。

 
fxsaber:

実際、ブレーキが止まるまで、戦闘アドバイザーの塊を無効化する必要があるんです。そうすれば、コードを提供することができます。待たされる。

このEAをいくつかのキャラクターで実行すると、すぐに結果を得ることができます。

#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

void OnTick()
{
  MqlTick Tick[1];
  
  if (_B(CopyTicks(_Symbol, Tick, COPY_TICKS_ALL, 0, 1), 1)) // Не знаю, влияет это или нет.
    _B(SymbolInfoTick(_Symbol, Tick[0]), 1);
}


5分で手に入れた。

        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 9 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 3 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 4 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 1 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 2 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 5 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 2 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 1 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 16 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 16 ms.


EAにこれだけ(CopyTicksなし)残しておけば十分そうですね。

    _B(SymbolInfoTick(_Symbol, Tick[0]), 1);
 
fxsaber:

10万回の繰り返しは指標にならない。機能として、常に遅くなるわけではなく、時々遅くなる。

私は、関数の速さを定義する概念を変えることを提案します。

関数の実行時間にピークがない場合、高速であると言えます。


先に示したように、単純な関数でもこのようなピークが存在する。時には非常に大きなものも。これと何の関係があるのか、さっぱりわからない。しかし、取引上重要な機能は すべて、上記の方法でピークの有無を確認すべきなのは明らかである。つまり、1ミリ秒以上のピークを数時間かけて監視するのです。


少なくとも空の端末ではピークがないことを実現する必要があります。高速な10万回の反復は、何もないことが判明する。

 
fxsaber:

関数の速さを定義する概念を変えることを提案します。

関数の持続時間にピークがない場合、高速であると言えます。


このように、単純な関数にもこのようなピークが存在する。時には非常に大きなものも。これと何の関係があるのか、さっぱりわからない。しかし、取引上重要な機能は すべて、上記の方法でピークの有無を確認すべきなのは明らかである。つまり、1ミリ秒以上のピークを数時間かけて監視するのです。


少なくとも空の端末ではピークがないことを実現する必要があります。高速な10万回の反復は、何もないことが判明する。

他のタスクが実行されていると、タイマーに累積時間が表示されることがあります。例えば、キャンバスで作業しているとき、表示関数が画像を作成せずに表示するタスクを設定し、戻ってきたときに発生することがあります。その後、他の機能が順次実行され、例えば同じコメントが表示されますが、キャンバスマッピングの処理はCPU言語で開始され、その後にキャンバスが表示されます。タイミングを測定すると、コメントの出力に非常に時間がかかっていることがわかりますが、kanvasの表示機能は0msで動作しています。

 
fxsaber:

を実行し、1ミリ秒以上のピークを数時間監視します。

少なくとも空のTerminalではピークがないことを確認する必要があります。高速な10万回の反復は、無価値であることが判明しました。

そんなモニター用のExpert Advisorを起草してみました。

// Мониторинг длительных пиков выполнения важных функций для торговли.
#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

input int inCycle = 10;    // Циклов проверки в одном OnTick
input int inAlertTime = 1; // Нижний порог в миллисекундах

#define _B2(A) _B(A, AlertTime)

void Check( const string Symb, const int AlertTime = 1 )
{
  MqlTick Tick;
  
  if (_B2(SymbolInfoTick(Symb, Tick)))
  {
    MqlTick Ticks[];
    
    _B2(CopyTicks(Symb, Ticks, COPY_TICKS_ALL, 0, 1));
    _B2(CopyTicks(Symb, Ticks, COPY_TICKS_ALL, Tick.time_msc));
    _B2(CopyTicksRange(Symb, Ticks, COPY_TICKS_ALL, Tick.time_msc));

    _B2(HistorySelect(Tick.time, INT_MAX));
    
    _B2(HistoryDealsTotal());
    _B2(HistoryDealGetTicket(0));
    _B2(HistoryDealGetInteger(0, DEAL_MAGIC));
    _B2(HistoryDealGetDouble(0, DEAL_PRICE));
    _B2(HistoryDealSelect(0));

    _B2(HistoryOrdersTotal());
    _B2(HistoryOrderGetTicket(0));
    _B2(HistoryOrderGetInteger(0, ORDER_MAGIC));
    _B2(HistoryOrderGetDouble(0, ORDER_PRICE_CURRENT));
    _B2(HistoryOrderSelect(0));
    
    _B2(GetLastError());
    _B2(IsStopped());
    
    _B2(SymbolInfoDouble(Symb, SYMBOL_ASK));
    _B2(SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE));
    _B2(SymbolInfoDouble(Symb, SYMBOL_POINT));
    _B2(SymbolInfoInteger(Symb, SYMBOL_DIGITS));

    _B2(TimeCurrent());
    _B2(TimeLocal());
    _B2(TimeTradeServer());
    
    _B2(OrdersTotal());
    _B2(OrderSelect(0));
    _B2(OrderGetDouble(ORDER_PRICE_CURRENT));
    _B2(OrderGetInteger(ORDER_MAGIC));
    _B2(OrderGetString(ORDER_SYMBOL));
    
    _B2(PositionsTotal());
    _B2(PositionSelect(Symb));
    _B2(PositionSelectByTicket(0));
    _B2(PositionGetDouble(POSITION_PRICE_CURRENT));
    _B2(PositionGetInteger(POSITION_MAGIC));
    _B2(PositionGetString(POSITION_SYMBOL));
    
    _B2(AccountInfoDouble(ACCOUNT_EQUITY));
    _B2(AccountInfoInteger(ACCOUNT_MARGIN_MODE));
    
    MqlTradeRequest Request = {0};
    MqlTradeCheckResult CheckResult;

    _B2(OrderCheck(Request, CheckResult));
    
    _B2(MQLInfoInteger(MQL_TRADE_ALLOWED));
    _B2(AccountInfoInteger(ACCOUNT_TRADE_EXPERT));
    _B2(AccountInfoInteger(ACCOUNT_TRADE_ALLOWED));
    _B2(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED));
    
    _B2(SymbolsTotal(true));
    _B2(SymbolName(0, true));
    _B2(Symbol());
    
    _B2(GlobalVariableCheck(NULL));
    _B2(GlobalVariableGet(NULL));
    
    _B2(ResourceFree(NULL));
  }
}

void OnTick()
{
  for (int i = 0; i < inCycle; i++)
    Check(_Symbol, inAlertTime);
}


5分のモニターで結果が出ました。

        Alert: Time[Test6.mq5 18: HistorySelect(Tick.time,INT_MAX)] = 21 ms.
        Alert: Time[Test6.mq5 24: HistoryDealSelect(0)] = 4 ms.
        Alert: Time[Test6.mq5 10: SymbolInfoTick(Symb,Tick)] = 24 ms.
        Alert: Time[Test6.mq5 14: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 4 ms.
        Alert: Time[Test6.mq5 30: HistoryOrderSelect(0)] = 3 ms.
        Alert: Time[Test6.mq5 35: SymbolInfoDouble(Symb,SYMBOL_ASK)] = 2 ms.


SZZY このような入力パラメータの値では、警告は非常に少なくなります。

input int inAlertTime = 10; // Нижний порог в миллисекундах


しかし、その結果もまた、より大きな意味を持つのです。

        Alert: Time[Test6.mq5 21: HistorySelect(Tick.time,INT_MAX)] = 19 ms.
        Alert: Time[Test6.mq5 21: HistorySelect(Tick.time,INT_MAX)] = 10 ms.
        Alert: Time[Test6.mq5 38: SymbolInfoDouble(Symb,SYMBOL_ASK)] = 10 ms.
        Alert: Time[Test6.mq5 13: SymbolInfoTick(Symb,Tick)] = 10 ms.
        Alert: Time[Test6.mq5 38: SymbolInfoDouble(Symb,SYMBOL_ASK)] = 10 ms.
        Alert: Time[Test6.mq5 17: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 148 ms.
        Alert: Time[Test6.mq5 74: SymbolName(0,true)] = 11 ms.
 

最後に、私がたくさんの注文を修正すると、1件あたり3~10秒かかることがあります。その後、再び0.1秒の長い時間がかかる。

サーバーのログを引き出すと、そこでは瞬時に表示されます。


バトルExpert Advisorでは非常に不愉快です。

2020.06.04 15:24:48.771 Alert: Time[NewTicks.mqh 31: ::SymbolInfoTick(_Symbol,Tick)] = 61 ms.
2020.06.04 15:25:21.729 Alert: Time[NewTicks.mqh 31: ::SymbolInfoTick(_Symbol,Tick)] = 29 ms.
2020.06.04 15:27:57.842 Alert: Time[NewTicks.mqh 31: ::SymbolInfoTick(_Symbol,Tick)] = 142 ms.


素晴らしい価値を持つものがあります。

 
fxsaber:

最後に、私がたくさんの注文を修正すると、1件あたり3~10秒かかることがあります。その後、再び0.1秒の長い時間がかかる。

サーバーのログを上げると、即座にそこに。

この状況は、別の取引サーバーでも繰り返された。

端末がオープンポジションを変更するのに2.5秒かかります。サーバーの場合 - 2ミリ秒。

おそらく、FORTS実行 時の不具合もこれが原因でしょう。

ФОРТС. Вопросы по исполнению
ФОРТС. Вопросы по исполнению
  • 2020.03.30
  • www.mql5.com
С большими проблемами удалось это сделать (начальник отдела по работе с профессиональными клиентами ДЦ Открытие Евгений Сергеевич,.
 

再送信を行います。

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

MetaTrader 5 build 1700 プラットフォームベータ版:MetaEditorと合成ツールのプロジェクト

レナート・ファットフーリン さん 2017.12.14 12:47

これは、コミュニケーションの質を示す指標です。TCP/IPプロトコルで再送信されたネットワークパケットの割合。

これは、オペレーティングシステム全体にわたるすべてのアプリケーションに対して、ネットワークインターフェースレベルでグローバルに計算されます。ラグや問題が疑われるときは、この指標を見てください。ブローカーのサーバーが非常に遠くにある場合に重要。例えば、アジアのトレーダーとヨーロッパのブローカーの場合。

すでに再送信率3%で取引できないことがわかる。再 送信率の異常は、無線LANが悪いと出ます。

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

MetaTrader 5 build 2360の新機能:SQLiteとの統合を拡張しました。

レナート・ファットフーリン さん 2020.04.06 12:33

標準は1%未満であるべきです。また、すでに3%のネットワーク損失が低遅延サービスを殺しています。

例えば、私たちの再送信は、明らかに多くのユーザー(MetaQuotes-Demoでは1万7千人がオンラインになっています)で0.68~0.75%です。そして、私たちはモスクワ/ロシアではなく、全世界に奉仕しているのです。

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

バグ、バグ、質問

レナート・ファットフーリン さん 2017.12.17 23:03

これはコンピュータ全体のネットワークインターフェースの統計で、メタトレーダーはユーザーの一人に過ぎません。必ずしも取引サーバーと関係があるわけではありません。

一般的な統計情報は、Webブラウザが何らかの不具合のある遠いサイトへのアクセスに失敗した後、簡単に破損してしまうことがあります。また、ローカル無線LANがネットワークの競合をキャッチして、ランダムな時間に何十パーセントもの再送信を受けることも可能です。

20%の再送信の場合、取引サーバーへの接続はなく、再接続が常時、エンドレスになります。端末は常時接続であり、長い接続を維持するためには3〜5%の再送信でも致命的となる。

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

バグ、バグ、質問

レナート・ファットフーリン さん 2017.12.18 11:36

これはOSによって報告されるローカルの TCP/IPスタックの技術的特性であり、取引サーバーへの特定の接続の品質を示すものではないことに留意してください。システム/電話のアクティビティを含む、すべてのネットワークアクティビティが含まれます。


トレーディングクラスターの接続は高品質であることが知られており、多くのパラメータを記録し(これはプラットフォームの標準機能です)、1分間のスナップショットを収集し、その後の分析を行っています。

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

バグ、バグ、質問

レナート・ファットフーリン さん 2017.12.18 00:13

確認しました。

Asiaを含むデモクラスタのどのノードも、終日(そして他の日も)再起動や再送信レベルの増加は見られませんでした。すべて0.5%~1.5%の正常値です。


私はたくさん持っているようです。

今は真夜中、クオーターはほとんど更新されません。再送信が目の前で増えていく。低遅延取引のために、VPSにAlertを1%以上の高い値に設定したい。しかし、このような巨大な価値観では、この考えは無意味になってしまいます。


おすすめは?トレードサーバーへのtracertを行うか?何らかの監視プログラム?一般的に、MT5を低遅延に対応させるにはどうしたらよいのでしょうか?


ZS 相場が速く動き出すと、すぐに指数が何倍にもなって下がる。

 
fxsaber:

再送信機。


私はたくさん持っているようです。

午前5時から6時

自宅(光、ETH→ルーター、ケーブル→コンピュータ)-8~19%、ping60~70

オランダのVPS(瞬間的に1MT5、9通貨/11チャート)-1.2-1.6%、ping3.7