Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wiseplat
GitHub Repository: wiseplat/python-code
Path: blob/master/ invest-robot-contest_TI_API_2-master/History_check.py
5918 views
1
# Этот файл заточен под работу с фьючерсами, для акций нужно изменить параметры.
2
# Плюс сейчас не хавтает аналитической части,
3
# она происходит уже в самой табдице (Посредством Google Sheets например).
4
import datetime
5
import math
6
7
import pandas as pd
8
# import matplotlib.pyplot as plt
9
import tinkoff.invest
10
import intro.basek
11
import intro.accid
12
from intro.quotation_dt import quotation_count
13
14
dtypes_dic = {'time': str,
15
'volume': int,
16
'open': float,
17
'close': float,
18
'high': float,
19
'low': float,
20
'ma': float,
21
'ema': float
22
}
23
24
# Часть для обработки файла с данными
25
hist_candles_inst = pd.read_csv('csv_files/brent092022_7-8mnth.csv', dtype=dtypes_dic)
26
27
# Здесь запросы токена и id из stub файлов, и самого клиента из библиотеки Тинькофф
28
TOKEN = intro.basek.TINKOFF_INVEST_DOG_NEW
29
SDK_client = tinkoff.invest.Client(TOKEN)
30
User_acc_ID = intro.accid.ACC_ID
31
instrument_figi = 'FUTBR0922000'
32
open_positions_limit = 60000
33
close_time = datetime.time.fromisoformat('15:30:00')
34
35
count_time_base = datetime.datetime(1,1,1, close_time.hour, close_time.minute, close_time.second)
36
close_period_start = datetime.timedelta(minutes=1)
37
close_period_start = count_time_base + close_period_start
38
close_period_end = datetime.timedelta(minutes=30)
39
close_period_end = count_time_base + close_period_end
40
41
42
43
def future_structure(future: [tinkoff.invest.GetFuturesMarginResponse]):
44
future_i = pd.DataFrame([{
45
'initial_margin_on_buy': quotation_count(future.initial_margin_on_buy),
46
'initial_margin_on_sell': quotation_count(future.initial_margin_on_sell),
47
'min_price_increment': quotation_count(future.min_price_increment),
48
'min_price_increment_amount': quotation_count(future.min_price_increment_amount)
49
}])
50
return future_i
51
52
53
def short_long(instrument: [tinkoff.invest.Future]):
54
future_i_2 = pd.DataFrame([{
55
'klong': quotation_count(instrument.klong),
56
'kshort': quotation_count(instrument.kshort),
57
'last_trade_day': pd.Timestamp(instrument.last_trade_date)
58
}])
59
return future_i_2
60
61
62
def future_info():
63
with SDK_client as client:
64
future_info_not_structured = client.instruments.get_futures_margin(figi=instrument_figi)
65
short_long_coef = client.instruments.future_by(id_type=1, id=instrument_figi).instrument
66
future_info_structured = future_structure(future_info_not_structured)
67
appendix_1 = short_long(short_long_coef)
68
fi = pd.concat([future_info_structured, appendix_1], axis=1)
69
return fi
70
71
72
future_info_1 = future_info()
73
fi_a = future_info_1['min_price_increment'][0]
74
fi_b = future_info_1['min_price_increment_amount'][0]
75
fi_shortk = future_info_1['klong'][0]
76
fi_lolgk = future_info_1['kshort'][0]
77
fi_time = future_info_1['last_trade_day'][0]
78
79
80
def ma_ema_cross_strategy_test(historical_candles_df):
81
hcdf = historical_candles_df
82
open_positions = 0 # Счётчик открытых позиций
83
check_rule = [bool, bool, bool] # Массив для проверки по правилам
84
condition_sell = [False, True, False] # Правило 1
85
condition_buy = [True, False, True] # Правило 2
86
ma = hcdf['ma']
87
ema = hcdf['ema']
88
time_line = hcdf['time']
89
hcdf['contract_turnover'] = 0
90
hcdf['deal'] = pd.NaT
91
hcdf['commission'] = 0
92
order_positions = 0
93
hcdf.drop(columns=['Unnamed: 0'], inplace=True)
94
# Проверка достаточности лимита/денег на счёте для открытия позиции
95
if open_positions_limit < (hcdf.loc[0, 'close'] * fi_b / fi_a):
96
print("Not enough money to open position or low limit")
97
exit()
98
else:
99
print('Limit Success')
100
101
for indx in range(len(hcdf)):
102
indx_min_1 = indx - 1
103
if indx_min_1 < 0:
104
continue
105
106
# Условия. В данном случае это проверка изменения соотношения MA и EMA средних с помощью 3-х соотношений.
107
# 1 Проверка отношения значения EMA в текущем периоде к предыдущему
108
if ema[indx] > ema[indx_min_1]:
109
check_rule[0] = True
110
else:
111
check_rule[0] = False
112
# 2 Проверка отношения значения MA в текущем периоде к EMA в текущем периоде
113
if ma[indx] > ema[indx]:
114
check_rule[1] = True
115
else:
116
check_rule[1] = False
117
# 3 Проверка отношения значения MA в предыдущем периоде к EMA в предыдущем
118
if ma[indx_min_1] > ema[indx_min_1]:
119
check_rule[2] = True
120
else:
121
check_rule[2] = False
122
123
# Расчёт открываемой позиции
124
if open_positions == 0 and check_rule == condition_sell:
125
order_positions = -1 * math.floor(open_positions_limit/(hcdf.loc[indx, 'close'] * fi_b/fi_a))
126
# print('Order positions:', order_positions, 'condition_sell from 0')
127
elif open_positions == 0 and check_rule == condition_buy:
128
order_positions = math.floor(open_positions_limit/(hcdf.loc[indx, 'close'] * fi_b/fi_a))
129
# print('Order positions:', order_positions, 'condition_buy from 0')
130
elif indx == len(hcdf) - 2:
131
order_positions = -1 * open_positions
132
# print('Order positions:', order_positions, 'condition_close when close to the end of massive')
133
elif open_positions < 0:
134
order_positions = 2 * math.floor(open_positions_limit/(hcdf.loc[indx, 'close'] * fi_b/fi_a))
135
# print('Order positions:', order_positions, 'condition_buy from open short positions')
136
elif open_positions > 0:
137
order_positions = -2 * math.floor(open_positions_limit/(hcdf.loc[indx, 'close'] * fi_b/fi_a))
138
# print('Order positions:', order_positions, 'condition_buy from open short positions')
139
# print(pd.Timestamp(time_line[indx]).day_of_week, time_line[indx], pd.Timestamp(time_line[indx]).ctime())
140
hcdf.loc[indx, 'open_position'] = open_positions
141
142
if close_period_end.time() >= pd.Timestamp(time_line[indx]).time() >= close_period_start.time():
143
continue
144
elif open_positions != 0 and \
145
pd.Timestamp(time_line[indx]).day_of_week == 4 and \
146
pd.Timestamp(time_line[indx]).time() >= close_time:
147
hcdf.loc[indx, 'deal'] = 'week end'
148
order_positions = open_positions
149
hcdf.loc[indx, 'contract_turnover'] = -1 * order_positions * (hcdf.loc[indx, 'close'] / fi_a * fi_b)
150
hcdf.loc[indx, 'commission'] = abs(order_positions * (hcdf.loc[indx, 'close'] / fi_a * fi_b) * 0.0004)
151
hcdf.loc[indx, 'open_position'] = open_positions + -1 * order_positions
152
hcdf.loc[indx, 'order_position'] = -1 * order_positions
153
open_positions = open_positions + -1 * order_positions
154
continue
155
156
if check_rule == condition_buy and open_positions <= 0:
157
hcdf.loc[indx, 'deal'] = 'buy'
158
hcdf.loc[indx, 'contract_turnover'] = order_positions * (hcdf.loc[indx, 'close'] / fi_a * fi_b)
159
hcdf.loc[indx, 'commission'] = abs(order_positions * (hcdf.loc[indx, 'close'] / fi_a * fi_b) * 0.0004)
160
hcdf.loc[indx, 'open_position'] = open_positions + order_positions
161
hcdf.loc[indx, 'order_position'] = order_positions
162
open_positions = open_positions + order_positions
163
elif check_rule == condition_sell and open_positions >= 0:
164
hcdf.loc[indx, 'deal'] = 'sell'
165
hcdf.loc[indx, 'contract_turnover'] = order_positions * (hcdf.loc[indx, 'close'] / fi_a * fi_b)
166
hcdf.loc[indx, 'commission'] = abs(order_positions * (hcdf.loc[indx, 'close'] / fi_a * fi_b) * 0.0004)
167
hcdf.loc[indx, 'open_position'] = open_positions + order_positions
168
hcdf.loc[indx, 'order_position'] = order_positions
169
open_positions = open_positions + order_positions
170
elif indx == len(hcdf) - 10:
171
print('last one done')
172
hcdf.loc[indx, 'deal'] = 'close'
173
hcdf.loc[indx, 'contract_turnover'] = -1 * order_positions / 2 * (hcdf.loc[indx, 'close'] / fi_a * fi_b)
174
hcdf.loc[indx, 'commission'] = abs(-1 * order_positions / 2 * (hcdf.loc[indx, 'close'] / fi_a * fi_b) * 0.0004)
175
hcdf.loc[indx, 'open_position'] = open_positions + order_positions / 2
176
hcdf.loc[indx, 'order_position'] = -1 * order_positions / 2
177
open_positions = open_positions + -1 * order_positions / 2
178
print(open_positions)
179
break
180
else:
181
hcdf.loc[indx, 'open_position'] = open_positions
182
hcdf.loc[indx, 'order_position'] = order_positions
183
open_positions = open_positions
184
# print('no actions')
185
186
# Далее три опции:
187
# Построение графика при необходимости (нужно еще раскомментировать импорт matplotlib)
188
# with plt.style.context('Solarize_Light2'):
189
# a = hcdf['time']
190
# b = hcdf['close']
191
# c = hcdf['ma']
192
# d = hcdf['ema']
193
# plt.plot(a, b, a, c, a, d)
194
# plt.show()
195
# Вывод полученных значений
196
# hcdf.drop(columns=['Unnamed: 0'], inplace=True)
197
hcdf.dropna(how='any', inplace=True)
198
print(hcdf)
199
# Запись значений в файл со своим названием
200
# hcdf.to_csv('csv_files/brent062022_orders.csv', mode='w')
201
# print('Record to file complete')
202
return hcdf
203
204
205
def check_profits(operations_df):
206
operations_df.dropna(how='any', inplace=True)
207
trade_result = 0
208
commision_sum = 0
209
# o = operations_df['contract_turnover']
210
# c = operations_df['commission']
211
for i in range(len(operations_df)):
212
213
trade_result += operations_df['contract_turnover'].iloc[i]
214
commision_sum += operations_df['commission'].iloc[i]
215
216
return print('trade result = ', trade_result - commision_sum, '\n',
217
'only operations =', trade_result)
218
219
220
def record_orders_results(operations_df):
221
operations_df.dropna(how='any', inplace=True)
222
operations_df.to_csv('csv_files/brent092022_7-8mnth_report.csv', mode='w')
223
return print('Record orders results complete')
224
225
226
test = ma_ema_cross_strategy_test(hist_candles_inst)
227
record_orders_results(test)
228
report = pd.read_csv('csv_files/brent092022_7-8mnth_report.csv')
229
check_profits(report)
230
231