Path: blob/master/ invest-robot-contest_TinkoffBot-main/main.py
5925 views
from time import sleep12from tinkoff.invest import Client, OrderDirection, OrderType, MoneyValue34from lib.func import *5from settings import Token, AccountNum67TOKEN = Token.broker_full8ACCOUNT_ID = AccountNum.broker9APP_NAME = 'Desead'10SANDBOX = True11LOT_1 = 112LOT_2 = 113SAVE_DATA_FILE = False14SAVE_FILE_NAME = 'all_data.csv'151617def main():18with Client(token=TOKEN, app_name=APP_NAME) as client:19# CloseAccountSandbox(client, account_id='3dfdcd62-4f5e-49c6-990c-c88e1a1de356')2021# ================ Получаем account_id ================22# ========================================================23if SANDBOX:24account_id = GetAccountSandbox(client)25if GetBalance(client, SANDBOX, account_id).units == 0: # если баланс = 0 закинем туда 1 млн26client.sandbox.sandbox_pay_in(account_id=account_id,27amount=MoneyValue(currency='rub', units=1000000, nano=0))28else:29account_id = ACCOUNT_ID30print('account_id:', account_id)3132# ================ Ищем необходимые для торговли пары инструментов ==========33# ==============================================================================34smb_1_figi, smb_2_figi = FindTwoInstruments()35print('Используемый инструмент 1:', smb_1_figi)36print('Используемый инструмент 2:', smb_2_figi)3738# ================ Проверяем торговые сессии ==========39# ========================================================40# trade_time=(True, start_time_trade, end_time_trade)41trade_time = TradeSession(client, 'FORTS')4243open_figi = None44lot = 045direction = None4647while True:48# ================ Получаем исторические данные ===========49# ============================================================50smb_1_data = GetHistoryData(client, smb_1_figi, datetime.utcnow() - timedelta(minutes=24 * 60),51datetime.utcnow(), CandleInterval.CANDLE_INTERVAL_1_MIN)52smb_2_data = GetHistoryData(client, smb_2_figi, datetime.utcnow() - timedelta(minutes=24 * 60),53datetime.utcnow(), CandleInterval.CANDLE_INTERVAL_1_MIN)54print('Всего получено свечей по инструменту 1:', len(smb_1_data))55print('Всего получено свечей по инструменту 2:', len(smb_2_data))5657# ================ Синхронизируем исторические данныи ===========58# ==================================================================59smb_1_data, smb_2_data = SynchronizationTwoArray(smb_1_data, smb_2_data)60start_index = 061smb_1_start_price = float(smb_1_data[start_index][0])62smb_2_start_price = float(smb_2_data[start_index][0])63print('Свечей после синхронизации по инструменту 1:', len(smb_1_data))64print('Свечей после синхронизации по инструменту 2:', len(smb_2_data))65print('Стартовая цена по инструменту 1:', smb_1_start_price)66print('Стартовая цена по инструменту 2:', smb_2_start_price)6768# ================ Переводим в относительную шкалу ==============69# ==================================================================70smb_1_relative = AbsoluteToRelative(smb_1_data, smb_1_start_price)71smb_2_relative = AbsoluteToRelative(smb_2_data, smb_2_start_price)7273# ================ Скинем данные в файл при необходимости ==============74# =========================================================================75if SAVE_DATA_FILE:76with open(SAVE_FILE_NAME, mode='w') as fl:77fl.write('time;;open_1;high_1;low_1;close_1;;open_2;high_2;low_2;close_2;;0;0;delta\n')78for k, v in enumerate(smb_1_data):79fl.write(str(smb_1_data[k][5]) + ';;' +80str(smb_1_data[k][0]) + ';' +81str(smb_1_data[k][1]) + ';' +82str(smb_1_data[k][2]) + ';' +83str(smb_1_data[k][3]) + ';;' +84str(smb_2_data[k][0]) + ';' +85str(smb_2_data[k][1]) + ';' +86str(smb_2_data[k][2]) + ';' +87str(smb_2_data[k][3]) + ';;' +88str(smb_1_relative[k + 1]) + ';' +89str(smb_2_relative[k + 1]) + ';' +90str(smb_1_relative[k + 1] - smb_2_relative[k + 1]) +91'\n')9293# ================ Считаем текущую дельту и если она привышает пороговое значение то входим в сделку94# ====================================================================================================95delta_1 = smb_1_relative[-1]96delta_2 = smb_2_relative[-1]97delta = round(delta_1 - delta_2, 3)98print('Текущее расхождение: ', delta)99100# Открываем новую сделку только если нет другой открытой сделки по этой паре инструментов101order_id = datetime.now().strftime('%Y-%m-%d %H:%M:%S')102103if FindOpenDeals(client, account_id) == []:104if delta_1 * delta_2 > 0: # если оба инструмента движутся в одном направлении105if abs(delta) >= CalcMinDelta():106if delta_1 > 0: # если движемся вверх107if delta > 0: # значит покупаем инструмент 2108open_figi = smb_2_figi109lot = LOT_2110direction = OrderDirection.ORDER_DIRECTION_BUY111if delta < 0: # значит покупаем инструмент 1112open_figi = smb_1_figi113lot = LOT_1114direction = OrderDirection.ORDER_DIRECTION_BUY115if delta_1 < 0: # если движемся вниз116if delta > 0: # значит продаём инструмент 1117open_figi = smb_1_figi118lot = LOT_1119direction = OrderDirection.ORDER_DIRECTION_SELL120if delta < 0: # значит продаём инструмент 2121open_figi = smb_2_figi122lot = LOT_2123direction = OrderDirection.ORDER_DIRECTION_SELL124else: # проверяем не пора ли закрыть сделки125if trade_time[0]:126if datetime.utcnow().timestamp() >= trade_time[2]:127if direction == OrderDirection.ORDER_DIRECTION_SELL:128direction = OrderDirection.ORDER_DIRECTION_BUY129else:130direction = OrderDirection.ORDER_DIRECTION_SELL131132if lot > 0:133r = OpenDeal(client, account_id, open_figi, lot, direction, OrderType.ORDER_TYPE_MARKET, order_id,134SANDBOX)135136sleep(60)137138139if __name__ == '__main__':140main()141142143