Path: blob/master/ invest-robot-contest_tinkoffSDK-master/my_moving_average.py
5925 views
import sys1import os2from urllib import response34path = os.getcwd()5repo_folder = os.path.dirname(os.path.dirname(path))6sys.path.append(repo_folder)7#!set PATH=%PATH%;%APPDATA%\Python\Scripts8#os.chdir(os.path.dirname(os.path.dirname(path)))910import logging11import operator1213from tinkoff.invest.mock_services import MockedClient14from decimal import Decimal15from tinkoff.invest.strategies.moving_average.strategy_settings import (16MovingAverageStrategySettings,17)18from tinkoff.invest import CandleInterval, MoneyValue19from tinkoff.invest.strategies.moving_average.signal_executor import (20MovingAverageSignalExecutor,21)22from tinkoff.invest.strategies.moving_average.supervisor import (23MovingAverageStrategySupervisor,24)25from tinkoff.invest.strategies.moving_average.strategy_state import (26MovingAverageStrategyState,27)28from tinkoff.invest.strategies.moving_average.strategy import MovingAverageStrategy29from tinkoff.invest.strategies.moving_average.trader import MovingAverageStrategyTrader30from datetime import timedelta, datetime, timezone31from tinkoff.invest.typedefs import ShareId, AccountId32from tinkoff.invest.strategies.base.account_manager import AccountManager33from tinkoff.invest.strategies.moving_average.plotter import (34MovingAverageStrategyPlotter,35)3637import my_account_manager38import my_trader39import my_strategy4041#Все даты учитываются по всемирному времени42def start_datetime() -> datetime:43return datetime(year=2022, month=5, day=23, hour=7, tzinfo=timezone.utc)4445def main(start_balance_units = 100000, long_ma_min = 30, long_ma_max = 30, short_ma_min = 3, short_ma_max = 3, std_period_min = 22, std_period_max = 22) -> dict:4647print("Start")4849# sandbox token50token = os.environ["SANDBOX_TOKEN"]51525354d_long_ma = [] #Диапазон настроек long_ma55for i in range(long_ma_min, long_ma_max+1):56d_long_ma.append(i)5758d_short_ma = []59for i in range(short_ma_min, short_ma_max+1):60d_short_ma.append(i)6162d_std_period = []63for i in range(std_period_min, std_period_max+1):64d_std_period.append(i)6566d_candle_interval = []67d_candle_interval.append(CandleInterval.CANDLE_INTERVAL_1_MIN)68# d_candle_interval.append(CandleInterval.CANDLE_INTERVAL_5_MIN)69# d_candle_interval.append(CandleInterval.CANDLE_INTERVAL_15_MIN)70# d_candle_interval.append(CandleInterval.CANDLE_INTERVAL_HOUR)7172long_ma = 1573short_ma = 374std_period = 3075timaframe = CandleInterval.CANDLE_INTERVAL_1_MIN76n, m, s, tf = long_ma, short_ma, std_period, timaframe77period = 1 # сюда добавить переход от tf к числу или отрекдактировать код снизу7879stocks = {80#"AAPL": {"figi": "BBG000B9XRY4"},81#"GAZP": {"figi": "BBG004730RP0"}82"VTB": {"figi": "BBG004730ZJ9"}83#"MSFT": {"figi": "BBG000BPH459"},84# "GOOG":{"figi":"BBG009S3NB30"}, гугл не работает85#"AMZN": {"figi": "BBG000BVPV84"},86#"TSLA": {"figi": "BBG000N9MNX3"},87# "NGK2": {"figi": os.environ["FIGI"]}88}8990default_stock = {"figi": "BBG004730ZJ9"}9192settings_data = {} # в этот словарь будут записываться сгенерированные настройки.93settings_data['default'] = {94"stock": default_stock,95'long_ma' : long_ma,96'short_ma' : short_ma,97'std_period' : std_period,98'tf' : timaframe,99'period' : period100}101102k = 0103settings_name = "set" + str(k) #Переменная будет хранить ключи настроек104105#Сгенерируем все наборы настроек:106for ci in d_candle_interval:107for dlm in d_long_ma:108for dsm in d_short_ma:109for dsp in d_std_period:110settings_data[settings_name] = {111"stock": default_stock,112'long_ma' : dlm,113'short_ma' : dsm,114'std_period' : dsp,115'tf' : ci,116'period' : period # пока константа117}118k += 1119settings_name = "set" + str(k)120121122123124125126# тут надо проставлять сдвиг даты в зависимости от выбранного тф127# что-то вроде CandleInterval.CANDLE_INTERVAL_1_MIN.seconds * (m+n) для real_market_data_test_from128real_market_data_test_from = start_datetime() # с какой даты начинают считаться индикаторы129#real_market_data_test_start = start_datetime() + timedelta(minutes=(n + m) * 20) # с какой даты начинает работать стратегия130real_market_data_test_start = start_datetime() + timedelta(hours=1)131#real_market_data_test_end = start_datetime() + timedelta(days=1)132real_market_data_test_end = start_datetime() + timedelta(hours=8) # когда все заканчивается133134takts_count = 420 #Количество тактов робота в минутах, если интервал свеч Минута135136start_balance = MoneyValue(currency="rub", units = start_balance_units, nano=000000000)137138#Начнем логирование здесь:139file_name = "Log_mov_aver__shortMA_%s, longMA_%s, stdP_%s,tf_%s.log" %(short_ma,long_ma, std_period,timaframe)140logging.basicConfig(format="%(asctime)s %(levelname)s:%(message)s", level=logging.INFO, filename = file_name)141logger = logging.getLogger(__name__)142143logger.info("Параметры теста _shortMA_%s, longMA_%s, stdP_%s,tf_%s.log" %(short_ma,long_ma, std_period,timaframe))144logger.info(f"Интервал: Дата начала получения свечей = {real_market_data_test_from}, Дата начала торговли (проверки сигналов) = {real_market_data_test_start}, Дата окончания тестовой торговли = {real_market_data_test_end}")145logger.info(f"Начальный баланс = {start_balance}")146147148balances = {}149results = []150maxprofit = 0151best_settings = "none"152#results["none"] = {'profit': "none"}153154for set in settings_data:155156figi = ShareId(settings_data[set]['stock']['figi'])157158logger.info(f'Инструмент = {figi}')159160balance = MoneyValue(currency="rub", units = start_balance_units, nano=000000000)161162163164#account_id = AccountId("1337007228")165account_id = os.environ["INVEST_ACCOUNT_ID"]166settings = MovingAverageStrategySettings(167share_id=figi, # figi конкретной ценной бумаги168account_id=account_id, # неважно для sandbox169max_transaction_price=Decimal(170100000171), # максимальный объем сделки - зависит от размера портфеля. сейчас фиксировано172candle_interval=settings_data[set]['tf'], # тф - таймфрейм173long_period=timedelta(minutes=settings_data[set]['long_ma'] * settings_data[set]['period']), # длинная скользяшка174short_period=timedelta(minutes=settings_data[set]['short_ma'] * settings_data[set]['period']), # короткая скользяшка175std_period=timedelta(minutes=settings_data[set]['std_period'] * settings_data[set]['period']), # количество периодов для стд176)177178with MockedClient(179token=token,180settings=settings,181real_market_data_test_from=real_market_data_test_from,182real_market_data_test_start=real_market_data_test_start,183real_market_data_test_end=real_market_data_test_end,184balance=balance,185) as mocked_services:186account_manager = my_account_manager.AccountManager(187services=mocked_services, strategy_settings=settings188)189state = MovingAverageStrategyState()190strategy = my_strategy.MovingAverageStrategy(191settings=settings,192account_manager=account_manager,193state=state,194)195supervisor = MovingAverageStrategySupervisor()196signal_executor = MovingAverageSignalExecutor(197services=mocked_services,198state=state,199settings=settings,200)201moving_average_strategy_trader = my_trader.MovingAverageStrategyTrader(202strategy=strategy,203settings=settings,204services=mocked_services,205state=state,206signal_executor=signal_executor,207account_manager=account_manager,208supervisor=supervisor,209)210211212213plotter = MovingAverageStrategyPlotter(settings=settings)214215216initial_balance = account_manager.get_current_balance()217218for i in range(takts_count):219logger.info("Trade %s", i)220moving_average_strategy_trader.trade()221222balance, shares = account_manager.get_current_balance()223224balances[set] = {'cash': balance, 'shares': shares}225226profit = balance - start_balance_units + shares227228results.append({"settings": settings_data[set], "balance": balances[set], "profit": profit})229230if profit > maxprofit:231maxprofit = profit232best_settings = set233234logger.info(f"РЕЗУЛЬТАТЫ:")235logger.info(f"Конечный баланс = {balance}")236logger.info(f"Инструмент = {default_stock}")237logger.info("Параметры теста _shortMA_%s, longMA_%s, stdP_%s,tf_%s.log" %(settings_data[set]['short_ma'],settings_data[set]['long_ma'] , settings_data[set]['std_period'],settings_data[set]['tf']))238logger.info(f"Интервал: Дата начала получения свечей = {real_market_data_test_from}, Дата начала торговли (проверки сигналов) = {real_market_data_test_start}, Дата окончания тестовой торговли = {real_market_data_test_end}")239logger.info(f"Начальный баланс = {start_balance_units}")240241if balance + shares - start_balance_units > 0:242logger.info(f"Результат = Успешная торговля! Прибыль = {balance - start_balance_units}")243#result = f"Результат = Успешная торговля! Прибыль = {balance.units - start_balance.units}"244#elif state.long_open:245# logger.info(f"Есть открытые позиции. Количество открытых позиций {state.position}")246# result = f"Есть открытые позиции. Количество открытых позиций {state.position}"247elif balance.units + shares.units - start_balance_units == 0:248logger.info(f"Результат = Нейтральный! Прибыль = {balance - start_balance_units}")249else:250logger.info(f"Результат = Убыток! Убыток = {balance - start_balance_units}")251252253#best_stock = max(balances, key=balances.get)254#best_stock = max(results, key=results.get)255256257258# events = supervisor.get_events()259# plotter.plot(events)260261#current_balance = account_manager.get_current_balance()262# assert initial_balance != current_balance263# logger.info("Initial balance %s", initial_balance)264# logger.info("Current balance %s", current_balance)265266267268269sorted_results = sorted(results, key = operator.itemgetter('profit'),reverse=True)270271272return sorted_results273274275if __name__ == "__main__":276main()277278