Forester #: Получилось у кого-то сделать распаковщик GZIP, если да - поделитесь пожалуйста. Можно даже через кодобазу. А может MQ и статью захотят.
Спасение утопающих - дело рук самих утопающих, а на статью тут вряд ли материал наберется, т.к. чисто технически все уже заложено внутри CryptDecode, но с нами не поделились сакральными знаниями, как согласовать режим сжатия между сервером и клиентом, чтобы получился совместимый формат "deflate".
Предлагаю 2 пункта для метода тыка:
поиграться значением server_max_window_bits=? (8..15, якобы по умолчанию 10) в отправляемом с клиента заголовке Sec-WebSocket-Extensions: permessage-deflate (подразумевается также, что там будут и server_no_context_takeover; client_no_context_takeover);
перед разжатием данных с помощью CryptDecode пристыковать в конец 4 байта: [0x00, 0x00, 0xff, 0xff] - если делать через книжные исходники, то это файл wsmessage.mqh, метод extract.
Спасение утопающих - дело рук самих утопающих, а на статью тут вряд ли материал наберется, т.к. чисто технически все уже заложено внутри CryptDecode, но с нами не поделились сакральными знаниями, как согласовать режим сжатия между сервером и клиентом, чтобы получился совместимый формат "deflate".
Предлагаю 2 пункта для метода тыка:
поиграться значением server_max_window_bits=? (8..15, якобы по умолчанию 10) в отправляемом с клиента заголовке Sec-WebSocket-Extensions: permessage-deflate (подразумевается также, что там будут и server_no_context_takeover; client_no_context_takeover);
перед разжатием данных с помощью CryptDecode пристыковать в конец 4 байта: [0x00, 0x00, 0xff, 0xff] - если делать через книжные исходники, то это файл wsmessage.mqh, метод extract.
У меня сейчас задача распаковывать архивы с файлом. И уже решил ее вчера. Распаковывает и созданные мной файлы gz и с сервера с которого буду брать нужные файлы.
Кстати - тут писали про то, что архив внутри содержит чанки (блоки) раздленные через последовательность 0x1f 0x8b 0x08. Написал такой поиск, но ни в моих файлах, ни в файле поставщика (100+мб архива и 500мб данных) таких блоков так и не встретилось. 0x1f 0x8b 0x08 встречается только в начале файла. Упростил функцию, сделал без поиска стало на 10-20% быстрее, чем с поиском.
Ну а сжатые GZIP данные с веб серверов я и не пробовал. Такой задачи нет пока что. Насколько помню, что сервер реагирует на заголовок в запросе
Accept-Encoding: gzip, deflate, br
Если есть gzip, то может вернуть данные в архиве. Но может и в текстовом виде: - если сервер не умеет сжимать или оно отключено админом - если сочтет что затраты на сжатие выше, чем экономия от трафика. Данные меньше 1000 байт может и не сжать, а отправить как есть. Проверять, что пришло можно как раз по первым 3м символам: если 0x1f 0x8b 0x08 - то это GZIP.
Чуть позже (когда у себя доделаю этот модуль и протестирую получше) выложу в кодобазу то, что получилось. Не все варианты возможно будет обрабатывать, но код открытый и любой сможет доработать, если что-то не учтено.
В контексте работы с WebSocket-ами все-таки важнее работа с фреймами/сообщениями непосредственно в формате deflate, а не файлами GZIP, которые, как видим, не составляет проблемы распознать и обработать средствами MQL5.
Провел эксперимент. Отправляю из MQL5 на эхо-сервер node.js сообщение: "My outbound message".
Из функции CryptEncode уходит бинарный массив:
F3 AD 54 C8 2F 2D 49 CA 2F CD 4B 51 C8 4D 2D 2E 4E 4C 4F 0500
Он нормально распознается сервером как исходная строка, но от сервера бинарный массив возвращается как:
F2 AD 54 C8 2F 2D 49 CA 2F CD 4B 51 C8 4D 2D 2E 4E 4C 4F 0500
Видим изменение в первом байте заголовка. И вот эти данные CryptDecode уже не может разжать.
В контексте работы с WebSocket-ами все-таки важнее работа с фреймами/сообщениями непосредственно в формате deflate, а не файлами GZIP, которые, как видим, не составляет проблемы распознать и обработать средствами MQL5.
Провел эксперимент. Отправляю из MQL5 на эхо-сервер node.js сообщение: "My outbound message".
Из функции CryptEncode уходит бинарный массив:
Он нормально распознается сервером как исходная строка, но от сервера бинарный массив возвращается как:
Видим изменение в первом байте заголовка. И вот эти данные CryptDecode уже не может разжать.
Через Python как-то проще выполнить нужную задачу оч много времени уходит что другими путями выстроить код
Как проще получать данные с помощью Python?
Если ваша цель — получать данные (например, котировки, тики, исторические данные) и обрабатывать их, Python действительно может быть проще, особенно если вы уже знакомы с языком. Вот несколько способов организовать получение данных:
Библиотека MetaTrader5 (доступна через pip install MetaTrader5) позволяет напрямую подключаться к MetaTrader 5, получать котировки, тики, ордера и управлять торговлей.
Пример: Получение котировок и сохранение в ZIP
import MetaTrader5 as mt5
import pandas as pd
from zipfile import ZipFile
from datetime import datetime
# Инициализация MetaTrader 5ifnot mt5.initialize():
print("Ошибка инициализации MT5")
quit()
# Получение котировок для символа (например, EURUSD)
symbol = "EURUSD"
timeframe = mt5.TIMEFRAME_M1
rates = mt5.copy_rates_from_pos(symbol, timeframe, 0, 100)
# Конвертация в DataFrame
df = pd.DataFrame(rates)
df['time'] = pd.to_datetime(df['time'], unit='s')
# Сохранение в CSV
csv_file = "quotes.csv"
df.to_csv(csv_file, index=False)
# Создание ZIP-архива
zip_file = "quotes.zip"with ZipFile(zip_file, 'w') as zipf:
zipf.write(csv_file)
# Завершение работы
mt5.shutdown()
print(f"Данные сохранены в {zip_file}")
Через Python как-то проще выполнить нужную задачу оч много времени уходит что другими путями выстроить код
Как проще получать данные с помощью Python?
Если ваша цель — получать данные (например, котировки, тики, исторические данные) и обрабатывать их, Python действительно может быть проще, особенно если вы уже знакомы с языком. Вот несколько способов организовать получение данных:
Как это относится к теме топика - WebSocket-ы и GZIP(deflate)?
Задача получать данные извне, а не по известной связке MT5 и его же питонского модуля.
А может MQ и статью захотят.
Получилось у кого-то сделать распаковщик GZIP, если да - поделитесь пожалуйста. Можно даже через кодобазу.
А может MQ и статью захотят.
Спасение утопающих - дело рук самих утопающих, а на статью тут вряд ли материал наберется, т.к. чисто технически все уже заложено внутри CryptDecode, но с нами не поделились сакральными знаниями, как согласовать режим сжатия между сервером и клиентом, чтобы получился совместимый формат "deflate".
Предлагаю 2 пункта для метода тыка:
Спасение утопающих - дело рук самих утопающих, а на статью тут вряд ли материал наберется, т.к. чисто технически все уже заложено внутри CryptDecode, но с нами не поделились сакральными знаниями, как согласовать режим сжатия между сервером и клиентом, чтобы получился совместимый формат "deflate".
Предлагаю 2 пункта для метода тыка:
У меня сейчас задача распаковывать архивы с файлом. И уже решил ее вчера. Распаковывает и созданные мной файлы gz и с сервера с которого буду брать нужные файлы.
Кстати - тут писали про то, что архив внутри содержит чанки (блоки) раздленные через последовательность 0x1f 0x8b 0x08.
Написал такой поиск, но ни в моих файлах, ни в файле поставщика (100+мб архива и 500мб данных) таких блоков так и не встретилось. 0x1f 0x8b 0x08 встречается только в начале файла. Упростил функцию, сделал без поиска стало на 10-20% быстрее, чем с поиском.
Ну а сжатые GZIP данные с веб серверов я и не пробовал. Такой задачи нет пока что. Насколько помню, что сервер реагирует на заголовок в запросе
Accept-Encoding: gzip, deflate, br
Если есть gzip, то может вернуть данные в архиве.
Но может и в текстовом виде:
- если сервер не умеет сжимать или оно отключено админом
- если сочтет что затраты на сжатие выше, чем экономия от трафика. Данные меньше 1000 байт может и не сжать, а отправить как есть. Проверять, что пришло можно как раз по первым 3м символам: если 0x1f 0x8b 0x08 - то это GZIP.
Чуть позже (когда у себя доделаю этот модуль и протестирую получше) выложу в кодобазу то, что получилось. Не все варианты возможно будет обрабатывать, но код открытый и любой сможет доработать, если что-то не учтено.
есть ссылка на данные передаваемые в GZ? Протестирую. А то у меня только файлы.
Уже не нужно.
Проверил с архивом сгенерированным таким PHP кодом:
<?
$t='{"retCode":0,"retMsg":"OK","result":{"category":"linear","list":[... Юя';
echo gzencode($t, 9);
?>
Распаковал успешно. Даже кириллицу понял.
В контексте работы с WebSocket-ами все-таки важнее работа с фреймами/сообщениями непосредственно в формате deflate, а не файлами GZIP, которые, как видим, не составляет проблемы распознать и обработать средствами MQL5.
Провел эксперимент. Отправляю из MQL5 на эхо-сервер node.js сообщение: "My outbound message".
Из функции CryptEncode уходит бинарный массив:
Он нормально распознается сервером как исходная строка, но от сервера бинарный массив возвращается как:
Видим изменение в первом байте заголовка. И вот эти данные CryptDecode уже не может разжать.
В контексте работы с WebSocket-ами все-таки важнее работа с фреймами/сообщениями непосредственно в формате deflate, а не файлами GZIP, которые, как видим, не составляет проблемы распознать и обработать средствами MQL5.
Провел эксперимент. Отправляю из MQL5 на эхо-сервер node.js сообщение: "My outbound message".
Из функции CryptEncode уходит бинарный массив:
Он нормально распознается сервером как исходная строка, но от сервера бинарный массив возвращается как:
Видим изменение в первом байте заголовка. И вот эти данные CryptDecode уже не может разжать.
На PHP у функции сжатия https://www.php.net/manual/ru/function.gzencode.php по умолчанию стоит
Режим сжатия, может быть FORCE_GZIP (по умолчанию) или FORCE_DEFLATE.
Вот FORCE_GZIP https://datatracker.ietf.org/doc/html/rfc1952.html моя функция распознала, а FORCE_DEFLATE - нет, т.к. там другая спецификация https://datatracker.ietf.org/doc/html/rfc1951.html
Есть вероятность, что вебсерверы чаще будут использовать то, что по умолчанию.
Через Python как-то проще выполнить нужную задачу оч много времени уходит что другими путями выстроить код
Как проще получать данные с помощью Python?
Если ваша цель — получать данные (например, котировки, тики, исторические данные) и обрабатывать их, Python действительно может быть проще, особенно если вы уже знакомы с языком. Вот несколько способов организовать получение данных:
Способ 1: Использование библиотеки MetaTrader5
Библиотека MetaTrader5 (доступна через pip install MetaTrader5) позволяет напрямую подключаться к MetaTrader 5, получать котировки, тики, ордера и управлять торговлей.
Пример: Получение котировок и сохранение в ZIP
Через Python как-то проще выполнить нужную задачу оч много времени уходит что другими путями выстроить код
Как проще получать данные с помощью Python?
Если ваша цель — получать данные (например, котировки, тики, исторические данные) и обрабатывать их, Python действительно может быть проще, особенно если вы уже знакомы с языком. Вот несколько способов организовать получение данных:
Как это относится к теме топика - WebSocket-ы и GZIP(deflate)?
Задача получать данные извне, а не по известной связке MT5 и его же питонского модуля.