Path: blob/master/ invest-robot-contest_tinkoff_invest_robot-main/src/strategy/macd.py
5929 views
from loguru import logger12from ta.trend import macd, macd_signal3from pandas import DataFrame4import numpy as np56from src.algotrading._sandbox_accounts import post_sandbox_order7from src.algotrading.get_candles import get_all_candles, request_iterator8from src.algotrading.instruments_service import get_instrument_by9from src.algotrading.utils import api_client_configure, to_float101112def create_df(candles):13df = DataFrame([{14'time': c.time,15'volume': c.volume,16'open': to_float(c.open),17'close': to_float(c.close),18'high': to_float(c.high),19'low': to_float(c.low),20} for c in candles])2122return df232425def macd_test(data: dict) -> int:26instrument_data = get_instrument_by(data['figi'])27api_client = api_client_configure()2829with api_client as client:3031candles = get_all_candles(client, data['figi'], 7, data['timeframe'])32df = create_df(candles)3334df['macd'] = macd(close=df['close'], window_slow=data['window_slow'], window_fast=data['window_fast'])35df['macd_signal'] = macd_signal(close=df['close'],36window_slow=data['window_slow'],37window_fast=data['window_fast'],38window_sign=data['window_sign']39)4041df['trading_signal'] = np.where(df['macd'] > df['macd_signal'], 1, 0)4243result = 044count_operation = 045for index, row in df.iterrows():46if index == 1:47continue48elif row['trading_signal'] > df.iloc[index - 1]['trading_signal']:49logger.info(f"Покупаем {row.time} по {row['close']}")50result -= row['close'] * instrument_data['lot']51count_operation += 152elif row['trading_signal'] < df.iloc[index - 1]['trading_signal']:53logger.info(f"Продажа {row.time} по {row['close']}")54result += row['close'] * instrument_data['lot']55count_operation += 15657return {'result': result, 'count_operation': count_operation, 'currency': instrument_data['currency']}585960def macd_sandbox_run(data: dict):61instrument_data = get_instrument_by(data['figi'])62api_client = api_client_configure()63candles = {}64positions = False6566with api_client as client:67for marketdata in client.market_data_stream.market_data_stream(68request_iterator(data['figi'], data['timeframe'])69):7071if marketdata.candle:72candles[int(marketdata.candle.time.timestamp())] = marketdata.candle7374df = create_df(candles.values())7576df['macd'] = macd(close=df['close'], window_slow=data['window_slow'], window_fast=data['window_fast'])77df['macd_signal'] = macd_signal(close=df['close'],78window_slow=data['window_slow'],79window_fast=data['window_fast'],80window_sign=data['window_sign']81)82df['trading_signal'] = np.where(df['macd'] > df['macd_signal'], 1, 0)838485if df.iloc[-1]['trading_signal'] and not positions:86logger.info(f"Покупаем {marketdata.candle.time} по {to_float(marketdata.candle.close)}")87post_sandbox_order(client, data['account_id'], data['figi'], 'buy')88positions = True8990elif not df.iloc[-1]['trading_signal'] and positions:91logger.info(f"Продаем {marketdata.candle.time} по {to_float(marketdata.candle.close)}")92positions = False93post_sandbox_order(client, data['account_id'], data['figi'], 'sell')9495else:96logger.trace(f"\n{df.tail(5)}")9798logger.trace(f"\n{marketdata}")99100101if __name__ == "__main__":102data = {'account_id': 'f10a6f40-711b-4a0a-855c-6bf43b7eba77', 'figi': 'BBG004730N88', 'window_slow': 26,103'window_fast': 12, 'window_sign': 9}104macd_sandbox_run(data)105106107