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

量化小白必看|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可以得到XtQuantTraderStockAccount2个对象,后期我们获取数据和交易会用到。

常见的一些用法

接下来列举一些我认为比较常用的方法。

1、调用init_account:

python 复制代码
path = r'D:\QMT交易端\userdata_mini' 
accountID = '这里填写你的股票资金帐号'
xt_trader,acc = init_account(path,accountID)

path 这里替换成QMT实际的userdata_mini目录的路径。这样我们就得到了XtQuantTraderStockAccount2个对象

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_asynccancel_order_stock_sysid_async执行异步撤单,参数同 同步撤单。

好了今天的文章就到这里了,改天等我有空了再写一篇最小实盘的完整Demo。

ok就这么多了。

相关推荐
TechLee5 小时前
Laravel 权限控制新选择:使用 Laravel-authz 集成 PHP-Casbin
后端·php
青梅主码5 小时前
量子位智库最新发布《 AI Coding 玩家图谱》: AI 编码玩家图谱全解析
后端
数据小子2146 小时前
【自记】Python 中 nonlocal 和 global 的区别,以及闭包的作用和示例
python
武子康6 小时前
大数据-85 Spark Action 操作详解:从 Collect 到存储的全景解析
大数据·后端·spark
唐天一6 小时前
Rust 基础之常用语法
后端
绝无仅有6 小时前
Go 语言面试之通道 (Channel) 解密
后端·面试·github
CodeSheep6 小时前
甲骨文严查Java授权,公司连夜删除JDK。。
前端·后端·程序员
WSSWWWSSW6 小时前
Python OpenCV图像处理与深度学习:Python OpenCV视频处理入门
图像处理·python·opencv
胖墩会武术6 小时前
【PyTorch项目实战】SAM(Segment Anything Model) —— 致力于建立第一个图像分割基础模型
人工智能·pytorch·python·sam