Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wiseplat
GitHub Repository: wiseplat/python-code
Path: blob/master/ invest-robot-contest_TinkoffBot-main/main.py
5925 views
1
from time import sleep
2
3
from tinkoff.invest import Client, OrderDirection, OrderType, MoneyValue
4
5
from lib.func import *
6
from settings import Token, AccountNum
7
8
TOKEN = Token.broker_full
9
ACCOUNT_ID = AccountNum.broker
10
APP_NAME = 'Desead'
11
SANDBOX = True
12
LOT_1 = 1
13
LOT_2 = 1
14
SAVE_DATA_FILE = False
15
SAVE_FILE_NAME = 'all_data.csv'
16
17
18
def main():
19
with Client(token=TOKEN, app_name=APP_NAME) as client:
20
# CloseAccountSandbox(client, account_id='3dfdcd62-4f5e-49c6-990c-c88e1a1de356')
21
22
# ================ Получаем account_id ================
23
# ========================================================
24
if SANDBOX:
25
account_id = GetAccountSandbox(client)
26
if GetBalance(client, SANDBOX, account_id).units == 0: # если баланс = 0 закинем туда 1 млн
27
client.sandbox.sandbox_pay_in(account_id=account_id,
28
amount=MoneyValue(currency='rub', units=1000000, nano=0))
29
else:
30
account_id = ACCOUNT_ID
31
print('account_id:', account_id)
32
33
# ================ Ищем необходимые для торговли пары инструментов ==========
34
# ==============================================================================
35
smb_1_figi, smb_2_figi = FindTwoInstruments()
36
print('Используемый инструмент 1:', smb_1_figi)
37
print('Используемый инструмент 2:', smb_2_figi)
38
39
# ================ Проверяем торговые сессии ==========
40
# ========================================================
41
# trade_time=(True, start_time_trade, end_time_trade)
42
trade_time = TradeSession(client, 'FORTS')
43
44
open_figi = None
45
lot = 0
46
direction = None
47
48
while True:
49
# ================ Получаем исторические данные ===========
50
# ============================================================
51
smb_1_data = GetHistoryData(client, smb_1_figi, datetime.utcnow() - timedelta(minutes=24 * 60),
52
datetime.utcnow(), CandleInterval.CANDLE_INTERVAL_1_MIN)
53
smb_2_data = GetHistoryData(client, smb_2_figi, datetime.utcnow() - timedelta(minutes=24 * 60),
54
datetime.utcnow(), CandleInterval.CANDLE_INTERVAL_1_MIN)
55
print('Всего получено свечей по инструменту 1:', len(smb_1_data))
56
print('Всего получено свечей по инструменту 2:', len(smb_2_data))
57
58
# ================ Синхронизируем исторические данныи ===========
59
# ==================================================================
60
smb_1_data, smb_2_data = SynchronizationTwoArray(smb_1_data, smb_2_data)
61
start_index = 0
62
smb_1_start_price = float(smb_1_data[start_index][0])
63
smb_2_start_price = float(smb_2_data[start_index][0])
64
print('Свечей после синхронизации по инструменту 1:', len(smb_1_data))
65
print('Свечей после синхронизации по инструменту 2:', len(smb_2_data))
66
print('Стартовая цена по инструменту 1:', smb_1_start_price)
67
print('Стартовая цена по инструменту 2:', smb_2_start_price)
68
69
# ================ Переводим в относительную шкалу ==============
70
# ==================================================================
71
smb_1_relative = AbsoluteToRelative(smb_1_data, smb_1_start_price)
72
smb_2_relative = AbsoluteToRelative(smb_2_data, smb_2_start_price)
73
74
# ================ Скинем данные в файл при необходимости ==============
75
# =========================================================================
76
if SAVE_DATA_FILE:
77
with open(SAVE_FILE_NAME, mode='w') as fl:
78
fl.write('time;;open_1;high_1;low_1;close_1;;open_2;high_2;low_2;close_2;;0;0;delta\n')
79
for k, v in enumerate(smb_1_data):
80
fl.write(str(smb_1_data[k][5]) + ';;' +
81
str(smb_1_data[k][0]) + ';' +
82
str(smb_1_data[k][1]) + ';' +
83
str(smb_1_data[k][2]) + ';' +
84
str(smb_1_data[k][3]) + ';;' +
85
str(smb_2_data[k][0]) + ';' +
86
str(smb_2_data[k][1]) + ';' +
87
str(smb_2_data[k][2]) + ';' +
88
str(smb_2_data[k][3]) + ';;' +
89
str(smb_1_relative[k + 1]) + ';' +
90
str(smb_2_relative[k + 1]) + ';' +
91
str(smb_1_relative[k + 1] - smb_2_relative[k + 1]) +
92
'\n')
93
94
# ================ Считаем текущую дельту и если она привышает пороговое значение то входим в сделку
95
# ====================================================================================================
96
delta_1 = smb_1_relative[-1]
97
delta_2 = smb_2_relative[-1]
98
delta = round(delta_1 - delta_2, 3)
99
print('Текущее расхождение: ', delta)
100
101
# Открываем новую сделку только если нет другой открытой сделки по этой паре инструментов
102
order_id = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
103
104
if FindOpenDeals(client, account_id) == []:
105
if delta_1 * delta_2 > 0: # если оба инструмента движутся в одном направлении
106
if abs(delta) >= CalcMinDelta():
107
if delta_1 > 0: # если движемся вверх
108
if delta > 0: # значит покупаем инструмент 2
109
open_figi = smb_2_figi
110
lot = LOT_2
111
direction = OrderDirection.ORDER_DIRECTION_BUY
112
if delta < 0: # значит покупаем инструмент 1
113
open_figi = smb_1_figi
114
lot = LOT_1
115
direction = OrderDirection.ORDER_DIRECTION_BUY
116
if delta_1 < 0: # если движемся вниз
117
if delta > 0: # значит продаём инструмент 1
118
open_figi = smb_1_figi
119
lot = LOT_1
120
direction = OrderDirection.ORDER_DIRECTION_SELL
121
if delta < 0: # значит продаём инструмент 2
122
open_figi = smb_2_figi
123
lot = LOT_2
124
direction = OrderDirection.ORDER_DIRECTION_SELL
125
else: # проверяем не пора ли закрыть сделки
126
if trade_time[0]:
127
if datetime.utcnow().timestamp() >= trade_time[2]:
128
if direction == OrderDirection.ORDER_DIRECTION_SELL:
129
direction = OrderDirection.ORDER_DIRECTION_BUY
130
else:
131
direction = OrderDirection.ORDER_DIRECTION_SELL
132
133
if lot > 0:
134
r = OpenDeal(client, account_id, open_figi, lot, direction, OrderType.ORDER_TYPE_MARKET, order_id,
135
SANDBOX)
136
137
sleep(60)
138
139
140
if __name__ == '__main__':
141
main()
142
143