QMT与通达信结合 5.0:监测交易系统,通达信公式自动交易系统

该系统通过监控通达信软件中的自定义板块文件变化,自动执行股票买入和卖出操作,实现了交易的自动化与智能化。

1. 系统概述

通达信板块自动交易系统是一款基于Python开发的量化交易工具,它通过图形用户界面(GUI)为用户提供了便捷的操作体验。

该系统的核心功能是监控通达信软件中指定的买入和卖出板块文件,当板块内容发生变化时,系统会根据预设的规则自动执行相应的交易操作。

1.1 系统功能

系统主要提供以下功能:

  • 自动监控通达信买入和卖出板块文件的变化
  • 根据设定的时间段、委托类型、价格策略执行交易
  • 智能化资金管理,包括单笔交易金额、总投入限制等
  • 持仓数量限制和自动同步功能
  • 实时交易反馈和日志记录

1.2 技术架构

该系统采用了以下技术组件:

  • GUI框架:使用Python标准库tkinter构建用户界面
  • 交易接口:基于xtquant库实现与券商交易系统的连接
  • 任务调度:使用apscheduler库实现定时监控和交易执行
  • 配置管理:通过JSON文件保存和加载用户配置

2. 代码结构分析

2.1 代码组织

代码主要由以下几个部分组成:

  1. 回调类MyXtQuantTraderCallback:负责处理交易接口的各种回调事件
  2. 主类TongDaXinTrader:系统的核心类,包含界面构建和业务逻辑
  3. 辅助函数:处理股票代码转换、文件路径生成等工作

2.2 核心类与方法

2.2.1 回调类 MyXtQuantTraderCallback

该类继承自XtQuantTraderCallback,用于处理交易接口的回调事件:

  • on_stock_order:处理委托回报推送
  • on_stock_trade:处理成交变动推送
  • on_order_error:处理委托失败推送
  • on_cancel_error:处理撤单失败推送
  • on_disconnected:处理连接断开事件

2.2.2 主类 TongDaXinTrader

主类包含了系统的主要逻辑,其重要方法包括:

  • create_gui:构建图形用户界面
  • load_config/save_config:加载和保存用户配置
  • trading_loop:启动交易循环
  • monitor_file:监控板块文件变化
  • place_buy_order/place_sell_order:执行买入和卖出操作
  • sync_positions_to_block:同步持仓到通达信板块

3. 工作流程分析

3.1 系统初始化流程

  1. 创建GUI界面
  2. 加载用户配置文件
  3. 初始化交易接口和调度器
  4. 注册回调函数
  5. 连接交易服务器并订阅账户
  6. 启动监控任务

3.2 交易监控与执行流程

  1. 定期检查板块文件内容变化
  2. 解析板块文件中的股票代码
  3. 判断当前时间是否在交易时间范围内
  4. 检查资金和持仓限制条件
  5. 获取股票最新价格
  6. 计算交易数量
  7. 设置委托价格和类型
  8. 发送交易指令
  9. 更新交易日志

3.3 持仓同步流程

  1. 获取当前持仓信息
  2. 将持仓股票代码转换为通达信格式
  3. 写入指定的通达信板块文件

4. 关键算法与技术实现

4.1 板块文件监控机制

系统通过调度器(Scheduler)定期检查板块文件内容,对比上次记录的内容,如果发生变化则触发交易操作:


def monitor_file(self, block_name, action):
    try:
        file_path = self.get_stock_pool_path(block_name)
        if not file_path:
            return
            
        if not os.path.exists(file_path):
            self.log_message(f"板块文件不存在: {file_path}")
            return
            
        # 读取当前文件内容
        with open(file_path, "r") as file:
            current_content = file.read()
            
        # 检查文件内容是否有变化
        if action == "buy":
            if current_content == self.last_buy_content:
                return
            self.last_buy_content = current_content
        else:  # sell
            if current_content == self.last_sell_content:
                return
            self.last_sell_content = current_content
        
        # 处理股票代码
        lines = current_content.splitlines()
        if not lines:  # 跳过空文件
            return
            
        # 处理股票代码
        for line in lines:
            stock_code = line.strip()
            if not stock_code:
                continue
                
            # 转换股票代码格式
            stock_code = self.convert_stock_code(stock_code)
            
            # 执行交易
            if action == "buy":
                self.place_buy_order(stock_code)
            else:
                self.place_sell_order(stock_code)
                
    except Exception as e:
        self.log_message(f"监控板块失败 {block_name}: {str(e)}")

4.2 智能资金管理算法

系统实现了复杂的资金管理算法,可以根据用户设置的参数智能分配交易资金:

以买入委托为例,系统会:

  • 单只证券总投入上限控制
  • 保留资金设置
  • 买入数量动态调整
  • 底仓保留机制
  1. 检查可用资金是否超过保留资金
  2. 计算当前持仓市值
  3. 检查是否超过单只证券的总投入限制
  4. 根据剩余可买金额计算委托数量
  5. 根据证券类型调整委托数量(股票按100股为单位,可转债按10张为单位)

4.3 价格策略实现

系统支持多种委托价格策略:

  • 限价委托:根据最新价格加上调整幅度
  • 最优五档委托:使用交易所最优五档申报机制
  • 最优五档转限价:先使用最优五档,失败后转为限价委托
  • 对手方最优:按照对手方最优价格委托
  • 本方最优:按照本方最优价格委托

4.4 股票代码格式转换

系统需要在通达信格式和交易接口格式之间进行股票代码转换:


def convert_stock_code(self, stock_code):
    stock_code = str(stock_code)
    if stock_code.startswith('0'):
        return stock_code[1:] + '.SZ'
    elif stock_code.startswith('1'):
        return stock_code[1:] + '.SH'
    return stock_code

def convert_to_tdx_code(self, stock_code):
    if stock_code.endswith('.SH'):
        return '1' + stock_code.split('.')[0]
    elif stock_code.endswith('.SZ'):
        return '0' + stock_code.split('.')[0]
    return stock_code

5. 用户界面设计

系统采用分区域设计的图形用户界面,包括:

界面采用了分组布局,使用LabelFrame和Grid布局管理器,提高了界面的清晰度和可用性。

  1. 路径设置区:配置证券账号、通达信目录和QMT报单目录
  2. 持仓参数区:设置持仓同步板块和持仓数量上限
  3. 买入设置区:配置买入板块、时间段、委托类型和资金参数
  4. 卖出设置区:配置卖出板块、时间段、委托类型和资金参数
  5. 按钮控制区:提供保存参数、清空日志、开始交易、停止交易等功能
  6. 日志显示区:实时显示系统运行日志

6. 系统局限性与改进建议

6.1 局限性

THE END