feat: replay reset ao mudar config — gráfico regenera com novo delta
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user