[QMT]04-在QMT之外调用xtquant直接编写策略

背景
希望不用在QMT软件里面憋屈地写代码,想使用pychar、vscode、notepad++等IDE编写python代码,因为有代码提示、补全。这完全没问题!QMT简直是为个人量化交易者量身打造的神器,它支持以上想法。

前提
想在Python本地调用(只支持python 36\37\38),需要两个前提条件:

启动XtMiniQmt.exe,它存在于QMT安装目录下的bin.x64子目录中。

将xtquant库,从bin.x64\Lib\site-packages拷贝到python本地的Lib\site-packages中。比如这里我的安装路径是G:\Anaconda3\Lib\site-packages\xtquant。

xtquant简介
xtquant是QMT官方内置的XtMiniQmt极简客户端对应的Python接口,目前支持Python的版本为3.6~3.8,可支持历史行情下载、实时数据订阅、外部数据访问、普通账户和两融账户交易(需开通相关权限),对量化交易支持的比较完善,跟极速策略交易系统相比最主要的优势是简洁、灵活,不局限在bar、kline的事件触发,可以容易地集成多种数据源进行综合分析、判断。

QMT内置的Python版本为3.6,第一次使用的话需手动下载相关的库,或直接拷贝已经下载好的xtquant库。

XtMiniQmt.exe存在于QMT安装目录下的bin.x64子目录中, xtquant库默认安装在bin.x64\Lib\site-packages中。

内置的Python版本较老,对于一些较新的库支持有限,因此,如果我们想在自定义的Python中调用,如Python3.8,只需将xtquant拷贝到我们自己python安装目录的Lib\site-packages中便可,这里我的安装路径是 C:\ProgramData\Anaconda3\Lib\site-packages\xtquant。

QMT这个东东基本是由两部分组成的:QMT交易终端(看盘界面 + 策略界面) + 量化库(xtquant)

XtQuant:基于迅投MiniQMT衍生出来的一套完善的Python策略运行框架,以Python库的形式提供策略交易所需要的:行情 + 交易 API接口。

它封装了策略交易所需要的Python API接口,可以和MiniQMT客户端交互,报单、撤单、查资产、查委托、查成交、查持仓以及收到资金、委托、成交和持仓等变动的主推消息。

xtquant主要包含两大块:

xtdata:xtdata提供和MiniQmt的交互接口,本质是和MiniQmt建立连接,由MiniQmt处理行情数据请求,再把结果回传返回到python层。需要注意的是这个模块的使用目前并不需要登录,因此只要安装了QMT,就可以无门槛的使用其提供的数据服务。

xttrader:xttrader是基于迅投MiniQMT衍生出来的一套完善的Python策略运行框架,对外以Python库的形式提供策略交易所需要的交易相关的API接口。该接口需开通A股实盘版权限方可登录使用。

启动XtMiniQmt客户端
启动MiniQMT客户端。通常有两种方式,一种是直接启动极简QMT客户端XtMiniQmt.exe:


另一种是启动QMT量化交易终端XtItClient.exe,在登录界面选择极简模式:


部分券商不支持策略的云服务器运行,但接收行情数据不受影响。设置好客户端后,便可在ipython、jupyter等环境中调试数据和策略了。

xttrader验证Demo
需要调整的参数:①:77行的path变量需要改为本地客户端路径 ②:84行的资金账号需要调整为自身资金账号

注意:本策略只用于提供策略写法及参考,若您直接进行实盘下单,造成损失本博主概不负担责任。

# 创建策略
#coding=utf-8
from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback
from xtquant.xttype import StockAccount
from xtquant import xtconstant
 
class MyXtQuantTraderCallback(XtQuantTraderCallback):
    def on_disconnected(self):
        """
        连接断开
        :return:
        """
        print("connection lost")
    def on_stock_order(self, order):
        """
        委托回报推送
        :param order: XtOrder对象
        :return:
        """
        print("on order callback:")
        print(order.stock_code, order.order_status, order.order_sysid)
    def on_stock_asset(self, asset):
        """
        资金变动推送
        :param asset: XtAsset对象
        :return:
        """
        print("on asset callback")
        print(asset.account_id, asset.cash, asset.total_asset)
    def on_stock_trade(self, trade):
        """
        成交变动推送
        :param trade: XtTrade对象
        :return:
        """
        print("on trade callback")
        print(trade.account_id, trade.stock_code, trade.order_id)
    def on_stock_position(self, position):
        """
        持仓变动推送
        :param position: XtPosition对象
        :return:
        """
        print("on position callback")
        print(position.stock_code, position.volume)
    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)
    
    def on_cancel_error(self, cancel_error):
        """
        撤单失败推送
        :param cancel_error: XtCancelError 对象
        :return:
        """
        print("on cancel_error callback")
        print(cancel_error.order_id, cancel_error.error_id,
        cancel_error.error_msg)
    def on_order_stock_async_response(self, response):
        """
        异步下单回报推送
        :param response: XtOrderResponse 对象
        :return:
        """
        print("on_order_stock_async_response")
        print(response.account_id, response.order_id, response.seq)
    
if __name__ == "__main__":
    print("demo test")
    # path为mini qmt客户端安装目录下userdata_mini路径
    path =r'输入你本地的userdata_mini目录'
    # session_id为会话编号,策略使用方对于不同的Python策略需要使用不同的会话编号
    session_id = 123456
    xt_trader = XtQuantTrader(path, session_id)
    
    # 创建资金账号为1000000365的证券账号对象
    #acc = StockAccount('1000000365')
    acc = StockAccount('输入你的QMT资金账号')
    # 创建交易回调类对象,并声明接收回调
    callback = MyXtQuantTraderCallback()
    xt_trader.register_callback(callback)
    
    # 启动交易线程
    xt_trader.start()
    
    # 建立交易连接,返回0表示连接成功
    connect_result = xt_trader.connect()
    print(connect_result)
    
    # 对交易回调进行订阅,订阅后可以收到交易主推,返回0表示订阅成功
    subscribe_result = xt_trader.subscribe(acc)
    print(subscribe_result)
    #stock_code = '600000.SH'
    stock_code = '000768.SZ'
    # 使用指定价下单,接口返回订单编号,后续可以用于撤单操作以及查询委托状态
    print("order using the fix price:")
    fix_result_order_id = xt_trader.order_stock(acc, stock_code,
    xtconstant.STOCK_BUY, 200, xtconstant.FIX_PRICE, 10.5, 'strategy_name',
    'remark')
    print(fix_result_order_id)
    
    # 使用订单编号撤单
    print("cancel order:")
    cancel_order_result = xt_trader.cancel_order_stock(acc, fix_result_order_id)
    print(cancel_order_result)
    
    # 使用异步下单接口,接口返回下单请求序号seq,seq可以和on_order_stock_async_response 的委托反馈response对应起来
    print("order using async api:")
    async_seq = xt_trader.order_stock(acc, stock_code, xtconstant.STOCK_BUY,
    200, xtconstant.FIX_PRICE, 10.5, 'strategy_name', 'remark')
    print(async_seq)
 
    # 查询证券资产
    print("query asset:")
    asset = xt_trader.query_stock_asset(acc)
    if asset:
        print("asset:")
        print("cash {0}".format(asset.cash))
 
    # 根据订单编号查询委托
    print("query order:")
    order = xt_trader.query_stock_order(acc, fix_result_order_id)
    if order:
        print("order:")
        print("order {0}".format(order.order_id))
 
 
    # 查询当日所有的委托
    print("query orders:")
    orders = xt_trader.query_stock_orders(acc)
    print("orders:", len(orders))
    if len(orders) != 0:
        print("last order:")
        print("{0} {1} {2}".format(orders[-1].stock_code,
        orders[-1].order_volume, orders[-1].price))
    
    # 查询当日所有的成交
    print("query trade:")
    trades = xt_trader.query_stock_trades(acc)
    print("trades:", len(trades))
 
    if len(trades) != 0:
        print("last trade:")
        print("{0} {1} {2}".format(trades[-1].stock_code,
        trades[-1].traded_volume, trades[-1].traded_price))
 
 
    # 查询当日所有的持仓
    print("query positions:")
    positions = xt_trader.query_stock_positions(acc)
    print("positions:", len(positions))
    
    if len(positions) != 0:
        print("last position:")
        print("{0} {1} {2}".format(positions[-1].account_id,
        positions[-1].stock_code, positions[-1].volume))
    
    # 根据股票代码查询对应持仓
    print("query position:")
    position = xt_trader.query_stock_position(acc, stock_code)
    if position:
        print("position:")
        print("{0} {1} {2}".format(position.account_id, position.stock_code,
        position.volume))
 
    # 阻塞线程,接收交易推送
    xt_trader.run_forever()
 
运行结果

————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/liuyukuan/article/details/128749621

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QMT 是一个基于Python的量化交易框架,可以用它来编写自己的交易策略。下面是一个基于MACD的策略示例: ``` from qmt import Strategy, DataHandler import talib class MACDStrategy(Strategy): def __init__(self): self.buy_price = None self.sell_price = None self.macd = None self.signal = None def on_data(self, data: DataHandler): if len(data.close) < 26: return self.macd, self.signal, _ = talib.MACD(data.close) current_price = data.close[-1] if self.macd[-1] > self.signal[-1] and self.macd[-2] < self.signal[-2]: self.buy(current_price) elif self.macd[-1] < self.signal[-1] and self.macd[-2] > self.signal[-2]: self.sell(current_price) def buy(self, price): self.buy_price = price self.buy_order(price) def sell(self, price): self.sell_price = price self.sell_order(price) def on_order_filled(self, filled_order): if filled_order.order_type == 'buy': self.buy_price = filled_order.price elif filled_order.order_type == 'sell': self.sell_price = filled_order.price def on_trade_closed(self, trade): profit = (trade.sell_price - trade.buy_price) / trade.buy_price * 100 print(f"Trade closed: buy @ {trade.buy_price}, sell @ {trade.sell_price}, profit: {profit:.2f}%") ``` 该策略使用 talib 库来计算 MACD 指标,并通过比较 MACD 和信号线的交叉点来判断买入和卖出时机。当 MACD 线上穿信号线时,发出买入指令;当 MACD 线下穿信号线时,发出卖出指令。在 `on_order_filled` 和 `on_trade_closed` 方法中,我们可以记录买入和卖出的价格,并在交易结束时计算盈利。 需要注意的是,这只是一个简的示例,并没有考虑市场的实际情况。在实际应用中,我们需要结合更多的指标和数据,以及制定更合理的买卖规则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值