91 lines
3.1 KiB
Python
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)
|