我是Mr.看海,我在尝试用信号处理的知识积累和思考方式做量化交易,应用深度学习和AI实现 股票自动交易,目的是实现财务自由~
目前我正在开发基于miniQMT的量化 交易系统。
在前几篇的文章中讲到,我正在开发的看海量化交易系统,底层是使用miniQMT的Python接口实现的数据获取和交易执行。
通过前几篇文章已经基本上将行情模块XtData的主要功能讲完了,由于知乎或者公众号的文章不便于维护,我搭建了一个帮助文档手册,未来关于XtQuant的教程将统一在此处更新维护:miniQMT接口使用教程——看海量化交易平台。
本文将系统介绍XtQuant的交易模块(XtTrade)的使用方法,对常用功能进行演示和讲解。由于行情交易模块是有机整体,所以就不再拆分章节,而是这一篇文章全讲完了。
一、基本概念介绍
1.1 XtTrade模块概述
XtTrade是XtQuant中专门用于交易的模块。它提供了完整的交易功能接口,包括:
- 系统设置接口:用于创建API实例、注册回调、启动交易线程等基础功能
- 操作接口:提供下单、撤单、订阅等交易操作功能
- 查询接口:用于查询账户资产、持仓、委托、成交等信息
- 回调接口:用于接收交易推送信息
1.2 交易流程概述
使用XtTrade进行交易的基本流程如下:
- 创建API实例并注册回调
- 启动交易线程并建立连接
- 订阅账户信息
- 进行交易操作(下单、撤单等)
- 接收交易推送信息
- 程序结束时取消订阅并断开连接
二、系统设置接口使用演示
在开始编写交易策略之前,我们需要先完成交易系统的初始化工作。这部分内容主要包括创建API实例、注册回调、启动交易线程等基础设置,属于程序运行前的准备工作,与具体的交易策略关联不大(不过部分回调功能中可以考虑与策略衔接)。
让我们按照初始化的流程,逐步了解这些基础设置:
2.1 创建API实例
创建API实例是使用XtTrade的第一步。通过XtQuantTrader类来创建实例,需要提供两个重要参数:path和session_id。前者是MiniQMT客户端安装路径中userdata_mini文件夹的完整路径,用以和miniQMT客户端建立连接;后者是与MiniQMT通信的会话ID,不同的会话要保证不重。
创建实例的写法如下,其中的session_id我用了毫秒级的时间戳,可以比较有效地防止重复,当然如果你有其他方式也可以。
from xtquant.xttrader import XtQuantTrader
import time
# 创建API实例
path = "D:\\XX证券QMT交易端\\userdata_mini" # miniQMT客户端安装目录下的userdata_mini路径
session_id = int(time.time() * 1000) # 使用毫秒级时间戳作为会话编号
trader = XtQuantTrader(path, session_id)
注意事项:1.确保path路径正确,否则无法与miniQMT建立连接,需根据本地电脑实际路径修改。2.通常一个策略只需要创建一个API实例。
2.2 创建资金账号
在进行任何交易操作之前,我们需要先创建一个资金账号对象。这个账号对象用来标识我们要操作的证券账户,需要和登录的miniQMT的账号保持一致:
from xtquant.xttype import StockAccount
# 创建证券账户对象
account = StockAccount('XXXXX') # 参数是资金账号
2.3 注册回调类
回调类是实现交易系统与用户策略之间通信的关键机制。通过回调类,我们可以实时接收交易状态变化(如委托、成交、撤单等),处理异常情况(如连接断开、委托失败等),并根据这些信息执行相应的交易逻辑。
回调类可以理解为一个"事件监听器"。当我们进行交易时,会发生各种事件:比如委托单成交了、撤单成功了、连接断开了等等。回调类就是用来接收这些事件通知的。
XtTrade模块中规定的回调包括失去连接时推送信息回调、账号状态信息变动推送等等,过会儿会详细介绍。
在使用回调函数时需要注意,所有的回调都是在主线程中执行的。这意味着如果在回调函数中执行耗时的操作,会阻塞后续回调消息的处理。当回调函数执行时间过长时,可能会错过重要的交易信息,或者导致其他回调处理发生延迟,从而影响整个交易系统的响应性。在实际开发中,建议将回调函数的实现保持简单和高效。可以在回调函数中进行必要的日志记录、状态检查等轻量级操作,但复杂的业务逻辑最好放在独立的处理线程中执行。同时,要注意做好异常处理,避免因为回调函数的异常导致整个交易系统受到影响。
下面是一个包含主要回调方法的官方示例(案例连接),其中演示的是最简单的通过打印来进行信息通知的处理方式:
from xtquant.xttrader import XtQuantTraderCallback
class MyXtQuantTraderCallback(XtQuantTraderCallback):
def on_disconnected(self):
"""
连接断开
:return:
"""
print(datetime.datetime.now(),'连接断开回调')
def on_stock_order(self, order):
"""
委托回报推送
:param order: XtOrder对象
:return:
"""
print(datetime.datetime.now(), '委托回调', order.order_remark)
def on_stock_trade(self, trade):
"""
成交变动推送
:param trade: XtTrade对象
:return:
"""
print(datetime.datetime.now(), '成交回调', trade.order_remark)
def on_order_error(self, order_error):
"""
委托失败推送
:param order_error:XtOrderError 对象
:return:
"""
# print("on order_error callback")
# print(order_error.order_id, order_error.error_id, order_error.error_msg)
print(f"委托报错回调 {order_error.order_remark} {order_error.error_msg}")
def on_cancel_error(self, cancel_error):
"""
撤单失败推送
:param cancel_error: XtCancelError 对象
:return:
"""
print(datetime.datetime.now(), sys._getframe().f_code.co_name)
def on_order_stock_async_response(self, response):
"""
异步下单回报推送
:param response: XtOrderResponse 对象
:return:
"""
print(f"异步委托回调 {response.order_remark}")
def on_cancel_order_stock_async_response(self, response):
"""
收到撤单回调信息
:param response: XtCancelOrderResponse 对象
:return:
"""
print(datetime.datetime.now(), sys._getframe().f_code.co_name)
def on_account_status(self, status):
"""
账号状态信息变动推送
:param response: XtAccountStatus 对象
:return:
"""
print(datetime.datetime.now(), sys._getframe().f_code.co_name)
以上八种回调类是官方文档中提到了的,据我查看xtquant.xttrader的源码,所能支持的回调类应该还有以下这几种,大家可以在实战中实验甄别:
def on_stock_position(self, position):
"""
持仓变动推送,根据:https://blog.csdn.net/liuyukuan/article/details/128754695
:param position: XtPosition对象
:return:
""&#