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

 
Renat Fatkhullin:

同期された1つのシンボル・データベース・オブジェクト。読み出し/書き込みのロコは、一定の刻みの書き込みがあるため、混在しています。

シンボルデータベースオブジェクトは、一度にすべてのシンボルに対して1つだけですか?もしそうなら、EURUSDのティックの要求がGBPUSDのティックの要求を遅くする可能性があることが判明します。


OnTickが呼ばれるまでにMqlTickを 用意しておけば、データベースから汎用的に要求されることはないのでしょうか?

 
fxsaber:

OnTickにMqlTickを 用意して、データベースから一般に呼び出されないようにできないでしょうか。

そうすると、MQL5では「4 - Ask and Bid」のようにあらかじめ定義された変数が使えるようになるかもしれません。

 

多くのEAが 動作している場合、MT5側のCPU消費量が多いことが原因で速度が低下している可能性が高いです。MT4ではどうなのかわからない。そうでなければ、並列に動作する空の端末でラグが発生する理由を説明するのは困難です。

間違いなく、取引環境APIの利用を最小限にすることで解決します。タンバリンダンスが終わったら、結果を報告します。

 
fxsaber:

あなたは間違っている。各EAは純粋に取引を行っており(テスターでは減速していない本物のティックによって)、他のEAに依存しません。すべての取引ロジックはOnTickのみで実行され、取引注文のスパム、再帰、グローバル化、リソースは不要です。

OnTrade*、OnBookは使用しません。特定のキーが押された場合のセカンドタイマーとOnChartEvent。


スナップショットの適切な実装(あなたや私が)により、通常の環境関数の呼び出し回数が大幅に減ることは間違いないでしょう。それに伴い、ラグも大幅に削減されます。

まさか、スナップショットの仕掛けになるとは。MT5標準のEA実装は残念ながらいい加減なので、この問題を研究しています。

あなたのケースは全く信じられません。

私たちの計算を示しました。
 
Renat Fatkhullin:
私はあなたのケースを全く信じていません。

TeamViewerなどを通じて、すぐにデモができる。

 
::TerminalInfoInteger(TERMINAL_BUILD) = 2605
(bool)::TerminalInfoInteger(TERMINAL_X64) = true
(bool)::TerminalInfoInteger(TERMINAL_VPS) = false
::HistoryDealsTotal() = 13973
::HistoryOrdersTotal() = 18606
::TerminalInfoInteger(TERMINAL_MAXBARS) = 5000
::TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1464
::MQLInfoInteger(MQL_MEMORY_USED) = 5
::ObjectsTotal(0) = 462
ChartsTotal = 16
::SymbolsTotal(true) = 19 (16 + 3)

Terminalのメモリ消費量を減らす方法を教えてください。CopyTicksのフレッシュティックを16文字分使っています。CopyTicksはそれぞれ128K tickをメモリに保持しているようです。全く必要ないのですが、思い出に残しています。1.5GB近くかかるとは?開発者は、メモリのどの部分が何に使われているかを見ることができますか?初歩的なタスクマネージャをいくつか。

 
fxsaber:

多くのEAが動作している場合、MT5側のCPU消費量が多いことが原因で速度が低下している可能性が高いです。M T4ではどうなのかわからない。そうでなければ、空のTerminalを実行するパラレルでラグが発生する理由を説明することは困難です。

間違いなく、取引環境APIの利用を最小限にすることで解決します。タンバリンで踊ってみた結果を書きます。

これは、数ページ前に私が話していたことと全く同じです。さらに、EAは非常にシンプルで、非流動的なシンボルに基づくことができます。つまり、問題は各EAのコード内部で行われている数学的演算の数ではありません。問題は端末そのものにあり、コードの改善で解決することはできない。残念ながら :(

P.S Expert Advisorの半分の ロジックをOnBookから OnTickに戻し、Core i5をXeon E5-2678に入れ替えました。速度が上がってもよさそうなものだが、残念ながら奇跡は起きなかった :(

 
OnTrade 関数で HistorySelect が遅延する。
// Демонстрация лага HistorySelect в OnTrade*-функциях.
#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

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

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

const bool Init = EventSetTimer(1);

void OnTimer()
{
  static MqlTradeRequest Request = {0};
  static MqlTradeResult Result = {0};

  if (PositionSelectByTicket(Result.order)) // Если позиция открыта - закрываем.
  {
    Request.type = ORDER_TYPE_SELL;
    Request.price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
    Request.position = Result.order;
  }
  else // Иначе - открываем.
  {
    Request.action = TRADE_ACTION_DEAL;
    Request.type = ORDER_TYPE_BUY;
    Request.symbol = _Symbol;
    Request.volume = 0.1;
    Request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
    Request.position = 0;
  }

  const bool AntiWarning = OrderSendAsync(Request, Result); // Асинхронный приказ не случайно
}

void OnTrade()
{
  _B2(HistorySelect(0, INT_MAX));  
}


ほぼすべてのステップで

2020.09.23 11:59:46.351 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 3 ms.
2020.09.23 11:59:46.354 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 2 ms.
2020.09.23 11:59:48.294 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 4 ms.
2020.09.23 11:59:48.296 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 2 ms.
2020.09.23 11:59:49.283 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 4 ms.
2020.09.23 11:59:49.285 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 2 ms.
2020.09.23 11:59:50.296 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 4 ms.
2020.09.23 11:59:50.302 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 5 ms.
2020.09.23 11:59:51.275 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 4 ms.
2020.09.23 11:59:51.277 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 2 ms.
2020.09.23 11:59:52.267 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 4 ms.
2020.09.23 11:59:52.269 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 2 ms.
2020.09.23 11:59:54.277 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 3 ms.
2020.09.23 11:59:54.282 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 5 ms.


キャッシュビルドにそれほど時間がかからず、この遅れはデータベース更新時のデータベースアクセスによるものであることを期待します。

 

なぜmt5には'Commissions'タブがないのか、何か心当たりはありますか?取引終了後にのみ表示されます。

なぜmt5には'Commissions'タブがないのですか?取引終了後にのみ表示されます。

 

このEAを現在のポジションや注文がない口座で実行した場合。

// Создает маркет-ордер в случае, если нет текущих позиций и ордеров.
bool PositionOpen()
{
  bool Res = (!PositionsTotal() && !OrdersTotal());
  
  if (Res)
  {
    MqlTradeRequest Request = {0};
    MqlTradeResult Result;
    
    Request.action = TRADE_ACTION_DEAL;
    Request.symbol = _Symbol;
    Request.volume = 0.1;
    Request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
    
    Res = OrderSendAsync(Request, Result);    
  }
  
  return(Res);
}

void OnInit()
{
  PositionOpen();
}

void OnTrade()
{
  PositionOpen();
}

で、EAで開いたポジションを手動で決済すると、ヘッジに3つのオープンポジションが 存在することになります(正味3倍量のポジションで)。


これは正しい動作なのでしょうか?私はおそらく、Terminalを正しく理解していないのだと思います。では、説明をお願いします。