Наконец более-менее довел до ума код, который берет данные с информационно-статистического сервера биржи.
В
предыдущей теме скрипт запрашивал некоторое количество тиков, привязанных либо к текущему моменту, либо к началу торгового дня. Сейчас я сделал так, что можно брать тики от начала заданного дня (доступны только текущий и два предыдущих рабочих) до текущего времени заданного дня. Похоже, сервер кривой и не дает за весь прошлый день получить тики. Зато, если дождаться 22:00, можно получить все что требуется за текущий день и два предыдущих.
Пока что заливаю файлы сюда, позже обновлю на гитхабе.
yadi.sk/d/ccTtLzbk3Rbtty
В общем, чтобы сохранить тики в файл, надо просто запустить скрипт iss_simple_main.py, предварительно в нем указав нужный день:
iss.get_trades_for_session( 'futures', 'forts', 'RIH8', 2 ) # доступны значения 0, 1, 2
Когда файл сохранится, можно нарисовать такой вот график с помощью скрипта iss_plot_trades.py:
Для этого надо указать в скрипте имя файла, который будем строить:
fname = 'RIH8 280218 10-00-34+0300.txt'
В файле первая строчка задает время нулевого тика:
zeroTime: 1519801234
а дальше идут строчками тики, задаваемыми тремя значениями, время относительно нулевого тика<tab>цена<tab>объем:
0 130410 3
0 130400 3
0 130370 10
Направления сделок, цены бид/аск, открытый интерес в этих данных недоступны — это уже Мосбиржей продается за деньги.
UPD: В файле iss_simple_main.py строчке 63 я сделал округление до нуля знаков после запятой, чтобы файл меньше занимал места:
f.write( '%d\t%.0f\t%d\n' % ( sec[0] — zeroTime, sec[1], sec[2] ) )
Если ваш инструмент имеет точность сколько-то знаков после запятой, это число надо указать вместо «0» выделенного цветом.
previous_session = 0:
previous_session = 1:
previous_session = 2:
previous_session = 3:
Надеюсь, эти мои исследования действительно кому-то окажутся полезными. Позже я расскажу про свое знакомство с платными данными от Мосбиржи (купил у них месяц тиков и лучших котировок по RIH8). Некоторые моменты хотелось бы прояснить у знающих людей. Там, например в заявках какой-то ад творится, что так просто этими бид-аск не воспользуешься, надо придумывать как их отфильтровывать. Но менеджер по данным продуктам сказал что все норм, алгоритмы поменялись и вот теперь такая фигня, зато все по-честному показано))
www.moex.com/ru/orders?historicaldata
(см .csv файлы). Полный стакан как анализировать по полной программе — это та еще задача, сам такой наукой не владею, на самом деле. Но стакан сохраняю из квика, на всякий пожарный) Да! Эти данные от 2014 года, там нормальные котировки бид-аск, вот так выглядят если построить:
(первые 15 секунд от начала вечерней сессии)
А на нынешний 2018 год оно уже выглядит совсем по-другому.
из питона прочесть файл построчно очень просто!
f = open( 'file.txt' )
for line in f:
print( line[ :-1 ] ) #откусываем последний символ "\n"
f.close()
А дде я не использую, посылаю тик (или другие данные) в dll и там уже их сохраняю в с++ коде, который в основном stl использует. Получается очень быстро, насколько быстрее чем это делать в lua не измерял, но, подозреваю, что при некотором потолке выделенной памяти, скажем, 50 мб или 100 может резко производительность деградировать. С сишным кодом такого не происходит при сотне мб уж точно.
P.S. с readlines() не должно быть никаких проблем:
If you want to read all the lines of a file in a list you can also use
list(f)
orf.readlines()
.например, предыдущий код можно переписать так:
f = open( 'file.txt' )
lines = f.readlines() #или list(f)
f.close()
for line in lines:
print( line[ :-1 ] ) #откусываем последний символ "\n", тут не уверен, может, питон уже откусил
например хочу получить следующее если данные в этом столбце меняются на больше 20 и oi вырос на 20, то print(значение)
можете ссылочку дать на книгу какую или статью… а то, что у меня есть не помогает мне))
пример slicing:
i-й столбец матрицы:
ith_column = matr[ :, i ]
надо помнить, что ith_column не новый объект, а ссылка на часть matr. Чтобы был новый, надо написать
ith_column = numpy.array( matr[ :, i ] )
boolean indexing. Вычленяем из столбца значения, которые больше либо равны какого-то уровня, скажем
level = 0
filtered = ith_column[ ith_column >= level ]
можно использовать комбинированное условие:
low_level = 0
high_level = 1000
filtered = ith_column[ numpy.logical_and( ith_column >= low_level, ith_column < high_level ) ]
С обычными списками (кортежами) такое напрямую не работает. А если заставить чтобы работало, все равно по скорости это будет сильно уступать показанных примеров с numpy
github.com/pecec/moex_iss