Path: blob/master/ invest-robot-contest_TI_API_2-master/History_check.py
5918 views
# Этот файл заточен под работу с фьючерсами, для акций нужно изменить параметры.1# Плюс сейчас не хавтает аналитической части,2# она происходит уже в самой табдице (Посредством Google Sheets например).3import datetime4import math56import pandas as pd7# import matplotlib.pyplot as plt8import tinkoff.invest9import intro.basek10import intro.accid11from intro.quotation_dt import quotation_count1213dtypes_dic = {'time': str,14'volume': int,15'open': float,16'close': float,17'high': float,18'low': float,19'ma': float,20'ema': float21}2223# Часть для обработки файла с данными24hist_candles_inst = pd.read_csv('csv_files/brent092022_7-8mnth.csv', dtype=dtypes_dic)2526# Здесь запросы токена и id из stub файлов, и самого клиента из библиотеки Тинькофф27TOKEN = intro.basek.TINKOFF_INVEST_DOG_NEW28SDK_client = tinkoff.invest.Client(TOKEN)29User_acc_ID = intro.accid.ACC_ID30instrument_figi = 'FUTBR0922000'31open_positions_limit = 6000032close_time = datetime.time.fromisoformat('15:30:00')3334count_time_base = datetime.datetime(1,1,1, close_time.hour, close_time.minute, close_time.second)35close_period_start = datetime.timedelta(minutes=1)36close_period_start = count_time_base + close_period_start37close_period_end = datetime.timedelta(minutes=30)38close_period_end = count_time_base + close_period_end39404142def future_structure(future: [tinkoff.invest.GetFuturesMarginResponse]):43future_i = pd.DataFrame([{44'initial_margin_on_buy': quotation_count(future.initial_margin_on_buy),45'initial_margin_on_sell': quotation_count(future.initial_margin_on_sell),46'min_price_increment': quotation_count(future.min_price_increment),47'min_price_increment_amount': quotation_count(future.min_price_increment_amount)48}])49return future_i505152def short_long(instrument: [tinkoff.invest.Future]):53future_i_2 = pd.DataFrame([{54'klong': quotation_count(instrument.klong),55'kshort': quotation_count(instrument.kshort),56'last_trade_day': pd.Timestamp(instrument.last_trade_date)57}])58return future_i_2596061def future_info():62with SDK_client as client:63future_info_not_structured = client.instruments.get_futures_margin(figi=instrument_figi)64short_long_coef = client.instruments.future_by(id_type=1, id=instrument_figi).instrument65future_info_structured = future_structure(future_info_not_structured)66appendix_1 = short_long(short_long_coef)67fi = pd.concat([future_info_structured, appendix_1], axis=1)68return fi697071future_info_1 = future_info()72fi_a = future_info_1['min_price_increment'][0]73fi_b = future_info_1['min_price_increment_amount'][0]74fi_shortk = future_info_1['klong'][0]75fi_lolgk = future_info_1['kshort'][0]76fi_time = future_info_1['last_trade_day'][0]777879def ma_ema_cross_strategy_test(historical_candles_df):80hcdf = historical_candles_df81open_positions = 0 # Счётчик открытых позиций82check_rule = [bool, bool, bool] # Массив для проверки по правилам83condition_sell = [False, True, False] # Правило 184condition_buy = [True, False, True] # Правило 285ma = hcdf['ma']86ema = hcdf['ema']87time_line = hcdf['time']88hcdf['contract_turnover'] = 089hcdf['deal'] = pd.NaT90hcdf['commission'] = 091order_positions = 092hcdf.drop(columns=['Unnamed: 0'], inplace=True)93# Проверка достаточности лимита/денег на счёте для открытия позиции94if open_positions_limit < (hcdf.loc[0, 'close'] * fi_b / fi_a):95print("Not enough money to open position or low limit")96exit()97else:98print('Limit Success')99100for indx in range(len(hcdf)):101indx_min_1 = indx - 1102if indx_min_1 < 0:103continue104105# Условия. В данном случае это проверка изменения соотношения MA и EMA средних с помощью 3-х соотношений.106# 1 Проверка отношения значения EMA в текущем периоде к предыдущему107if ema[indx] > ema[indx_min_1]:108check_rule[0] = True109else:110check_rule[0] = False111# 2 Проверка отношения значения MA в текущем периоде к EMA в текущем периоде112if ma[indx] > ema[indx]:113check_rule[1] = True114else:115check_rule[1] = False116# 3 Проверка отношения значения MA в предыдущем периоде к EMA в предыдущем117if ma[indx_min_1] > ema[indx_min_1]:118check_rule[2] = True119else:120check_rule[2] = False121122# Расчёт открываемой позиции123if open_positions == 0 and check_rule == condition_sell:124order_positions = -1 * math.floor(open_positions_limit/(hcdf.loc[indx, 'close'] * fi_b/fi_a))125# print('Order positions:', order_positions, 'condition_sell from 0')126elif open_positions == 0 and check_rule == condition_buy:127order_positions = math.floor(open_positions_limit/(hcdf.loc[indx, 'close'] * fi_b/fi_a))128# print('Order positions:', order_positions, 'condition_buy from 0')129elif indx == len(hcdf) - 2:130order_positions = -1 * open_positions131# print('Order positions:', order_positions, 'condition_close when close to the end of massive')132elif open_positions < 0:133order_positions = 2 * math.floor(open_positions_limit/(hcdf.loc[indx, 'close'] * fi_b/fi_a))134# print('Order positions:', order_positions, 'condition_buy from open short positions')135elif open_positions > 0:136order_positions = -2 * math.floor(open_positions_limit/(hcdf.loc[indx, 'close'] * fi_b/fi_a))137# print('Order positions:', order_positions, 'condition_buy from open short positions')138# print(pd.Timestamp(time_line[indx]).day_of_week, time_line[indx], pd.Timestamp(time_line[indx]).ctime())139hcdf.loc[indx, 'open_position'] = open_positions140141if close_period_end.time() >= pd.Timestamp(time_line[indx]).time() >= close_period_start.time():142continue143elif open_positions != 0 and \144pd.Timestamp(time_line[indx]).day_of_week == 4 and \145pd.Timestamp(time_line[indx]).time() >= close_time:146hcdf.loc[indx, 'deal'] = 'week end'147order_positions = open_positions148hcdf.loc[indx, 'contract_turnover'] = -1 * order_positions * (hcdf.loc[indx, 'close'] / fi_a * fi_b)149hcdf.loc[indx, 'commission'] = abs(order_positions * (hcdf.loc[indx, 'close'] / fi_a * fi_b) * 0.0004)150hcdf.loc[indx, 'open_position'] = open_positions + -1 * order_positions151hcdf.loc[indx, 'order_position'] = -1 * order_positions152open_positions = open_positions + -1 * order_positions153continue154155if check_rule == condition_buy and open_positions <= 0:156hcdf.loc[indx, 'deal'] = 'buy'157hcdf.loc[indx, 'contract_turnover'] = order_positions * (hcdf.loc[indx, 'close'] / fi_a * fi_b)158hcdf.loc[indx, 'commission'] = abs(order_positions * (hcdf.loc[indx, 'close'] / fi_a * fi_b) * 0.0004)159hcdf.loc[indx, 'open_position'] = open_positions + order_positions160hcdf.loc[indx, 'order_position'] = order_positions161open_positions = open_positions + order_positions162elif check_rule == condition_sell and open_positions >= 0:163hcdf.loc[indx, 'deal'] = 'sell'164hcdf.loc[indx, 'contract_turnover'] = order_positions * (hcdf.loc[indx, 'close'] / fi_a * fi_b)165hcdf.loc[indx, 'commission'] = abs(order_positions * (hcdf.loc[indx, 'close'] / fi_a * fi_b) * 0.0004)166hcdf.loc[indx, 'open_position'] = open_positions + order_positions167hcdf.loc[indx, 'order_position'] = order_positions168open_positions = open_positions + order_positions169elif indx == len(hcdf) - 10:170print('last one done')171hcdf.loc[indx, 'deal'] = 'close'172hcdf.loc[indx, 'contract_turnover'] = -1 * order_positions / 2 * (hcdf.loc[indx, 'close'] / fi_a * fi_b)173hcdf.loc[indx, 'commission'] = abs(-1 * order_positions / 2 * (hcdf.loc[indx, 'close'] / fi_a * fi_b) * 0.0004)174hcdf.loc[indx, 'open_position'] = open_positions + order_positions / 2175hcdf.loc[indx, 'order_position'] = -1 * order_positions / 2176open_positions = open_positions + -1 * order_positions / 2177print(open_positions)178break179else:180hcdf.loc[indx, 'open_position'] = open_positions181hcdf.loc[indx, 'order_position'] = order_positions182open_positions = open_positions183# print('no actions')184185# Далее три опции:186# Построение графика при необходимости (нужно еще раскомментировать импорт matplotlib)187# with plt.style.context('Solarize_Light2'):188# a = hcdf['time']189# b = hcdf['close']190# c = hcdf['ma']191# d = hcdf['ema']192# plt.plot(a, b, a, c, a, d)193# plt.show()194# Вывод полученных значений195# hcdf.drop(columns=['Unnamed: 0'], inplace=True)196hcdf.dropna(how='any', inplace=True)197print(hcdf)198# Запись значений в файл со своим названием199# hcdf.to_csv('csv_files/brent062022_orders.csv', mode='w')200# print('Record to file complete')201return hcdf202203204def check_profits(operations_df):205operations_df.dropna(how='any', inplace=True)206trade_result = 0207commision_sum = 0208# o = operations_df['contract_turnover']209# c = operations_df['commission']210for i in range(len(operations_df)):211212trade_result += operations_df['contract_turnover'].iloc[i]213commision_sum += operations_df['commission'].iloc[i]214215return print('trade result = ', trade_result - commision_sum, '\n',216'only operations =', trade_result)217218219def record_orders_results(operations_df):220operations_df.dropna(how='any', inplace=True)221operations_df.to_csv('csv_files/brent092022_7-8mnth_report.csv', mode='w')222return print('Record orders results complete')223224225test = ma_ema_cross_strategy_test(hist_candles_inst)226record_orders_results(test)227report = pd.read_csv('csv_files/brent092022_7-8mnth_report.csv')228check_profits(report)229230231