首页
数据字典 (opens new window)
  • 内置Python
  • 原生Python
  • VBA
投研服务平台 (opens new window)
迅投官网 (opens new window)

    暂无数据

    策略服务 (opens new window) 迅投知识库 迅投知识库
    首页
    数据字典 (opens new window)
    • 内置Python
    • 原生Python
    • VBA
    投研服务平台 (opens new window)
    迅投官网 (opens new window)
      • XtQuant.简介

        • XtQuantFAQ
      • XtQuant.XtData 行情模块

      • XtQuant.Xttrader 交易模块

      • XtQuant交易示例
        • 1.使用xtquant库orderstockasync下单接口进行下单Demo
        • 2.交易接口重连示例
        • 3.使用xtquant库还负债示例
        • 4.行情接口示例
      • 常见问题Q&A
      • XtQuant版本下载
      ×
      当前文档查询 “ ” 关键字 0 个
      0/0
      • 原生Python
      RZRK
      2022-09-26
      目录

      XtQuant交易示例

      ×

      # 交易示例

      # 1.使用xtquant库order_stock_async下单接口进行下单Demo

      本示例用于展示如何订阅上海及深圳市场全推,对于沪深A股品种策略进行判断当前涨幅超过9个点的买入200股

      需要调整的参数:①:111行的path变量需要改为本地客户端路径 ②:116行的资金账号需要调整为自身资金账号

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

      #coding:utf-8
      import time, datetime, traceback, sys
      from xtquant import xtdata
      from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback
      from xtquant.xttype import StockAccount
      from xtquant import xtconstant
      
      #定义一个类 创建类的实例 作为状态的容器
      class _a():
          pass
      A = _a()
      A.bought_list = []
      A.hsa = xtdata.get_stock_list_in_sector('沪深A股')
      
      def interact():
          """执行后进入repl模式"""
          import code
          code.InteractiveConsole(locals=globals()).interact()
      xtdata.download_sector_data()
      
      def f(data):
          now = datetime.datetime.now()
          for stock in data:
              if stock not in A.hsa:
                  continue
              cuurent_price = data[stock]['lastPrice']
              pre_price = data[stock]['lastClose']
              ratio = cuurent_price / pre_price - 1 if pre_price > 0 else 0
              if ratio > 0.09 and stock not in A.bought_list:
                  print(f"{now} 最新价 买入 {stock} 200股")
                  async_seq = xt_trader.order_stock_async(acc, stock, xtconstant.STOCK_BUY, 200, xtconstant.LATEST_PRICE, -1, 'strategy_name', stock)
                  A.bought_list.append(stock)
          
      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)
      
      
      if __name__ == '__main__':
          print("start")
          #指定客户端所在路径
          path = r'D:\qmt\sp3\迅投极速交易终端 睿智融科版\userdata_mini'
          # 生成session id 整数类型 同时运行的策略不能重复
          session_id = int(time.time())
          xt_trader = XtQuantTrader(path, session_id)
          # 开启主动请求接口的专用线程 开启后在on_stock_xxx回调函数里调用XtQuantTrader.query_xxx函数不会卡住回调线程,但是查询和推送的数据在时序上会变得不确定
          # 详见: http://docs.thinktrader.net/vip/pages/ee0e9b/#开启主动请求接口的专用线程
          # xt_trader.set_relaxed_response_order_enabled(True)
      
          # 创建资金账号为 800068 的证券账号对象
          acc = StockAccount('800068', 'STOCK')
          # 创建交易回调类对象,并声明接收回调
          callback = MyXtQuantTraderCallback()
          xt_trader.register_callback(callback)
          # 启动交易线程
          xt_trader.start()
          # 建立交易连接,返回0表示连接成功
          connect_result = xt_trader.connect()
          print('建立交易连接,返回0表示连接成功', connect_result)
          # 对交易回调进行订阅,订阅后可以收到交易主推,返回0表示订阅成功
          subscribe_result = xt_trader.subscribe(acc)
          print('对交易回调进行订阅,订阅后可以收到交易主推,返回0表示订阅成功', subscribe_result)
      
          #这一行是注册全推回调函数 包括下单判断 安全起见处于注释状态 确认理解效果后再放开
          # xtdata.subscribe_whole_quote(["SH", "SZ"], callback=f)
          # 阻塞主线程退出
          xt_trader.run_forever()
          # 如果使用vscode pycharm等本地编辑器 可以进入交互模式 方便调试 (把上一行的run_forever注释掉 否则不会执行到这里)
          interact()
      
      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
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118
      119
      120
      121
      122
      123
      124
      125
      126
      127
      128
      129
      130
      131

      # 2.交易接口重连示例

      该示例演示交易链接断开时重连的代码处理
      注意:
      1. 该示例不是线程安全的,仅演示断开链接时应该怎么处理重连代码,实际使用时请注意避免潜在的问题
      2. 本策略只用于提供策略写法及参考,若您直接进行实盘下单,造成损失本网站不负担责任。

      
      import time
      from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback
      from xtquant.xttype import StockAccount
      from xtquant import xtconstant
      
      #指定客户端所在路径
      path = 'E:\qmt\\userdata_mini'
      # 指定session id 整数类型,任意整数即可,同时运行的策略不能重复
      session_id = 123456
      
      xt_trader = None
      
      
      class MyXtQuantTraderCallback(XtQuantTraderCallback):
          def on_disconnected(self):
              """
              连接断开
              :return:
              """
              print("connection lost, 交易接口断开,即将重连")
      
              global xt_trader
              xt_trader = None
      
      
      def connect():
          global session_id
          
          # 重连时需要更换session_id
          session_id += 1
          xt_trader = XtQuantTrader(path, session_id)
          # 创建资金账号为1000000365的证券账号对象
          acc = StockAccount('1000000365')
          callback = MyXtQuantTraderCallback()
          xt_trader.register_callback(callback)
          # 启动交易线程
          xt_trader.start()
          # 建立交易连接,返回0表示连接成功
          connect_result = xt_trader.connect()
          if connect_result == 0:
              return xt_trader, True
          else:
              return None, False
      
      
      if __name__ == "__main__":
          xt_trader, success = connect()
          print(xt_trader, success)
          while 1:
              if xt_trader is None:
                  print('开始重连交易接口')
                  xt_trader, success = connect()
                  if success:
                      print('交易接口重连成功')
              time.sleep(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
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58

      # 3.使用xtquant库还负债示例

      本示例用于展示如何使用xtquant库对信用账号执行还款的操作
      注意:本策略只用于提供策略写法及参考,若您直接进行实盘下单,造成损失本网站不负担责任。

      #coding=utf-8
      from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback
      from xtquant.xttype import StockAccount
      from xtquant import xtconstant
      
      # 修改参数
      # path为mini qmt客户端安装目录下userdata_mini路径
      path = 'E:\\qmt\\userdata_mini'
      # session_id为会话编号,策略使用方对于不同的Python策略需要使用不同的会话编号
      session_id = 1234567
      repay_money = 1000.51  # 元,需要执行还款的金额
      
      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)
          def on_account_status(self, status):
              """
              :param response: XtAccountStatus 对象
              :return:
              """
              print("on_account_status")
              print(status.account_id, status.account_type, status.status)
      
      
      if __name__ == "__main__":
          print("demo test")
      
      
          xt_trader = XtQuantTrader(path, session_id)
          # 创建资金账号为1000000365的证券账号对象
          acc = StockAccount('200035', 'CREDIT')
          # StockAccount可以用第二个参数指定账号类型,如沪港通传'HUGANGTONG',深港通传'SHENGANGTONG'
          # acc = StockAccount('1000000365','STOCK')
          # 创建交易回调类对象,并声明接收回调
          callback = MyXtQuantTraderCallback()
          xt_trader.register_callback(callback)
          # 启动交易线程
          xt_trader.start()
          # 建立交易连接,返回0表示连接成功
          connect_result = xt_trader.connect()
          if connect_result != 0:
              import sys
              sys.exit('链接失败,程序即将退出 %d'%connect_result)
          # 对交易回调进行订阅,订阅后可以收到交易主推,返回0表示订阅成功
          subscribe_result = xt_trader.subscribe(acc)
          if subscribe_result != 0:
              print('账号订阅失败 %d'%subscribe_result)
          print(subscribe_result)
          stock_code = '600000.SH'  # 参数占位用,任意股票代码都可以
          volume = 200  # 参数占位用,任意数量
          # 使用指定价下单,接口返回订单编号,后续可以用于撤单操作以及查询委托状态
          fix_result_order_id = xt_trader.order_stock(acc, stock_code, xtconstant.CREDIT_DIRECT_CASH_REPAY, volume, xtconstant.FIX_PRICE, repay_money, 'strategy_name', 'remark')
      
          # 阻塞线程,接收交易推送
          xt_trader.run_forever()
      
      
      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
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116

      # 4.行情接口示例

      
      # coding:utf-8
      import time
      
      from xtquant import xtdata
      
      
      code = '600000.SH'
      
      #取全推数据
      full_tick = xtdata.get_full_tick([code])
      print('全推数据 日线最新值', full_tick)
      
      #下载历史数据
      xtdata.download_history_data2([code], period='1m', start_time='20230701')
      
      #订阅最新行情
      def callback_func(data):
          print('回调触发', data)
      
      xtdata.subscribe_quote(code, period='1m', count=-1, callback= callback_func)
      data = xtdata.get_market_data(['close'], [code], period='1m', start_time='20230701')
      print('一次性取数据', data)
      
      #死循环 阻塞主线程退出
      xtdata.run()
      
      
      
      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
      上次更新: 2023/10/12, 10:46:32
      上一章-附录
      下一章-常见问题Q&A

      ← 附录 常见问题Q&A→

      Copyright © 2022-2024 北京睿智融科控股股份有限公司 | 迅投官网
      请使用微信扫码联系客服
      请使用微信扫码联系客服
      点击这里给我发消息
      • 跟随系统
      • 浅色模式
      • 深色模式
      • 阅读模式