MT5 und Geschwindigkeit in Aktion - Seite 18

 
Renat Fatkhullin:

Sie haben nur zwei Staaten 5000 und eine unbegrenzte?

Du bist der Meister deines eigenen Glücks.

Ja, Sie brauchen entweder eine vollständige Kontrolle oder eine oberflächliche Kontrolle. Ich sehe keinen Sinn in dem Dazwischen.
 
Renat Fatkhullin:

Theoretisch, ja.

Vergessen Sie nicht die Synchronisationsprozesse. Eine große Anzahl von Prozessen auf der Plattform ist asynchron.

Eine Gateway-Integration mit einer Börse oder einem Liquiditätsanbieter kann zum Beispiel Transaktionsberichte mit Verzögerungen von Sekunden oder sogar Minuten senden. Häufig bietet die API überhaupt keinen Zugriff auf die Historie für den Abgleich, sondern liefert langsame und unrhythmische Berichtsgeneratoren.

Bei Marktöffnung oder aufgrund einer unerwarteten Gateway-Neuverbindung können sich die Berichte verzögern. Sie werden in den Verlauf auf dem Server repliziert und sofort asynchron an die Terminals gesendet. Durch die Sortierung nach Datum werden sie an den richtigen Stellen eingefügt, und in der Zwischenzeit können Sie neue Geschäfte eröffnen.

Die meisten Integrations-APIs sind so unausgereift und dysfunktional, dass sie es fast unmöglich machen, garantierte Gateways zu schaffen. Allerdings gibt es die Meinung, dass dies ein Produkt der absichtlichen Sabotage durch ihre Entwickler ist.

Sollten wir das Recht auf Wahlfreiheit gewähren? Wer braucht physische Schnappschüsse und wer braucht genug, um mit Indizes mit entsprechenden Risiken zu arbeiten.

 
Kommentare, die sich nicht auf dieses Thema beziehen, wurden nach "Fragen von MQL5 MT5 MetaTrader 5 Anfängern" verschoben.
 
fxsaber:

Sollten wir das Recht zu wählen geben? Wer braucht physische Schnappschüsse und wer braucht genug, um mit Indizes mit den entsprechenden Risiken zu arbeiten.

Was ist das Problem mit einem lokalen Cache auf dem EA und einer Stichprobe in Bezug auf die letzte Aktualisierungszeit? Das tue ich und hatte noch nie irgendwelche Verzögerungen damit. Meine Netzwerk-Funktionen verlangsamen die gesamte Schnittstelle wegen seiner synchronen Implementierung, es wäre schön, WebRequestAsync aus der Box zu haben, obwohl ich bereits an DLL oder sogar Bindung Python und C++ Wrapper suchen, da es eine Handels-API in Python ist :)

Aber die Arbeit mit großen Datenmengen ohne lokale Zwischenspeicherung ist sehr seltsam.

PS. Im Allgemeinen sind Hash-Masken und Caching in der Mehrfachwährung sehr gefragt, und deshalb habe ich oben in diesem Thread nach normalen (sprich schnellen) Hash-Masken gefragt, die sofort einsatzbereit sind.
Документация по MQL5: Сетевые функции / WebRequest
Документация по MQL5: Сетевые функции / WebRequest
  • www.mql5.com
Для использования функции WebRequest() следует добавить адреса серверов в список разрешенных URL во вкладке "Советники" окна "Настройки". Порт сервера выбирается автоматически на основе указанного протокола - 80 для "http://" и 443 для "https://". Функция WebRequest() является синхронной, это означает, что она приостанавливает выполнение...
 
Andrey Pogoreltsev:

Was ist das Problem mit einem lokalen Cache auf dem EA und einer Stichprobe in Bezug auf die letzte Aktualisierungszeit?

DasDrehbuch tut genau das.

Was den lokalen Cache betrifft, so ist die Historie in MT4Orders auf diese Weise implementiert.

 
fxsaber:

Was den lokalen Cache angeht, so hat MT4Orders die Geschichte so umgesetzt.

Ich habe nicht erwartet, dass das Skript, das zwei Jahre alt ist

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

OrderCloseTime Expert Advisor MQL5

fxsaber, 2018.07.06 00:49

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

void LastTimeMQL4( datetime &OpenTime, datetime &CloseTime )
{
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      OpenTime = OrderOpenTime();
      CloseTime = OrderCloseTime();
      
      break;
    }
}

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  if (HistorySelect(0, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
  
      if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
          OpenTime = (datetime)HistoryDealGetInteger(HistoryDealGetTicket(0), DEAL_TIME);
          
        break;
      }
    }
  }
}

typedef void (*GetLastTime)( datetime&, datetime& );

void Bench( GetLastTime LastTime, const int Amount = 10000 )
{
  datetime OpenTime, CloseTime;
  datetime Tmp = 0;

  for (int i = 0; i < Amount; i++)
  {
    LastTime(OpenTime, CloseTime);
    
    Tmp += CloseTime - OpenTime;        
  }
  
  Print(Tmp);
}

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
    PRINT(HistoryDealsTotal());

  BENCH(Bench(LastTimeMQL4))
  BENCH(Bench(LastTimeMQL5))  
}


werden solche Bremsen zeigen!

// Первый запуск
2020.08.28 22:01:12.941 HistoryDealsTotal() = 9435
2020.08.28 22:01:13.198 2046.04.30 00:13:20
2020.08.28 22:01:13.198 Time[Bench(LastTimeMQL4)] = 257277
2020.08.28 22:01:43.982 2046.04.30 00:13:20
2020.08.28 22:01:43.982 Time[Bench(LastTimeMQL5)] = 30783493

// Второй запуск
2020.08.28 22:03:31.474 HistoryDealsTotal() = 9435
2020.08.28 22:03:31.724 2046.04.30 00:13:20
2020.08.28 22:03:31.724 Time[Bench(LastTimeMQL4)] = 250491
2020.08.28 22:04:02.011 2046.04.30 00:13:20
2020.08.28 22:04:02.011 Time[Bench(LastTimeMQL5)] = 30286258

Reines MQL5 ist 100 Mal langsamer als partielles (nur HistorySelectByPosition) Caching.

 
Der Test ist in keiner Weise akzeptabel.

Für MQL5 haben Sie speziell 10 000 Proben von HistorySelect in der gesamten Tiefe getestet. Und Sie haben auch zusätzliche Zyklen hinzugefügt.

Ohne eine klare anfängliche Erklärung der Bedingungen, die ihre offensichtliche Voreingenommenheit erklärt und schockierende Zahlen nennt - das ist Betrug und Manipulation in Reinkultur.

Für ein solches Foulspiel mit einem Eisenhut-Ticket.
 
Renat Fatkhullin:
Der Test ist in keiner Weise akzeptabel.

Für MQL5 haben Sie speziell 10 000 Proben von HistorySelect in der gesamten Tiefe getestet. Und Sie haben auch zusätzliche Zyklen hinzugefügt.

Ohne eine klare anfängliche Erklärung der Bedingungen, die ihre offensichtliche Voreingenommenheit erklärt und schockierende Zahlen nennt - das ist Betrug und Manipulation in Reinkultur.

Für ein solches Foulspiel mit einem Eisenhut-Ticket.

Ihre Wahrnehmung ist also falsch. Es wird gezeigt, dass es richtig ist, sich selbst zu verbergen, damit einem kein Dorn im Auge bleibt.

Wenn ich es richtig verstehe, wird nach dieser Umsetzung.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

MT5 und Geschwindigkeit in Aktion

Renat Fatkhullin, 2020.08.27 22:58

Wir haben bereits viele Abtastvorgänge optimiert und denken nun über eine optimale Aktualisierung des Cache nach, obwohl in Wirklichkeit 99 % der Abtastungen völlig nutzlos sind und übersehen werden.

Das heißt, dass der Cache Treffer nahe 100 % anzeigt, es sei denn, Sie setzen die Stichprobengrenzen gezielt nach dem Zufallsprinzip fest.

Wahrscheinlich wird es schon nächste Woche eine wirksame Lösung geben.


wird dieses Beispiel viel schneller laufen.


HH Das Skript berechnet die Eröffnungs-/Schließungszeit der letzten Position in der Handelshistorie.

 
fxsaber:

Zeigt Ihnen, wie Sie sich richtig cachen, damit Sie nicht abgeworfen werden.

Wenn Sie so "cachen", wird es superschnell sein.

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  static ulong PrevTicketIn = 0;  // Хранит тикет входа позиции с последнего вызова.
  static ulong PrevTicketOut = 0; // Хранит тикет выхода позиции с последнего вызова.
  
  if (HistorySelect(0, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
      
      if (Ticket == PrevTicketOut)            
      {
        OpenTime = (datetime)HistoryDealGetInteger(PrevTicketIn, DEAL_TIME);
        CloseTime = (datetime)HistoryDealGetInteger(PrevTicketOut, DEAL_TIME);        
        
        break;
      }
      else if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        PrevTicketOut = Ticket;
        
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
        {
          PrevTicketIn = HistoryDealGetTicket(0);
          OpenTime = (datetime)HistoryDealGetInteger(PrevTicketIn, DEAL_TIME);
        }
          
        break;
      }
    }
  }
}

Wer schreibt denn so?

 
fxsaber:

Wenn Sie es so zwischenspeichern, ist es superschnell.

Wer schreibt denn so?

C-Programmierer.