From 1b1358353fb8b14faa471406f8f3fe5c35c762ed Mon Sep 17 00:00:00 2001 From: shokollm <270575765+shokollm@users.noreply.github.com> Date: Sat, 11 Apr 2026 17:56:27 +0000 Subject: [PATCH] feat: configurable simulation duration and periodic signal saving Frontend: - Added duration selector (1min, 5min, 10min, 30min) - Added check interval selector (10s, 30s, 60s) Backend: - Signals are now saved to database every 30 seconds during simulation - Can stop simulation early to see partial signals --- src/backend/app/api/simulate.py | 39 ++++++++++++++++++- src/frontend/src/lib/api/client.ts | 2 +- .../src/routes/bot/[id]/simulate/+page.svelte | 23 ++++++++--- 3 files changed, 57 insertions(+), 7 deletions(-) diff --git a/src/backend/app/api/simulate.py b/src/backend/app/api/simulate.py index 2a4d978..8d3fbcf 100644 --- a/src/backend/app/api/simulate.py +++ b/src/backend/app/api/simulate.py @@ -22,6 +22,7 @@ def run_simulation_sync( simulation_id: str, db_url: str, bot_id: str, config: Dict[str, Any] ): import asyncio + import time from ..services.simulate.engine import SimulateEngine from ..core.database import SessionLocal @@ -29,8 +30,44 @@ def run_simulation_sync( engine = SimulateEngine(config) engine.run_id = simulation_id running_simulations[simulation_id] = engine + + def save_signals_to_db(): + """Save current signals to database.""" + db = SessionLocal() + try: + simulation = ( + db.query(Simulation).filter(Simulation.id == simulation_id).first() + ) + if simulation: + simulation.signals = engine.signals + db.commit() + finally: + db.close() + try: - results = await engine.run() + # Run engine in background with periodic signal saving + check_interval = config.get("check_interval", 60) + save_interval = min(check_interval, 30) # Save at least every 30 seconds + + async def run_with_periodic_save(): + last_save_time = time.time() + while engine.running and engine.status == "running": + await asyncio.sleep(1) # Check every second + + current_time = time.time() + if current_time - last_save_time >= save_interval: + save_signals_to_db() + last_save_time = current_time + + # Final save when done + save_signals_to_db() + + # Run both the engine and periodic save concurrently + await asyncio.gather( + engine.run(), + run_with_periodic_save() + ) + db = SessionLocal() try: simulation = ( diff --git a/src/frontend/src/lib/api/client.ts b/src/frontend/src/lib/api/client.ts index c612985..2d591b8 100644 --- a/src/frontend/src/lib/api/client.ts +++ b/src/frontend/src/lib/api/client.ts @@ -189,7 +189,7 @@ export const api = { }, simulate: { - async start(botId: string, config: { token: string; chain?: string; check_interval: number; auto_execute: boolean }): Promise { + async start(botId: string, config: { token: string; chain?: string; check_interval: number; duration_seconds: number; auto_execute: boolean }): Promise { const response = await fetch(`${API_URL}/bots/${botId}/simulate`, { method: 'POST', headers: getAuthHeaders(), diff --git a/src/frontend/src/routes/bot/[id]/simulate/+page.svelte b/src/frontend/src/routes/bot/[id]/simulate/+page.svelte index a71572c..e6c2435 100644 --- a/src/frontend/src/routes/bot/[id]/simulate/+page.svelte +++ b/src/frontend/src/routes/bot/[id]/simulate/+page.svelte @@ -10,6 +10,7 @@ let tokenName = $state(''); let tokenAddress = $state(''); let intervalSeconds = $state(60); + let durationSeconds = $state(300); // 5 minutes default let autoExecute = $state(false); let isRunning = $state(false); @@ -70,6 +71,7 @@ token: tokenAddress, chain: 'bsc', check_interval: intervalSeconds, + duration_seconds: durationSeconds, auto_execute: autoExecute }); setCurrentSimulation(simulation); @@ -132,12 +134,23 @@
- - + + + + +
+ + +
+
+ +