Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
В процессе освоения mql5 решил написать пару простых функций, осуществляющих сжатие/распаковку массива байт без потерь.
Алгоритм сжатия выбрал известный и довольно простой - пытаемся предсказать байт; если предсказанный байт совпадает со следующим - записываем единичный бит в выходной поток, если не совпадает - записываем нулевой бит, а после него - фактическое значение байта, который не удалось предсказать.
Предсказание следующего байта осуществляется исходя из частоты встречаемости различных значений после "контекста" - предыдущих нескольких бит (моя реализация предусматривает контекст фиксированной длины - 8 бит).
Класс, осуществляющий предсказание:
Для работы нужен всего один экземпляр класса (допустим, он уже создан в виде: "CCharPredictor model;").
Метод Init сбрасывает контекст и обнуляет таблицу частот.
Метод Predict возвращает предсказание на основе текущего контекста.
Метод Update обновляет контекст и таблицу частот.
Итак, функции для сжатия данных:
Для использования нужно включить файл ArrayChar.mqh из стандартной библиотеки:
#include <\Arrays\ArrayChar.mqh>
Обе функции принимают на вход два аргумента: srcBuffer - массив входных данных, dstBuffer - массив выходных данных.
Для тестирования я сгенерировал небольшой файл при помощи следующего кода:
Тестирование проходило следующим образом: читаем сгенерированный файл, сжимаем его, результат сжатия записываем в первый выходной файл, разжимаем сжатые данные, результат распаковки записываем во второй выходной файл. При помощи hex-редактора сравниваем входной файл и второй выходной (различий быть не должно). Код для тестирования:
Вот и всё. Надеюсь, мой код окажется полезным.Отзывы приветствуются :)