From cc0e1bc3de8b7fda340257e749b02e1f51110c33 Mon Sep 17 00:00:00 2001 From: rufinomec-afk Date: Sun, 7 Jun 2026 23:38:28 -0300 Subject: [PATCH] =?UTF-8?q?feat:=20replay=20reset=20ao=20mudar=20config=20?= =?UTF-8?q?=E2=80=94=20gr=C3=A1fico=20regenera=20com=20novo=20delta?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/mt5_collector.py | 15 +++++++++++++++ backend/server.py | 9 +++++++++ frontend/src/App.jsx | 5 ++++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/backend/mt5_collector.py b/backend/mt5_collector.py index 8f7bcc0..2ebee44 100644 --- a/backend/mt5_collector.py +++ b/backend/mt5_collector.py @@ -30,6 +30,7 @@ class MT5Collector: self.last_bid = 0.0 self.last_ask = 0.0 self._history_annotated = False + self._replay_reset_requested = False async def connect_mt5(self) -> bool: """ @@ -125,11 +126,25 @@ class MT5Collector: logger.warning("Nenhum gap de sessão encontrado, usando HISTORY_HOURS") return datetime.now() - timedelta(hours=settings.HISTORY_HOURS) + def request_replay_reset(self): + """Signal the polling loop to reset the aggregator and replay from session start.""" + self.aggregator.history.clear() + self.aggregator.active_cluster = type(self.aggregator.active_cluster)(tick_size=self.aggregator.tick_size) + self._history_annotated = False + self._replay_reset_requested = True + async def start(self): self.running = True backoff = 1.0 while self.running: + # Config changed — restart replay from session start with new settings + if self._replay_reset_requested: + self._replay_reset_requested = False + self.connected = False + logger.info("Replay reset requested — restarting from session start...") + continue + if not self.connected: success = await self.connect_mt5() if not success: diff --git a/backend/server.py b/backend/server.py index 9b6a0c4..1abd013 100644 --- a/backend/server.py +++ b/backend/server.py @@ -123,6 +123,15 @@ async def update_config(update: ConfigUpdate): if update.time_seconds is not None: settings.CLUSTER_TIME_SECONDS = update.time_seconds logger.info(f"Config updated: mode={settings.CLUSTER_CLOSE_MODE}, delta_max={settings.CLUSTER_DELTA_MAX}") + + # Notify clients to clear history, then reset and replay with new config + for ws in list(active_connections): + try: + await ws.send_json({"type": "reset"}) + except Exception: + active_connections.discard(ws) + collector.request_replay_reset() + return {"ok": True} @app.get("/history") diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index b2a2ee9..54d8e1d 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -79,8 +79,11 @@ export default function App() { if (msg.type === 'init') { setActiveCluster(msg.active); fetchHistory(); + } else if (msg.type === 'reset') { + setHistory([]); + setActiveCluster(null); } else if (msg.type === 'history_ready') { - fetchHistory(); // Replay completo — busca histórico atualizado + fetchHistory(); } else if (msg.type === 'tick') { setActiveCluster(msg.active); if (msg.active?.bid) setLastBid(msg.active.bid);