Была у меня мысль, и сейчас она есть, сделать автообновление истории по нашим акциям и фьючерсам. Так как у самого времени на это не хватало, на разбирательство что и как то перепоручил это дело знакомому. Вот об этом и рассказ. Может кто то уже сталкивался или делал это. Может подскажите. В данной теме буду продолжать писать до тех пор пока вопрос не решиться и я не получу необходимый результат.
Стиль автора сохранен.
Добрый день! Эта история о том, как я работал с продуктом S# - S#.Data, также известной как Гидра.
Идея была таковой: обеспечить автоматическую загрузку и обновление исторических данных (минутные свечи) с Финама по сотне акций и двум десяткам фьючерсов. Решено было реализовать эту идею с помощью источника «Финам» и задачи «Экспорт (авто)». С первых минут работы с сим шедевром стало ясно, что придётся помучиться. Первым делом загрузил все инструменты, доступные Гидре (с трудом, ибо Гидра начала бунтовать, пришлось перезапустить это чудовище), после добавил примерно сотню акций и около двадцати фьючерсов, настроил кое-как источник и задачу, установил начальную дату для загрузки историй.
Первой серьёзной, как тогда казалось, проблемой стал шаблон экспорта, но всё по порядку. Пришлось разбираться, какой формат данных нужен был (предусматривалась работа с TSLab): скриншот ниже.
http://prntscr.com/ky2z8b Загвоздка оказалась в том, что данный файл с расширением 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 (слева — с Финама, справа — с Гидры):
http://prntscr.com/ky31t1 Рядом на скриншоте можно увидеть, что Гидра считает HYDR@TQBR акцией:
http://prntscr.com/ky325tИ добавлю про логи: Гидра пишет, что начинает загрузку данных с 2007 года, но потом, с 2011 года, по-настоящему начинает загружать:
http://prntscr.com/ky32uz Кстати, интересен факт того, что скаченные данные уже неправильные, т. е. Это не экспорт шалит, а именно источник Финам. Вот сравнение скачанных данных, лежащих в папке Гидры (слева) и выходного файла (справа) после экспорта:
http://prntscr.com/ky33ji Мало того, что данные разные, так ещё и история с Гидры начинается 01.03.2011, как будто это фьючерс какой-то. И так со многими акциями, почти со всеми. Фьючерсы вроде правильные, но я проверял не все.
Моё повествование подошло к концу. Собственно, зачем я всё это писал? Чтобы попросить вас о помощи. Что не так с Гидрой? И вообще, взбесилась Гидра или Финам? Почему Гидра и Финам предоставляют абсолютно разные данные?