MT5 und Geschwindigkeit in Aktion - Seite 80

 
fxsaber:

ZS Es wäre gut, die seit Monaten andauernden Hängepartien loszuwerden. Führen Sie dieses Skript auf einem Rechner mit unendlich viel RAM aus. Ich kann zum Beispiel keine Zecken vom 1. Juni hochladen, sondern nur ein Zeichen nach dem anderen. Es hängt einfach CopyTicks mit null Ressourcenverbrauch.

b2699 - behoben, danke.

 
Zum Sparschwein der Codes, die die Bremsen demonstrieren. Diesmal Tester.
 

Forum zum Thema Handel, automatische Handelssysteme und Testen von Handelsstrategien

Annahme von SL/TP-Aufträgen

fxsaber, 2020.12.11 09:17

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

Es wurden 100 Zecken verarbeitet. Die Ankunftszeit zwischen dem Server und dem Terminal variiert 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 die Annahme von Aufträgen.

 
Um Handelsverzögerungen zu reduzieren, empfehle ich, das Battle-Terminal auf das RAM-Laufwerk zu übertragen.
 

Unerwartet stieß ich auf einen Tick, der in der Historie fehlte, obwohl er in Market Watch auftauchte: SymbolInfoTick.



Der Ausdruck desselben Ticks durch MQL zeigt eine interessante Flagge.

                         [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
        [0] 2021.01.04 20:52:55 103.16300 103.16500 0.0000        0 1609793575267       4       0.00000
        [1] 2021.01.04 20:52:55 103.16300 103.16400 0.0000        0 1609793575788       4       0.00000
        [2] 2021.01.04 20:52:59 103.16400 103.16400 0.0000        0 1609793579367     130       0.00000
        [3] 2021.01.04 20:53:01 103.16400 103.16400 0.0000        0 1609793581817       2       0.00000
        [4] 2021.01.04 20:53:01 103.16300 103.16400 0.0000        0 1609793581969       2       0.00000

Diese Flagge wurde an dem Tick in der Historie gebildet, der unmittelbar vor dem fehlenden Market Watch-Tick lag. Vielleicht erfahren wir dadurch, wo das Problem liegt.


ZS Leider geschieht dies systematisch. Der Zeckenverlauf enthält nicht alle Zecken, die zum Terminal kommen.

 
fxsaber:

Unerwartet stieß ich auf einen Tick, der in der Historie fehlte, obwohl er in Market Watch auftauchte: SymbolInfoTick.



Der Ausdruck desselben Ticks durch MQL zeigt eine interessante Flagge.

Diese Flagge wurde an dem Tick in der Historie gebildet, der unmittelbar vor dem fehlenden Market Watch-Tick lag. Vielleicht erfahren wir dadurch, wo das Problem liegt.


ZS Leider geschieht dies systematisch. Der Zeckenverlauf enthält nicht alle Zecken, die zum Terminal kommen.

Sagen wir, der EA handelt einen ganzen Tag auf einem echten Konto und erzielt einen Gewinn.

Am nächsten Tag lasse ich den Tester am Vortag laufen und erhalte einen Verlust.

Ich verstehe den Grund nicht, entweder gibt der Broker die falschen Ticks oder etwas anderes...

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
Информация о счете - Состояние окружения - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

MT5 und Geschwindigkeit in Aktion

fxsaber, 2021.01.04 20:51

Unerwartet stieß ich auf ein fehlendes Tick in der Geschichte, trotz der Tatsache, dass es auf den Market Watch kam: SymbolInfoTick.


Ich habe ein paralleles Terminal gestartet, wobei tkc nicht vom Terminal erzeugt, sondern vom Server hochgeladen wurde.

Auf dem Screenshot ist dieses Terminal auf der linken Seite zu sehen - das Häkchen ist vorhanden. Aber auf dem anderen Terminal (rechts) - ist es nicht!


Es hat sich herausgestellt, dass das Terminal selbst nicht alle eingehenden Ticks in den Tickverlauf aufnimmt. Wenn Sie den Verlauf ohne Auslassungen haben möchten, sollten Sie die tkc-Datei hinzufügen und vom Server abrufen.

Unangenehmer Fehler.

 
// Попытка поймать тик, который не попал в историю тиков.

// Сравнение двух тиков.
bool IsEqual( const MqlTick &Tick1, const MqlTick &Tick2 )
{
  return((Tick1.time_msc == Tick2.time_msc) &&
         !NormalizeDouble(Tick1.bid - Tick2.bid, _Digits) &&
         !NormalizeDouble(Tick1.ask - Tick2.ask, _Digits));
}

// Проверяет наличие тика в истории.
bool IsHistory( const MqlTick &Tick )
{
  bool Res = false;
  
  MqlTick Ticks[];
  
  const int Size = CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, Tick.time_msc, Tick.time_msc + 1);
  
  for (int i = 0; !Res && (i < Size); i++)
    Res = IsEqual(Tick, Ticks[i]);
    
  return(Res);
}

void OnTick()
{
  static MqlTick Ticks[];
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick)) // Взяли текущий тик.
  {
    const int Size = ArrayResize(Ticks, ArraySize(Ticks) + 1);
    
    Ticks[Size - 1] = Tick; // Дописали его в массив
    
    MqlTick HistoryTick[1];
    
    if (CopyTicks(_Symbol, HistoryTick, COPY_TICKS_ALL, 0, 1) > 0) // Взяли последний исторический тик
    {
      int i = 0;
      
      while ((i < Size) && (Ticks[i].time_msc < HistoryTick[0].time_msc)) // Если исторический тик пришел позже проверяемого
      {
        if (!IsHistory(Ticks[i]))                                    // Если в истории тиков нет проверяемого тика,
        {
          Alert("!IsHistory(Ticks[i]) == true");
          ArrayPrint(Ticks, _Digits, NULL, i, 1, ARRAYPRINT_HEADER); // выводим его.
        }
          
        i++;
      }
      
      ArrayRemove(Ticks, 0, i); // Удалили тики, что проверили.
    }
  }  
}

Ein solcher EA könnte keine in der Vergangenheit verpassten Ticks auffangen. Das war der Kampf. Offensichtlich lösen diese Ticks den OnTick nicht aus.

Die verpassten Ticks selbst können einige zehn Millisekunden lang aktuell sein.

 
fxsaber:
Oben war ein Beitrag mit dem Quellcode. Sie ist jetzt leer. Der Grund?
Der Beitrag muss bei der Aktualisierung der Website verfasst worden sein (es gibt zwei solcher Beiträge im englischen Teil).
 
fxsaber:

Ich habe ein paralleles Terminal laufen lassen, in dem die tkc nicht vom Terminal erzeugt, sondern vom Server hochgeladen wurde.

Auf dem Screenshot dieses Terminals auf der linken Seite ist das Häkchen vorhanden. Aber auf dem anderen Terminal (rechts) ist das nicht der Fall!

Ich habe dieses Skript auf beiden Terminals ausgeführt.

// Сохранение тиковой истории в текстовый файл.

string GetTickFlag( uint tickflag )
{
  string flag = " " + (string)tickflag;

#define  TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " TICK_FLAG_" + #A : ""; \
                        tickflag -= tickflag & TICK_FLAG_##A;
 TICKFLAG_MACRO(BID)
TICKFLAG_MACRO(ASK)
TICKFLAG_MACRO(LAST)
TICKFLAG_MACRO(VOLUME)
TICKFLAG_MACRO(BUY)
TICKFLAG_MACRO(SELL)
#undef  TICKFLAG_MACRO

  if (tickflag)
    flag += " FLAG_UNKNOWN (" + (string)tickflag + ")";

  return(flag);
}

#define  TOSTRING(A) " " + #A + " = " + (string)Tick.A
string TickToString( const MqlTick &Tick, const int FilterFlags = 0xFF )
{
  return(TOSTRING(time) + "." + ::IntegerToString(Tick.time_msc % 1000, 3, '0') +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags & FilterFlags));
}
#undef  TOSTRING


void OnStart()
{  
  MqlTick Ticks[];
  const int Size = CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, D'2021.01.05 01:00' * 1000, D'2021.01.05 10:50' * 1000);
  
  string From = (string)Ticks[0].time;
  string To = (string)Ticks[Size - 1].time;
  
  StringReplace(From, ":", ".");
  StringReplace(To, ":", ".");
  
  const int handle = FileOpen(_Symbol + "_" + From + "-" + To + ".txt", FILE_WRITE | FILE_ANSI | FILE_TXT);

  if (handle != INVALID_HANDLE)
  {        
    for (int i = 0; i < Size; i++)
      FileWrite(handle, TickToString(Ticks[i], 0x7F)); // Фильтр флагов, иначе очень много различий.

    FileClose(handle);
  }
  
  Alert("Done.");
}


Je nachdem, welches Intervall Sie anfordern, kann sich tkc ändern (Synchronisierung mit dem Server). Daher kann es sein, dass einige Häkchen, die vor der Anfrage fehlten, jetzt wieder vorhanden sind.

Trotzdem war es möglich, einige von ihnen an verschiedenen Zeichen zu erkennen. Ich musste einen Flaggenfilter anwenden, da sie für Zecken auf verschiedenen Terminals sehr unterschiedlich sind.

So sehen die Unterschiede aus.


EURJPY.


USDCHF .


Beim Handel in Echtzeit kann es vorkommen, dass einige Ticks nicht in der Tick-Historie erscheinen, da sie sich im Terminal befinden und auf dem Server sein können.

Dieser Fehler muss behoben werden.