Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wiseplat
GitHub Repository: wiseplat/python-code
Path: blob/master/ invest-robot-contest_tinkoff_invest_robot-main/src/strategy/macd.py
5929 views
1
from loguru import logger
2
3
from ta.trend import macd, macd_signal
4
from pandas import DataFrame
5
import numpy as np
6
7
from src.algotrading._sandbox_accounts import post_sandbox_order
8
from src.algotrading.get_candles import get_all_candles, request_iterator
9
from src.algotrading.instruments_service import get_instrument_by
10
from src.algotrading.utils import api_client_configure, to_float
11
12
13
def create_df(candles):
14
df = DataFrame([{
15
'time': c.time,
16
'volume': c.volume,
17
'open': to_float(c.open),
18
'close': to_float(c.close),
19
'high': to_float(c.high),
20
'low': to_float(c.low),
21
} for c in candles])
22
23
return df
24
25
26
def macd_test(data: dict) -> int:
27
instrument_data = get_instrument_by(data['figi'])
28
api_client = api_client_configure()
29
30
with api_client as client:
31
32
candles = get_all_candles(client, data['figi'], 7, data['timeframe'])
33
df = create_df(candles)
34
35
df['macd'] = macd(close=df['close'], window_slow=data['window_slow'], window_fast=data['window_fast'])
36
df['macd_signal'] = macd_signal(close=df['close'],
37
window_slow=data['window_slow'],
38
window_fast=data['window_fast'],
39
window_sign=data['window_sign']
40
)
41
42
df['trading_signal'] = np.where(df['macd'] > df['macd_signal'], 1, 0)
43
44
result = 0
45
count_operation = 0
46
for index, row in df.iterrows():
47
if index == 1:
48
continue
49
elif row['trading_signal'] > df.iloc[index - 1]['trading_signal']:
50
logger.info(f"Покупаем {row.time} по {row['close']}")
51
result -= row['close'] * instrument_data['lot']
52
count_operation += 1
53
elif row['trading_signal'] < df.iloc[index - 1]['trading_signal']:
54
logger.info(f"Продажа {row.time} по {row['close']}")
55
result += row['close'] * instrument_data['lot']
56
count_operation += 1
57
58
return {'result': result, 'count_operation': count_operation, 'currency': instrument_data['currency']}
59
60
61
def macd_sandbox_run(data: dict):
62
instrument_data = get_instrument_by(data['figi'])
63
api_client = api_client_configure()
64
candles = {}
65
positions = False
66
67
with api_client as client:
68
for marketdata in client.market_data_stream.market_data_stream(
69
request_iterator(data['figi'], data['timeframe'])
70
):
71
72
if marketdata.candle:
73
candles[int(marketdata.candle.time.timestamp())] = marketdata.candle
74
75
df = create_df(candles.values())
76
77
df['macd'] = macd(close=df['close'], window_slow=data['window_slow'], window_fast=data['window_fast'])
78
df['macd_signal'] = macd_signal(close=df['close'],
79
window_slow=data['window_slow'],
80
window_fast=data['window_fast'],
81
window_sign=data['window_sign']
82
)
83
df['trading_signal'] = np.where(df['macd'] > df['macd_signal'], 1, 0)
84
85
86
if df.iloc[-1]['trading_signal'] and not positions:
87
logger.info(f"Покупаем {marketdata.candle.time} по {to_float(marketdata.candle.close)}")
88
post_sandbox_order(client, data['account_id'], data['figi'], 'buy')
89
positions = True
90
91
elif not df.iloc[-1]['trading_signal'] and positions:
92
logger.info(f"Продаем {marketdata.candle.time} по {to_float(marketdata.candle.close)}")
93
positions = False
94
post_sandbox_order(client, data['account_id'], data['figi'], 'sell')
95
96
else:
97
logger.trace(f"\n{df.tail(5)}")
98
99
logger.trace(f"\n{marketdata}")
100
101
102
if __name__ == "__main__":
103
data = {'account_id': 'f10a6f40-711b-4a0a-855c-6bf43b7eba77', 'figi': 'BBG004730N88', 'window_slow': 26,
104
'window_fast': 12, 'window_sign': 9}
105
macd_sandbox_run(data)
106
107