MT5 y la velocidad en acción - página 80

 
fxsaber:

ZS Sería bueno deshacerse de los cuelgues que se producen desde hace meses. Ejecute este script en una máquina con memoria RAM infinita. Por ejemplo, no puedo cargar las garrapatas del 1 de junio sólo un personaje a la vez. Simplemente cuelga CopyTicks con cero consumo de recursos.

b2699 - arreglado, gracias.

 
A la hucha de los códigos que muestran los frenos. Esta vez Tester.
 

Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio

Aceptación de órdenes SL/TP

fxsaber, 2020.12.11 09:17

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

Se procesaron 100 garrapatas. El desfase entre el servidor y el terminal varía de uno a ocho milisegundos. La media es de poco más de cuatro milisegundos. Esto es igual al retraso de la activación de la orden TP, que es donde comenzó esta rama.


El lag en sí está dentro del servidor de MT5. El canal Servidor->Terminal no tiene nada que ver.


Gran petición a los desarrolladores para que eliminen este retraso. Ahora con cero pings tenemos un retardo constante de ticks entrando no sólo en el terminal, sino también en el Servidor. En particular, la aceptación de pedidos.

 
Para reducir los retrasos en las operaciones, recomiendo transferir el terminal de batalla a la unidad RAM.
 

Inesperadamente me encontré con un tick que faltaba en el historial, aunque venía en Market Watch: SymbolInfoTick.



La impresión del mismo tick a través de MQL muestra una bandera interesante.

                         [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

Esta bandera se formó en el tic del historial justo antes del tic perdido de la Vigilancia del Mercado. Quizás esto nos diga dónde está el problema.


ZS Por desgracia, esto ocurre sistemáticamente. El historial de garrapatas no contiene todas las garrapatas que llegan al Terminal.

 
fxsaber:

Inesperadamente me encontré con un tick que faltaba en el historial, aunque venía en Market Watch: SymbolInfoTick.



La impresión del mismo tick a través de MQL muestra una bandera interesante.

Esta bandera se formó en el tic del historial justo antes del tic perdido de la Vigilancia del Mercado. Quizás esto nos diga dónde está el problema.


ZS Por desgracia, esto ocurre sistemáticamente. El historial de garrapatas no contiene todas las garrapatas que llegan al Terminal.

Lo hace. Digamos que el EA negocia un día entero en una cuenta real, y obtiene beneficios.

al día siguiente ejecuto el probador del día anterior y obtengo una pérdida.

No entiendo el motivo, o el broker da los ticks mal o algo más...

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

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

MT5 y Speed en acción

fxsaber, 2021.01.04 20:51

Inesperadamente me encontré con una falta de tick en el historial, a pesar de que venía al Market Watch: SymbolInfoTick.


He iniciado un terminal paralelo, donde el tkc no fue generado por el Terminal, sino cargado desde el Servidor.

En la captura de pantalla de este terminal a la izquierda - garrapata está presente. Pero en el otro terminal (el de la derecha), ¡no lo es!


Resulta que el propio Terminal no pone todos los ticks entrantes en el historial de ticks. Si quieres tener el historial sin omisiones, debes añadir el archivo tkc y sacarlo del Servidor.

Un bicho desagradable.

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

// Сравнение двух тиков.
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 EA así no podría captar los ticks perdidos en la historia. El de combate sí. Aparentemente, estos ticks no inician el OnTick.

Los propios ticks perdidos pueden ser reales durante decenas de milisegundos.

 
fxsaber:
Había un post más arriba con el código fuente. Ahora está vacío. ¿La razón?
El puesto debe haber sido cuando se actualizó el sitio (hay dos puestos de este tipo en la parte inglesa).
 
fxsaber:

He ejecutado un terminal paralelo en el que el tkc no era generado por el Terminal, sino cargado desde el Servidor.

En la captura de pantalla de este Terminal a la izquierda - la garrapata está presente. Pero en el otro terminal (el de la derecha) no lo es.

He ejecutado este script en ambos terminales.

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

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


Dependiendo del intervalo que solicite, el tkc puede cambiar (sincronización con el servidor). Por lo tanto, algunas garrapatas que faltaban antes de la solicitud pueden empezar a estar presentes.

A pesar de ello, todavía era posible detectar algunos en diferentes personajes. Tuve que aplicar un filtro de banderas, porque son muy diferentes para las garrapatas en diferentes Terminales.

Así es como se ven las diferencias.


EURJPY.


USDCHF


En general, cuando se negocia en tiempo real, algunos ticks pueden no estar presentes en el historial de ticks, ya que están en el Terminal y pueden estar en el Servidor.

Este error tiene que ser corregido.

Razón de la queja: