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_bid = 0.0
|
||||||
self.last_ask = 0.0
|
self.last_ask = 0.0
|
||||||
self._history_annotated = False
|
self._history_annotated = False
|
||||||
|
self._replay_reset_requested = False
|
||||||
|
|
||||||
async def connect_mt5(self) -> bool:
|
async def connect_mt5(self) -> bool:
|
||||||
"""
|
"""
|
||||||
@@ -125,11 +126,25 @@ class MT5Collector:
|
|||||||
logger.warning("Nenhum gap de sessão encontrado, usando HISTORY_HOURS")
|
logger.warning("Nenhum gap de sessão encontrado, usando HISTORY_HOURS")
|
||||||
return datetime.now() - timedelta(hours=settings.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):
|
async def start(self):
|
||||||
self.running = True
|
self.running = True
|
||||||
backoff = 1.0
|
backoff = 1.0
|
||||||
|
|
||||||
while self.running:
|
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:
|
if not self.connected:
|
||||||
success = await self.connect_mt5()
|
success = await self.connect_mt5()
|
||||||
if not success:
|
if not success:
|
||||||
|
|||||||
@@ -123,6 +123,15 @@ async def update_config(update: ConfigUpdate):
|
|||||||
if update.time_seconds is not None:
|
if update.time_seconds is not None:
|
||||||
settings.CLUSTER_TIME_SECONDS = update.time_seconds
|
settings.CLUSTER_TIME_SECONDS = update.time_seconds
|
||||||
logger.info(f"Config updated: mode={settings.CLUSTER_CLOSE_MODE}, delta_max={settings.CLUSTER_DELTA_MAX}")
|
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}
|
return {"ok": True}
|
||||||
|
|
||||||
@app.get("/history")
|
@app.get("/history")
|
||||||
|
|||||||
@@ -79,8 +79,11 @@ export default function App() {
|
|||||||
if (msg.type === 'init') {
|
if (msg.type === 'init') {
|
||||||
setActiveCluster(msg.active);
|
setActiveCluster(msg.active);
|
||||||
fetchHistory();
|
fetchHistory();
|
||||||
|
} else if (msg.type === 'reset') {
|
||||||
|
setHistory([]);
|
||||||
|
setActiveCluster(null);
|
||||||
} else if (msg.type === 'history_ready') {
|
} else if (msg.type === 'history_ready') {
|
||||||
fetchHistory(); // Replay completo — busca histórico atualizado
|
fetchHistory();
|
||||||
} else if (msg.type === 'tick') {
|
} else if (msg.type === 'tick') {
|
||||||
setActiveCluster(msg.active);
|
setActiveCluster(msg.active);
|
||||||
if (msg.active?.bid) setLastBid(msg.active.bid);
|
if (msg.active?.bid) setLastBid(msg.active.bid);
|
||||||
|
|||||||
Reference in New Issue
Block a user