Path: blob/master/ invest-robot-contest_TI_API_2-master/Instr_last_candles.py
5918 views
from intro.quotation_dt import quotation_count1from datetime import datetime, timedelta2from pathlib import Path3import tinkoff.invest4import intro.basek5import intro.accid6import pandas as pd7import time8import pandas_ta as ta910# Здесь запросы токена и id из stub файлов, и самого клиента из библиотеки Тинькофф11TOKEN = intro.basek.TINKOFF_INVEST_DOG_NEW12SDK_client = tinkoff.invest.Client(TOKEN)13User_acc_ID = intro.accid.ACC_ID1415# Здесь переменные по которым будет производиться запрос свечей (Figi инструмента,16# интервал данных и месяц, а так же числа за который нужны данные.17# Эти значения выбираем вручную из полученного списка инструментов18cti_future = 'FUTBR0722000'19tf = tinkoff.invest.CandleInterval.CANDLE_INTERVAL_5_MIN20start_date = datetime.fromisoformat('2022-04-23T10:00:00') # time from 10 a.m. UTC+3 format: '2022-04-25T13:00:00'21end_date = datetime.fromisoformat('2022-05-25T19:00:00') # time to 7 p.m. UTC+3 format: '2022-04-25T13:00:00'222324# Функция получения данных свечей по инструменту25def current_trade_instrument_candles(cti_figi, interval):26try:27with SDK_client as client:28period = datetime.date(end_date) - datetime.date(start_date)29period_days = period.days3031for i in range(0, period_days):32current_date = start_date + timedelta(i)33start = [current_date.year, current_date.month, current_date.day, start_date.hour, start_date.minute]34end = [current_date.year, current_date.month, current_date.day, end_date.hour, end_date.minute]35cti_candles = client.market_data.get_candles(36figi=cti_figi,37from_=datetime(start[0], start[1], start[2], start[3], start[4]),38to=datetime(end[0], end[1], end[2], end[3], end[4]),39interval=interval40)41# Обработка запроса по форме42candle_df = create_candle_df(cti_candles.candles)43if candle_df.empty:44continue45else:46# Добавление индикаторов47candle_df['ema'] = ta.ema(candle_df['close'], 10)48candle_df['ma'] = ta.sma(candle_df['close'], lenght=10)49# Запись полученных данных в табличку50# указать название файла соответствующее инструменту51filepath = Path('csv_files/instrument_name.csv')52df = pd.DataFrame(candle_df)53print(df.dtypes)54df.to_csv(filepath, mode='a')55time.sleep(0.1)56print('Record ', i, ' complete')5758df_check = pd.read_csv('csv_files/instrument_name.csv')59# Убираем пропуски значений60df_check.dropna(inplace=True)61# Убираем повторения названий из выгрузки62df_check.drop_duplicates(subset=['time', 'volume', 'open', 'close', 'high', 'low'],63inplace=True64)65df_check.drop(columns=['Unnamed: 0'], inplace=True)66print(df_check.dtypes)67df = df_check.convert_dtypes(infer_objects=True)68# Запись полученных данных в табличку69# указать название файла соответствующее инструменту70filepath = Path('csv_files/instrument_name.csv')71print(df.dtypes)72df.to_csv(filepath, mode='w')7374return candle_df75except tinkoff.invest.RequestError as e:76print(str(e))777879# Форма для обработки полученных данных80def create_candle_df(candles: [tinkoff.invest.HistoricCandle]):81candle_df = pd.DataFrame([{82'time': pd.Timestamp(c.time),83'volume': c.volume,84'open': quotation_count(c.open),85'close': quotation_count(c.close),86'high': quotation_count(c.high),87'low': quotation_count(c.low),88} for c in candles])89return candle_df909192ctic = current_trade_instrument_candles(cti_future, tf)939495