4.0 版本更新
主要增加了“卖出委托类型”功能选项“最优五档转限价”。该委托功能解决“最优五档”(最优五档即时成交剩余撤销)遇涨停或跌停无法委托的缺陷,可先检查是否涨停或跌停,若非涨跌停,以最优五档进委委托;若涨跌停,以最新价进行委托。
自己部署 python 环境的话,设置等跟其他版本一致:需要安装两个库,xtquant 和 apscheduler,其他的是标准库,不需安装。
xtquant
是小 QMT 的数据获取和交易的库,不支持通过 pip 安装,可以到官网 xtquant版本下载
在当今快节奏的金融市场中,自动化交易系统已成为投资者的重要工具。本文将深入解析一个基于通达信和国金QMT的自动化交易系统的代码实现,帮助读者理解其工作原理、架构设计和核心功能。
1. 系统概述
通达信智能交易助手是一个将通达信行情软件与国金QMT交易系统相结合的自动化交易工具。该系统主要通过监控通达信的板块文件变化,自动执行相应的买入或卖出操作,实现无人值守的自动化交易。
1.1 系统核心功能
自动监控通达信板块文件变化
根据板块变化执行买入或卖出操作
支持多种委托方式和价格策略
智能资金管理和风险控制
完整的日志记录系统
图形用户界面操作
系统主要由两个核心类组成:MyXtQuantTraderCallback
和TongDaXinTrader
。
2.1 回调处理类:MyXtQuantTraderCallback
MyXtQuantTraderCallback
类继承自XtQuantTraderCallback
,负责处理交易过程中的各种回调事件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class MyXtQuantTraderCallback(XtQuantTraderCallback): def__init__(self, logger): # 初始化回调处理器,接收日志记录器 defon_stock_order(self, order): # 处理股票订单回调 defon_stock_trade(self, trade): # 处理股票成交回调 defon_order_error(self, order_error): # 处理订单错误回调 defon_cancel_error(self, cancel_error): # 处理撤单错误回调 defconvert_time(self, unix_timestamp): # 转换Unix时间戳为可读时间格式 defon_disconnected(self): # 处理断开连接事件
这个类的主要职责是接收交易系统的各种事件通知,并进行相应处理,如记录日志、更新交易状态等。
2.2 主交易类:TongDaXinTrader
TongDaXinTrader
类是系统的核心,负责创建GUI界面、初始化交易环境、监控板块文件、执行交易操作等:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class TongDaXinTrader: def__init__(self): # 初始化交易系统 defcreate_gui(self): # 创建图形用户界面 defload_config(self): # 加载配置信息 defsave_config(self): # 保存配置信息 deflog_message(self, message): # 记录日志信息 defstart_trading(self): # 启动交易系统 defstop_trading(self): # 停止交易系统
3. 核心功能实现详解 3.1 板块文件监控机制
系统通过定时任务监控通达信的板块文件变化,这是自动交易的触发机制:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def init_scheduler(self): """初始化定时任务调度器""" self.scheduler = BackgroundScheduler() self.scheduler.start() defadd_monitor_jobs(self): """添加监控任务""" # 添加买入监控任务 buy_block = self.get_entry_value(self.buy_pool_entry, "示例:BUY") if buy_block: self.scheduler.add_job( self.monitor_file, 'interval', seconds=int(self.get_entry_value(self.monitor_interval_entry, "10")), args=[buy_block, "buy"] ) # 添加卖出监控任务 # 类似代码...
monitor_file
方法是监控的核心,它会检查板块文件的变化,并触发相应的交易操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def monitor_file(self, block_name, action): """监控板块文件变化并执行相应操作""" try: # 获取板块文件路径 file_path = self.get_stock_pool_path(block_name) ifnot file_path ornot os.path.exists(file_path): return # 读取板块文件内容 withopen(file_path, 'r', encoding='gbk', errors='ignore') as f: content = f.read() # 解析股票代码 stock_codes = [] for line in content.split('\n'): line = line.strip() if line andnot line.startswith('#'): stock_codes.append(line) # 执行交易操作 if action == "buy": for stock_code in stock_codes: self.place_buy_order(stock_code) else: for stock_code in stock_codes: self.place_sell_order(stock_code) except Exception as e: self.log_message(f"监控文件异常: {str(e)}")
3.2 股票路径处理
系统需要正确处理通达信的文件路径,以便读取板块文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def get_stock_pool_path(self, block_name): """根据通达信目录和板块名称生成完整的股票池文件路径""" try: tdx_base_path = self.get_entry_value(self.tdx_path_entry, "示例:D:\\jiaoyi\\gxtdx") ifnot tdx_base_path: raise ValueError("通达信程序目录未设置") # 如果用户输入了.blk后缀,则去掉 block_name = block_name.replace('.blk', '') # 构建完整路径,添加固定的子目录结构 full_path = os.path.join(tdx_base_path, 'T0002', 'blocknew', f'{block_name}.blk') return full_path except Exception as e: self.log_message(f"生成股票池路径失败: {str(e)}") returnNone
3.3 交易执行逻辑
买入和卖出操作是系统的核心功能,下面以买入操作为例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def place_buy_order(self, stock_code): """执行买入操作""" try: # 转换股票代码格式 formatted_code = self.convert_stock_code(stock_code) ifnot formatted_code: return # 获取最新价格 latest_price = self.get_latest_price(formatted_code) ifnot latest_price: return # 计算买入数量 # 根据资金管理策略计算买入股数 # 执行买入委托 # 根据不同的委托方式执行买入 # 记录买入操作 self.log_message(f"买入委托: {formatted_code}, 价格: {price}, 数量: {quantity}") # 从监控板块中移除该股票 self.remove_stock_from_block(stock_code, "buy") except Exception as e: self.log_message(f"买入委托异常: {str(e)}")
3.4 用户界面交互
系统提供了图形用户界面,方便用户配置和操作:
1
2
3
4
5
6
7
8
9
10
11
12
def create_gui(self): """创建图形用户界面""" # 创建主窗口 self.root = tk.Tk() self.root.title("通达信板块自动交易系统") self.root.geometry("800x600") # 创建各种配置框、按钮和日志区域 # ... # 设置默认值和加载配置 self.load_config()
用户界面包含多个输入框,系统提供了一系列方法来处理输入框的默认值和实际值:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def on_entry_click(self, entry, default_text): """处理输入框点击事件,清除默认提示文本""" if entry.get() == default_text: entry.delete(0, tk.END) entry.config(foreground='black') defon_focus_out(self, entry, default_text): """处理输入框失去焦点事件,如果为空则显示默认提示文本""" ifnot entry.get(): entry.insert(0, default_text) entry.config(foreground='gray') defset_entry_value(self, entry, value, default_text=None): """设置输入框的值,处理默认提示文本的显示""" if value: entry.delete(0, tk.END) entry.insert(0, value) entry.config(foreground='black') elif default_text: entry.delete(0, tk.END) entry.insert(0, default_text) entry.config(foreground='gray') defget_entry_value(self, entry, default_text): """获取输入框的实际值,如果是默认提示文本则返回空字符串""" value = entry.get() return''if value == default_text else value
4. 系统工作流程
整个系统的工作流程可以概括为以下几个步骤:
用户配置通达信路径、买入/卖出板块、交易参数等
启动交易系统,初始化调度器和监控任务
系统定期检查板块文件变化
发现新的股票代码时,执行相应的买入或卖出操作
交易完成后,从板块文件中移除该股票代码
记录交易日志,更新界面显示
系统主要使用Python语言开发,涉及以下库和模块:
- tkinter
: 用于创建图形用户界面
- os
: 处理文件路径和系统操作
- json
: 处理配置文件的读写
- datetime
: 处理日期和时间
- threading
: 实现多线程操作
- time
: 处理时间延迟和计时
- random
: 生成随机数
- xtquant
: 国金量化交易接口
- apscheduler
: 任务调度器,用于定时监控
- 依赖外部软件
: 系统依赖通达信和国金QMT,如果这些软件升级或接口变更,可能导致系统失效。
- 错误处理
: 当前的错误处理机制较为简单,可能无法应对复杂的异常情况。
- 并发控制
: 在高频交易场景下,可能存在并发问题。
- 安全性
: 缺乏对交易指令的二次验证机制。
- 增强错误恢复机制
: 实现更完善的错误处理和自动恢复功能。
- 优化监控机制
: 使用文件系统事件通知替代定时轮询,提高响应速度和效率。
- 增加回测功能
: 集成回测模块,允许用户在实盘前验证策略有效性。
- 增强风控功能
: 实现更复杂的风险控制策略,如波动率控制、最大回撤限制等。
- 数据持久化
: 使用数据库存储交易记录,便于后续分析和优化。
通达信智能交易助手是一个将传统交易软件与现代量化交易技术相结合的系统,通过自动化监控和交易执行,帮助投资者提高交易效率,减少人为干预。系统设计合理,功能完善,但仍有优化空间。对于有一定技术背景的投资者来说,理解并使用这样的系统,可以显著提升交易体验和效率。
流程图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
graph TD A[启动系统] --> B[加载配置] B --> C[创建GUI界面] C --> D[用户配置参数] D --> E[启动交易] E --> F[初始化调度器] F --> G[添加监控任务] G --> H{定期检查板块文件} H --> |发现买入股票| I[执行买入操作] H --> |发现卖出股票| J[执行卖出操作] I --> K[获取最新价格] J --> K K --> L[计算交易数量] L --> M[执行委托] M --> N[记录交易日志] N --> O[从板块文件移除股票] O --> H P[停止交易] --> Q[清理资源] Q --> R[保存配置] R --> S[退出系统]
类图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
classDiagram class XtQuantTraderCallback { <> +on_stock_order(order) +on_stock_trade(trade) +on_order_error(error) +on_cancel_error(error) +on_disconnected() } class MyXtQuantTraderCallback { -logger +__init__(logger) +on_stock_order(order) +on_stock_trade(trade) +on_order_error(error) +on_cancel_error(error) +convert_time(unix_timestamp) +on_disconnected() } class TongDaXinTrader { -root: Tk -trader_callback: MyXtQuantTraderCallback -scheduler: BackgroundScheduler -trading_active: bool +__init__() +create_gui() +load_config() +save_config() +log_message(message) +start_trading() +stop_trading() +validate_inputs() +trading_loop() +init_scheduler() +add_monitor_jobs() +monitor_file(block_name, action) +convert_stock_code(stock_code) +place_buy_order(stock_code) +place_sell_order(stock_code) +get_latest_price(stock_code) +run() +clear_stock_pool(pool_type) +clear_log() +get_stock_pool_path(block_name) +remove_stock_from_block(stock_code, action_type) } XtQuantTraderCallback <|-- MyXtQuantTraderCallback TongDaXinTrader o-- MyXtQuantTraderCallback
通过本文的详细解析,读者应该能够全面理解通达信智能交易助手的代码结构、工作原理和核心功能,为进一步学习和应用量化交易技术打下基础。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.