Path: blob/master/ invest-robot-contest_tinkoff_invest_competition-master/app/daily_buy_functions.py
7840 views
import os1import datetime2from typing import List, Tuple3import pandas as pd4import tinvest as ti5from datetime import timedelta6from openapi_client import openapi7from talib import RSI, BBANDS8import statistics9import random10import telebot11from telebot import types12import numpy as np13import time14from pytz import timezone15import parameters_of_trading16import config171819bot = telebot.TeleBot(config.telegram_bot_id())20client = ti.SyncClient(config.token_tinkoff_invest())21client2 = openapi.api_client(config.token_tinkoff_invest())222324class RobotSearcherAndFirstBuy:25def __init__(self, limit_ticker, directory):26self.limit_ticker = limit_ticker27self.list_of_Limit = list(self.limit_ticker['Limit'])28self.list_of_ticker = list(self.limit_ticker['ticker'])29self.list_of_figi = list(self.limit_ticker['figi'])30self.list_of_Position = list(self.limit_ticker['Position'])31self.list_of_threshold = list(self.limit_ticker['AVG_RSI_of_ticker'])32self.list_of_RSI_alarm = list(self.limit_ticker['AVG_RSI_of_005'])33self.list_of_percentage_of_ticker = list(self.limit_ticker['percentage'])34self.list_of_tg_alarm = list(self.limit_ticker['AVG_RSI_of_05'])35self.list_of_param_freq = list(self.limit_ticker['param_freq_parametr'])36self.directory = directory3738def daily_searcher(self):39list_of_orders = client2.orders.orders_get().payload40figis = []41for ind_ in range(len(list_of_orders)):42figis.append(list_of_orders[ind_].figi)4344for ind_ in range(len(self.list_of_Limit)):45for day_ind_ in range(1, 8):46df = parameters_of_trading.get_figi_data(self.list_of_figi[ind_], day_ind_)47df.to_csv(self.directory + self.list_of_ticker[ind_] + '/'+str('day_history_') + str(day_ind_)+'.csv', index = False)48time.sleep(random.randint(1,4))49list_of_files = os.listdir(self.directory + self.list_of_ticker[ind_] + '/')50stock_df = pd.DataFrame()51for file in list_of_files:52try:53df = pd.read_csv(self.directory + self.list_of_ticker[ind_] + '/'+ file)54stock_df = pd.concat([stock_df, df])55except:56pass57stock_df = stock_df.sort_values(by = 'time', ascending = True)58stock_df = stock_df.reset_index(drop = True)59close = stock_df['c'].values60rsi = RSI(close, timeperiod=23)61rsi2 = list(rsi)62rsi2.reverse()63close = list(close)64close.reverse()656667for_stat_list = rsi2[0:15]68avg_RSI = statistics.mean(for_stat_list)69avg_RSI = round(avg_RSI, 2)7071#now.hour - поменять время на 35 - пресессия/постсессия7273for_stat_list2 = rsi2[0:5]74avg_RSI_for_threshold = statistics.mean(for_stat_list2)75avg_RSI_for_threshold = round(avg_RSI_for_threshold, 2)767778#проверка недельки79quantile_list = list(stock_df['c'].quantile(np.linspace(.1, 1, 10, 0)))80price_ = close[0]8182index_quantille = 083for quantile_price in quantile_list:84if quantile_price >= price_:85index_quantille = quantile_list.index(quantile_price)86break8788if index_quantille == 0:89index_quantille = 1090919293#проверка дня:94stock_df2 = stock_df.copy()95stock_df2['time'] = pd.to_datetime(stock_df2['time'])96stock_df2 = stock_df2.sort_values(by = 'time', ascending = False)97stock_df2 = stock_df2.reset_index(drop = True)98stock_df2 = stock_df2[0:600]99100quantile_list2 = list(stock_df2['c'].quantile(np.linspace(.1, 1, 9, 0)))101price_ = close[0]102103index_quantille2 = -1104for quantile_price in quantile_list2:105if quantile_price >= price_:106index_quantille2 = quantile_list2.index(quantile_price)107break108109if index_quantille2 == -1:110index_quantille2 = 10111112#такой функции нет - она скрыта из-за бизнес-логики)113min_price_tendention = function(stock_df2['c'], quantile_list2[0], stock_df2['c'].min())114115116hour_now = datetime.datetime.now().hour117118if (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):119return 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'120elif (avg_RSI < self.list_of_tg_alarm[ind_]):121return 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'122123f = open(self.directory + 'all_progons.txt', 'a+', encoding='utf-8')124f.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)))125f.write('\n')126f.close()127return 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'128129130class FirstBuyBot:131def __init__(self, figi, lots, price, directory):132self.figi = figi133self.lots = lots134self.price = price135self.directory = directory136137def potential_first_buy(self):138df_of_status = pd.read_csv(self.directory + 'test_steven_cat.txt', names = ['time','figi','price','type','order_id','status'])139df_of_status['time'] = pd.to_datetime(df_of_status['time'], format="%Y_%m_%d-%H:%M:%S")140type_ = list(df_of_status[df_of_status['time'] == df_of_status['time'].max()]['type'])[0]141142if type_ == 'ReallSell':143order_list, status_list, operation_list, figi_list = [],[],[],[]144order_response = client2.orders.orders_limit_order_post(figi = self.figi,145limit_order_request={"lots": self.lots,146"operation": 'Buy',147"price": self.price})148149"""Ожидание исполнения ордера для позиции"""150time.sleep(60)151152for ind_ in range(len(client2.orders.orders_get().payload)):153order_list.append(client2.orders.orders_get().payload[ind_].order_id)154status_list.append(client2.orders.orders_get().payload[ind_].status)155operation_list.append(client2.orders.orders_get().payload[ind_].operation)156figi_list.append(client2.orders.orders_get().payload[ind_].figi)157df = pd.DataFrame({158'order_id': order_list,159'status': status_list,160'operation': operation_list,161'figi': figi_list162})163164if len(df[df['order_id'] == str(order_response.payload.order_id)]) > 0:165client2.orders.orders_cancel_post(order_id=order_response.payload.order_id)166else:167f = open(self.directory + 'test_steven_cat.txt', 'a+', encoding='utf-8')168f.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)))169f.write('\n')170f.close()171time.sleep(2)172173order_response_sell = client2.orders.orders_limit_order_post(figi = self.figi, limit_order_request={"lots": self.lots,174"operation": 'Sell',175"price": round(self.price*parameters_of_trading.first_time_profit_value(), 2)})176177f = open(self.directory + 'test_steven_cat.txt', 'a+', encoding='utf-8')178f.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)))179f.write('\n')180f.close()181182183184185186187