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

 
fxsaber:

このMQの壁は、フォーラムのメンバーのサポートなしには乗り切れないと感じています。コードは短いので、プロでもすぐに分かるはずです。そこに欠点はない。マーケットウォッチよりも、ポジションを通した価格の方が、はるかに速く取得できることがよくわかります。どうしてMQは当たり前のことがわからないのだろう--。

1.あなたのテストは、条件により、本当に微小な割合の反復をカウントしています。

if (Interval##A > 100)

要するに、99%以上の反復処理が1マイクロ秒以下で行われるため、プロセッサがタスクで過負荷になり、与えられたタスクの実行を遠くの棚に追いやった異常だけをカウントしているのです。

また、条件>0とした場合でも、客観性はない。

2.このような高速演算の時間測定は、1回の反復ではなく、全サイクルの時間としてのみ行うべきである。

3.しかし、あなたの例では周期が10秒に制限されているので(なぜ!ティックについては、0.1秒でも十分だと思います。なぜなら、1秒間に3つのtickが到着し、3つのtickがそれぞれ10秒間、並行して実行されることが十分にあり得るからです)、タイミングは必要ありません。一定時間内に何回反復実行されるかを計算するのが簡単です。多ければ多いほど、生産性が上がる。

あなたのコードを "ちょっと "修正しました。私のバリアントは、より現実を反映していると思います。

2つのバリアントが混ざらないように、計算は1つずつ行われます。偶数番目のティックはSYMBOL_BID 用、奇数番目はGetBid()用です。

念のため、最適化に対してコンパイラを騙す試みとして、和とその出力を追加しました。
出力結果は累積されます。

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define  TimeLoop 125  // 15.625*8  

bool GetPosition(const int Type = OP_BUY)
  {
   bool Res = false;
   for(int i = PositionsTotal() - 1; (i >= 0) && !Res; i--)
      Res = PositionGetTicket(i) && (PositionGetInteger(POSITION_TYPE) == Type) &&
            (PositionGetString(POSITION_SYMBOL) == _Symbol);
   return(Res);
  }

// Альтернативный способ получения Bid-цены текущего символа.
// Запускать только на демо-счетах.
double GetBid()
  {
   static const TICKET_TYPE Ticket = GetPosition() ? PositionGetInteger(POSITION_TICKET) : OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);
   return(PositionSelectByTicket(Ticket) ? PositionGetDouble(POSITION_PRICE_CURRENT) : 0);
  }

#define  TOSTRING(A) ", "#A + " = " + (string)(A)


long N1=0;
long N2=0;
long n=0;
double sum1=0;
double sum2=0;

const bool Init = EventSetTimer(10) && GetBid(); // Будем выводить статистику каждый 10 секунд.

//+------------------------------------------------------------------+

void OnTick()
  {
//  return;
   const uint StartTime = GetTickCount();
   if(n%2==0)
      while(!IsStopped() && (GetTickCount() - StartTime < TimeLoop))
        {
         sum1+=SymbolInfoDouble(_Symbol, SYMBOL_BID);
         N1++;
        }
   else
      while(!IsStopped() && (GetTickCount() - StartTime < TimeLoop))
        {
         sum2+=GetBid();
         N2++;
        }
   if(n%2==0 && n>1)
      if (N1>N2) Print(_Symbol+": SYMBOL_BID быстрее GetBid() в " + DoubleToString(double(N1)/N2,2) + " раза. Среднее время одной итерации: SYMBOL_BID - " + DoubleToString((TimeLoop*1000000.0*n/2)/N1,2) + " ns, GetBid() - " + DoubleToString((TimeLoop*1000000.0*n/2)/N2,2) + " ns" + TOSTRING(sum1) + TOSTRING(sum2));
      else       Print(_Symbol+": GetBid() быстрее SYMBOL_BID в " + DoubleToString(double(N2)/N1,2) + " раза. Среднее время одной итерации: SYMBOL_BID - " + DoubleToString((TimeLoop*1000000.0*n/2)/N1,2) + " ns, GetBid() - " + DoubleToString((TimeLoop*1000000.0*n/2)/N2,2) + " ns" + TOSTRING(sum1) + TOSTRING(sum2));
      n++;
  }
//+------------------------------------------------------------------+

私の結果です。

2020.10.26 19:26:46.193 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.97 раза. Среднее время одной итерации: SYMBOL_BID - 45.80 ns, GetBid() - 135.80 ns, sum1 = 106706334.7283292, sum2 = 35987491.50911281
2020.10.26 19:26:46.193 FxSaberBidSpeed (EURUSD,M1)     EURUSD: SYMBOL_BID быстрее GetBid() в 2.90 раза. Среднее время одной итерации: SYMBOL_BID - 45.10 ns, GetBid() - 130.82 ns, sum1 = 34042649.2788716,  sum2 = 11735304.45101236
2020.10.26 19:26:47.085 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.95 раза. Среднее время одной итерации: SYMBOL_BID - 45.57 ns, GetBid() - 134.55 ns, sum1 = 110131593.3516681, sum2 = 37303001.98488424
2020.10.26 19:26:52.397 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.99 раза. Среднее время одной итерации: SYMBOL_BID - 45.48 ns, GetBid() - 135.90 ns, sum1 = 113269505.1945728, sum2 = 37903458.6724181
2020.10.26 19:26:59.412 FxSaberBidSpeed (EURUSD,M1)     EURUSD: SYMBOL_BID быстрее GetBid() в 2.85 раза. Среднее время одной итерации: SYMBOL_BID - 45.16 ns, GetBid() - 128.57 ns, sum1 = 36611618.7279973,  sum2 = 12858907.51985167
2020.10.26 19:27:00.131 FxSaberBidSpeed (BTCUSD,M1)     BTCUSD: SYMBOL_BID быстрее GetBid() в 2.78 раза. Среднее время одной итерации: SYMBOL_BID - 47.10 ns, GetBid() - 130.88 ns, sum1 = 305215291120.0239, sum2 = 109832697267.1495
2020.10.26 19:27:03.303 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.96 раза. Среднее время одной итерации: SYMBOL_BID - 45.44 ns, GetBid() - 134.61 ns, sum1 = 116279675.0471961, sum2 = 39248002.75579567
2020.10.26 19:27:06.318 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 3.01 раза. Среднее время одной итерации: SYMBOL_BID - 45.17 ns, GetBid() - 135.96 ns, sum1 = 119877506.6663743, sum2 = 39829996.08171722
2020.10.26 19:27:06.709 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 3.01 раза. Среднее время одной итерации: SYMBOL_BID - 44.92 ns, GetBid() - 135.42 ns, sum1 = 123505976.1123297, sum2 = 40965170.16304104
2020.10.26 19:27:07.803 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.99 раза. Среднее время одной итерации: SYMBOL_BID - 44.84 ns, GetBid() - 134.00 ns, sum1 = 126664503.6443297, sum2 = 42385980.37108831
ご覧の通り、性能の差は通常版の3倍もあります。
 
Nikolai Semko:


ご覧の通り、性能の差はオリジナル版の3倍にもなっています。

fxsaberのオリジナル版はGetBidの優位性を示しているのか、それともより強力な/負荷の少ないPCの話なのか?

 
Andrey Khatimlianskii:

fxsaberによるオリジナル版はGetBidの優位性を示すのか、それとももっと強力な/負荷の少ないPCなのでしょうか?

また、彼の亜種は、CPU負荷が最大になったときにGetBidの優位性を示しました。しかし、同時に私のバリエーションは、同じ負荷で通常の機能の3倍のアドバンテージを示しています。
これは
、私のバリアントが入札価格取得の全反復の平均時間を考慮し、そのごく一部が異常なハングアップを伴うからです。
どのような理由で、プロセッサが困難な「分」において、通常の機能(遅延が100μ以上ある場合)に埋もれてしまうのか、誰にもわからない。それでも平均時間はレギュラー機能の3倍以上

つまり、例えば(Interval#A > 100)であれば、このようになります。

一方、(Interval#A > 0)の場合は、すでにかなり異なっており、入札価格を得るための通常バージョンと代替バージョンの間の異常な遅延のランダムな分布を示しています。

を、同じCPU負荷でテストしてみたところ、このような結果になりました。

2020.10.26 22:16:10.569 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.79 раза. Среднее время одной итерации: SYMBOL_BID - 57.95 ns, GetBid() - 161.43 ns, sum1 = 108105265.450882, sum2 = 38804020.20301527
2020.10.26 22:16:12.146 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.79 раза. Среднее время одной итерации: SYMBOL_BID - 57.81 ns, GetBid() - 161.06 ns, sum1 = 111212159.8857315, sum2 = 39917412.88663763
2020.10.26 22:16:13.741 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.79 раза. Среднее время одной итерации: SYMBOL_BID - 57.37 ns, GetBid() - 159.91 ns, sum1 = 114942034.0034028, sum2 = 41233865.03452455
2020.10.26 22:16:14.740 FxSaberBidSpeed (EURUSD,M1)     EURUSD: SYMBOL_BID быстрее GetBid() в 3.18 раза. Среднее время одной итерации: SYMBOL_BID - 52.88 ns, GetBid() - 167.92 ns, sum1 = 75470423.51597476, sum2 = 23764764.64380601
2020.10.26 22:16:15.756 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.78 раза. Среднее время одной итерации: SYMBOL_BID - 57.30 ns, GetBid() - 159.06 ns, sum1 = 117956798.0483066, sum2 = 42491447.24894404
2020.10.26 22:16:17.646 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.77 раза. Среднее время одной итерации: SYMBOL_BID - 57.19 ns, GetBid() - 158.36 ns, sum1 = 121056970.4066543, sum2 = 43721243.0341278
2020.10.26 22:16:20.146 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.76 раза. Среднее время одной итерации: SYMBOL_BID - 57.14 ns, GetBid() - 157.85 ns, sum1 = 124053724.3725583, sum2 = 44907061.11418578
2020.10.26 22:16:21.553 FxSaberBidSpeed (EURUSD,M1)     EURUSD: SYMBOL_BID быстрее GetBid() в 3.15 раза. Среднее время одной итерации: SYMBOL_BID - 52.80 ns, GetBid() - 166.11 ns, sum1 = 78375839.87008552, sum2 = 24913626.42960918
2020.10.26 22:16:24.865 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.77 раза. Среднее время одной итерации: SYMBOL_BID - 56.94 ns, GetBid() - 157.50 ns, sum1 = 127392085.5933389, sum2 = 46051851.71182434
2020.10.26 22:16:27.678 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.77 раза. Среднее время одной итерации: SYMBOL_BID - 57.13 ns, GetBid() - 158.30 ns, sum1 = 129851046.9417646, sum2 = 46862113.16739535

ですから、fxsaberさんのテストのバージョンは、客観性からは程遠いと思います。

エージェントでCPUに負荷をかけるのではなく、このスクリプトで負荷をかけました。より効率的でした。

ファイル:
LSD.mq5  6 kb
 

fxsaberテストに若干の修正を加え、計算に占める反復回数の割合を明確に示した後。

2020.10.26 22:45:03.679 FxSaberBidSpeed (USDCAD,M1)     Alert: , TimeBid1-TimeBid2 = 2142416 mcs., TimeBid1 = 2858669, TimeBid2 = 716253,  Всего итераций - 31456223, из них принято во внимание, NBid1 = 3015, NBid2 = 1714
2020.10.26 22:45:05.739 FxSaberBidSpeed (BTCUSD,M1)     Alert: , TimeBid1-TimeBid2 = 1521696 mcs., TimeBid1 = 2282285, TimeBid2 = 760589,  Всего итераций - 31417549, из них принято во внимание, NBid1 = 1794, NBid2 = 1418
2020.10.26 22:45:06.006 FxSaberBidSpeed (USDJPY,M1)     Alert: , TimeBid1-TimeBid2 = 2241890 mcs., TimeBid1 = 3204507, TimeBid2 = 962617,  Всего итераций - 54138004, из них принято во внимание, NBid1 = 4401, NBid2 = 2083
2020.10.26 22:45:09.099 FxSaberBidSpeed (EURUSD,M1)     Alert: , TimeBid1-TimeBid2 = 1000828 mcs., TimeBid1 = 1496646, TimeBid2 = 495818,  Всего итераций - 10037824, из них принято во внимание, NBid1 = 2429, NBid2 = 1711
2020.10.26 22:45:14.803 FxSaberBidSpeed (USDCAD,M1)     Alert: , TimeBid1-TimeBid2 = 2676273 mcs., TimeBid1 = 3916168, TimeBid2 = 1239895, Всего итераций - 41606744, из них принято во внимание, NBid1 = 4935, NBid2 = 3790
2020.10.26 22:45:15.745 FxSaberBidSpeed (BTCUSD,M1)     Alert: , TimeBid1-TimeBid2 = 1521696 mcs., TimeBid1 = 2282285, TimeBid2 = 760589,  Всего итераций - 31417549, из них принято во внимание, NBid1 = 1794, NBid2 = 1418
2020.10.26 22:45:16.115 FxSaberBidSpeed (USDJPY,M1)     Alert: , TimeBid1-TimeBid2 = 2653810 mcs., TimeBid1 = 4195095, TimeBid2 = 1541285, Всего итераций - 64310228, из них принято во внимание, NBid1 = 6486, NBid2 = 3879
2020.10.26 22:45:19.834 FxSaberBidSpeed (EURUSD,M1)     Alert: , TimeBid1-TimeBid2 = 1949809 mcs., TimeBid1 = 3091755, TimeBid2 = 1141946, Всего итераций - 19435170, из них принято во внимание, NBid1 = 4724, NBid2 = 3547

すなわち、約0.01%です。

You bet.
SymbolInfoDouble(_Symbol,SYMBOL_BID)の平均実行時間が50ナノ秒程度であれば、実行時間が100 000ナノ秒以上のものだけを考慮するようにします。

ファイル:
 
Nikolai Semko:

fxsaberテストに若干の修正を加え、計算に占める反復回数の割合を明確に示した後。

すなわち、約0.01%です。


SymbolInfoDouble(_Symbol,SYMBOL_BID)の平均実行時間が約50ナノ秒の場合、100 000ナノ秒以上の反復処理のみをカウントしています。

単純に100μs以上ではなく、3μs以上という条件にすればよかったのです。結果は、どうやら同じだったようだ。セグメント別の調査で、異なる実行条件では、異なるセグメント、異なるセクションで違いがあるかもしれないと考えたのです。実行の優先順位は、何かに依存して作られることが多い。軽い負荷ではいくつかの優先順位、高い負荷では他の優先順位、重要なものでは、コンピュータがハングアップしてクラッシュしないようにするもので、パフォーマンスはバックグラウンドになります。

一般的に、ハードウェアの70%以上の負荷で取引するのはおかしいと言われています。ほぼクリティカルな性能です。戦闘用EAの鉄の負荷は60%以下であることが望ましい。

 
しばらくPCに向かえないので、短くまとめます。

アルゴトレーディングでは、定期的にスローダウンが発生しても、誰も病院の平均温度を気にしない。ミリ秒単位で価格を把握することは日常茶飯事です。しかも、それは戦闘環境下での話です。

もし、取引の重要な場面でラグがない価格を得ることができるのであれば、私はこの機会を逃すまいと戦っています。

そのような松葉杖が存在することをコードで証明しました。ラグを避けたいなら、松葉杖を使え。

ここでは、タンブラーで作業するときに受信した価格を比較するコードを同様に見たことがある人はいません。そこには、控えめに言っても重大な疑問がある。

実は、松葉杖よりも正規の機能の方が、壊滅的に遅れているのです。そして、平均時間がゼロに近いことも気にしない。トレーディング時に問題となるのはラグです

HFTを望む - 今は遅いミリ秒のレベルさえ忘れてください。
 
は、すでにHFTブローカーを持っているのでしょうか?)
 
secret:
とか、すでにHFTブローカーがあるのかとか)
はい。
 
Igor Makanu:

シンボルインフォティックのテストは、市場概要に1つのシンボルしかない場合と、数十のシンボルがある場合で、1つのツールに依頼することを試してみてください。

サーバーが圧縮されたトラフィックを送信している可能性が高く、データが解凍されるときに SymbolInfoTick に周期的な遅延が発生している。

すなわち、シンボルの数が多い場合、テスト時間の落ち込みがさらに頻繁になったり、深くなったりします

最近のビルドでは、ティックストリームを受信しても、理論上では何の影響もありません。実用的には、SymbolInfoTickはすでにキャッシュで動作 していますが、一部の市民は黒猫を探し続けています。

80%負荷のプロセッサでテストする意味がわからない。

テストでは8割もないんですよ。4つのコアで6つのエージェントが動作しており、つまり100%保証されています。

問題は、彼のシステムのタスクスケジューラが、この状況をどのように処理しているかだ。同時に、端末の実装にこそ原因があるとの主張も行っている。

つまり、コンピュータに負荷がかかり、文字通りコンピュータ上のあらゆるものが遅くなる状況を人為的に作り出し、「ああ、ほら、どうして時々端末がラグるんだ」という形で何らかの主張がなされるのである。

そんな状況でも「約0.01%」なのだから、細かいことはいい加減にしろ!と目をつぶることにしよう。病院の平均温度なんて誰も気にしない」「ラグがあると取引時に困る」「HFTが欲しい」というだけで十分です。

さらに、古いオフィスのデスクトップや枯れた仮想マシンで20人のエキスパートにHFTを させることも当然ながら可能です。

PS PositionSelectByTicket()の実装では、確かにアクセス同期のある共有リソースにアクセスすることができます。そして、すべてのコールでポジションを選択しなければ、古い価格を読んでいることになります。SymbolInfoDoubleを介した「スナップショット」の方が簡単だったのです。

Ордерa, позиции и сделки в MetaTrader 5
Ордерa, позиции и сделки в MetaTrader 5
  • www.mql5.com
Конечной целью трейдера является извлечение прибыли посредством торговых операций на финансовых рынках. В этой статье дается описание терминов и процессов торговой платформы MetaTarder 5, знание которых необходимо для правильного понимания работы торговых функций языка MQL5. Ордера — это принятые торговым сервером запросы на совершение торговых...
 
リアルタイムカーネルは何か役に立ちますか?