Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wiseplat
GitHub Repository: wiseplat/python-code
Path: blob/master/ invest-robot-contest_tinkoff_invest_competition-master/app/daily_buy_functions.py
7840 views
1
import os
2
import datetime
3
from typing import List, Tuple
4
import pandas as pd
5
import tinvest as ti
6
from datetime import timedelta
7
from openapi_client import openapi
8
from talib import RSI, BBANDS
9
import statistics
10
import random
11
import telebot
12
from telebot import types
13
import numpy as np
14
import time
15
from pytz import timezone
16
import parameters_of_trading
17
import config
18
19
20
bot = telebot.TeleBot(config.telegram_bot_id())
21
client = ti.SyncClient(config.token_tinkoff_invest())
22
client2 = openapi.api_client(config.token_tinkoff_invest())
23
24
25
class RobotSearcherAndFirstBuy:
26
def __init__(self, limit_ticker, directory):
27
self.limit_ticker = limit_ticker
28
self.list_of_Limit = list(self.limit_ticker['Limit'])
29
self.list_of_ticker = list(self.limit_ticker['ticker'])
30
self.list_of_figi = list(self.limit_ticker['figi'])
31
self.list_of_Position = list(self.limit_ticker['Position'])
32
self.list_of_threshold = list(self.limit_ticker['AVG_RSI_of_ticker'])
33
self.list_of_RSI_alarm = list(self.limit_ticker['AVG_RSI_of_005'])
34
self.list_of_percentage_of_ticker = list(self.limit_ticker['percentage'])
35
self.list_of_tg_alarm = list(self.limit_ticker['AVG_RSI_of_05'])
36
self.list_of_param_freq = list(self.limit_ticker['param_freq_parametr'])
37
self.directory = directory
38
39
def daily_searcher(self):
40
list_of_orders = client2.orders.orders_get().payload
41
figis = []
42
for ind_ in range(len(list_of_orders)):
43
figis.append(list_of_orders[ind_].figi)
44
45
for ind_ in range(len(self.list_of_Limit)):
46
for day_ind_ in range(1, 8):
47
df = parameters_of_trading.get_figi_data(self.list_of_figi[ind_], day_ind_)
48
df.to_csv(self.directory + self.list_of_ticker[ind_] + '/'+str('day_history_') + str(day_ind_)+'.csv', index = False)
49
time.sleep(random.randint(1,4))
50
list_of_files = os.listdir(self.directory + self.list_of_ticker[ind_] + '/')
51
stock_df = pd.DataFrame()
52
for file in list_of_files:
53
try:
54
df = pd.read_csv(self.directory + self.list_of_ticker[ind_] + '/'+ file)
55
stock_df = pd.concat([stock_df, df])
56
except:
57
pass
58
stock_df = stock_df.sort_values(by = 'time', ascending = True)
59
stock_df = stock_df.reset_index(drop = True)
60
close = stock_df['c'].values
61
rsi = RSI(close, timeperiod=23)
62
rsi2 = list(rsi)
63
rsi2.reverse()
64
close = list(close)
65
close.reverse()
66
67
68
for_stat_list = rsi2[0:15]
69
avg_RSI = statistics.mean(for_stat_list)
70
avg_RSI = round(avg_RSI, 2)
71
72
#now.hour - поменять время на 35 - пресессия/постсессия
73
74
for_stat_list2 = rsi2[0:5]
75
avg_RSI_for_threshold = statistics.mean(for_stat_list2)
76
avg_RSI_for_threshold = round(avg_RSI_for_threshold, 2)
77
78
79
#проверка недельки
80
quantile_list = list(stock_df['c'].quantile(np.linspace(.1, 1, 10, 0)))
81
price_ = close[0]
82
83
index_quantille = 0
84
for quantile_price in quantile_list:
85
if quantile_price >= price_:
86
index_quantille = quantile_list.index(quantile_price)
87
break
88
89
if index_quantille == 0:
90
index_quantille = 10
91
92
93
94
#проверка дня:
95
stock_df2 = stock_df.copy()
96
stock_df2['time'] = pd.to_datetime(stock_df2['time'])
97
stock_df2 = stock_df2.sort_values(by = 'time', ascending = False)
98
stock_df2 = stock_df2.reset_index(drop = True)
99
stock_df2 = stock_df2[0:600]
100
101
quantile_list2 = list(stock_df2['c'].quantile(np.linspace(.1, 1, 9, 0)))
102
price_ = close[0]
103
104
index_quantille2 = -1
105
for quantile_price in quantile_list2:
106
if quantile_price >= price_:
107
index_quantille2 = quantile_list2.index(quantile_price)
108
break
109
110
if index_quantille2 == -1:
111
index_quantille2 = 10
112
113
#такой функции нет - она скрыта из-за бизнес-логики)
114
min_price_tendention = function(stock_df2['c'], quantile_list2[0], stock_df2['c'].min())
115
116
117
hour_now = datetime.datetime.now().hour
118
119
if (avg_RSI < self.list_of_tg_alarm[ind_]) and (close[0] > min_price_tendention) and (index_quantille <= 10) and (index_quantille2 <= 10) and (self.list_of_param_freq[ind_] > parameters_of_trading.param_frequency_threshold()) and (hour_now >= 17) and (hour_now < 22):
120
return self.list_of_figi[ind_], self.list_of_ticker[ind_], self.list_of_tg_alarm[ind_], avg_RSI, close[0], index_quantille, index_quantille2, min_price_tendention, self.list_of_param_freq[ind_], 'FirstBuyCondition'
121
elif (avg_RSI < self.list_of_tg_alarm[ind_]):
122
return self.list_of_figi[ind_], self.list_of_ticker[ind_], self.list_of_tg_alarm[ind_], avg_RSI, close[0], index_quantille, index_quantille2, min_price_tendention, self.list_of_param_freq[ind_], 'FirstBuyNoCondition'
123
124
f = open(self.directory + 'all_progons.txt', 'a+', encoding='utf-8')
125
f.write(str(datetime.datetime.now().strftime("%Y_%m_%d-%H:%M:%S") + ',' + self.list_of_ticker[ind_]+ ',' + str(close[0]) + ',' + str(avg_RSI) + ',' + str(0)))
126
f.write('\n')
127
f.close()
128
return self.list_of_figi[ind_], self.list_of_ticker[ind_], self.list_of_tg_alarm[ind_], avg_RSI, close[0], index_quantille, index_quantille2, min_price_tendention, self.list_of_param_freq[ind_], 'NoFirstBuy'
129
130
131
class FirstBuyBot:
132
def __init__(self, figi, lots, price, directory):
133
self.figi = figi
134
self.lots = lots
135
self.price = price
136
self.directory = directory
137
138
def potential_first_buy(self):
139
df_of_status = pd.read_csv(self.directory + 'test_steven_cat.txt', names = ['time','figi','price','type','order_id','status'])
140
df_of_status['time'] = pd.to_datetime(df_of_status['time'], format="%Y_%m_%d-%H:%M:%S")
141
type_ = list(df_of_status[df_of_status['time'] == df_of_status['time'].max()]['type'])[0]
142
143
if type_ == 'ReallSell':
144
order_list, status_list, operation_list, figi_list = [],[],[],[]
145
order_response = client2.orders.orders_limit_order_post(figi = self.figi,
146
limit_order_request={"lots": self.lots,
147
"operation": 'Buy',
148
"price": self.price})
149
150
"""Ожидание исполнения ордера для позиции"""
151
time.sleep(60)
152
153
for ind_ in range(len(client2.orders.orders_get().payload)):
154
order_list.append(client2.orders.orders_get().payload[ind_].order_id)
155
status_list.append(client2.orders.orders_get().payload[ind_].status)
156
operation_list.append(client2.orders.orders_get().payload[ind_].operation)
157
figi_list.append(client2.orders.orders_get().payload[ind_].figi)
158
df = pd.DataFrame({
159
'order_id': order_list,
160
'status': status_list,
161
'operation': operation_list,
162
'figi': figi_list
163
})
164
165
if len(df[df['order_id'] == str(order_response.payload.order_id)]) > 0:
166
client2.orders.orders_cancel_post(order_id=order_response.payload.order_id)
167
else:
168
f = open(self.directory + 'test_steven_cat.txt', 'a+', encoding='utf-8')
169
f.write(str(datetime.now().strftime("%Y_%m_%d-%H:%M:%S") + ',' + str(self.figi) + ',' + str(self.price) + ',' + 'Buy' + ',' + str(order_response.payload.order_id) + ',' + str(order_response.payload.status)))
170
f.write('\n')
171
f.close()
172
time.sleep(2)
173
174
order_response_sell = client2.orders.orders_limit_order_post(figi = self.figi, limit_order_request={"lots": self.lots,
175
"operation": 'Sell',
176
"price": round(self.price*parameters_of_trading.first_time_profit_value(), 2)})
177
178
f = open(self.directory + 'test_steven_cat.txt', 'a+', encoding='utf-8')
179
f.write(str(datetime.now().strftime("%Y_%m_%d-%H:%M:%S") + ',' + str(self.figi) + ',' + str(round(self.price*parameters_of_trading.first_time_profit_value(), 2)) + ',' + 'Sell' + ',' + str(order_response_sell.payload.order_id) + ',' + str(order_response_sell.payload.status)))
180
f.write('\n')
181
f.close()
182
183
184
185
186
187