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.
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.2622: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.203015272020.10.2622: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.886637632020.10.2622: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.034524552020.10.2622: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.643806012020.10.2622: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.248944042020.10.2622: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.03412782020.10.2622: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.114185782020.10.2622: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.429609182020.10.2622: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.711824342020.10.2622: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.
nach einer leichten Änderung des fxsaber-Tests, um deutlich zu machen, welcher Prozentsatz der Iterationen in die Berechnungen einfließt:
2020.10.2622:45:03.679 FxSaberBidSpeed (USDCAD,M1) Alert: , TimeBid1-TimeBid2 = 2142416 mcs., TimeBid1 = 2858669, TimeBid2 = 716253, Всего итераций - 31456223, из них принято во внимание, NBid1 = 3015, NBid2 = 17142020.10.2622:45:05.739 FxSaberBidSpeed (BTCUSD,M1) Alert: , TimeBid1-TimeBid2 = 1521696 mcs., TimeBid1 = 2282285, TimeBid2 = 760589, Всего итераций - 31417549, из них принято во внимание, NBid1 = 1794, NBid2 = 14182020.10.2622:45:06.006 FxSaberBidSpeed (USDJPY,M1) Alert: , TimeBid1-TimeBid2 = 2241890 mcs., TimeBid1 = 3204507, TimeBid2 = 962617, Всего итераций - 54138004, из них принято во внимание, NBid1 = 4401, NBid2 = 20832020.10.2622:45:09.099 FxSaberBidSpeed (EURUSD,M1) Alert: , TimeBid1-TimeBid2 = 1000828 mcs., TimeBid1 = 1496646, TimeBid2 = 495818, Всего итераций - 10037824, из них принято во внимание, NBid1 = 2429, NBid2 = 17112020.10.2622:45:14.803 FxSaberBidSpeed (USDCAD,M1) Alert: , TimeBid1-TimeBid2 = 2676273 mcs., TimeBid1 = 3916168, TimeBid2 = 1239895, Всего итераций - 41606744, из них принято во внимание, NBid1 = 4935, NBid2 = 37902020.10.2622:45:15.745 FxSaberBidSpeed (BTCUSD,M1) Alert: , TimeBid1-TimeBid2 = 1521696 mcs., TimeBid1 = 2282285, TimeBid2 = 760589, Всего итераций - 31417549, из них принято во внимание, NBid1 = 1794, NBid2 = 14182020.10.2622:45:16.115 FxSaberBidSpeed (USDJPY,M1) Alert: , TimeBid1-TimeBid2 = 2653810 mcs., TimeBid1 = 4195095, TimeBid2 = 1541285, Всего итераций - 64310228, из них принято во внимание, NBid1 = 6486, NBid2 = 38792020.10.2622: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.
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.
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.
Конечной целью трейдера является извлечение прибыли посредством торговых операций на финансовых рынках. В этой статье дается описание терминов и процессов торговой платформы MetaTarder 5, знание которых необходимо для правильного понимания работы торговых функций языка MQL5. Ордера — это принятые торговым сервером запросы на совершение торговых...
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
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.
Mein Ergebnis:
Wie Sie sehen können, ist der Leistungsunterschied dreimal größer als bei der Standardversion.
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?
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:
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.
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%.
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.
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.
und haben Sie bereits HFT-Broker?)
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.
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.