37172-vm/algo_trader/ui/main_window.py
2025-12-27 04:12:50 +00:00

91 lines
3.1 KiB
Python

import sys
import asyncio
from PySide6.QtWidgets import QApplication, QMainWindow, QLabel, QWidget, QVBoxLayout, QTabWidget
from PySide6.QtCore import Qt, QTimer, QThread, Signal
from .dashboard import DashboardPanel
from .strategy_panel import StrategyPanel
from .positions_panel import PositionsPanel
from .orders_panel import OrdersPanel
from .logs_panel import LogsPanel
class AsyncWorker(QThread):
def __init__(self, loop: asyncio.AbstractEventLoop, target_coro, kwargs):
super().__init__()
self.loop = loop
self.target_coro = target_coro
self.kwargs = kwargs
def run(self):
asyncio.set_event_loop(self.loop)
self.loop.run_until_complete(self.target_coro(**self.kwargs))
self.loop.close()
class MainWindow(QMainWindow):
def __init__(
self, broker, data_feed, db_session, order_manager, risk_manager, strategy_engine, settings, backend_runner
):
super().__init__()
self.broker = broker
self.data_feed = data_feed
self.db_session = db_session
self.order_manager = order_manager
self.risk_manager = risk_manager
self.strategy_engine = strategy_engine
self.settings = settings
self.backend_runner = backend_runner
self.setWindowTitle("Algo Trader")
self.setGeometry(100, 100, 1600, 900)
# Create main tab widget
self.tabs = QTabWidget()
self.tabs.setTabPosition(QTabWidget.North)
# Create panels
self.dashboard_panel = DashboardPanel()
self.strategy_panel = StrategyPanel()
self.positions_panel = PositionsPanel()
self.orders_panel = OrdersPanel()
self.logs_panel = LogsPanel()
# Add panels to tabs
self.tabs.addTab(self.dashboard_panel, "Dashboard")
self.tabs.addTab(self.strategy_panel, "Strategies")
self.tabs.addTab(self.positions_panel, "Positions")
self.tabs.addTab(self.orders_panel, "Orders")
self.tabs.addTab(self.logs_panel, "Logs")
self.setCentralWidget(self.tabs)
# --- Asyncio Integration ---
self.loop = asyncio.get_event_loop()
if self.loop.is_running():
self.loop = asyncio.new_event_loop()
self.backend_worker = AsyncWorker(
loop=self.loop,
target_coro=self.backend_runner,
kwargs={
"broker": self.broker,
"data_feed": self.data_feed,
"db_session": self.db_session,
"order_manager": self.order_manager,
"risk_manager": self.risk_manager,
"strategy_engine": self.strategy_engine,
"settings": self.settings,
},
)
self.backend_worker.start()
def closeEvent(self, event):
if self.data_feed:
asyncio.run_coroutine_threadsafe(self.data_feed.close(), self.loop)
if self.db_session:
self.db_session.close()
self.loop.call_soon_threadsafe(self.loop.stop)
self.backend_worker.wait() # Wait for the backend thread to finish
super().closeEvent(event)