MT5 und Geschwindigkeit in Aktion - Seite 30

 
Renat Fatkhullin:

ein synchronisiertes Symboldatenbankobjekt. Lese-/Schreib-Loks werden vermischt, da ein ständiger Tick geschrieben wird.

Gibt es ein Symboldatenbankobjekt für alle Symbole gleichzeitig? Wenn ja, dann zeigt sich, dass die Anforderung eines Ticks für EURUSD die Anforderung eines Ticks für GBPUSD möglicherweise verlangsamt.


Können Sie ein MqlTick für es vorbereiten, wenn OnTick aufgerufen wird, so dass es nicht von der Datenbank auf der allgemeinen Basis angefordert wird?

 
fxsaber:

Können Sie ein MqlTick für OnTick vorbereiten, so dass es nicht von der Datenbank auf der allgemeinen Basis aufgerufen wird?

Das wäre gut, dann vielleicht MQL5 wird vordefinierte Variablen wie in 4 haben - Ask und Bid

 

Höchstwahrscheinlich wird die Verlangsamung durch einen hohen CPU-Verbrauch auf der MT5-Seite verursacht, wenn viele EAs ausgeführt werden. Ich weiß nicht, wie es bei MT4 ist. Ansonsten ist es schwer zu erklären, warum in einem parallel laufenden leeren Terminal Verzögerungen auftreten.

Die Minimierung der Verwendung der Handelsumgebungs-API wird das Problem mit Sicherheit lösen. Nach dem Tamburintanz werde ich über die Ergebnisse berichten.

 
fxsaber:

Das ist ein Irrtum. Jeder EA ist rein handelbar (im Tester durch echte Ticks nicht verlangsamt) und hängt nicht von anderen ab. Die gesamte Handelslogik wird nur in OnTick ausgeführt, kein Spamming von Handelsaufträgen, keine Rekursion, keine Globalisierung und keine Ressourcen.

OnTrade*, OnBook werden nicht verwendet. Zweiter Timer und OnChartEvent für den Fall, dass bestimmte Tasten gedrückt werden.


Ich bin sicher, dass die richtige Implementierung von Snapshots (durch Sie oder mich) die Anzahl der Aufrufe der regulären Umgebungsfunktionen erheblich reduzieren wird. Dementsprechend werden die Verzögerungen drastisch reduziert.

Ich hätte nie gedacht, dass es zu Schnappschüssen kommen würde. Ich studiere das Thema, weil die Standard-MT5-EA-Implementierung ist lahm, leider.

Ich kann Ihren Fall überhaupt nicht glauben.

Wir haben unsere Berechnungen gezeigt
 
Renat Fatkhullin:
Ich glaube in Ihrem Fall überhaupt nicht daran.

Über TeamViewer oder ähnliches, bereit zur Demonstration.

 
::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)

Wie kann ich den Speicherverbrauch des Terminals reduzieren? Ich verwende frische Ticks von CopyTicks für 16 Zeichen. Es scheint, dass jeder CopyTicks 128K Ticks im Speicher hält. Ich brauche sie überhaupt nicht, aber ich behalte sie im Gedächtnis. Wozu braucht es fast 1,5 GB? Können Entwickler sehen, welcher Teil des Speichers wofür verwendet wird? Ein rudimentärer Task-Manager.

 
fxsaber:

Höchstwahrscheinlich wird die Verlangsamung durch einen hohen CPU-Verbrauch auf der MT5-Seite verursacht, wenn viele EAs ausgeführt werden. Ich weiß nicht, wie es bei MT4 ist. Ansonsten ist es schwer zu erklären, warum in einem parallel laufenden leeren Terminal Verzögerungen auftreten.

Die Minimierung der Verwendung der Handelsumgebungs-API wird das Problem mit Sicherheit lösen. Ich werde über die Ergebnisse schreiben, nachdem ich mit Tamburinen getanzt habe.

Das ist genau das, worüber ich vor ein paar Seiten gesprochen habe. Außerdem können EAs recht einfach sein und auf nicht-flüssigen Symbolen basieren, d.h. es geht nicht um die Anzahl der mathematischen Operationen, die im Code jedes EAs vorkommen. Das Problem liegt im Terminal selbst, und wir werden nicht in der Lage sein, es durch Verbesserung unseres Codes zu beheben. Leider :(

P.S. Ich habe die Logik, die in der Hälfte meiner Expert Advisors verwendet wird, von OnBook zurück auf OnTick umgeschrieben und den Core i5 durch Xeon E5-2678 ersetzt. Es scheint, dass die Geschwindigkeit zunehmen sollte, aber leider ist das Wunder nicht geschehen :(

 
HistorySelect verzögert sich in OnTrade-Funktionen.
// Демонстрация лага 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));  
}


Bei fast jedem Schritt.

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.


Hoffentlich dauern Cache-Builds nicht so lange, und die Verzögerung ist auf den Datenbankzugriff während der Datenbankaktualisierung zurückzuführen.

 

Irgendeine Idee, warum mt5 nicht über die Registerkarte "Provisionen"? Sie erscheinen nur, wenn ein Geschäft abgeschlossen ist.

Irgendeine Idee, warum mt5 nicht über "Kommissionen" Registerkarte? Sie erscheinen nur, wenn ein Geschäft abgeschlossen ist.

 

Wenn Sie diesen EA auf einem Konto ohne aktuelle Positionen oder Aufträge ausführen.

// Создает маркет-ордер в случае, если нет текущих позиций и ордеров.
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();
}

und dann die vom EA eröffnete Position manuell schließen, dann gibt es drei offene Positionen in der Absicherung (auf der Netting-Dreifach-Volumen-Position).


Ist dies das richtige Verhalten? Wahrscheinlich habe ich das Terminal nicht richtig verstanden. Dann erklären Sie bitte.