Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wiseplat
GitHub Repository: wiseplat/python-code
Path: blob/master/ invest-robot-contest_TinkoffInvestBot-main/main.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_account_id, convert_price, INSTRUMENT_TICKER
6
7
8
TOKEN = 'TOKEN'
9
INITIAL_DIRECTION = 1 # Направление сделки: 0 - покупка, 1 - продажа
10
11
12
def main():
13
logging.basicConfig(filename='tinkoff_invest_bot.log', level=logging.DEBUG,
14
format='%(asctime)s %(levelname)s:%(message)s')
15
with ti.Client(TOKEN, app_name='Loginov-Mikhail.TinkoffInvestBot') as client:
16
account_id = get_account_id(client)
17
if account_id == 0:
18
exit(0)
19
print(account_id)
20
sharefigi = get_shares_figi(client, INSTRUMENT_TICKER)
21
sharecandles = get_time_series(client, sharefigi)
22
# Включение подписки на свечи указанного тикера
23
market_data_stream = client.create_market_data_stream()
24
market_data_stream.candles.subscribe(
25
[
26
ti.CandleInstrument(
27
figi=sharefigi,
28
interval=ti.SubscriptionInterval.SUBSCRIPTION_INTERVAL_FIVE_MINUTES,
29
)
30
]
31
)
32
akcii = INITIAL_DIRECTION
33
oi = '' # order_id - необходим для проверки исполнения выставленной заявки
34
for marketdata in market_data_stream:
35
# print(marketdata)
36
if marketdata.subscribe_candles_response is not None:
37
# print(marketdata.subscribe_candles_response.tracking_id)
38
logging.info('Включена подписка на данные для инструмента ' + INSTRUMENT_TICKER + ' c tracking_id=' +
39
marketdata.subscribe_candles_response.tracking_id)
40
if marketdata.candle is not None:
41
# TODO: Добавить проверку на завершение периода свечи
42
tempdf = create_df_from_stream(marketdata.candle)
43
sharecandles = recalculate_time_series(sharecandles, tempdf)
44
# print(sharecandles.tail())
45
j = sharecandles.index[-1]
46
k = sharecandles.loc[j, '%K']
47
d = sharecandles.loc[j, '%D']
48
price = sharecandles.loc[j, 'close']
49
t = sharecandles.loc[j, 'time']
50
print(t, price)
51
logging.info('Цена закрытия ' + str(price))
52
if oi != '':
53
r = client.orders.get_order_state(account_id=account_id, order_id=oi)
54
if r.lots_executed > 0:
55
logging.info('Заявка ' + oi + ' исполнена по цене ' +
56
str(convert_price(r.executed_order_price)) + ' в ' +
57
r.order_date.strftime('%Y-%m-%d %H:%M:%S'))
58
oi = ''
59
if k < d < 20 and akcii == 0 and oi == '':
60
print(t, k, d, price, 'Купить')
61
akcii = 1
62
datestr = datetime.now().strftime('%y-%m-%d_%H:%M:%S')
63
r = client.orders.post_order(figi=sharefigi, quantity=1, account_id=account_id,
64
order_id='Loginov-Mikhail_'+datestr,
65
direction=ti.OrderDirection.ORDER_DIRECTION_BUY,
66
order_type=ti.OrderType.ORDER_TYPE_LIMIT,
67
price=marketdata.candle.close)
68
print(r)
69
oi = r.order_id
70
logging.info('Выставлена заявка ' + oi + ' (Loginov-Mikhail_' + datestr +
71
') на покупку одного лота ' + INSTRUMENT_TICKER + ' по цене ' +
72
str(convert_price(marketdata.candle.close)))
73
if k > d > 80 and akcii == 1 and oi == '':
74
print(t, k, d, price, 'Продать')
75
akcii = 0
76
datestr = datetime.now().strftime('%y-%m-%d_%H:%M:%S')
77
r = client.orders.post_order(figi=sharefigi, quantity=1, account_id=account_id,
78
order_id='Loginov-Mikhail_' + datestr,
79
direction=ti.OrderDirection.ORDER_DIRECTION_SELL,
80
order_type=ti.OrderType.ORDER_TYPE_LIMIT,
81
price=marketdata.candle.close)
82
print(r)
83
oi = r.order_id
84
logging.info('Выставлена заявка ' + oi + ' (Loginov-Mikhail_' + datestr +
85
') на продажу одного лота ' + INSTRUMENT_TICKER + ' по цене ' +
86
str(convert_price(marketdata.candle.close)))
87
88
89
if __name__ == '__main__':
90
main()
91
92