MT5 et la vitesse en action - page 80

 
fxsaber:

ZS Il serait bon de se débarrasser des blocages qui durent depuis des mois. Exécutez ce script sur une machine avec une RAM infinie. Par exemple, je ne peux pas télécharger les ticks du 1er juin, un seul caractère à la fois. Il ne fait que suspendre CopyTicks sans consommer de ressources.

b2699 - corrigé, merci.

 
Dans la tirelire des codes qui montrent les freins. Cette fois, Tester.
 

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Acceptation des ordres SL/TP

fxsaber, 2020.12.11 09:17

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

100 tiques ont été traitées. Le délai d'arrivée entre le serveur et le terminal varie de une à huit millisecondes. La moyenne est d'un peu plus de quatre millisecondes. C'est juste égal au décalage du déclenchement de l'ordre TP, qui est à l'origine de cette branche.


Le décalage lui-même se trouve à l'intérieur du serveur MT5. Le canal Serveur->Terminal n'a rien à voir avec cela.


Je demande aux développeurs d'éliminer ce décalage. Maintenant, avec zéro pings, nous avons un délai constant de ticks entrant non seulement dans le terminal, mais aussi dans le serveur. En particulier, l'acceptation des commandes.

 
Pour réduire les délais d'échange, je recommande de transférer le terminal de combat sur le disque RAM.
 

De manière inattendue, je suis tombé sur un tick manquant dans l'historique, bien qu'il soit apparu dans Market Watch : SymbolInfoTick.



L'impression du même tick par MQL montre un drapeau intéressant.

                         [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

Ce drapeau s'est formé sur le tick de l'historique juste avant le tick manquant de Market Watch. Peut-être cela nous dira-t-il où se situe le problème.


ZS Malheureusement, cela se produit systématiquement. L'historique des tiques ne contient pas toutes les tiques qui se présentent au Terminal.

 
fxsaber:

De manière inattendue, je suis tombé sur un tick manquant dans l'historique, bien qu'il soit apparu dans Market Watch : SymbolInfoTick.



L'impression du même tick par MQL montre un drapeau intéressant.

Ce drapeau s'est formé sur le tick de l'historique juste avant le tick manquant de Market Watch. Peut-être cela nous dira-t-il où se situe le problème.


ZS Malheureusement, cela se produit systématiquement. L'historique des tiques ne contient pas toutes les tiques qui se présentent au Terminal.

C'est le cas. Disons que l'EA négocie toute une journée sur un compte réel et réalise un bénéfice.

le lendemain, je lance le testeur sur le jour précédent et j'obtiens une perte.

Je ne comprends pas la raison, soit le courtier donne les mauvais ticks, soit quelque chose d'autre...

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

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

MT5 et la vitesse en action

fxsaber, 2021.01.04 20:51

De manière inattendue, j'ai rencontré un manque de tick dans l'historique, malgré le fait qu'il arrive à la Market Watch : SymbolInfoTick.


J'ai démarré un terminal parallèle, où le tkc n'a pas été généré par le terminal, mais téléchargé depuis le serveur.

Dans la capture d'écran, ce terminal se trouve à gauche - la tique est présente. Mais sur l'autre Terminal (à droite) - ce n'est pas le cas !


Il s'avère que le terminal lui-même ne place pas tous les ticks entrants dans l'historique des ticks. Si vous voulez avoir l'historique sans omissions, vous devez ajouter le fichier tkc et le tirer du serveur.

Bug désagréable.

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

// Сравнение двух тиков.
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); // Удалили тики, что проверили.
    }
  }  
}

Un tel EA ne pourrait pas rattraper les ticks manqués dans l'histoire. Celui du combat l'a fait. Apparemment, ces ticks ne déclenchent pas le OnTick.

Les tics manqués eux-mêmes peuvent être réels pendant des dizaines de millisecondes.

 
fxsaber:
Il y avait un post ci-dessus avec le code source. C'est maintenant vide. La raison ?
Le message a dû être publié lors de la mise à jour du site (il y a deux messages de ce type dans la partie anglaise).
 
fxsaber:

J'ai lancé un terminal parallèle dans lequel le tkc n'était pas généré par le terminal, mais téléchargé depuis le serveur.

Sur la capture d'écran de ce terminal, à gauche - la coche est présente. Mais sur l'autre terminal (à droite), ce n'est pas le cas !

J'ai lancé ce script sur les deux terminaux.

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

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.");
}


Selon l'intervalle que vous demandez, tkc peut changer (synchronisation avec le serveur). Ainsi, certains tics qui étaient absents avant la demande peuvent commencer à être présents.

Malgré cela, il a été possible d'en détecter quelques-uns sur différents personnages. J'ai dû appliquer un filtre de drapeaux, car ils sont très différents pour les ticks sur différents terminaux.

Voici à quoi ressemblent les différences.


EURJPY.


USDCHF .


En général, lors d'un trading en temps réel, certains ticks peuvent ne pas être présents dans l'historique des ticks, comme ils le sont dans le Terminal et peuvent l'être sur le Serveur.

Ce bug doit être corrigé.