Files
QuikPy/Examples/04 - Bars.py

66 lines
5.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import os.path
import pandas as pd
from QuikPy import QuikPy # Работа с Quik из Python через LUA скрипты QuikSharp
def SaveCandlesToFile(classCode='TQBR', secCodes=('SBER',), timeFrame='D', compression=1):
interval = compression # Для минутных временнЫх интервалов ставим кол-во минут
if timeFrame == 'D': # Дневной временной интервал
interval = 1440 # В минутах
elif timeFrame == 'W': # Недельный временной интервал
interval = 10080 # В минутах
elif timeFrame == 'MN': # Месячный временной интервал
interval = 23200 # В минутах
for secCode in secCodes: # Пробегаемся по всем тикерам
fileName = f'..\\..\\Data\\{classCode}.{secCode}_{timeFrame}{compression}.txt'
isFileExists = os.path.isfile(fileName) # Существует ли файл
if not isFileExists: # Если файл не существует
print(f'Файл {fileName} не найден и будет создан')
else: # Файл существует
print(f'Получение файла {fileName}')
fileBars = pd.read_csv(fileName, sep='\t', index_col='datetime') # Считываем файл в DataFrame
fileBars.index = pd.to_datetime(fileBars.index, format='%d.%m.%Y %H:%M') # Переводим индекс в формат datetime
print(f'- Первая запись файла: {fileBars.index[0]}')
print(f'- Последняя запись файла: {fileBars.index[-1]}')
print(f'- Кол-во записей в файле: {len(fileBars)}')
newBars = qpProvider.GetCandlesFromDataSource(classCode, secCode, interval, 0)["data"] # Получаем все свечки
pdBars = pd.DataFrame.from_dict(pd.json_normalize(newBars), orient='columns') # Внутренние колонки даты/времени разворачиваем в отдельные колонки
pdBars.rename(columns={'datetime.year': 'year', 'datetime.month': 'month', 'datetime.day': 'day',
'datetime.hour': 'hour', 'datetime.min': 'minute', 'datetime.sec': 'second'},
inplace=True) # Чтобы получить дату/время переименовываем колонки
pdBars.index = pd.to_datetime(pdBars[['year', 'month', 'day', 'hour', 'minute', 'second']]) # Собираем дату/время из колонок
pdBars = pdBars[['open', 'high', 'low', 'close', 'volume']] # Отбираем нужные колонки
pdBars.index.name = 'datetime' # Ставим название индекса даты/времени
pdBars.volume = pd.to_numeric(pdBars.volume, downcast='integer') # Объемы могут быть только целыми
print(f'- Первая запись в QUIK: {pdBars.index[0]}')
print(f'- Последняя запись в QUIK: {pdBars.index[-1]}')
print(f'- Кол-во записей в QUIK: {len(pdBars)}')
if isFileExists: # Если файл существует
pdBars = pd.concat([fileBars, pdBars]).drop_duplicates(keep='last').sort_index() # Объединяем файл с данными из QUIK, убираем дубликаты, сортируем заново
pdBars.to_csv(fileName, sep='\t', date_format='%d.%m.%Y %H:%M')
print(f'- В файл {fileName} сохранено записей: {len(pdBars)}')
if __name__ == '__main__': # Точка входа при запуске этого скрипта
qpProvider = QuikPy() # Вызываем конструктор QuikPy с подключением к локальному компьютеру с QUIK
# qpProvider = QuikPy(Host='192.168.1.7') # Вызываем конструктор QuikPy с подключением к удаленному компьютеру с QUIK
classCode = 'TQBR' # Акции ММВБ
secCodes = ('SBER', 'GMKN', 'GAZP', 'LKOH', 'TATN', 'YNDX', 'TCSG', 'ROSN', 'NVTK', 'MVID',
'CHMF', 'POLY', 'OZON', 'ALRS', 'MAIL', 'MTSS', 'NLMK', 'MAGN', 'PLZL', 'MGNT',
'MOEX', 'TRMK', 'RUAL', 'SNGS', 'AFKS', 'SBERP', 'SIBN', 'FIVE', 'SNGSP', 'AFLT',
'IRAO', 'PHOR', 'TATNP', 'VTBR', 'QIWI', 'CBOM', 'FEES', 'BELU', 'TRNFP', 'FIXP') # TOP 40 акций ММВБ
SaveCandlesToFile(classCode, secCodes) # По умолчанию получаем дневные бары
classCode = 'SPBFUT' # Фьючерсы РТС
secCodes = ('SiZ1', 'RIZ1') # Формат фьючерса: <Тикер><Месяц экспирации><Последняя цифра года> Месяц экспирации: 3-H, 6-M, 9-U, 12-Z
SaveCandlesToFile(classCode, secCodes) # По умолчанию получаем дневные бары
timeFrame = 'M' # Временной интервал: 'M'-Минуты, 'D'-дни, 'W'-недели, 'MN'-месяцы
compression = 5 # Кол-во минут для минутного графика. Для остальных = 1
SaveCandlesToFile(classCode, secCodes, timeFrame, compression) # Получаем 5-и минутные бары
qpProvider.CloseConnectionAndThread() # Перед выходом закрываем соединение и поток QuikPy из любого экземпляра