diff --git a/Examples/04 - Bars.py b/Examples/04 - Bars.py index 92bdf89..6d30b33 100644 --- a/Examples/04 - Bars.py +++ b/Examples/04 - Bars.py @@ -1,10 +1,11 @@ from time import time 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): +def SaveCandlesToFile(classCode='TQBR', secCodes=('SBER',), timeFrame='D', compression=1, skipLast=False): interval = compression # Для минутных временнЫх интервалов ставим кол-во минут if timeFrame == 'D': # Дневной временной интервал interval = 1440 # В минутах @@ -27,6 +28,8 @@ def SaveCandlesToFile(classCode='TQBR', secCodes=('SBER',), timeFrame='D', compr print(f'- Кол-во записей в файле: {len(fileBars)}') newBars = qpProvider.GetCandlesFromDataSource(classCode, secCode, interval, 0)["data"] # Получаем все свечки + if skipLast: # Для дневных баров мы получаем еще несформировавшийся бар текущей сессии. Он нам не нужен + newBars = newBars[:len(newBars) - 1] # Берем все бары кроме последнего 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'}, @@ -38,9 +41,9 @@ def SaveCandlesToFile(classCode='TQBR', secCodes=('SBER',), timeFrame='D', compr 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)}') @@ -59,15 +62,15 @@ if __name__ == '__main__': # Точка входа при запуске это '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) # По умолчанию получаем дневные бары + SaveCandlesToFile(classCode, secCodes, skipLast=True) # Получаем дневные бары без последнего бара SaveCandlesToFile(classCode, secCodes, timeFrame, compression1) # Получаем 5-и минутные бары SaveCandlesToFile(classCode, secCodes, timeFrame, compression2) # Получаем 15-и минутные бары classCode = 'SPBFUT' # Фьючерсы РТС secCodes = ('SiH2', 'RIH2') # Формат фьючерса: <Тикер><Месяц экспирации><Последняя цифра года> Месяц экспирации: 3-H, 6-M, 9-U, 12-Z - SaveCandlesToFile(classCode, secCodes) # По умолчанию получаем дневные бары + SaveCandlesToFile(classCode, secCodes, skipLast=True) # Получаем дневные бары без последнего бара SaveCandlesToFile(classCode, secCodes, timeFrame, compression1) # Получаем 5-и минутные бары SaveCandlesToFile(classCode, secCodes, timeFrame, compression2) # Получаем 15-и минутные бары qpProvider.CloseConnectionAndThread() # Перед выходом закрываем соединение и поток QuikPy из любого экземпляра - print(f'Скрипт выполнен за {time() - startTime} с') + print(f'Скрипт выполнен за {(time() - startTime):.2f} с')