From dd06606a5fb75aea271fbd0974b6e3b010436ab8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80?= <78488229+viktor138irk@users.noreply.github.com> Date: Fri, 8 May 2026 04:33:10 +0900 Subject: [PATCH] Rotate markets and skip markets with open positions --- app/ai_bot.py | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/app/ai_bot.py b/app/ai_bot.py index 65daea9..67350d6 100644 --- a/app/ai_bot.py +++ b/app/ai_bot.py @@ -113,19 +113,36 @@ class AiTradingBot: reason=reason, ) - async def choose_best_market(self, db: Session) -> IndicatorPack: + def rotated_markets(self, db: Session) -> list[str]: + state = self.get_or_create_state(db) + markets = list(self.markets) + if not markets or not state.last_market or state.last_market not in markets: + return markets + index = markets.index(state.last_market) + return markets[index + 1:] + markets[:index + 1] + + async def choose_best_market(self, db: Session, skip_open_positions: bool = True) -> IndicatorPack: packs: list[IndicatorPack] = [] - for market in self.markets: + for market in self.rotated_markets(db): + if skip_open_positions: + open_position = db.query(DemoPosition).filter(DemoPosition.market == market, DemoPosition.is_open.is_(True)).first() + if open_position is not None: + continue try: packs.append(await self.analyze_market(db, market)) except Exception: continue if not packs: raise ValueError('no market could be analyzed') - return max(packs, key=lambda item: item.score) + chosen = max(packs, key=lambda item: item.score) + state = self.get_or_create_state(db) + state.last_market = chosen.market + db.add(state) + db.commit() + return chosen - async def make_decision(self, db: Session, market: str | None = None, persist: bool = True) -> AiDecision: - pack = await self.analyze_market(db, market) if market else await self.choose_best_market(db) + async def make_decision(self, db: Session, market: str | None = None, persist: bool = True, skip_open_positions: bool = True) -> AiDecision: + pack = await self.analyze_market(db, market) if market else await self.choose_best_market(db, skip_open_positions=skip_open_positions) decision = AiDecision( market=pack.market, action=pack.action, @@ -194,6 +211,7 @@ class AiTradingBot: 'max_open_positions': state.max_open_positions, 'max_quote_per_trade': state.max_quote_per_trade, 'emergency_stop': state.emergency_stop, + 'last_market': state.last_market, } def _parse_candles(self, raw: dict[str, Any]) -> list[dict[str, float]]: