QMT与同花顺结合:动态板块监控交易,自然语言问询自动化交易

在当今快节奏的金融市场中,量化交易已成为投资者提高效率和精准度的重要工具。本文将深入解析一个基于同花顺板块的自动交易系统,该系统能够自动监控同花顺自定义板块的变化,并根据预设策略执行买入与卖出操作。

这篇文章面向具有一定技术背景但非专业程序员的读者,旨在帮助您理解系统的工作原理、架构设计和核心算法。

1. 系统概述与技术栈

同花顺板块自动交易系统是一款基于Python开发的量化交易工具,它通过监控同花顺软件中用户自定义的板块变化,自动执行相应的交易策略。系统采用图形用户界面(GUI)设计,便于用户操作和监控交易过程。

主要技术栈:

  • 编程语言:Python
  • GUI框架:Tkinter
  • 交易接口:XtQuant API(量化交易接口)
  • 任务调度:APScheduler(高级Python调度器)
  • 其他库:datetime, threading, json, os等Python标准库

2. 系统架构与模块组织

系统采用面向对象的设计方法,主要包含以下核心组件:

系统的整体架构遵循MVC(模型-视图-控制器)设计模式:

  1. TongHuaShunTrader类:系统的主类,负责GUI界面创建、交易逻辑实现和状态管理
  2. MyXtQuantTraderCallback类:交易回调处理类,处理委托回报、成交回报等交易事件
  3. read_block模块:负责读取同花顺板块文件,获取板块内的股票列表
  • 模型(Model):交易数据和状态管理
  • 视图(View):Tkinter构建的GUI界面
  • 控制器(Controller):交易逻辑和事件处理

3. 核心功能与实现逻辑

3.1 GUI界面设计

系统使用Tkinter构建了一个直观的用户界面,包含以下主要部分:

GUI的实现采用了网格布局(grid),通过Frame和LabelFrame组织不同功能区域,使界面结构清晰、操作便捷。

  • 路径设置区:配置证券账号、同花顺板块目录和QMT报单目录
  • 交易参数区:设置板块名称、保留资金、交易时间、委托类型等参数
  • 按钮区:包含保存参数、清空日志、开始/停止交易等功能按钮
  • 日志区:实时显示交易系统的运行状态和交易信息

def create_gui(self):
    # 创建主框架
    main_frame = ttk.Frame(self.root, padding="5")
    main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
    
    # 路径设置区域
    path_frame = ttk.LabelFrame(main_frame, text="路径设置", padding="3")
    path_frame.grid(row=0, column=0, columnspan=2, sticky=(tk.W, tk.E), padx=3, pady=3)
    
    # 交易参数区域
    trade_frame = ttk.LabelFrame(main_frame, text="交易参数", padding="3")
    trade_frame.grid(row=1, column=0, columnspan=2, sticky=(tk.W, tk.E), padx=3, pady=3)
    
    # 按钮区域和日志区域...

3.2 板块监控与交易逻辑

系统的核心功能是监控同花顺板块变化并执行交易,这一功能主要通过monitor_file方法实现:

  1. 板块监控:系统定期读取同花顺板块文件,获取板块内的股票列表
  2. 变化检测:比较当前板块股票与上次记录的股票列表,检测变化
  3. 交易决策:根据板块变化和持仓情况,决定需要买入或卖出的股票
  4. 交易执行:调用place_buy_order和place_sell_order方法执行具体的交易操作

def monitor_file(self, block_name):
    # 获取同花顺板块的股票代码
    current_block_stocks = set(get_stocks_by_block_name(block_name, ths_path))
    
    # 检查板块内容是否有变化
    if current_block_stocks != self.last_block_stocks:
        # 处理板块变化...
    
    # 获取当前持仓和未成交委托
    positions = self.xt_trader.query_stock_positions(acc)
    pending_orders = self.xt_trader.query_stock_orders(acc, True)
    
    # 决定买入和卖出的股票
    stocks_to_buy = set()  # 需要买入的股票
    stocks_to_sell = set() # 需要卖出的股票
    
    # 执行买入和卖出操作
    for stock_code in stocks_to_buy:
        self.place_buy_order(stock_code, available_money, reserve_money)
    
    for stock_code in stocks_to_sell:
        self.place_sell_order(stock_code)

3.3 买入和卖出策略

系统实现了智能的买入和卖出策略,主要考虑以下因素:

买入策略:

卖出策略:

  • 持仓市值低于目标金额的股票
  • 交易间隔控制,避免频繁交易
  • 资金管理,确保不超过可用资金
  • 根据证券类型调整委托数量(股票按100股,可转债按10张)

买入和卖出操作都支持多种委托方式,包括限价、最优五档、对手方最优等,并针对可转债做了特殊处理。

  • 不在板块中的持仓股票
  • 持仓市值超过目标金额的股票
  • 交易间隔控制
  • 分批卖出,控制单次卖出金额

3.4 日志管理与错误处理

系统实现了完善的日志管理和错误处理机制:

  • 日志分级:通过log_message和log_periodic方法实现不同级别的日志输出
  • 定期日志:对于频繁重复的日志,采用定期输出策略,减少日志冗余
  • 错误捕获:使用try-except结构捕获各类异常,确保系统稳定运行
  • 日志过滤:过滤掉不必要的日志信息,如"买入数量无效"等

def log_message(self, message, level="INFO"):
    # 过滤掉不需要记录的日志
    if "买入数量无效" in message or "计算买入金额" in message:
        return
        
    current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    self.log_text.insert(tk.END, f"[{current_time}] {message}\n")
    self.log_text.see(tk.END)
    
def log_periodic(self, message, level="INFO"):
    current_time = datetime.now()
    # 如果距离上次日志输出时间超过设定的间隔,则输出日志
    if (current_time - self.last_log_time).total_seconds() >= self.log_interval:
        self.log_message(message, level)
        self.last_log_time = current_time

4. 任务调度与并发处理

系统使用APScheduler库实现任务调度,主要包括两类任务:

为了提高系统性能,调度器配置了线程池和进程池:

  1. 板块监控任务:每秒执行一次,检查板块变化并执行交易
  2. 撤单任务:每10秒执行一次,检查并撤销超过10秒未成交的订单

executor_config = {
    'executors': {
        'default': ThreadPoolExecutor(max_workers=20),
        'processpool': ProcessPoolExecutor(max_workers=5)
    },
    'job_defaults': {
        'coalesce': True,
        'max_instances': 3
    }
}

self.scheduler = BackgroundScheduler(executor_config)

系统还使用了线程来处理交易循环,确保GUI界面保持响应:


self.trading_thread = threading.Thread(target=self.trading_loop, daemon=True)
self.trading_thread.start()

5. 数据结构与算法分析

系统中使用了多种数据结构来管理交易状态和决策:

核心算法包括:

  • 集合(set):用于存储板块股票和需要交易的股票,便于快速查找和比较
  • 字典(dict):用于存储持仓信息、最新价格和交易时间等
  • 列表(list):用于存储和展示股票信息
  1. 板块变化检测算法:使用集合操作(差集、交集)快速检测板块变化
  2. 交易决策算法:基于持仓市值、目标金额和交易间隔等因素决定交易操作
  3. 资金分配算法:根据单笔金额、总金额和可用资金计算交易数量
  4. 日志优化算法:通过时间间隔控制和消息合并减少日志输出频率

6. 系统限制与改进建议

尽管系统功能完善,但仍存在一些限制和可改进之处:

系统限制:

改进建议:

  1. 依赖外部软件:需要同花顺软件和QMT交易端
  2. 交易接口限制:仅支持XtQuant交易接口,不支持其他券商接口
  3. 错误恢复机制:缺乏完善的错误恢复和断点续传机制
  4. 性能瓶颈:频繁查询行情和持仓可能导致性能问题
  1. 多策略支持:增加更多交易策略选项,如均线策略、动量策略等
  2. 回测功能:添加策略回测功能,评估策略历史表现
  3. 多账户支持:支持多个交易账户同时操作
  4. 数据持久化:增加交易记录数据库存储和分析功能
  5. 风险控制:增强风险控制机制,如止损止盈、波动率控制等
  6. API扩展:支持更多交易接口,如通达信、同花顺等

7. 系统流程图


graph TD
    A[启动系统] --> B[加载配置]
    B --> C[初始化交易接口]
    C --> D[启动调度器]
    D --> E[监控板块文件]
    
    E --> F{板块有变化?}
    F -->|是| G[更新板块股票列表]
    F -->|否| H[检查持仓与板块]
    G --> H
    
    H --> I[确定买入股票]
    H --> J[确定卖出股票]
    
    I --> K{交易时间内?}
    J --> K
    
    K -->|是| L[执行买入操作]
    K -->|是| M[执行卖出操作]
    K -->|否| N[等待下次检查]
    
    L --> O[更新持仓和资金]
    M --> O
    O --> P[记录交易日志]
    P --> N
    
    N --> E
    
    Q[定时撤单任务] --> R[查询未成交订单]
    R --> S{有超时订单?}
    S -->|是| T[撤销订单]
    S -->|否| U[等待下次检查]
    T --> U
    U --> Q

8. 总结

同花顺板块自动交易系统是一个功能完善的量化交易工具,它通过监控同花顺板块变化,自动执行买入和卖出操作,帮助投资者实现投资自动化。系统采用面向对象设计,结构清晰,逻辑严谨,具有良好的可扩展性和可维护性。

系统的核心价值在于将人工判断转化为自动化流程,减少人为干预,严格执行交易纪律。通过合理的资金管理和交易间隔控制,系统能够有效控制风险,提高投资效率。

对于有一定技术背景的投资者,理解并使用这样的系统,不仅能够提高投资效率,还能加深对量化交易的理解,为进一步开发和优化交易策略奠定基础。

THE END