Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wiseplat
GitHub Repository: wiseplat/python-code
Path: blob/master/ invest-robot-contest_TinkoffInvestBot-main/sandbox.py
5925 views
1
import logging
2
import tinkoff.invest as ti
3
from datetime import datetime
4
from functions import get_shares_figi, get_time_series, create_df_from_stream, recalculate_time_series,\
5
get_sandbox_account_id, convert_price, get_shares_lot_size, INSTRUMENT_TICKER
6
7
8
TOKEN = 'TOKEN'
9
INITIAL_DIRECTION = 1 # Направление сделки: 0 - покупка, 1 - продажа
10
11
12
def test_hypothesis():
13
with ti.Client(TOKEN) as client:
14
sharefigi = get_shares_figi(client, INSTRUMENT_TICKER)
15
sharecandles = get_time_series(client, sharefigi)
16
# Проверка гипотезы на последних 500 записях
17
money = 10000 # Первоначальная баланс счета
18
akcii = 0 # Направление сделки: 0 - покупка, 1 - продажа
19
n = sharecandles.shape[0] - 500
20
lot = get_shares_lot_size(client, INSTRUMENT_TICKER)
21
for i in range(500):
22
k = sharecandles.loc[i + n, '%K']
23
d = sharecandles.loc[i + n, '%D']
24
price = sharecandles.loc[i + n, 'close']
25
t = sharecandles.loc[i + n, 'time']
26
if k < d < 20 and akcii == 0:
27
print(t, 'Покупка акции', INSTRUMENT_TICKER, 'по цене', price)
28
akcii = 1
29
money = money - price * lot
30
if k > d > 80 and akcii == 1:
31
print(t, 'Продажа акции', INSTRUMENT_TICKER, 'по цене', price)
32
akcii = 0
33
money = money + price * lot
34
print('Баланс счета', money)
35
print('Количество акций на счете', akcii)
36
37
38
def start():
39
logging.basicConfig(filename='tinkoff_invest_bot_sandbox.log', level=logging.DEBUG,
40
format='%(asctime)s %(levelname)s:%(message)s')
41
with ti.Client(TOKEN, app_name='Loginov-Mikhail_TinkoffInvestBot') as client:
42
sandbox_account_id = get_sandbox_account_id(client)
43
sharefigi = get_shares_figi(client, INSTRUMENT_TICKER)
44
sharecandles = get_time_series(client, sharefigi)
45
# Включение подписки на свечи указанного тикера
46
market_data_stream = client.create_market_data_stream()
47
market_data_stream.candles.subscribe(
48
[
49
ti.CandleInstrument(
50
figi=sharefigi,
51
interval=ti.SubscriptionInterval.SUBSCRIPTION_INTERVAL_FIVE_MINUTES,
52
)
53
]
54
)
55
akcii = INITIAL_DIRECTION
56
oi = '' # order_id - необходим для проверки исполнения выставленной заявки
57
for marketdata in market_data_stream:
58
print(marketdata)
59
if marketdata.subscribe_candles_response is not None:
60
print(marketdata.subscribe_candles_response.tracking_id)
61
logging.info('Включена подписка на данные для инструмента ' + INSTRUMENT_TICKER + ' c tracking_id=' +
62
marketdata.subscribe_candles_response.tracking_id)
63
if marketdata.candle is not None:
64
# TODO: Добавить проверку на завершение периода свечи
65
tempdf = create_df_from_stream(marketdata.candle)
66
sharecandles = recalculate_time_series(sharecandles, tempdf)
67
# print(sharecandles.tail())
68
j = sharecandles.index[-1]
69
k = sharecandles.loc[j, '%K']
70
d = sharecandles.loc[j, '%D']
71
price = sharecandles.loc[j, 'close']
72
t = sharecandles.loc[j, 'time']
73
print(t, price)
74
logging.info('Цена закрытия ' + str(price))
75
if oi != '':
76
r = client.sandbox.get_sandbox_order_state(account_id=sandbox_account_id, order_id=oi)
77
if r.lots_executed > 0:
78
logging.info('Заявка ' + oi + ' исполнена по цене ' +
79
str(convert_price(r.executed_order_price)) + ' в ' +
80
r.order_date.strftime('%Y-%m-%d %H:%M:%S'))
81
oi = ''
82
if k < d < 20 and akcii == 0 and oi == '':
83
print(t, k, d, price, 'Купить')
84
akcii = 1
85
datestr = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
86
r = client.sandbox.post_sandbox_order(figi=sharefigi, quantity=1, account_id=sandbox_account_id,
87
order_id='Loginov-Mikhail_TinkoffInvestBot_'+datestr,
88
direction=ti.OrderDirection.ORDER_DIRECTION_BUY,
89
order_type=ti.OrderType.ORDER_TYPE_LIMIT,
90
price=marketdata.candle.close)
91
print(r)
92
oi = r.order_id
93
logging.info('Выставлена заявка ' + oi + ' на покупку одного лота ' + INSTRUMENT_TICKER +
94
' по цене ' + str(convert_price(marketdata.candle.close)))
95
if k > d > 80 and akcii == 1 and oi == '':
96
print(t, k, d, price, 'Продать')
97
akcii = 0
98
datestr = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
99
r = client.sandbox.post_sandbox_order(figi=sharefigi, quantity=1, account_id=sandbox_account_id,
100
order_id='Loginov-Mikhail_TinkoffInvestBot_' + datestr,
101
direction=ti.OrderDirection.ORDER_DIRECTION_SELL,
102
order_type=ti.OrderType.ORDER_TYPE_LIMIT,
103
price=marketdata.candle.close)
104
print(r)
105
oi = r.order_id
106
logging.info('Выставлена заявка ' + oi + ' на продажу одного лота ' + INSTRUMENT_TICKER +
107
' по цене ' + str(convert_price(marketdata.candle.close)))
108
109
110
if __name__ == '__main__':
111
test_hypothesis()
112
start()
113
114