Path: blob/master/ invest-robot-contest_invest-bot-main/main.py
5925 views
import asyncio1import logging2import os3import sys4from logging.handlers import RotatingFileHandler56from blog.blog_worker import BlogWorker7from blog.blogger import Blogger8from configuration.configuration import ProgramConfiguration9from invest_api.services.accounts_service import AccountService10from invest_api.services.client_service import ClientService11from invest_api.services.instruments_service import InstrumentService12from invest_api.services.market_data_service import MarketDataService13from invest_api.services.operations_service import OperationService14from invest_api.services.orders_service import OrderService15from invest_api.services.market_data_stream_service import MarketDataStreamService16from trade_system.strategies.strategy_factory import StrategyFactory17from trading.trade_service import TradeService1819# the configuration file name20CONFIG_FILE = "settings.ini"2122logger = logging.getLogger(__name__)232425async def start_asyncio_trading(blog_worker_loop: BlogWorker, trade_service_loop: TradeService) -> None:26# Some asyncio MAGIC for Windows OS27if sys.version_info[0] == 3 and sys.version_info[1] >= 8 and sys.platform.startswith('win'):28asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())2930logger.info("Start loop workers for trading")3132blog_task = asyncio.create_task(blog_worker_loop.worker())33trade_task = asyncio.create_task(trade_service_loop.worker())3435await blog_task36await trade_task373839def prepare_logs() -> None:40if not os.path.exists("logs/"):41os.makedirs("logs/")4243logging.basicConfig(44level=logging.DEBUG,45format="%(asctime)s - %(module)s - %(levelname)s - %(funcName)s: %(lineno)d - %(message)s",46handlers=[RotatingFileHandler('logs/robot.log', maxBytes=100000000, backupCount=10, encoding='utf-8')],47encoding="utf-8"48)495051if __name__ == "__main__":52prepare_logs()5354logger.info("Program start")5556try:57config = ProgramConfiguration(CONFIG_FILE)58logger.info("Configuration has been loaded")59except Exception as ex:60logger.critical("Load configuration error: %s", repr(ex))61else:62account_service = AccountService(config.tinkoff_token, config.tinkoff_app_name)63client_service = ClientService(config.tinkoff_token, config.tinkoff_app_name)64instrument_service = InstrumentService(config.tinkoff_token, config.tinkoff_app_name)65operation_service = OperationService(config.tinkoff_token, config.tinkoff_app_name)66order_service = OrderService(config.tinkoff_token, config.tinkoff_app_name)67stream_service = MarketDataStreamService(config.tinkoff_token, config.tinkoff_app_name)68market_data_service = MarketDataService(config.tinkoff_token, config.tinkoff_app_name)6970if account_service.verify_token():71logger.info(f"Blog settings: {config.blog_settings}")7273trade_strategies = \74[StrategyFactory.new_factory(x.name, x) for x in config.trade_strategy_settings]7576# Queue to keep messages for TG. TradeService(via Blogger) produce, BlogWorker consume (send)77messages_queue = asyncio.Queue()7879blog_worker = BlogWorker(config.blog_settings, messages_queue)80trade_service = TradeService(81account_service=account_service,82client_service=client_service,83instrument_service=instrument_service,84operation_service=operation_service,85order_service=order_service,86stream_service=stream_service,87market_data_service=market_data_service,88blogger=Blogger(config.blog_settings, config.trade_strategy_settings, messages_queue),89account_settings=config.account_settings,90trading_settings=config.trading_settings,91strategies=trade_strategies92)9394asyncio.run(start_asyncio_trading(blog_worker, trade_service))9596else:97logger.critical("Client verification has been failed")9899logger.info("Program end")100101102