feat: replay reset ao mudar config — gráfico regenera com novo delta

This commit is contained in:
rufinomec-afk
2026-06-07 23:38:28 -03:00
parent 6f8e64048a
commit cc0e1bc3de
3 changed files with 28 additions and 1 deletions
+15
View File
@@ -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:
+9
View File
@@ -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")
+4 -1
View File
@@ -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);