mainwindow.py

"""
AI Quant 图形化界面主程序
保留 VNpy 原生操作逻辑
"""

import sys
import os
import logging
import argparse

from PySide6.QtWidgets import (QApplication, QMainWindow, QTextEdit,
                               QVBoxLayout, QWidget)
from PySide6.QtGui import QAction

# 添加项目根目录到路径
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    handlers=[
        logging.FileHandler("aiquant.log"),
        logging.StreamHandler()
    ]
)

logger = logging.getLogger("AIQuant.gui")


class MainWindow(QMainWindow):
    """
    AI Quant 主窗口
    """
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        """
        初始化用户界面
        """
        self.setWindowTitle("AI Quant - A 股量化交易框架")
        self.setGeometry(100, 100, 1200, 800)

        # 创建中心部件
        central_widget = QWidget()
        self.setCentralWidget(central_widget)

        # 创建布局
        layout = QVBoxLayout(central_widget)

        # 创建文本编辑区域
        self.text_edit = QTextEdit()
        self.text_edit.setReadOnly(True)
        layout.addWidget(self.text_edit)

        # 创建菜单
        self.create_menu()

        # 显示欢迎信息
        self.show_welcome_message()

    def create_menu(self):
        """
        创建菜单
        """
        menubar = self.menuBar()

        # 文件菜单
        file_menu = menubar.addMenu("文件")
        exit_action = QAction("退出", self)
        exit_action.setShortcut("Ctrl+Q")
        exit_action.triggered.connect(self.close)
        file_menu.addAction(exit_action)

        # 交易菜单
        trade_menu = menubar.addMenu("交易")
        connect_action = QAction("连接行情", self)
        connect_action.setShortcut("Ctrl+C")
        connect_action.triggered.connect(self.connect_market)
        trade_menu.addAction(connect_action)

        disconnect_action = QAction("断开行情", self)
        disconnect_action.setShortcut("Ctrl+D")
        disconnect_action.triggered.connect(self.disconnect_market)
        trade_menu.addAction(disconnect_action)

        # 策略菜单
        strategy_menu = menubar.addMenu("策略")
        load_strategy_action = QAction("加载策略", self)
        load_strategy_action.setShortcut("Ctrl+L")
        load_strategy_action.triggered.connect(self.load_strategy)
        strategy_menu.addAction(load_strategy_action)

        run_strategy_action = QAction("运行策略", self)
        run_strategy_action.setShortcut("Ctrl+R")
        run_strategy_action.triggered.connect(self.run_strategy)
        strategy_menu.addAction(run_strategy_action)

        # 回测菜单
        backtest_menu = menubar.addMenu("回测")
        run_backtest_action = QAction("运行回测", self)
        run_backtest_action.setShortcut("Ctrl+B")
        run_backtest_action.triggered.connect(self.run_backtest)
        backtest_menu.addAction(run_backtest_action)

        # 帮助菜单
        help_menu = menubar.addMenu("帮助")
        about_action = QAction("关于", self)
        about_action.triggered.connect(self.show_about)
        help_menu.addAction(about_action)

    def show_welcome_message(self):
        """
        显示欢迎信息
        """
        welcome_text = """
<h1>AI Quant - A 股量化交易框架</h1>

<p>欢迎使用 AI Quant,基于 VNpy 4.3.0 重构的 A 股量化交易框架。</p>

<h2>项目特性</h2>
<ul>
    <li>保留 VNpy 原生所有 A 股交易/回测/风控/招商证券对接/图形界面能力</li>
    <li>采用三层架构设计:核心接口层、服务引擎层、应用策略层</li>
    <li>仅保留 A 股相关功能,精简非必要代码</li>
    <li>统一配置管理,接口标准化</li>
    <li>支持大模型推理插件</li>
    <li>招商证券专属对接优化</li>
    <li>单票量化策略专用模块</li>
</ul>

<h2>快速开始</h2>
<ol>
    <li>配置招商证券接口参数(config/zs_sec_config.py)</li>
    <li>安装项目依赖(pip install -r requirements.txt)</li>
    <li>加载策略或运行回测</li>
</ol>

<p>如需帮助,请查看帮助菜单或访问项目文档。</p>
        """
        self.text_edit.setHtml(welcome_text)
        logger.info("AI Quant 图形化界面启动成功")

    def connect_market(self):
        """
        连接行情
        """
        logger.info("连接行情")
        self.text_edit.append("<p><b>连接行情中...</b></p>")

    def disconnect_market(self):
        """
        断开行情
        """
        logger.info("断开行情")
        self.text_edit.append("<p><b>行情已断开</b></p>")

    def load_strategy(self):
        """
        加载策略
        """
        logger.info("加载策略")
        self.text_edit.append("<p><b>策略加载中...</b></p>")

    def run_strategy(self):
        """
        运行策略
        """
        logger.info("运行策略")
        self.text_edit.append("<p><b>策略运行中...</b></p>")

    def run_backtest(self):
        """
        运行回测
        """
        logger.info("运行回测")
        self.text_edit.append("<p><b>回测运行中...</b></p>")

    def show_about(self):
        """
        显示关于信息
        """
        about_text = """
<h2>关于 AI Quant</h2>

<p>AI Quant 是基于 VNpy 4.3.0 重构的 A 股量化交易框架。</p>

<h3>项目信息</h3>
<ul>
    <li>版本: 1.0.0</li>
    <li>作者: AI Quant Team</li>
    <li>许可证: MIT</li>
    <li>项目地址: https://github.com/aiquant/aiquant</li>
</ul>

<h3>联系方式</h3>
<ul>
    <li>官方网站: https://www.quantquantquant.com</li>
    <li>文档中心: https://docs.quantquantquant.com</li>
    <li>社区论坛: https://forum.quantquantquant.com</li>
    <li>联系邮箱: support@quantquantquant.com</li>
</ul>
        """
        self.text_edit.setHtml(about_text)


def run_gui(config_file: str = "config/main_config.py"):
    """
    运行图形化界面

    Args:
        config_file: 配置文件路径
    """
    logger.info("启动 AI Quant 图形化界面")
    logger.info(f"配置文件: {config_file}")

    app = QApplication(sys.argv)

    try:
        window = MainWindow()
        window.show()

        logger.info("AI Quant 图形化界面启动成功")
        sys.exit(app.exec())

    except Exception as e:
        logger.error(f"启动图形化界面失败: {e}")
        logger.exception("详细错误信息:")
        sys.exit(1)


if __name__ == "__main__":
    # 解析命令行参数
    parser = argparse.ArgumentParser(
        description="AI Quant 图形化界面"
    )
    parser.add_argument(
        "--config",
        default="config/main_config.py",
        help="配置文件路径"
    )

    args = parser.parse_args()

    # 运行图形化界面
    run_gui(args.config)