Annahme von SL/TP-Aufträgen - Seite 4

 
Enrique Dangeroux:

https://www.mql5.com/ru/forum/341117 ist immer noch ein aktuelles Problem

Als ich das letzte Mal nachgesehen habe, wurde dieses Problem bei dem genannten Broker gelöst.

 

Liebe Entwickler, bitte beantworten Sie die folgende Frage zur Architektur. Die Informationen werden für einen Kampfeinsatz benötigt. Keine Ansprüche.


Es gibt zwei Begrenzer mit demselben Preis und unterschiedlichen Losen. Wovon hängt ihre Reihenfolge in der Reihenfolge der Aktivierungsauslöser ab?

Ich habe mehrere Antworten auf diese Frage.

  1. Auf dem Grundstück.
  2. Auf der Ticketnummer.
  3. Ab der letzten Änderung des Eröffnungskurses.
  4. Ab der letzten Änderung einer Order (z.B. wurde der Take Level bei einer Limit Order aktualisiert).

Wenn ich es richtig verstehe, wird der Limiter nach der Änderung des Eröffnungskurses entsprechend in die Listentabelle aller Limiter des Servers eingebaut, sortiert nach Eröffnungskurs. Die Antwort auf die Frage lautet dann, ob sie am Anfang der Liste der Aufträge mit demselben Preis oder am Ende eingebettet ist.


Die gleiche Frage bezieht sich nicht auf Grenzwerte, sondern auf Token. Wovon hängt die Reihenfolge der Auslösung identischer Takes ab? Ist es eine ID-Position oder etwas anderes?


Lassen Sie mich erklären, wie dies im Kampf helfen kann. Ich habe zum Beispiel zwei Begrenzer (oder Positionstees) auf derselben Ebene, aber mit unterschiedlichen Losen. Wenn die Ausführung des Limits (T-Stück) von der letzten Änderung abhängt, kann ich die FillRate einfach erhöhen, indem ich die Limiter in aufsteigenden Lot-Schritten ändere.


Wahrscheinlich kennt nur jemand, der die Implementierung des entsprechenden MT5-Serverteils geschrieben hat, die Antwort auf diese Frage.

 
Andrei Trukhanovich:

mit einem Makler zusammenarbeiten, um den Engpass zu finden

Was ist das? Bienen gegen Honig?)
 
fxsaber:

Es gibt zwei Begrenzer mit demselben Preis und unterschiedlichen Losen. Wovon hängt ihre Reihenfolge in der Reihenfolge der Aktivierungsauslösung ab?

Ich habe mehrere Antworten auf diese Frage.

  1. Auf dem Grundstück.
  2. Auf der Ticketnummer.
  3. Ab der letzten Änderung des Eröffnungskurses.
  4. Ab der letzten Änderung eines Auftrags (z.B. wurde der Take Level am Limit aktualisiert).

Ich glaube, Variante 4 wurde in der vierten Version verwendet. Das heißt, dass jede Änderung den Auftrag an das Ende der Warteschlange des entsprechenden Preisniveaus verschiebt.

 
secret:
Es ist wie Bienen gegen Honig?)

in diesem besonderen Moment, in dieser besonderen Situation, ist es für beide Seiten von Vorteil und wurde bereits durchgeführt. ein seltener Zufall.

 

TP-Aufträge im MT5 sind insofern bemerkenswert, als dass wir die FillRate untersuchen können (welcher Teil des Auftrags erfüllt wird).

Die Analyse von Zehntausenden solcher Aufträge hat gezeigt, dass die FillRate sehr stark vom Symbol abhängt. Wenn ein Paket von TP-Aufträgen gleichzeitig ausgelöst wird, sinkt die FillRate mit zunehmender Anzahl der Aufträge im Paket.

Auch andere spezifische Nuancen wurden aufgedeckt. Aber das ist bereits mit dem Makler besprochen.


Das Rezept zur Erhöhung der FillRate: Kombination aller gleichen Ticks und Limiter zu einem gemeinsamen MT5-Limit.


Diese Daten sind jedoch nur ein Bonus zu diesem Thema. Das brokerunabhängige Problem ist, dass MT5 mit Ticks und damit mit der Annahme von Pending Orders (einschließlich SL/TP-Levels) im Rückstand ist.


Und nach einer Umleitung wartet MT5 jedes Mal auf den nächsten Tick, um zu prüfen, ob der Preis das TP-Niveau (oder Limit) erfüllt oder nicht. Dies kann bis zu Sekunden dauern. Und die Kontrolle sollte immer unmittelbar nach der Wiederbefüllung (oder Teilbefüllung) durchgeführt werden.

Dateien:
 
fxsaber:

OnTick wird ein paar Millisekunden später ausgelöst, als der Tick auf den Handelsserver geschrieben wird.

// Измеряет размер лага между приходом тика на MT5-сервер и MT5-Терминал.
// Запускать на той же машине, на которой установлен MT5-сервер.

#include <WinAPI\WinAPI.mqh>

input int inPeriod = 10;  // EMA-period
input int inAmount = 100; // Количество тиков для анализа

// Локальное время в миллисекундах.
long TimeLocalMsc()
{
  SYSTEMTIME SystemTime;
  
  kernel32::GetLocalTime(SystemTime);

  MqlDateTime time;
  
  time.year = SystemTime.wYear;
  time.mon = SystemTime.wMonth;
  time.day = SystemTime.wDay;
  time.hour = SystemTime.wHour;
  time.min = SystemTime.wMinute;
  time.sec = SystemTime.wSecond;


  return((StructToTime(time) * 1000 + SystemTime.wMilliseconds));
}

double EMA = 0;
int MaxValue = 0;
int MinValue = INT_MAX;
int Amount = 0;

void OnTick()
{
  static const double Alpha = 1.0 / inPeriod; // EMA-коэффициент для расчета среднего значения.

  MqlTick Tick;
  
  const long time = TimeLocalMsc(); // Локальное время в миллисекундах

  if (SymbolInfoTick(_Symbol, Tick))
  {
    const int Value = (int)(time - Tick.time_msc); // На сколько локальное время отличается от тика.
    
    MaxValue = MathMax(Value, MaxValue); // Максимальное значение.
    MinValue = MathMin(Value, MinValue); // Минимальное значение.
    
    EMA += (Value - EMA) * Alpha; // Среднее значение
    
    if (++Amount >= inAmount) // Если посчитали все тики - распечатываем и выходим.
    {
    #define  TOSTRING(A) #A + " = " + (string)(A) + "\n"      
      Print(TOSTRING(Amount), TOSTRING(MinValue) + TOSTRING(MaxValue) + TOSTRING(EMA) +
            TOSTRING(TerminalInfoInteger(TERMINAL_PING_LAST)));
      
      ExpertRemove();
    }
  }
}


Ergebnis.

Amount = 100
MinValue = 1
MaxValue = 8
EMA = 4.344007436833947
TerminalInfoInteger(TERMINAL_PING_LAST) = 42


Es wurden 100 Zecken verarbeitet. Die Ankunftszeit zwischen dem Server und dem Tick-Terminal schwankt zwischen einer und acht Millisekunden. Der Durchschnitt liegt bei etwas mehr als vier Millisekunden. Dies entspricht gerade der Verzögerung bei der Auslösung der TP-Bestellung, mit der dieser Zweig begann.


Der Lag selbst befindet sich innerhalb des MT5-Servers. Der Kanal Server->Terminal hat damit nichts zu tun.


Große Bitte an die Entwickler, diese Verzögerung zu beseitigen. Mit Null Pings haben wir nun eine konstante Verzögerung von Ticks, die nicht nur am Terminal, sondern auch am Server ankommen. Insbesondere nimmt die Bestellung an.


ZS Für diejenigen, die Küchenmakler durch Arbitrage ausnehmen, ist diese eingebaute Verzögerung wie ein Geschenk des Himmels. D.h. die Makler gehen ein erhebliches zusätzliches Risiko ein.

 
Auf welchem Server haben Sie das überprüft?

Mit welchem Tool und welchem Gateway/Datendisplay haben Sie die Ausgangsdaten erstellt?

Wenn die Zeit von einem Kursanbieter auf der entfernten Seite (z. B. einem Börsen-Gateway) und nicht vom MT5-Server selbst generiert wurde, kann eine Lücke bestehen.

Welche Hintergrundprozesse könnten Sie vergessen, z. B. Stresstests mit Zehn- und Hunderttausenden von Parallelgeschäften?
 

Renat Fatkhullin:
На каком сервере проверяли?

Auf vielen Servern geprüft. Einschließlich MQ-Demo.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Annahme von SL/TP-Aufträgen

fxsaber, 2020.11.25 00:47

Ergebnis der Ausführung auf MQ-Demo.

Total Orders (from 2020.09.01 00:00:00) = 58493, calculated = 439
Calculation time = 00:00:11.328, Performance = 38.0 orders/sec.

ServerName: MetaQuotes-Demo

Last Tick 2020.09.30 19:07:32.917 1.80181 1.80205
Accepted Tick 2020.09.30 19:07:32.716 1.80178 1.80202
Accepted Length = 357 ms.
Order 726444166 ORDER_TYPE_BUY GBPAUD 2020.09.30 19:07:33.073 1.80206 ORDER_REASON_TP ORDER_STATE_FILLED 2020.09.30 19:07:33.082, Position created 2020.09.30 17:21:17.933, StopLevel = 0

Orders (2) before 726444166 with PositionID = 725926764:
------------------------
Checked Orders = 0
------------------------


Das Skript behauptet, einen TP-Auftrag und einen Tick gefunden zu haben, der der Auslöser für seine Erstellung war (im Text farblich hervorgehoben). Es scheint, dass, wenn der Preis das TP-Niveau einer offenen Position auf dem Handelsserver (insbesondere auf dem Demoserver) erreicht hat, die entsprechende TP-Order sofort erstellt (nicht unbedingt ausgeführt) werden sollte. In diesem Fall geschah dies jedoch nicht sofort, sondern erst nach 357 Millisekunden!


Auf welchem Gerät und welchem Gateway/Datendisplay entstanden die Ausgangsdaten?

Ich habe Forex-Tools, RannForex-Server und AMTS-Gateway überprüft. Andere Konfigurationen sind zu klären.

Wenn die Zeit vom Kursanbieter auf seiner Gegenseite (z.B. dem Börsen-Gateway) gebildet wurde, und nicht vom MT5-Server selbst, dann kann die Lücke sein.

Ich glaube, dass der MT5-Server auf einem Rechner mit Null-Ping gebildet wurde. Erfordert aber eine Klärung für eine 100%ige Garantie. Allerdings zeigte die oben, dass auch auf Ihrem Server das Problem.

 
fxsaber:

Bei der Untersuchung der Ausführung von TP-Aufträgen ist mir aufgefallen, dass einige TP-Aufträge mit einer erheblichen Verzögerung gegenüber den Ticks, die sie angenommen haben, erstellt wurden.

Die Nachbesprechung ergab, dass sich diese Situation nicht nur bei verschiedenen Brokern wiederholt, sondern auch dann, wenn der Handel über das Terminal erfolgt, das sich auf demselben Rechner wie der Handelsserver befindet. D.h. mit einem sehr niedrigen Ping und einem einzigen Handelskonto für den Handelsserver.

Ich möchte Sie ermutigen, die Ergebnisse Ihrer Konten mitzuteilen. Helfen Sie mit, den MT5 zu verbessern!

Sie haben ein sehr kleines Detail "vergessen" - Sie haben 58.000 Aufträge geprüft und nur einen Fall von Überschreitung bei 300 ms gefunden. Und darauf (1 von 58 000) hätten Sie sich bei diesen Kontrollen eindeutig konzentrieren müssen.

Genau wie bei den früheren Millionen-Schecks, bei denen man ebenfalls nach einem einzelnen Ausreißer suchte und so tat, als sei dies ein normales Verhalten.


Wir haben die Logs des Servers überprüft und konnten sehen, dass unsere Virtualisierung mit dem MetaQuotes-Demo-Server in diesen Sekunden physisch krank war (um 2020.09.30 19:07 für 4 Sekunden), denn es gab etwa 15 Mio. Konten und etwa 2 Mio. offene Positionen, und in der Zwischenzeit passierte etwas auf den benachbarten virtuellen Servern und dem Hypervisor.

Wir werden uns das auf jeden Fall genauer ansehen, obwohl es in jedem System immer wieder einzelne Ausschläge gibt.