Блог им. Din_Don
Добрый день! Эта история о том, как я работал с продуктом S# — S#.Data, также известной как Гидра.
Идея была таковой: обеспечить автоматическую загрузку и обновление исторических данных (минутные свечи) с Финама по сотне акций и двум десяткам фьючерсов. Решено было реализовать эту идею с помощью источника «Финам» и задачи «Экспорт (авто)». С первых минут работы с сим шедевром стало ясно, что придётся помучиться. Первым делом загрузил все инструменты, доступные Гидре (с трудом, ибо Гидра начала бунтовать, пришлось перезапустить эту программу), после добавил примерно сотню акций и около двадцати фьючерсов, настроил кое-как источник и задачу, установил начальную дату для загрузки историй.
Первой серьёзной, как тогда казалось, проблемой стал шаблон экспорта, но всё по порядку. Пришлось разбираться, какой формат данных нужен был (предусматривалась работа с TSLab): скриншот ниже.
Загвоздка оказалась в том, что данный файл с расширением txt, а Гидра, как ни странно, умеет выводить текстовые файлы только в формате csv, для которого в TSLab существовал другой формат. К сожалению, скриншот вставить не могу, так как все файлы в формате csv я удалил, а это уже совсем другая история. Могу только предоставить шаблон экспорта минутных свечей, который нужен Гидре:
{OpenTime:MM/dd/yyyy};{OpenTime:HH}:{OpenTime:mm};{OpenPrice};{HighPrice};{LowPrice};{ClosePrice};{TotalVolume}
Но и с ним были проблемы: время должно было быть в формате HH:mm, поэтому в шаблоне пришлось бы прописывать {OpenTime:HH:mm}, а второе двоеточие Гидре не понравилось. Спустя две недельки до меня наконец-то дошло, что можно просто разделить поля, как в шаблоне выше. Так первая проблема была решена.
Второй проблемой стала сама механика работы задачи экспорта в Гидре. Мало того, что название экспортируемого файла было, мягко говоря, некрасивым (например: candles_TimeFrameCandle_00_01_00_SBER@TQBR_2007_01_09_2018_08_16.csv), так ещё и Гидра не могла дополнять файлы, то есть она выводила один файл, потом спустя сутки ещё один, вместо дополнения первого, и так каждый день. В итоге я наблюдал чудесную картину: три файла: один за период 01.01.2007 — 01.08.2018, другой — за период 01.08.2018 — 02.08.2018, третий — за 02.08.2018 — 03.08.2018. Чтобы избежать этой мути, пришлось писать .bat, склеивающий файлы одной акции/фьючерса, одновременно давая адекватные названия файлам. Ещё один бзик Гидры побеждён!
Но радовался я недолго… Оказалась, что в выходные и праздники Гидра продолжает каждый день экспортировать файлы, несмотря на отсутствие новых данных. В итоге каждый день появлялись новые одинаковые файлы, а скрипт их склеивал, и в основном файле со всей историей с 2007 года последние строки просто дублировались. Решение тоже нашлось: пришлось дополнить скрипт, чтобы он сравнивал новые файлы с последними строками основных файлов, и, если они идентичные, скрипт их удаляет. Одной проблемой меньше.
Очень скоро нашлась ещё одна проблема, Гидра встраивает в файлы в формате csv временной признак +3, который не нужен, и получалось, что в TSLab'е вся история была сдвинута на 3 часа вперёд. Торги начинались в 13:00, а заканчивались в 3:00. Именно тогда я психанул, удалил все файлы в формате csv и переделал шаблон и скрипт для работы с txt. Гидра экспортировала файлы в формате csv, но скрипт, склеивая их, менял их расширение на txt. Кстати, вот шаблон для минуток:
{SecurityId.SecurityCode},1,{OpenTime:yyyyMMdd},{OpenTime:HHmmss},{OpenPrice},{HighPrice},{LowPrice},{ClosePrice},{TotalVolume}
Также в формате txt TSLab'у нужен заголовок файла:
<TICKER>,<PER>,<DATE>,<TIME>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>
Дальше выясняется, что, когда Гидра видит отсутствие экспортированных вчера файлов, она создаёт новый файл, в который запихивает данные сразу за два дня: вчера и сегодня, из-за чего перестал работать правильно скрипт, ведь он ищет точное совпадение всего нового файла среди строк основного файла, а так как новый файл только наполовину содержит новые данные (данные за вчера уже есть в основном файле, а за сегодня — ещё нет), скрипт пропускает этот файл, и данные опять дублируются.
Не успел я разобраться с предыдущей проблемой, как появилась ещё одна. Оказалось, что большая часть акций просто не те! То есть данные, загруженные напрямую с Финама, сильно отличаются от данных, которые предоставила Гидра, хотя тикеры акций идентичны!
Ниже можно увидеть скриншоты истории по акции HYDR (слева — с Финама, справа — с Гидры):
Рядом на скриншоте можно увидеть, что Гидра считает HYDR@TQBRакцией:
И добавлю про логи: Гидра пишет, что начинает загрузку данных с 2007 года, но потом, с 2011 года, по-настоящему начинает загружать:
Кстати, интересен факт того, что скаченные данные уже неправильные, т. е. Это не экспорт шалит, а именно источник Финам. Вот сравнение скачанных данных, лежащих в папке Гидры (слева) и выходного файла (справа) после экспорта:
Мало того, что данные разные, так ещё и история с Гидры начинается 01.03.2011, как будто это фьючерс какой-то. И так со многими акциями, почти со всеми. Фьючерсы вроде правильные, но я проверял не все.
Моё повествование подошло к концу. Собственно, зачем я всё это писал? Чтобы попросить вас о помощи. Что не так с Гидрой? И вообще, взбесилась Гидра или Финам? Почему Гидра и Финам предоставляют абсолютно разные данные?
Вот такая история. От себя добавлю.
1. Автор статьи вместо акций скачивает фьючерс на данную акцию, хотя в настройках четко указано что это акция.
2. На поддержку StockSharp говорит писал, 0. Видимо из за того что продукт не платный.
3. Прошу откликнуться кто что знает, может кто то реализовал уже данный процесс.
HYDRA их сложная до чертиков. Так же мучался с настройками акций вместо фьючерсов. Саппорт платный, покупаю по месячно когда требуется решать вопросы. Просто писать на форум бесполезно, его никто не мониторит.
Решение было скачать ночную сборку и удалить предыдущие настройки. Перезакачал базу с Финам, все пошло нормально. Мне объяснили, что иногда Финам меняет идентификаторы у секций рынков, поэтому такое случается.
Я вот не программер, но написал такую в 2007 году за полдня (120 строк на visual basic), до сих пор работает исправно. Правда не автомат, обновление по кнопке, но мне и не надо
1. В Data нет SmartCom-а, пришлось использовать Финам, как поставщик данных.
2. Исторические данные Финам дает нормально, а с реалом — проблемы. Минутные свечки формируются неверно. Открывал параллельно поток данных от SmartCom-а и сравнивал с тем, что дает Data — идут расхождения. Возможно, причина в том, что в Data свечки формируются из тиков, а Финам дает тики с игрового сервера, не знаю.
Вообщем, эту идею оставил. Сейчас пытаюсь перенести скрипт, написанный на АПИ ТСЛаба, на ОСА. Ничего не имею против ТСЛаба, но 4 тыс. в месяц платить, по-моему, слишком дорого. Когда только разрабатывал, то писал им на техподдержку, спрашивал, тогда было оправдано. Но когда уже все отладил, то дорого. Опционами я не пользуюсь, версия 2.0 не нужна.
Off
False
False
False
False
False
False
False
True
False
False
False
False
False
False
False
False
False
Finam
01.01.2008 0:00:00
18.10.2018 0:00:00
Min1
BR
BR*22460@ED*21989@Eu*22010@GAZP*17451@GOLD*19898@MGNT*390848@MIX*81408@MOEX*390846@RTS*17455@SBRF*17456@Si*19899@
Tick
5
True
False
такой вид имеет, и в нем есть дата, вот эта дата и берется. Не пробовал поставить сильно далекую. Запрос делается на +2 дня от текущей, её и ставил. Она не меняется автоматом