Path: blob/master/ invest-robot-contest_TinkoffBot-main/lib/func.py
5929 views
from datetime import datetime, timedelta12from tinkoff.invest import CandleInterval, Quotation, AccessLevel, AccountStatus, AccountType345def Qt(obj: Quotation) -> float:6return obj.units + obj.nano / 1e9789def TradeSession(client, exchange):10'''11Проверяем можно ли сейчас торговать или сессия закрыта12торговлю начинаем через 5 минут после открытия торгов13и заканчиваем за 15 минут до окончания14'''15tms = client.instruments.trading_schedules(from_=datetime.utcnow(), to=datetime.utcnow())16for i in tms.exchanges:17if i.exchange == exchange:18if i.days[0].is_trading_day:19if i.days[0].start_time.timestamp() > datetime.utcnow().timestamp():20start_time = i.days[0].start_time + timedelta(minutes=5)21end_time = i.days[0].end_time - timedelta(minutes=15)22return True, start_time, end_time23return False,242526def GetHistoryData(client, figi, from_data, to_date, interval):27'''28получаем историю по выбранному интсрументу29'''30candles = client.market_data.get_candles(figi=figi, from_=from_data, to=to_date, interval=interval)3132data = []33for i in candles.candles:34data.append((Qt(i.open), Qt(i.high), Qt(i.low), Qt(i.close), i.volume, str(i.time), i.is_complete))3536return data373839def SynchronizationTwoArray(smb_1, smb_2):40smb_1_index = 041smb_2_index = 042len_common = min(len(smb_1), len(smb_2))4344out_1 = []45out_2 = []4647while True:48# ('open', 'high', 'low', 'close', 'volume', 'time', 'bar complete')49dt1 = smb_1[smb_1_index][5]50dt2 = smb_2[smb_2_index][5]5152if dt1 > dt2:53smb_2_index += 154continue5556if dt1 < dt2:57smb_1_index += 158continue5960out_1.append(smb_1[smb_1_index])61out_2.append(smb_2[smb_2_index])6263smb_1_index += 164smb_2_index += 16566if smb_1_index >= len_common or smb_2_index >= len_common:67break6869return out_1, out_2707172def AbsoluteToRelative(smb, start_price):73'''74оставляем только отношение к цене открытия. Остальные данные отбрасываем75цена открытия плавающая, чтобы была возможность её менять при закрытии сделки внутри дня76'''77data = list(map(lambda i: float(i[3] / start_price - 1) * 100, smb))78data.insert(0, 0)79return data808182def CalcMinDelta():83'''84Рассчитываем минимально необходимое расхождение между активами необхадимое для входа85другими словами складываем все комиссионные издержки и переводимв относительную шкалу86'''87return abs(0.2)888990def FigiToTicker(figi) -> str:91'''92получаем тикер по фиги93'''94return ''959697def FindTwoInstruments():98'''99Функция поиска необходимой пары инструментов100Можно использовать коинтеграцию.101Если инструменты схожи или из одного сектора экономики то можно использовать корреляцию102Также можно использовать один инструмент но с разных бирж или секиий одной биржи103к акция + её адр104или спот+фьюч105'''106SRM2 = 'FUTSBRF06220'107VBM2 = 'FUTVTBR06220'108return SRM2, VBM2109110111def FindOpenDeals(client, account_id):112'''113Ищем открытые сделки114'''115acc = client.sandbox.get_sandbox_positions(account_id=account_id)116return acc.futures117118119def OpenDeal(client, account_id, figi, lots, direction, order_type, order_id, sandbox):120'''121Отправляем ордер.Пока работаем только с маркетами122'''123if sandbox:124r = client.sandbox.post_sandbox_order(figi=figi, quantity=lots, account_id=account_id, direction=direction,125order_type=order_type, order_id=order_id)126else:127r = client.orders.post_order(figi=figi, quantity=lots, account_id=account_id, direction=direction,128order_type=order_type, order_id=order_id)129return r130131132def CloseAccountSandbox(client, account_id):133try:134client.sandbox.close_sandbox_account(account_id=account_id)135except:136pass137138139def GetAccountSandbox(client):140# в песочнице берём первый акк141acc = client.sandbox.get_sandbox_accounts()142if acc.accounts == []:143acc = client.sandbox.open_sandbox_account()144return acc.account_id145return acc.accounts[0].id146147148def GetBalance(client, sandbox, account_id):149if sandbox:150acc = client.sandbox.get_sandbox_portfolio(account_id=account_id)151return acc.total_amount_currencies152153154