Привет всем алготрейдерам!
Хочу поделиться своим решение для тестирования скальперских и ХФТ стратегий. Долгое время я использую замечательный привод Морошкина (бесплатную версию 🙂 ). И недавно решил автоматизировать несколько стратегий на базе StockSharp.
Но для этого нужны исторические данные, в частности стаканы. У StockSharp есть программа Гидра, которая по идее позволяет качать все необходимое, но ее нужно держать постоянно включенной. Для меня это не вариант, так как я постоянно занят, и интернет не всегда стабильный.
Но недавно я узнал, что QScalp сам пишет историю и бесплатно ее выкладывает через брокера IT Invest.
В итоге, я написал конвертор данных QScalp в формат StockSharp!


Просто установите программу и скачайте исторические данные формата QSH для QScalp по одной из ссылок ниже
http://www.itinvest.ru/software/spo/qscalp/history/
Теперь осталось только указать в конвертере путь к скаченным файлам и к папке хранения исторических данных StockSharp, и нажать кнопку “Запустить”!
Вуаля, теперь у вас есть высококачественные исторические данные для тестирования своих стратегий!
PS Торопитесь пока бесплатно ;))
PPS Шутка))
Всем удачной торговли!
Присоединиться и редактировать код можно по https://github.com/stocksharp/Qsh2Bin
скомпилированную программу по https://github.com/StockSharp/Qsh2Bin/releases
Комментарии (70)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Исторические данные можно скачать только за один день? А за период времени? И какая глубина этих исторических данных?
Собственно можно залить уже установленную версию, т.к. у меня при установки вылетает ошибка... Что-то то там с манифестом.
Это значит, что не в программе ошибка. Манифест - это ОС.
Типа мне разбираться?😂 Гуглите.
дык я и прошу проинсталенную уже ) чтобы и мне не разбираться с установкой )
Скажите, пожалуйста, какая версия стокшарпа сможет открыть эти архивные файлы ?
А то у меня вобще какая то проблема с доставанием инфы из базы данных: Версия 4.1.19.1 пишу трейды в базу :
Потом пробую дастать трейды из той же базы в той же программе :
Но почему то в трейдере нет ни одного трейда , они вобще должны там быть или они будут появлятся в процессе тестирования ?
Проверил версию 4.1.14.1, тоже самое Трейдов нет , Может я что-то не так делаю ?
Trader.RegisterTrades(security); тоже не помогает :(
А что вы вообще делаете?
Постоянно пишу все новые треды в базу , потом хочу тестировать на этой истории .
вставил в исходники текущую версию API с поддержкой четверной версии qsh файлов (http://www.qscalp.ru/download) http://dropmefiles.com/XqiuN
Залили бы сразу в репозитарий. Потеряется же.
не умею )
http://stocksharp.com/forum/4893/Sovmiestnaia-rabota-v-GitHub/
Сейчас история только клиентам ITinvest доступна или вообще прикрыли лавочку?
http://www.qscalp.ru/qsh-zerich
У айти абонентка за быть их клиентом?
Церих тоже скоро лавочку прикроет
http://dropmefiles.com/P5alg - перезалил. До гитхаба все никак не добраться (
А можно перезалить, а то файл уже удален? Спасибо
Обновил сырцы. Качается так же с Гита. ОЛ от Цериха конвертирует.
Финансовые рынки - не место для трусов.
Подскажите, что за ошибка: Имя параметра: item в StockSharp.Algo.OrderLogHelper.GetOrderLogCancelReason(ExecutionMessage item) в f:\develop\StockSharp_436\Algo\OrderLogHelper.cs:строка 128 в StockSharp.Algo.OrderLogMarketDepthBuilder.Update(ExecutionMessage item) в f:\develop\StockSharp_436\Algo\OrderLogMarketDepthBuilder.cs:строка 167 в StockSharp.Algo.Connector.ProcessOrderLogMessage(Security security, ExecutionMessage message) в f:\develop\StockSharp_436\Algo\Connector_ProcessMessage.cs:строка 1047 2015/06/04 19:00:00.126|Error |HistoryEmulationConnector|System.ArgumentException: Строка лога заявок не содержит информацию о причине отмены заявки. Имя параметра: item
В ОЛ сформированного данной программой.
https://github.com/StockSharp/StockSharp
Придется переконвертировать ОЛ, если кто уже сделал. Забыл заполнить одно из важных полей https://github.com/AntonySS/Qsh2Bin/commit/ae2470db4092ab93ad69305430058bc473786831
Может быть кто-то выложил сконвертированные файлы, чтобы не заниматься одним и тем же?
Пожалуйста, выложите скомпилированную версию программы!
Выложил
А можно попросить у вас прямую ссылку на *.exe?
Не работает конвертация, скачал историю с цериха. ордерлог видит в qsh, сохраняет пачками по 1000 записей, но в папке с инструментом в результате только файл orderlog.bin размером 7 килобайт.
Запустил, проверил, работает.
я качал с гитхаба скомпилированную прогу, и сам компилировал из исходников - результат одинаков.
сюда передается массив сообщений: registry.GetOrderLogMessageStorage(security).Save(secData.Item4);
но в файл orderlog.bin ничего не записывается и что там в Save() происходит мне не ведомо... запускал на разных машинах...
Куда смотреть? Где копать?
https://github.com/StockSharp/StockSharp/
выяснил что в ExecutionMessage не проставляется transactionId, он всегда равен 0. поэтому ничего не сохраняется, если убрать AppendOnlyNew или проставить свой transactionId то всё сохраняется - но по этой истории тестирование все равно не работает, свечки не формируются
хотя qscalp проигрывает скаченные файлы нормально.
Доработал чуть утилиту. Добавил файл настроек и файл с ранее обработанными файлами (это если экспорт перезапускается, чтобы не конвертировать все заново).
Добавил поддежку CSV формата. У Ку Скальпа есть своя утилита, но она у меня почему-то падает. Плюс она без графического интерфейса, а значит нужно писать скрипт (опять же делать индекс-файл с обработанными файлами).
Ну что, может сейчас уже кто-то решится сделать мини сервер истории с паблик доступом? Может скинутся, и купить Amazon S3? Там есть веб интерфейс и настройка прав доступа (в том числе и публичное использование). За 100GB придется заплатить 36 долларов в год. Этого размера вполне хватит для ОЛ истории.
Я готов оплатить место сам, но администрировать не берусь. Если кто-то все настроит, то давайте туда зальем данные (пока доступ не отрубили).
https://github.com/StockSharp/Qsh2Bin/releases
Как их истории торгов от ИК «ЦЕРИХ» с помощью Qsh2Bin получить: quotes.bin trades.bin security.bin, а не orderlog.bin?
Спасибо.
Через Гидру.
Спасибо. все сделал, но даже в Гидре есть только BIDы и в ОЛ и в конвертированных стаканах. Какие надо учесть ньюансы, что не так?
https://github.com/StockSharp/Qsh2Bin/commit/8a314f967e918658219d6e44e4d5133b7e9e076f
Хочу к чему ОЛ при таком ДолларРубле...
Все заработало, получил, что хотел, спасибо Михаил. Готов оплатить помощь, скажите куда.
Лучше выложите сконвертированное куда-то, чтобы не делать одно и то же всем.
https://github.com/StockSharp/Qsh2Bin/releases/tag/1.0.4
Фильтр по инструменту. Фикс экспорта в csv.
У меня получился несколько иной алгоритм конвертации. Возможно, кому-то окажется полезным:
По 3 дням стакан построить не получилось: предполагаю что запись данных была выполнена с ошибками. Даты и время ошибок: 13.10.2014 Пн 19:00:55.878 11.06.2015 Чт 18:56:21.672 18.09.2015 Пт 18:51:07.919
После конвертации в из qsh в bin подкладываю данные в директорию где хранятся данные для гидры. Но при попытке получить тики по этому инструменту гидра говорит что данных нет. Что надо сделать чтобы гидра увидела файлы с сконвертированной историей?
Новая версия 1.0.5:
Скачать
Напишите пожелание по утилите. Интересен ли вам сервис от Цериха, нужны ли в работе такие данные. Кто знает что стало с аналогичным сервисом от IT Invest?
Программа очень и очень нужная для тестирования hft-стратегий на предмет того не являются ли они тестовыми граалыми, у которых чудо-доходность обусловлена исключительно несовершенством тестера (а-ля такого Мой hft-грааль). А так же подобные данные позволяют "исследовать" микроструктуру рынка на предмет реальных возможностей для заработка на фреймах ниже М1. Основное пожелание - интегрировать в следующую версию S#.Data данный сайт Цериха как доп. источник для скачивания данных с конвертацией "на лету" в формат bin с формированием OL или стаканов по выбору пользователя.
Сайт поддерживает неофициально. Вполне вероятно, что у Цериха не хватает ресурсов, и он может быть закрыт в любое время. Тратить ресурсы на такую задачу нам не сильно охота. Да и что там автоматизировать? Закачку c FTP? Это делается любым download manager-ом на 1-2-3.
Конвертор не работает с файлами типа:
Поправил утилиту, чтобы поддерживала новый формат.
Утилитой кто-то пользуется? Или ОЛ уже интересен только единицам?
Здравствуйте. Я пользуюсь утилитой. Огромное за нее спасибо - очень полезная вещь. Но я обнаружил, что утилита неправильно собирает стакан. Как я это обнаружил. Я добавил в утилиту функцию подсчета суммарного объема стакана по бидам и аскам (глубина стакана 50) и сохранения суммарного объема, а также лучшей цены в файл. Т.е. я добавил после строки 509 метода ConvertFile файла MainWindow.xaml.cs следующий код (под спойлером):
Далее я протестировал утилиту на исторических данных фьючерса на индекс РТС (RTS-3.19), скаченных с сайта цериха и сравнил полученные объемы стакана с объемами, которые выводит QScalp на этих же исторических данных. Результаты отличались: объемы, рассчитанные утилитой на порядок превышали объемы QScalp. Я пришел к выводу, что проблема в коде в строках 438 - 441 метода ConvertFile файла MainWindow.xaml.cs:
По совету пользователя vk37 от 26.01.2016 я установил OrderState = Done для заявок с флагом Moved:
И утилита стала считать объемы стакана правильно. Скажите пожалуйста, насколько мое решение верно? Пользователь vk37 в своем сообщении от 26.01.2016 вообще советует устанавливать OrderState = Done для всех заявок из ордерлога, кроме добавляемых заявок (с флагом Add). Скажите пожалуйста, насколько его совет правильный?
Но это еще не все. Когда я стал сравнивать лучшие цены и суммарные объемы стакана после вечернего клиринга с данными, выводимыми QScalp, то обнаружил, что они отличаются: объемы рассчитанные утилитой в разы превышали объемы QScalp. Я пришел к выводу, что утилита при сборке стакана некорректно обрабатывает вечерний клиринг, фактически не очищая стакан. Вот пример результата работы утилиты в вечерний клиринг:
Я решил очищать стакан в вечерний клиринг просто создавая новый экземпляр builder:
Теперь результаты утилиты и QScalp совпадают.
Скажите пожалуйста, насколько мое решение верно и каким еще образом можно очищать стакан (мой метод мне кажется слишком грубым).
Я юзаю сею утиль
Хотя нет, утилита все еще неудовлетворительно собирает стакан. Стал на истории сравнивать лучшие цены, рассчитанные утилитой с лучшими ценами, выводимыми QScalp и обнаружил, что разница между ними большая. Для фьючерса на индекс РТС за 25 февраля, например разница составляет 2-3 шага цены (20-30 пунктов)
Все-таки интересно, почему лучшие цены в стакане, собранным утилитой (PlazaOrderLogMarketDepthBuilder) отличаются от лучших цен QScalp. Неужели один из двух дает неверный результат? Или я что-то не понимаю...
Добрый день.
Подскажите пожалуйста.
Имею данные (c ftp://athistory.zerich.com/). GAZP.2019-01-30.Deals.qsh GAZP.2019-01-30.Quotes.qsh LKOH.2019-01-30.Deals.qsh LKOH.2019-01-30.Quotes.qsh
Стаканы грузятся корректно, но сделки не совсем.
Для Газпрома цену нужно разделить на 100 и тогда ок.
Для Лукойла цену нужно разделить на 2 и тогда ок.
Почему так получается?
Может надо цену умножать на шаг (priceStep) по аналогии с заявками из ордерлога?
Подскажите пожалуйста, на какой строке проекта находится данная "аналогия с заявками из ордерлога"?
Отследил чтение. Нужно в этом методе что-то менять?
Попробуйте поменять строку №380 в файле MainWindow.xaml.cs:
Старая строка: TradePrice = deal.Price, Исправленная срока: TradePrice = deal.Price * priceStep,
Коллеги, правильно ли я понимаю, что файлы сделок и стаканов на athistory.zerich.com и http://qsh.qscalp.ru/scalping.pro - это данные по Московской бирже?
Надо полагать, да
Добрый день. Пробую сейчас сконвертировать данные через этот конвертер. Данные беру отсюда: http://erinrv.qscalp.ru, за апрель Возникли следующие ошибки: При загрузке данных стаканов по акциям Сбербанка возникала ошибка и данные не грузились. Проблему я решил, порывшись в исходниках. там в исходном файле в начале торгов есть строки с ценой и объемом 0 и типом Unknown. Когда тип Unknown, программа сразу выдает исключение:
Написал пока так для себя, не знаю, как в С# принято такое обрабатывать, когда у нас только 2 значения side:
Второй ошибкой является то, что для всех стаканов (файл quotes) время проставляется одно и то же для каждой строчки на весь файл. Эта ошибка проявляется и для акций и для фьючерсов. Пока не могу её побороть. сохранение в файл делается средствами StockSharp.Algo.Storages, все исходники там, как я понимаю. По отладке не могу понять, какие параметры должны быть у pair, чтобы в строке registry.GetQuoteMessageStorage(pair.Key, format: format).Save(pair.Value.Item1); запись происходила как надо. Пробовал менять LocalTime и ServerTime для каждого набора, всё равно сохраняет неправильно (со временем 35517549, например)
Опытным путем разобрался с проблемой времени! Если у вас в папке, из которой вы конвертируете, лежат сразу 3 файла на день из архива http://erinrv.qscalp.ru (Deals, Quotes И AuxInfo), то конвертация будет некорректной! Я скачивал сразу все 3 файла, и из одной папки конвертировал, поэтому была ошибка. Если в папке лежат 2 файла на день - Deals, Quotes, то всё конвертируется нормально (если не считать ошибки по акциям, описанной мной выше)
UPD: В общем это я поспешил, что разобрался, всё равно время некорректно ставится. Ошибка плавающая... Я в потоках этих не разбираюсь... Однако, если прописать вместо ServerTime = currentDate.ApplyTimeZone(TimeHelper.Moscow), ServerTime = qr.CurrentDateTime.ApplyTimeZone(TimeHelper.Moscow), то вроде будет работать и время сменяться. Только в файлах начало дня при таком раскладе будет 4 часа.
Тип Unknown для quotes действительно надо фильтровать, в файле MainWindow.xaml.cs я добавил Where var quotes2 = quotes**.Where(q => q.Type != QuoteType.Unknown)**.Select(... что позволяет сразу выкинуть этот тип из рассмотрения.
И цена бывает иногда нулевая, тоже можно фильтровать при желании.
Для правки времени согласен с постом выше, можно использовать ServerTime = qr.CurrentDateTime.ApplyTimeZone(TimeHelper.Moscow) и тогда присвоение currentDate выше можно удалить, оно нигде не используется.
Писал подобную утилиту для TSLab и тоже заметил проблему рассинхронизации стакана и сделок. Как я понял эту проблему:
При генерации из ордер лога всё хорошо, так как в логе есть все записи, а вот с акциями придётся наворачивать.
Как поступил я.
Если акция я просто создаю сразу 2 QshReader для Deals.qsh и Quotes.qsh. И начинаю их читать опираясь на внутреннее время записи QshReader CurrentDateTime, и стакан синхронизирую относительно времени сделки.
Есть засада, что стаканы до первой сделки придётся проигнорировать, но в моей задаче была цель узнать лучший Бид/Аск в момент сделки и я её так решил.
Надеюсь помог.
Думаю скоро погружусь в эту задачу и для StokSharp
Позвольте глупый вопрос... При импорте данных QSH по инструменту RIZ2019 за 20.11.19 первая строка: 064624425;+03:00;637098399844250000;38091733454;143780;1;Buy;Done;PutInQueue;;;; 64624425 это время в миллисекундах с начала дня, получается 18 часов? Или это 06:46? Первая сделка должна проходить в 10:00 мск.
Здравствуйте, у меня Qsh2bin не видит файлы QSH
Я не трейдер, меня попросили сконвертировать данные в csv или txt, нашел вашу утилиту, но она выдает ошибку при конвертации. qsh.7z исходные файлы и то что получается SBER@FORTS.7z
Что делаю не так?
Обновил утилиту. Перевел на 17ую версию, заобно пофиксил ошибки. Бинарники так же по ссылке https://github.com/StockSharp/Qsh2Bin/releases
Важный момент при анализе записей. QSH не имеет признака временной зоны у времени. Поэтому понять в какой временной зоне записаны данные невозможно. С большей вероятностью она может быть или Московская или UTC. Точно могу сказать, что Церих и Айти в разных временных зонах пишут данные.
Как вишенка на торт - временная зона биржевой даты так же может отличаться от временной зоны локальной метки (хотя, это вполне логично, но вдруг для кого-то сюрприз).
Как решить это проблему. Конечно же, надо писать всё в UTC. Но данные и формат уже легаси, поэтому в утилите две выпадающих списка. Один для установка временной зоны локальной отметки, другой для биржевой.
После конвертации может Гидрой или через S#.Storage API просмотреть полученные данные на предмет времени. Если начало торгов что-то вроде 7 часов утра - значит временная зона была в UTC.
Пишите о своём опыте использования. Ошибки старайтесь сами исправить, исходники на Гите. Папку с рефами не заливал, чтобы не захламлять дистрибутив. Думаю, кто умеет код пистать, эту проблему порешает.
Данные по качестве средней паршивости и для пипсовых алгоритмов совершенно бесполезные из-за недостоверной отметки времени и пропуска ряда цен внутри спреда (я про стакан). Но объемы более менее совпадают по итогу. Сервис уже достоин медали, что столь долго существует, и его ещё кто-то поддерживает.
А АйТи ещё продолжает шарить записи с qscalp ?