Use total PNL including open positions in dashboard KPI

Этот коммит содержится в:
Виктор
2026-05-08 04:40:11 +09:00
родитель 8c4c4083dd
Коммит 1c5ddd7225
+17 -10
Просмотреть файл
@@ -1,4 +1,3 @@
from datetime import datetime, timezone
from typing import Any from typing import Any
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
@@ -18,9 +17,9 @@ from app.models import (
DEFAULT_STRATEGIES = [ DEFAULT_STRATEGIES = [
('AI News Scalper', '1min', 'BTCUSDT,ETHUSDT,SOLUSDT'), ('AI News Scalper', '1min', 'ALL_USDT'),
('Trend Follow', '5min', 'BTCUSDT,ETHUSDT'), ('Trend Follow', '5min', 'ALL_USDT'),
('Volatility Catcher', '1min', 'SOLUSDT,XRPUSDT,DOGEUSDT'), ('Volatility Catcher', '1min', 'ALL_USDT'),
] ]
@@ -41,6 +40,9 @@ class LegacyBotService:
account = db.get(DemoAccountState, 1) account = db.get(DemoAccountState, 1)
balance = account.balance if account else 0.0 balance = account.balance if account else 0.0
realized = account.realized_pnl if account else 0.0 realized = account.realized_pnl if account else 0.0
unrealized = sum(item.unrealized_pnl for item in db.query(DemoPosition).filter(DemoPosition.is_open.is_(True)).all())
open_value = sum(item.current_price * item.amount for item in db.query(DemoPosition).filter(DemoPosition.is_open.is_(True)).all())
equity = balance + open_value
trades_total = db.query(DemoTradeRecord).count() trades_total = db.query(DemoTradeRecord).count()
open_positions = db.query(DemoPosition).filter(DemoPosition.is_open.is_(True)).count() open_positions = db.query(DemoPosition).filter(DemoPosition.is_open.is_(True)).count()
closed_positions = db.query(DemoPosition).filter(DemoPosition.is_open.is_(False)).count() closed_positions = db.query(DemoPosition).filter(DemoPosition.is_open.is_(False)).count()
@@ -51,7 +53,11 @@ class LegacyBotService:
return { return {
'kpi': { 'kpi': {
'balance': balance, 'balance': balance,
'equity': equity,
'realized_pnl': realized, 'realized_pnl': realized,
'unrealized_pnl': unrealized,
'total_pnl': realized + unrealized,
'open_positions_value': open_value,
'trades_total': trades_total, 'trades_total': trades_total,
'open_positions': open_positions, 'open_positions': open_positions,
'closed_positions': closed_positions, 'closed_positions': closed_positions,
@@ -85,12 +91,12 @@ class LegacyBotService:
] ]
def snapshot_history(self, db: Session) -> dict[str, Any]: def snapshot_history(self, db: Session) -> dict[str, Any]:
account = db.get(DemoAccountState, 1) dash = self.dashboard(db)
point = ChartHistoryPoint( point = ChartHistoryPoint(
balance=account.balance if account else 0.0, balance=dash['kpi']['equity'],
pnl_total=account.realized_pnl if account else 0.0, pnl_total=dash['kpi']['total_pnl'],
open_trades=db.query(DemoPosition).filter(DemoPosition.is_open.is_(True)).count(), open_trades=dash['kpi']['open_positions'],
closed_trades=db.query(DemoPosition).filter(DemoPosition.is_open.is_(False)).count(), closed_trades=dash['kpi']['closed_positions'],
) )
db.add(point) db.add(point)
db.commit() db.commit()
@@ -161,7 +167,8 @@ class LegacyBotService:
'ok': True, 'ok': True,
'mode': dash['coinex']['mode'], 'mode': dash['coinex']['mode'],
'balance': dash['kpi']['balance'], 'balance': dash['kpi']['balance'],
'pnl': dash['kpi']['realized_pnl'], 'equity': dash['kpi']['equity'],
'pnl': dash['kpi']['total_pnl'],
'open_positions': dash['kpi']['open_positions'], 'open_positions': dash['kpi']['open_positions'],
'active_strategies': dash['kpi']['active_strategies'], 'active_strategies': dash['kpi']['active_strategies'],
} }