Были запрошены тики за 5.5 лет. Это почти 500 миллионов тиков. Если бы был запрос через штатный CopyTicksRange, то потребовалось бы больше 28 Гб RAM. В данной реализации - в 10 раз меньше. Это позволило даже на очень старом компе полностью получить и хранить в памяти все 500 миллионов тиков.
Поскольку все тики хранятся в памяти, то с ними можно работать. В частности, фильтровать - см. исходник.
Столь дешевое наполнение тиками кастомных символов позволяет на этих символах получать в Тестере идентичную тиковой истории последовательность тиков. Что полностью исключает влияние рассинхронизированных баров реальных символов на генерацию тиков Тестером. Грубо говоря, Тестер выдает только те тики, что были записаны.
Напоминаю, что есть дешевый способ посмотреть данные по имеющимся тикам.
ЗЫ Это еще одна причина создавать кастомные символы - закидывать в историю только последний тик из последовательностей с одинаковым временем. В таком случае в моновалютном режиме будет всегда соблюдаться актуализация.
This Delta + VLQ encoding is very efficient. It is also flexible to allow compressing other fields (volume, flags, etc..) by just adding few extra lines of code.
long prev_flags = 0;
for (int i = 0; i < nticks; i++)
{
constMqlTick tick = ticks[i];
long f = tick.flags;
VLQWrite(buf, pos, ZigZagEncode(f - prev_flags)); // compress flags field
prev_flags = f; // Update previous
}
This Delta + VLQ encoding is very efficient. It is also flexible to allow compressing other fields (volume, flags, etc..) by just adding few extra lines of code.
Столь дешевое наполнение тиками кастомных символов позволяет на этих символах получать в Тестере идентичную тиковой истории последовательность тиков. Что полностью исключает влияние рассинхронизированных баров реальных символов на генерацию тиков Тестером. Грубо говоря, Тестер выдает только те тики, что были записаны.
При поиске внутрисуточных закономерностей имеет смысл модифицировать тиковую историю брокеров с европейским временем, чтобы время ролловера оставалось неизменным.
#property script_show_inputsinputstring inName = "";
inputdatetime inFrom = D'2024.09.01';
inputdatetime inTo = D'2026.09.01';
inputbool inAntiDST = false;
#include <fxsaber\TicksShort\LotsTicks.mqh> // https://www.mql5.com/ru/code/61126voidOnStart()
{
LOTS_TICKS LotsTicks;
if ((LotsTicks.CopyTicksRange(_Symbol, COPY_TICKS_ALL, inFrom * 1000, inTo * 1000) > 0) &&
(!inAntiDST || LotsTicks.AntiDST())) // Не меняется время ролловера для брокеров европейского времени.
{
conststring Name = (inName == "") ? "CUSTOM_" + _Symbol + "_AntiDST_" + (string)inAntiDST : inName;
if (CustomSymbolCreate(Name, NULL, _Symbol) &&
(LotsTicks.CustomTicksReplace(Name) > 0) &&
SymbolSelect(Name, true))
ChartOpen(Name, _Period);
}
}
Пример такого изменения.
На скрине используется индикатор спреда для реального символа брокера с европейским временем и кастомного символа, полученного через скрипт выше.
Всплеск спреда хорошо идентифицирует время ролловера. На нижней половине видно, что DST-смещения не повлияли на время ролловера - полночь.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
После починки кодобазы будет доступен CopyTicksRange, который потребляет на порядок меньше памяти (чем штатный) и работает быстрее.
Пример.
Заодно показан сразу дешевый по памяти сброс тиков в кастомный символ.
Результат.
Были запрошены тики за 5.5 лет. Это почти 500 миллионов тиков. Если бы был запрос через штатный CopyTicksRange, то потребовалось бы больше 28 Гб RAM. В данной реализации - в 10 раз меньше. Это позволило даже на очень старом компе полностью получить и хранить в памяти все 500 миллионов тиков.
Поскольку все тики хранятся в памяти, то с ними можно работать. В частности, фильтровать - см. исходник.
Столь дешевое наполнение тиками кастомных символов позволяет на этих символах получать в Тестере идентичную тиковой истории последовательность тиков. Что полностью исключает влияние рассинхронизированных баров реальных символов на генерацию тиков Тестером. Грубо говоря, Тестер выдает только те тики, что были записаны.
Напоминаю, что есть дешевый способ посмотреть данные по имеющимся тикам.
После починки кодобазы будет доступен CopyTicksRange, который потребляет на порядок меньше памяти (чем штатный) и работает быстрее.
Опубликован.
Опубликован.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: OnTickMulti
fxsaber, 2025.10.04 06:18
ЗЫ Это еще одна причина создавать кастомные символы - закидывать в историю только последний тик из последовательностей с одинаковым временем. В таком случае в моновалютном режиме будет всегда соблюдаться актуализация.
В полноценном примере выше замена этой функции будет создавать кастомные символы с условием актуализации.
Но надо всегда осознавать один нюанс.
The header file "TicksShort.mqh" provides an alternative implementation of 'TicksShort' tick compression library by fxsaber usig 'CBitBuffer' class.
https://www.mql5.com/en/code/61728
The header file "TicksShort.mqh" provides an alternative implementation of 'TicksShort' tick compression library by fxsaber usig 'CBitBuffer' class.
https://www.mql5.com/en/code/61728
Как Вы этого достигли?
После применения ZIP итоговое сжатие превышает 28x.
После применения ZIP итоговое сжатие превышает 28x.
Опередили даже tkc-формат.
Шикарный результат!
They even surpassed the tkc format.
A fantastic result!
This Delta + VLQ encoding is very efficient. It is also flexible to allow compressing other fields (volume, flags, etc..) by just adding few extra lines of code.
This Delta + VLQ encoding is very efficient. It is also flexible to allow compressing other fields (volume, flags, etc..) by just adding few extra lines of code.
Столь дешевое наполнение тиками кастомных символов позволяет на этих символах получать в Тестере идентичную тиковой истории последовательность тиков. Что полностью исключает влияние рассинхронизированных баров реальных символов на генерацию тиков Тестером. Грубо говоря, Тестер выдает только те тики, что были записаны.
При поиске внутрисуточных закономерностей имеет смысл модифицировать тиковую историю брокеров с европейским временем, чтобы время ролловера оставалось неизменным.
Пример такого изменения.
На скрине используется индикатор спреда для реального символа брокера с европейским временем и кастомного символа, полученного через скрипт выше.
Всплеск спреда хорошо идентифицирует время ролловера. На нижней половине видно, что DST-смещения не повлияли на время ролловера - полночь.