MT5 und Geschwindigkeit in Aktion - Seite 61

 
fxsaber:

Ich glaube, dass diese MQ-Wand ohne die Unterstützung der Forumsmitglieder nicht durchkommen wird. Der Code ist kurz, die Profis sollten ihn schnell herausfinden können. Dort gibt es keine Mängel. Es zeigt sich deutlich, dass die Preise durch Positionen viel schneller erhalten werden als durch Market Watch. Ich verstehe nicht, wie MQ das Offensichtliche nicht sehen kann.

1. Ihr Test zählt wirklich nur einen winzigen Prozentsatz an Iterationen aufgrund der Bedingung

if (Interval##A > 100)

Im Wesentlichen werden nur Anomalien gezählt, bei denen der Prozessor mit Aufgaben überlastet ist und die Ausführung der jeweiligen Aufgabe auf die lange Bank schiebt, da über 99 % der Iterationen in weniger als einer Mikrosekunde durchgeführt werden.

Und selbst wenn Sie die Bedingung >0 setzen, gibt es immer noch keine Objektivität.

2. Die Zeitmessung solcher schnellen Operationen sollte nur als volle Zykluszeit erfolgen, nicht als einzelne Iteration.

3. aber da der Zyklus in Ihrem Beispiel auf 10 Sekunden begrenzt ist (Warum! Für Ticks sind 0,1 Sekunden meiner Meinung nach völlig ausreichend. Da es durchaus vorkommen kann, dass 3 Ticks in einer Sekunde eintreffen und alle drei Ticks jeweils 10 Sekunden lang und parallel ausgeführt werden, ist kein Timing erforderlich. Es ist einfacher zu berechnen, wie viele Iterationen in einer bestimmten Zeit ausgeführt werden. Je mehr, desto höher die Produktivität.

Ich habe Ihren Code "ein bisschen" geändert. Ich denke, meine Variante spiegelt die Realität besser wider.

Die Berechnung erfolgt nacheinander, um die beiden Varianten nicht zu vermischen. Gerade Zahlen sind fürSYMBOL_BID, ungerade - für GetBid().

Ich fügte Summen und ihre Ausgabe nur für den Fall hinzu, dass ich versuche, den Compiler gegen die Optimierung auszutricksen.
Das Ergebnis der Ausgabe ist kumulativ.

#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++;
  }
//+------------------------------------------------------------------+

Mein Ergebnis:

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
Wie Sie sehen können, ist der Leistungsunterschied dreimal größer als bei der Standardversion.
 
Nikolai Semko:


Wie Sie sehen können, ist der Leistungsunterschied dreimal so groß wie bei der Originalversion.

Zeigt die Originalversion von fxsaber den GetBid-Vorteil, oder handelt es sich um einen leistungsfähigeren/weniger belasteten PC?

 
Andrey Khatimlianskii:

Zeigt die Originalversion von fxsaber einen GetBid-Vorteil, oder ist der PC leistungsfähiger/weniger belastet?

Seine Variante zeigte auch bei voller CPU-Auslastung einen GetBid-Vorteil. Aber gleichzeitig zeigt meine Variante den dreifachen Vorteil der regulären Funktion bei gleicher Belastung.
Das
liegt daran, dass meine Variante die durchschnittliche Zeit aller Iterationen berücksichtigt, um den Angebotspreis zu erhalten, und nur einen winzigen Teil mit anomalen Hängern.
Wer weiß, aus welchem Grund der Prozessor bei der regulären Funktion (wenn die Verzögerung mehr als 100 µ beträgt) in einer schwierigen "Minute" ins Stocken gerät. Dennoch ist die durchschnittliche Zeit für die reguläre Funktion dreimal kürzer

Dies ist z. B. der Fall, wenn (Intervall##A > 100):

wenn jedoch (Intervall##A > 0) bereits recht unterschiedlich ist, was eine Zufallsverteilung von abnormalen Verzögerungen zwischen der regulären und der alternativen Version der Erlangung des Geldkurses zeigt

zur gleichen Zeit zeigt mein Test bei der gleichen CPU-Last:

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

Daher denke ich, dass die von fxsaber vorgeschlagene Version des Tests alles andere als objektiv ist.

Ich habe die CPU nicht mit Agenten belastet, sondern mit diesem Skript. Es war effizienter.

Dateien:
LSD.mq5  6 kb
 

nach einer leichten Änderung des fxsaber-Tests, um deutlich zu machen, welcher Prozentsatz der Iterationen in die Berechnungen einfließt:

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

d.h. etwa 0,01%.

Darauf können Sie wetten.
Wenn die durchschnittliche Ausführungszeit von SymbolInfoDouble(_Symbol, SYMBOL_BID) etwa 50 Nanosekunden beträgt, werden nur solche mit einer Ausführungszeit von über 100 000 Nanosekunden berücksichtigt.

Dateien:
 
Nikolai Semko:

nach einer leichten Änderung des fxsaber-Tests, um deutlich zu machen, welcher Prozentsatz der Iterationen in die Berechnungen einfließt:

d.h. etwa 0,01%.

Und ob.
Wenn die durchschnittliche Ausführungszeit von SymbolInfoDouble(_Symbol, SYMBOL_BID) etwa 50 Nanosekunden beträgt, werden nur die Iterationen gezählt, die länger als 100 000 Nanosekunden dauern.

Wir hätten einfach die Bedingung nicht mehr als 100 µs, sondern mehr als 3 µs machen können. Das Ergebnis war offenbar das gleiche. Der Gedanke war, dass es bei einer segmentierten Studie und bei unterschiedlichen Ausführungsbedingungen einen Unterschied in verschiedenen Segmenten und in verschiedenen Abschnitten geben könnte. Ausführungsprioritäten werden oft von irgendetwas abhängig gemacht. Bei geringer Last einige Prioritäten, bei hoher Last andere, bei kritischer Last diejenigen, die den Computer nicht hängen lassen und zum Absturz bringen, und die Leistung tritt in den Hintergrund.

Im Allgemeinen ist es nicht richtig, mit einer Auslastung von mehr als 70 % der Hardware zu handeln. Es ist eine fast kritische Leistung. Die Eisenbelastung von Kampf-EAs sollte 60 % nicht überschreiten.

 
Ich werde eine Weile nicht an meinem Computer sitzen, also werde ich mich kurz fassen.

Im Algotrading kümmert sich niemand um die durchschnittliche Temperatur im Krankenhaus, wenn es regelmäßig zu Ausfällen kommt. Preise in Millisekunden zu erhalten, ist ein alltägliches Phänomen. Und das in einer Kampfumgebung.

Wenn es möglich ist, Preise ohne Verzögerungsspitzen zu wichtigen Handelszeitpunkten zu erhalten, dann werde ich für genau diese Möglichkeit kämpfen.

Ich habe mit dem Code bewiesen, dass eine solche Krücke existiert. Wenn Sie Verzögerungen vermeiden wollen, benutzen Sie die Krücke.

Niemand hier hat sich jemals den Code angesehen, der die erhaltenen Preise vergleicht, wenn man auch mit einem Tumbler arbeitet. Und hier stellen sich, gelinde gesagt, ernste Fragen.

Tatsache ist, dass die reguläre Funktion häufiger katastrophal zurückbleibt als die Krücke. Und es ist mir egal, dass die durchschnittliche Zeit nahe bei Null liegt. Es sind die Verzögerungen, die beim Handel Probleme verursachen

Sie wollen HFT - vergessen Sie sogar die langsame Millisekunden-Ebene für jetzt.
 
haben Sie bereits HFT-Broker?)
 
secret:
und haben Sie bereits HFT-Broker?)
Ja.
 
Igor Makanu:

Versuchen Sie, SymbolInfoTick zu testen, wenn es nur ein Symbol in der Marktübersicht gibt und wenn es Dutzende von Symbolen gibt, aber fragen Sie nach einem Tool - wie in Ihrem Beispiel

es ist sehr wahrscheinlich, dass der Server komprimierten Datenverkehr sendet und dass SymbolInfoTick beim Dekomprimieren der Daten periodische Verzögerungen erfährt

d. h., wenn es viele Symbole gibt, wird es noch häufigere oder tiefere Einbrüche in der Testzeit geben

In neueren Builds hat der Empfang von Tick-Streams nicht einmal theoretisch einen Effekt. Praktisch funktioniert SymbolInfoTick bereits mit Cache, aber einige Bürger suchen immer noch nach einer schwarzen Katze.

Ich sehe keinen Sinn darin, mit einem zu 80 % ausgelasteten Prozessor zu testen.

In dem Test sind es nicht einmal 80 %. Es laufen 6 Agenten auf 4 Kernen, d.h. 100% garantiert.

Die einzige Frage ist, wie der Taskplaner seines Systems mit dieser Situation umgeht. Gleichzeitig wird behauptet, dass es an der Umsetzung der Terminals liegt, die dafür verantwortlich ist.

Das heißt, es wird künstlich eine Situation geschaffen, in der ein Computer überlastet ist, in der buchstäblich alles auf ihm langsamer wird, und dann werden Behauptungen aufgestellt in der Form "Oh, sieh mal, warum ist der Terminal manchmal lags".

Verschließen wir die Augen vor der Tatsache, dass es selbst unter solchen Bedingungen "etwa 0,01 %" sind - zum Teufel mit den Details! Es genügt zu sagen, dass "sich niemand für die durchschnittliche Temperatur im Krankenhaus interessiert", "Verzögerungen beim Handel Probleme verursachen" und "wir wollen HFT".

Außerdem wollen wir natürlich HFT in 20 Experten auf einem alten Büro-Desktop oder einer toten virtuellen Maschine.

PS PositionSelectByTicket() hat in seiner Implementierung sicherlich Zugriff auf eine gemeinsame Ressource mit Zugriffssynchronisierung. Und wenn Sie nicht bei jedem Anruf die Position auswählen, lesen Sie den alten Kurs. Es war einfacher, einen "Schnappschuss" über SymbolInfoDouble zu machen.

Ордерa, позиции и сделки в MetaTrader 5
Ордерa, позиции и сделки в MetaTrader 5
  • www.mql5.com
Конечной целью трейдера является извлечение прибыли посредством торговых операций на финансовых рынках. В этой статье дается описание терминов и процессов торговой платформы MetaTarder 5, знание которых необходимо для правильного понимания работы торговых функций языка MQL5. Ордера — это принятые торговым сервером запросы на совершение торговых...
 
Kann der Echtzeit-Kernel in irgendeiner Weise helfen?