Add explain analysis workflow and UI

This commit is contained in:
2026-03-16 22:28:41 +08:00
parent 3a5558b576
commit 1f5ee3698e
49 changed files with 8888 additions and 1476 deletions

View File

@@ -47,6 +47,10 @@ class StateSync:
"""Set current simulation date for backtest-compatible timestamps"""
self._simulation_date = date
def clear_simulation_date(self):
"""Disable backtest timestamp simulation and use wall-clock time."""
self._simulation_date = None
def _get_timestamp_ms(self) -> int:
"""
Get timestamp in milliseconds.
@@ -97,9 +101,21 @@ class StateSync:
if not self._enabled:
return
# Ensure timestamp exists (use simulation date if in backtest mode)
# Ensure timestamp exists. Prefer explicit millisecond timestamps so
# frontend displays local wall time correctly instead of date-only UTC.
if "timestamp" not in event:
if self._simulation_date:
ts_ms = event.get("ts")
if ts_ms is not None:
try:
event["timestamp"] = datetime.fromtimestamp(
float(ts_ms) / 1000.0,
).isoformat()
except (TypeError, ValueError, OSError):
if self._simulation_date:
event["timestamp"] = f"{self._simulation_date}"
else:
event["timestamp"] = datetime.now().isoformat()
elif self._simulation_date:
event["timestamp"] = f"{self._simulation_date}"
else:
event["timestamp"] = datetime.now().isoformat()
@@ -238,9 +254,12 @@ class StateSync:
"""Called at start of trading cycle"""
self._state["current_date"] = date
self._state["status"] = "running"
self.set_simulation_date(
date,
) # Set for backtest-compatible timestamps
if self._state.get("server_mode") == "backtest":
self.set_simulation_date(
date,
) # Set for backtest-compatible timestamps
else:
self.clear_simulation_date()
await self.emit(
{