Mira cómo descargar robots gratis
¡Búscanos en Telegram!
Pon "Me gusta" y sigue las noticias
¿Es interesante este script?
Deje un enlace a él, ¡qué los demás también lo valoren!
¿Le ha gustado el script?
Evalúe su trabajo en el terminal MetaTrader 5
Librerías

TickCompressor - con compresión de 1 tick a 2-3 bytes de media - librería para MetaTrader 5

Visualizaciones:
88
Ranking:
(4)
Publicado:
Actualizado:
\MQL5\Include\Forester\
TickCompressor.mqh (39.54 KB) ver
MQL5 Freelance ¿Necesita un robot o indicador basado en este código? Solicítelo en la bolsa freelance Pasar a la bolsa

Compresión de los datos de tick para su almacenamiento de forma compacta hasta 3,5 veces más compacta que los archivos .tcs MQ. Y para trabajar rápidamente con ellos, ya que se tarda menos tiempo en leer 3 bytes que 60 bytes de la estructura MqlTick.

El tamaño del archivo para 2023 con Ask, Bid, tiempo con compresión ZIP adicional de bloques de datos se puede ver en la captura de pantalla:

Tamaño del archivo en formato .tcs para 2023:

3,56 veces la compresión.

Para almacenar los ticks se utilizan las diferencias de los precios Ask y Bid respecto al precio anterior. A menudo (hasta el 50...70% de todos los ticks) no supera los (-8...7) puntos, y puede registrarse con 4 bits. Ask y Bid se combinan en 1 byte.
Más 1 byte para almacenar la diferencia de tiempo de 0 a 255 milisegundos (en el código hasta 229, los valores por encima de 229 se utilizan para codificar los ticks que están más allá de -8...7 puntos).

Si los precios o los tiempos difieren en valores mayores, se empaquetan en un número mayor de bytes.

Para una compresión adicional se puede aplicar el archivado ZIP. El tamaño de los datos se reduce hasta 2 veces.

Alternativamente, se puede realizar la compresión a 3 bytes, con Ask y Bid de -129 a 128 comprimidos a 8 bits o 1 byte cada uno. Más 1 byte para el tiempo - totalizando 3 bytes para la mayoría de los ticks.
A veces(https://www.mql5.com/ru/forum/499639/page6#comment_58544810), si hay más ticks comprimidos a 2 bytes que a 4 bytes, es más eficiente comprimir a 3 bytes. Tienes que mirar las estadísticas del instrumento.
Puede cambiar la compresión máxima a 3 bytes con el comando:

#define  compressTo3Bytes // comprimir los ticks a 3 bytes en lugar de 2.


Elementos de tick a almacenar comprimidos

Se programan 3 variantes de elementos de tick para almacenar:

  1. Ask, Bid, time_msc
  2. Ask, Bid, time_msc, volume_real
  3. Todos los elementos Ask, Bid, Last, time_msc, volume_real, flags (el volumen int se calcula a partir de volume_real).

También se pueden comprimir adicionalmente en ZIP. Habrá 6 variantes en total

method=1;//1...6 BidAsk_=1, BidAskVolume_=2, All_=3, BidAsk_Zipped=4, BidAskVolume_Zipped=5, All_Zipped=6

Antes de iniciar la compresión, es necesario pasar a la clase la variante de almacenamiento de ticks y algunos parámetros estándar utilizados para los cálculos y la normalización de los precios.

    TickCompressor Compressor2;
    double VolumeStep_=SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP);
    Compressor2.Start(method,_Point,VolumeStep_,_Digits);

Si el Asesor Experto utiliza banderas, se pueden restaurar de los cambios de precios por el comando

#define  RestoreFlags // restablecer las banderas de tick de cambio ask, bid, volume - añadirá un 7% al tiempo de generación de tick 931 en lugar de 869ms

Se adjunta el Asesor Experto para la prueba de compresión, que dará estadísticas sobre la velocidad y la tasa de compresión. Puede ver un ejemplo de compresión y descompresión de ticks en él.

Puede ver un ejemplo del Asesor Experto para operaciones aquí https://www.mql5.com/es/code/65821.

Estadísticas para compresión a 2 y 3 bytes:

Compresión a 2 bytes: Compresión a 3 bytes
Ticks: 47707712
Tamaño comprimido: 135718404
Compresión de 2862666420 bytes en 135718404 bytes ==> 4,74%
Rendimiento de compresión: 764 MB/s
Rendimiento de compresión: 13,4 Ticks (millones)/seg.
Criterio de rendimiento de compresión: 281,7
Rendimiento de descompresión: 3550 MB/s
Rendimiento de descompresión: 62,0 Ticks (millones)/seg.
Criterio de rendimiento de descompresión: 1308,8


Estadísticas del experto https://www. mql5.com/es/code/65821
para BTCUSDT

-------------------- Estadísticas: --------------------
2 bytes: 70,1%, 50705359 ticks
4 bytes: 17,1%, 12350966 ticks
5 bytes: 12,7%, 9185484 ticks
6 bytes: 0.0%, 15274 ticks
11 bytes: 0,1%, 46214 ticks
12 bytes: 0,0%, 1 ticks
24 bytes: 0,0%, 1 ticks
Total: 72303299 ticks, 197342036 bytes.
Media: 2,729 bytes por tick
Tamaño sin comprimir: 197342036. Tamaño comprimido: 108302550. Compresión ZIP: 54,9%
Media: 1,498 bytes por tick

Para EURUSD

-------------------- Estadísticas: --------------------
2 bytes: 66,2%, 29694779 ticks
4 bytes: 2,3%, 1022937 ticks
5 bytes: 31,5%, 14106637 ticks
6 bytes: 0.0%, 25 ticks
7 bytes: 0,0%, 8 ticks
11 bytes: 0,0%, 800 ticks
12 bytes: 0,0%, 3 ticks
13 bytes: 0,0%, 4 ticks
24 bytes: 0,0%, 1 ticks
Total: 44825194 ticks, 134023609 bytes.
Media: 2,99 bytes por tick
Tamaño sin comprimir: 134023609. Tamaño comprimido: 95495454. Compresión ZIP: 71,3 %
Media: 2,13 bytes por tick
Ticks: 47707712
Tamaño comprimido: 169378137
Bytes comprimidos de 2862462720 en bytes de 169378137 ==> 5,92%
Rendimiento de compresión: 623 MB/s
Rendimiento de compresión: 10,9 Ticks (millones)/seg.
Criterio de rendimiento de compresión: 183.9
Rendimiento de descompresión: 3225 MB/s
Rendimiento de descompresión: 56,4 Ticks (millones)/seg.
Criterio de rendimiento de descompresión: 952,6
Correcto = verdadero

Estadísticas del experto https://www. mql5.com/es/code/65821
para BTCUSDT

-------------------- Estadísticas: --------------------
3 bytes: 86,6%, 62644158 ticks
4 bytes: 0,6%, 412167 ticks
5 bytes: 12,7%, 9185484 ticks
6 bytes: 0.0%, 15274 ticks
11 bytes: 0,1%, 46214 ticks
12 bytes: 0,0%, 1 ticks
24 bytes: 0,0%, 1 ticks
Total: 72303299 ticks, 236108596 bytes.
Media: 3,266 bytes por tick
Tamaño sin comprimir: 236108596. Tamaño comprimido: 105802525. Compresión ZIP: 44,8%
Media: 1,463 bytes por tick

Para EURUSD

3 bytes: 66,5%, 29801633 ticks
4 bytes: 2,0%, 916083 ticks
5 bytes: 31,5%, 14106637 ticks
6 bytes: 0,0%, 25 ticks
7 bytes: 0.0%, 8 ticks
11 bytes: 0,0%, 800 ticks
12 bytes: 0,0%, 3 ticks
13 bytes: 0,0%, 4 ticks
24 bytes: 0,0%, 1 ticks
Total: 44825194 ticks, 163611534 bytes.
Media: 3,65 bytes por tick
Tamaño sin comprimir: 163611534. Tamaño comprimido: 96541155. Compresión ZIP: 59,0%
Media: 2,154 bytes por tick

Ejemplos de código

Compresión de ticks

Bloque a bloque:

    int ZIPpos=0;//contador de bytes comprimidos
    if(Amount>ticks_per_block){// > 1 bloque - pegado de bloques de tmp a Ticks2
       for(int start=0; start<Amount; start+=ticks_per_block){
          Compressor2.Compress(Ticks, tmp, start, (Amount > start + ticks_per_block ? ticks_per_block : Amount - start));
          ZIPpos+=ArrayCopy(Ticks2,tmp,ZIPpos); //copiar al final de Ticks2
       }
    }else{//1 bloque - descomprimir directamente en Ticks2
       Compressor2.Compress(Ticks, Ticks2, 0, Amount);
    } 

Si el número de ticks en 1 bloque es mayor que el número total de ticks en el array, se comprimirá en 1 bloque.

Si necesita comprimir siempre en 1 bloque, puede utilizar

Compressor2.Compress(Ticks,Ticks2); 

Pero la velocidad de descompresión de un bloque tan grande o muy grande puede ser 2 veces más lenta. También habrá un gran consumo de memoria para un bloque grande.


Desempaquetar ticks

Al desempaquetar es deseable conocer el número de ticks empaquetados. El array receptor debe tener este tamaño.

ArrayResize(Ticks3,Amount);

El tamaño se puede guardar en un archivo, por ejemplo. Y luego utilizarlo al desempaquetar.

Si se desconoce el tamaño, se puede cambiar el tamaño dentro del bucle por el número de ticks del bloque

       /disminuye la velocidad 
ArrayResize(Ticks3,total_ticks+ticks_per_block,10000000); //redimensionar un array grande - funciona más lento que sobrescribir un bloque pequeño


Este código obtiene los ticks bloque a bloque. Si sólo hay un bloque grande, también lo cuenta correctamente. Los ticks no son recolectados en un array grande, sino que pueden ser procesados inmediatamente por su estrategia Strategy(Ticks3[j]);

    while (ZIPpos<ArraySize(Ticks2)){
       nextSize=Compressor3.ArrToInt(Ticks2,ZIPpos);//dimensiona el siguiente bloque, incrementa ZIPpos en 4

       uint s = ArrayCopy(tmp,Ticks2,0,ZIPpos,nextSize); // copiar nuevo bloque a tmp con tamaño nextSize
       //más lento por un factor de 3 ArrayResize(Ticks3,total_ticks+ticks_per_block,10000000); //redimensionar un array grande - funciona más lento que sobrescribir un bloque pequeño
       //total_ticks=Compressor3.DeCompress(tmp,Ticks3,nextSize,total_ticks);//descomprime el bloque y añádelo a Ticks3.
       
       total_ticks+=Compressor3.DeCompress(tmp,Ticks3,nextSize,0); //descomprimir el bloque y sobrescribirlo en Ticks3
       ZIPpos+=nextSize;
       for (int j = 0; j < ticks; j++){ Strategy(Ticks3[j]);}/estrategia
    };


Recoge los ticks de todos los bloques en un array grande:

    while (ZIPpos<ArraySize(Ticks2)){
       nextSize=Compressor3.ArrToInt(Ticks2,ZIPpos);//dimensiona el siguiente bloque, incrementa ZIPpos en 4

       uint s = ArrayCopy(tmp,Ticks2,0,ZIPpos,nextSize); // copiar nuevo bloque a tmp con tamaño nextSize
       /más lento ArrayResize(Ticks3,total_ticks+ticks_per_block,10000000); //redimensionar un array grande - funciona más lento que sobrescribir un bloque pequeño
       total_ticks=Compressor3.DeCompress(tmp,Ticks3,nextSize,total_ticks);//descomprimir el bloque y añadirlo a Ticks3
       
       //total_ticks+=Compressor3.DeCompress(tmp,Ticks3,nextSize,0); //descomprimir el bloque y sobrescribirlo en Ticks3
       ZIPpos+=nextSize;
       //for (int j = 0; j < ticks; j++){ Estrategia(Ticks3[j]);}//estrategia
    };


O una sola línea. Sólo debe registrarse 1 bloque. Si hay más, utilice las dos variantes de código anteriores.

total_ticks=Compressor3.DeCompress(Ticks2,Ticks3);



Traducción del ruso realizada por MetaQuotes Ltd
Artículo original: https://www.mql5.com/ru/code/66201

Report by Magic and currency MT5 indicator for account PNL and trade statistics exported to CSV Report by Magic and currency MT5 indicator for account PNL and trade statistics exported to CSV

Exporta estadísticas comerciales completas a un archivo CSV.

Daily Lot Statistics Daily Lot Statistics

Moderno indicador que muestra sus estadísticas diarias de trading directamente en su gráfico MT5. Siga el rendimiento de sus operaciones con un bonito panel de diseño plano que muestra los lotes negociados, el número de órdenes y las ganancias/pérdidas de cada día.

Titik Impas Breakeven Titik Impas Breakeven

Mientras que ajustar manualmente el stop-loss de una sola operación para que coincida con su precio de apertura es una tarea relativamente sencilla, gestionar numerosas posiciones individualmente puede ser engorroso y llevar mucho tiempo. El script Titik Impas Breakeven para MT4/MT5 agiliza este proceso, proporcionando eficiencia y comodidad a los operadores que gestionan múltiples posiciones.

ATR Weighted Moving Averages ATR Weighted Moving Averages

Este es un indicador para calcular medias móviles ponderadas ATR.