feat: add daily budget, active window, trade snapshots, and price impact monitor
- New migrations for daily_budget, active_window, and bottrade snapshot - Add trumpstruth scraper and price_impact_monitor service - Expand bot_engine, hyperliquid, recovery, and tp_sl_monitor logic - Update API/schemas/models for new features Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -18,7 +18,7 @@ logger = logging.getLogger(__name__)
|
||||
|
||||
async def rehydrate_open_trades() -> None:
|
||||
# Imported locally to avoid circular imports at module load
|
||||
from app.services.bot_engine import MAX_HOLD_SECONDS, _close_after_hold, close_and_finalize
|
||||
from app.services.bot_engine import MAX_HOLD_SECONDS, close_and_finalize
|
||||
from app.services.crypto import decrypt_api_key
|
||||
from app.services.tp_sl_monitor import register_trade
|
||||
|
||||
@@ -49,12 +49,16 @@ async def rehydrate_open_trades() -> None:
|
||||
logger.error("Cannot decrypt key for trade %d: %s", t.id, exc)
|
||||
continue
|
||||
|
||||
# Use the leverage snapshot from the trade row (stamped at open time).
|
||||
# Fall back to current Subscription only for legacy rows (pre-migration 005).
|
||||
trade_leverage = t.leverage if t.leverage is not None else sub.leverage
|
||||
|
||||
# Re-register TP/SL watcher
|
||||
register_trade(
|
||||
trade_id=t.id,
|
||||
wallet=t.wallet_address,
|
||||
api_key=api_key,
|
||||
leverage=sub.leverage,
|
||||
leverage=trade_leverage,
|
||||
asset=t.asset,
|
||||
side=t.side,
|
||||
entry_price=t.entry_price,
|
||||
@@ -67,23 +71,29 @@ async def rehydrate_open_trades() -> None:
|
||||
elapsed = (now - opened_aware).total_seconds()
|
||||
remaining = MAX_HOLD_SECONDS - elapsed
|
||||
|
||||
from app.services.bot_engine import _background_tasks
|
||||
|
||||
if remaining <= 0:
|
||||
logger.info("Trade %d past max-hold on startup — closing now", t.id)
|
||||
asyncio.create_task(
|
||||
task = asyncio.create_task(
|
||||
close_and_finalize(
|
||||
trade_id=t.id, api_key=api_key, leverage=sub.leverage,
|
||||
trade_id=t.id, api_key=api_key, leverage=trade_leverage,
|
||||
asset=t.asset, wallet=t.wallet_address, reason="max_hold_recovery",
|
||||
)
|
||||
)
|
||||
_background_tasks.add(task)
|
||||
task.add_done_callback(_background_tasks.discard)
|
||||
else:
|
||||
async def _delayed_close(trade_id=t.id, key=api_key, lev=sub.leverage,
|
||||
async def _delayed_close(trade_id=t.id, key=api_key, lev=trade_leverage,
|
||||
asset=t.asset, wallet=t.wallet_address, delay=remaining):
|
||||
await asyncio.sleep(delay)
|
||||
await close_and_finalize(
|
||||
trade_id=trade_id, api_key=key, leverage=lev,
|
||||
asset=asset, wallet=wallet, reason="max_hold",
|
||||
)
|
||||
asyncio.create_task(_delayed_close())
|
||||
task = asyncio.create_task(_delayed_close())
|
||||
_background_tasks.add(task)
|
||||
task.add_done_callback(_background_tasks.discard)
|
||||
|
||||
await db.commit()
|
||||
logger.info("Rehydrated %d open trades.", len(open_trades))
|
||||
|
||||
Reference in New Issue
Block a user