#property script_show_inputs input datetime inFrom = D'2024.12.01'; //#include "TicksShort.mqh" // Короткий формат хранения тиков. #include "TicksShortLite.mqh" // Возвращает размер массива в байтах. template ulong GetSize( const T &Array[] ) { return((ulong)sizeof(T) * ArraySize(Array)); } template double Criterion( const T1 &Decompression[], const T2 &Compression[], const ulong Interval ) { const double Performance = (double)ArraySize(Decompression) / Interval; return(Performance * ((double)GetSize(Decompression) / GetSize(Compression))); } void OnStart() { MqlTick Ticks[]; // Для исходных тиков. if (CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL,(ulong)inFrom * 1000) > 0) { //TICK_SHORT Ticks2[]; // Для сжатых тиков. uchar Ticks2[]; ulong Interval = GetMicrosecondCount(); TICKS_SHORT::Compress(Ticks, Ticks2); // Сжали. Interval = GetMicrosecondCount() - Interval; const double Performance = (double)ArraySize(Ticks) / Interval; // https://www.mql5.com/ru/forum/490384#comment_57497700 long n1 = ArraySize(Ticks) * (long)sizeof(MqlTick); //long n2 = ArraySize(Ticks2) * (long)sizeof(TICK_SHORT); long n2 = ArraySize(Ticks2) * (long)sizeof(uchar); PrintFormat("Compressed %I64i bytes into %I64i bytes ==> %.2f%%",n1,n2,(double)n2/n1*100); Print("Compress performance: " + DoubleToString(Performance * sizeof(MqlTick) / 1.04858, 0) + " MB/s"); Print("Compress performance: " + DoubleToString(Performance, 1) + " Ticks (millions)/sec."); Print("Compress performance criterion: " + DoubleToString(Criterion(Ticks, Ticks2, Interval), 1)); MqlTick Ticks3[]; // Для разжатых тиков. ulong Interval2 = GetMicrosecondCount(); TICKS_SHORT::Decompress(Ticks2, Ticks3); // Разжали. Interval2 = GetMicrosecondCount() - Interval2; const double Performance2 = (double)ArraySize(Ticks3) / Interval2; Print("Decompress performance: " + DoubleToString(Performance2 * sizeof(MqlTick) / 1.04858, 0) + " MB/s"); Print("Decompress performance: " + DoubleToString(Performance2, 1) + " Ticks (millions)/sec."); Print("Decompress performance criterion: " + DoubleToString(Criterion(Ticks3, Ticks2, Interval2), 1)); Print("Correct = " + (string)TICKS_SHORT::IsEqual(Ticks, Ticks3)); // Сравнили. } }