From afb98d6f8a8997fa93b617eee4d77432ffe5821f Mon Sep 17 00:00:00 2001 From: m5l14i11 Date: Wed, 6 Dec 2023 16:43:02 +0300 Subject: [PATCH] upd --- config.ini | 2 +- core/queries/position.py | 2 +- executor/market_order_executor.py | 4 +--- portfolio/portfolio.py | 2 +- position/take_profit/__init__.py | 0 quant.py | 4 ++-- sor/_router.py | 12 +++++++++--- sor/_twap.py | 1 + strategy/baseline/__init__.py | 0 strategy/stop_loss/__init__.py | 0 10 files changed, 16 insertions(+), 11 deletions(-) create mode 100644 position/take_profit/__init__.py create mode 100644 strategy/baseline/__init__.py create mode 100644 strategy/stop_loss/__init__.py diff --git a/config.ini b/config.ini index 6218e146..beee1667 100644 --- a/config.ini +++ b/config.ini @@ -14,7 +14,7 @@ risk_reward_ratio = 1.5 risk_buffer = 0.0001 twap_duration = 300 max_order_slice = 8 -entry_timeout = 60 +entry_timeout = 30 stop_loss_threshold = 0.5 [portfolio] diff --git a/core/queries/position.py b/core/queries/position.py index aa4a93d7..aa063efc 100644 --- a/core/queries/position.py +++ b/core/queries/position.py @@ -1,6 +1,6 @@ from dataclasses import dataclass -from core.models.order import Order +from core.models.order import Order from core.models.position import Position from core.queries.base import Query diff --git a/executor/market_order_executor.py b/executor/market_order_executor.py index f2cf785a..0a176eaa 100644 --- a/executor/market_order_executor.py +++ b/executor/market_order_executor.py @@ -63,9 +63,7 @@ async def _close_position(self, event: PositionCloseRequested): await self.ask(ClosePosition(current_position)) - order = await self.ask( - GetClosePosition(current_position) - ) + order = await self.ask(GetClosePosition(current_position)) current_position = current_position.add_order(order) diff --git a/portfolio/portfolio.py b/portfolio/portfolio.py index a79477ea..3aa7247a 100644 --- a/portfolio/portfolio.py +++ b/portfolio/portfolio.py @@ -115,4 +115,4 @@ async def update_account_size(self, command: UpdateAccountSize): @command_handler(PortfolioReset) async def portfolio_reset(self, _event: PortfolioReset): - await self.state.reset_all() \ No newline at end of file + await self.state.reset_all() diff --git a/position/take_profit/__init__.py b/position/take_profit/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/quant.py b/quant.py index c1299608..e4c759b9 100644 --- a/quant.py +++ b/quant.py @@ -66,7 +66,7 @@ async def main(): "bus": {"num_workers": os.cpu_count()}, "store": {"base_dir": LOG_DIR}, "generator": { - "timeframes": [str(Timeframe.FIVE_MINUTES)], + "timeframes": [str(Timeframe.ONE_MINUTE)], "blacklist": ["USDCUSDT"], }, } @@ -79,7 +79,7 @@ async def main(): exchange_factory = ExchangeFactory(EnvironmentSecretService()) Portfolio(config_service) - SmartRouter(exchange_factory) + SmartRouter(exchange_factory, config_service) Backtest(DataSourceFactory(exchange_factory), config_service) feed = Feed(EnvironmentSecretService()) diff --git a/sor/_router.py b/sor/_router.py index b00aaead..86b515b0 100644 --- a/sor/_router.py +++ b/sor/_router.py @@ -8,7 +8,6 @@ from core.interfaces.abstract_exhange_factory import AbstractExchangeFactory from core.models.exchange import ExchangeType from core.models.order import Order, OrderStatus -from core.models.position import PositionSide from core.queries.account import GetBalance from core.queries.broker import GetSymbol, GetSymbols from core.queries.position import GetClosePosition, GetOpenPosition @@ -46,7 +45,7 @@ def get_open_position(self, query: GetOpenPosition): @query_handler(GetClosePosition) def get_close_position(self, query: GetClosePosition): position = query.position - + symbol = position.signal.symbol trade = self.exchange.fetch_trade(symbol) @@ -87,15 +86,22 @@ async def open_position(self, command: OpenPosition): symbol = position.signal.symbol position_side = position.side position_size = position.size + stop_loss = position.stop_loss_price + distance_to_stop_loss = abs(position.entry_price - stop_loss) min_size = symbol.min_position_size max_order_slice = self.config["max_order_slice"] + entry_timeout = self.config["entry_timeout"] + stop_loss_threshold = self.config["stop_loss_threshold"] num_orders = min(max(1, int(position_size / min_size)), max_order_slice) size = round(position_size / num_orders, symbol.position_precision) order_counter = 0 for price in self.entry_price.calculate(symbol, self.exchange): + if distance_to_stop_loss > stop_loss_threshold * abs(stop_loss - price): + break + order_id = self.exchange.create_limit_order( symbol, position_side, size, price ) @@ -108,7 +114,7 @@ async def open_position(self, command: OpenPosition): if order_counter >= num_orders: break - await asyncio.sleep(self.config["entry_timeout"]) + await asyncio.sleep(entry_timeout) @command_handler(ClosePosition) def close_position(self, command: ClosePosition): diff --git a/sor/_twap.py b/sor/_twap.py index 97e7351d..1b809901 100644 --- a/sor/_twap.py +++ b/sor/_twap.py @@ -1,4 +1,5 @@ import time + import numpy as np from core.interfaces.abstract_config import AbstractConfig diff --git a/strategy/baseline/__init__.py b/strategy/baseline/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/strategy/stop_loss/__init__.py b/strategy/stop_loss/__init__.py new file mode 100644 index 00000000..e69de29b