量化小白必看|MiniQMT踩坑记:想做实盘这些知识请你一定要掌握

最近写了不少关于MiniQMT回测、量化的文章,应广大网友要求,今天写一些关于交易部分的内容。全文干货满满建议收藏。
首先定义一个初始化函数,用于连接miniQMT的交易,代码如下:
python
from datetime import datetime
import sys,time
from xtquant.xttrader import XtQuantTrader,XtQuantTraderCallback
from xtquant.xttype import StockAccount
from typing import Optional,Tuple
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)
def init_account(path,accountID)-> Tuple[Optional[XtQuantTrader],Optional[StockAccount]]:
# 生成session id 整数类型 同时运行的策略不能重复
session_id = int(time.time())
xt_trader = XtQuantTrader(path, session_id)
# 创建资金账号为 accountID 的证券账号对象
acc = StockAccount(accountID, 'STOCK')
# 创建交易回调类对象,并声明接收回调
callback = MyXtQuantTraderCallback()
xt_trader.register_callback(callback)
# 启动交易线程
xt_trader.start()
# 建立交易连接,返回0表示连接成功
connect_result = xt_trader.connect()
if str(connect_result)=='0':
print('建立交易连接成功')
else:
print('建立交易连接失败')
return None,None
# 对交易回调进行订阅,订阅后可以收到交易主推,返回0表示订阅成功
subscribe_result = xt_trader.subscribe(acc)
if str(subscribe_result)=='0':
print('交易回调订阅成功')
else:
print('交易回调订阅失败')
return None,None
return xt_trader,acc
通过上面的方法init_account
可以得到XtQuantTrader 和StockAccount2个对象,后期我们获取数据和交易会用到。
常见的一些用法
接下来列举一些我认为比较常用的方法。
1、调用init_account
:
python
path = r'D:\QMT交易端\userdata_mini'
accountID = '这里填写你的股票资金帐号'
xt_trader,acc = init_account(path,accountID)
path
这里替换成QMT实际的userdata_mini
目录的路径。这样我们就得到了XtQuantTrader 和StockAccount2个对象
2、获取资产情况
示例是获取可用现金,如下
python
asset = xt_trader.query_stock_asset(acc)
print(f"可用现金为:{asset.cash}元")
可以查询的数据有:
- account_id,资金账号
- cash,可用金额
- frozen_cash,冻结金额
- market_value,持仓市值
- total_asset,总资产
3、股票持仓
示例是获取某个股票的可用数量
python
position = xt_trader.query_stock_position(acc,'xxxxxx.SH')
can_use_volume = position.can_use_volume
可以查询的数据有:
- account_type, 账号类型
- account_id, 资金账号
- stock_code, 证券代码
- volume, 持仓数量
- can_use_volume, 可用数量
- open_price, 开仓价
- market_value, 市值
- frozen_volume, 冻结数量
- on_road_volume, 在途股份
- yesterday_volume, 昨夜拥股
- avg_price, 成本价
- direction, 多空方向,股票不适用
当然也可以批量获取全部的股票持仓,示例代码如下:
python
positions = xt_trader.query_stock_positions(acc)
for p in positions:
print(f"股票:{p.stock_code}可用数量为{p.can_use_volume}")
4、查询当前委托 通过以下方法就可以查询当前的委托单的状态,然后根据对应的状态做相关的操作
python
orders = xt_trader.query_stock_orders(acc)
for o in orders:
print(f'柜台合同编号:{o.order_sysid},委托价格:{o.price},委托状态{o.order_status}')
可以查询的数据有:
- account_type, 账号类型,参见数据字典
- account_id, 资金账号
- stock_code , 证券代码
- order_id , 订单编号
- order_sysid , 柜台合同编号
- order_time , 报单时间
- order_type , 委托类型,参见数据字典
- order_volume , 委托数量
- price_type , 报价类型,该字段在返回时为柜台返回类型,不等价于下单传入的price_type,枚举值不一样功能一样,参见数据字典
- price , 委托价格
- traded_volume , 成交数量
- traded_price , 成交均价
- order_status , 委托状态
- status_msg , 委托状态描述,如废单原因
- strategy_name , 策略名称
- order_remark , 委托备注,最大 24 个英文字符
- direction , 多空方向,股票不适用
- offset_flag , 交易操作,用此字段区分股票买卖,期货开、平仓,期权买卖等;
当然也支持根据订单编号(同步报单接口返回的编号)来查询某个委托的状态
python
order = xt_trader.query_stock_order(acc,'这里填写你的order_id')
print(f'柜台合同编号:{order.order_sysid},委托价格:{order.price},委托状态{order.order_status}')
5、下单接口
股票同步下单
股票资金账号acc对浦发银行买入100股,使用限价价格14.03元, 策略名称为huajie_01,委托备注为'my_test'
python
from xtquant import xtconstant
order_id = xt_trader.order_stock(
account=acc,
stock_code='600000.SH',
order_type=xtconstant.STOCK_BUY,
order_volume=100,
price_type=xtconstant.FIX_PRICE,
price=14.03,
strategy_name='huajie_01',
order_remark='my_test')
返回值order_id
大于0表示下单成功,下单失败返回-1
其中order_type
支持如下类型:
- xtconstant.STOCK_BUY,买入
- xtconstant.STOCK_SELL,卖出
其中price_type
支持的类型如下:
上交所、北交所、深交所股票支持如下类型
- xtconstant.LATEST_PRICE,最新价
- xtconstant.FIX_PRICE,指定价
上交所/北交所的股票支持如下类型
- xtconstant.MARKET_SH_CONVERT_5_CANCEL,最优五档即时成交剩余撤销
- xtconstant.MARKET_SH_CONVERT_5_LIMIT,最优五档即时成交剩转限价
- xtconstant.MARKET_PEER_PRICE_FIRST,对手方最优价格委托
- xtconstant.MARKET_MINE_PRICE_FIRST,本方最优价格委托
深交所的股票支持如下类型
- xtconstant.MARKET_PEER_PRICE_FIRST,对手方最优价格委托
- xtconstant.MARKET_MINE_PRICE_FIRST,本方最优价格委托
- xtconstant.MARKET_SZ_INSTBUSI_RESTCANCEL,即时成交剩余撤销委托
- xtconstant.MARKET_SZ_CONVERT_5_CANCEL,最优五档即时成交剩余撤销
- xtconstant.MARKET_SZ_FULL_OR_CANCEL,全额成交或撤销委托
股票异步下单 异步下单接口为order_stock_async
参数和同步一致,区别在于会收到on_order_stock_async_response
的委托反馈
6、撤单接口
股票同步撤单
根据下单时返回的订单号来撤单
python
cancel_result = xt_trader.cancel_order_stock(acc,order_id)
cancel_result
返回0表示撤单命令下达成功,-1表示撤单失败,结果是0不一定撤单成功了,这里只是告诉我们已经成功下达了撤单命令,这点大家需要理解到位。
比如12点的时候我们下达了撤单,返回值是0,此时是无法撤单成功的,需要等开盘以后才可以。
根据柜台合同编号为order_sysid
撤单,从查询当前委托 里面可以拿到order_sysid
的值
python
cancel_result = xt_trader.cancel_order_stock_sysid(acc, xtconstant.SH_MARKET, order_sysid)
股票异步撤单
使用cancel_order_stock_async
、cancel_order_stock_sysid_async
执行异步撤单,参数同 同步撤单。
好了今天的文章就到这里了,改天等我有空了再写一篇最小实盘的完整Demo。
ok就这么多了。