-
Notifications
You must be signed in to change notification settings - Fork 0
/
module_trading_strategy.py
131 lines (117 loc) · 5.8 KB
/
module_trading_strategy.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import datetime as dt
def pattern_bearish_takeover(candle1, candle2):
# если предыдущая свеча бычья
if candle1['open'] < candle1['close']:
if candle2['open'] >= candle1['close'] and candle2['close'] < candle1['open']:
return True
else:
return False
else:
False
def pattern_bullish_takeover(candle1, candle2):
# если предыдущая свеча медвежья
if candle1['open'] > candle1['close']:
if candle2['open'] <= candle1['close'] and candle2['close'] > candle1['open']:
return True
else:
return False
else:
False
def strategy_takeover(df, ma, tm, add):
# локальные переменные для торгов
INPUT = False
OUTPUT = True
ADD = False
OVER = False
TRAND_UP = False
TRAND_DOWN = False
# Определяем дату начала торгов на истории
candle_start = df.iloc[ma]
if tm == "1d":
trading_start_date = (dt.datetime.strptime(candle_start['begin'], '%Y-%m-%d') + dt.timedelta(
days=1)).strftime('%Y-%m-%d')
# получим индексы первых свечей с даты начала торгов
index_candel_start_trading = df.loc[df['begin'] == f'{trading_start_date}'].index[0]
else:
trading_start_date = (dt.datetime.strptime(candle_start['begin'], '%Y-%m-%d %H:%M:%S') + dt.timedelta(
days=1)).strftime('%Y-%m-%d')
# получим индексы первых свечей с даты начала торгов
index_candel_start_trading = df.loc[df['begin'] == f'{trading_start_date} 10:00:00'].index[0]
# обрезаем датафремы с даты начала торгов
signals = df.iloc[index_candel_start_trading:, :].reset_index(drop=True)
# список сигналов 1h на всей истории
labels_duration = []
# список позиций 1h на всей истории
labels_position = []
# поиск сигналов на истории 1h
for index, row in signals.iterrows():
# получаем теущую и предыдущую свечки
current_candle = row
previous_candle = signals.iloc[index - 1]
# если обнаружен медвежий паттерн по тренду
if pattern_bearish_takeover(previous_candle, current_candle) and current_candle['close'] < current_candle[f'ma{ma}']:
labels_duration.append('sell')
# вне рынка
if OUTPUT:
labels_position.append('input')
INPUT, OUTPUT, ADD, OVER = True, False, False, False
# в рынке
elif (INPUT or ADD or OVER) and TRAND_DOWN:
labels_position.append('add')
INPUT, OUTPUT, ADD, OVER = False, False, True, False
elif (INPUT or ADD or OVER) and TRAND_UP:
labels_position.append('over')
INPUT, OUTPUT, ADD, OVER = False, False, False, True
# меняем тренд
TRAND_UP = False
TRAND_DOWN = True
# если обнаружен медвежий паттерн против тренда
elif pattern_bearish_takeover(previous_candle, current_candle) and current_candle['close'] > current_candle[f'ma{ma}']:
# вне рынка
if OUTPUT:
labels_duration.append(None)
labels_position.append('output')
INPUT, OUTPUT, ADD, OVER = False, True, False, False
# в рынке
elif INPUT or ADD or OVER:
labels_duration.append('sell')
labels_position.append('output')
INPUT, OUTPUT, ADD, OVER = False, True, False, False
# если обнаружен бычий паттерн по тренду
elif pattern_bullish_takeover(previous_candle, current_candle) and current_candle['close'] > current_candle[f'ma{ma}']:
labels_duration.append('buy')
# вне рынка
if OUTPUT:
labels_position.append('input')
INPUT, OUTPUT, ADD, OVER = True, False, False, False
# в рынке
elif (INPUT or ADD or OVER) and TRAND_UP:
labels_position.append('add')
INPUT, OUTPUT, ADD, OVER = False, False, True, False
elif (INPUT or ADD or OVER) and TRAND_DOWN:
labels_position.append('over')
INPUT, OUTPUT, ADD, OVER = False, False, False, True
# меняем тренд
TRAND_UP = True
TRAND_DOWN = False
# если обнаружен бычий паттерн против тренда
elif pattern_bullish_takeover(previous_candle, current_candle) and current_candle['close'] < current_candle[f'ma{ma}']:
# вне рынка
if OUTPUT:
labels_duration.append(None)
labels_position.append('output')
INPUT, OUTPUT, ADD, OVER = False, True, False, False
# в рынке
elif INPUT or ADD or OVER:
labels_duration.append('buy')
labels_position.append('output')
INPUT, OUTPUT, ADD, OVER = False, True, False, False
# если нет паттерна
else:
labels_duration.append(None)
labels_position.append('output')
# формируем признак сгенерированных сигналов на истории 1h
signals['durations'] = labels_duration
# формируем признак сгенерированных позиций на истории 1h
signals['positions'] = labels_position
return signals