
Miniqmt
- 137 installs
- 169 repo stars
- Updated June 29, 2026
- lzwme/finance-quant-skills
Helps with ai & agent building tasks.
About
miniqmt is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- miniqmt
- AI & Agent Building
- AI-coding skill
Miniqmt by the numbers
- 137 all-time installs (skills.sh)
- +9 installs in the week ending Aug 2, 2026 (Skillselion tracking)
- Ranked #3,568 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 2, 2026 (Skillselion catalog sync)
npx skills add https://github.com/lzwme/finance-quant-skills --skill miniqmtAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 137 |
|---|---|
| repo stars | ★ 169 |
| Last updated | June 29, 2026 |
| Repository | lzwme/finance-quant-skills ↗ |
What it does
Helps with ai & agent building tasks.
Files
MiniQMT 量化交易技能
任务目标
- 本 Skill 用于:通过 XtQuant 库连接 MiniQMT 客户端,获取 A 股/期货/期权行情数据,执行量化交易操作
- 能力包含:
- 行情模块 (xtdata):K线数据、分笔数据、实时行情订阅、财务数据、板块分类、ETF信息、新股申购、交易日历
- 交易模块 (xttrader):股票/期货/期权下单、撤单、查询资产/委托/持仓、资金划拨、信用交易、约券
- 触发条件:用户提及 miniqmt、xtquant、迅投、获取行情、量化交易、下单交易时使用
前置准备
MiniQMT 环境要求
- 客户端安装:需安装迅投极速交易终端,并启动 MiniQMT(支持模拟/实盘)
- Python 库:
pip install xtquant - 路径配置:MiniQMT 安装目录下的
userdata_mini路径用于 xttrader 连接
目录结构
QMT安装目录\
├── bin.x64\XtMiniQmt.exe # MiniQMT 主程序
├── userdata_mini\ # 用户数据目录(xttrader 连接路径)
│ ├── xqtrader.ini # 交易配置
│ └── xtdatacenter.ini # 行情配置核心概念
证券代码格式
- 股票:6位数字 + 市场后缀,如
600000.SH(上海)、000001.SZ(深圳) - 期货:品种代码 + 合约月份,如
rb2405.SF(螺纹钢) - 期权:标的代码 + 行权月份,如
510050.SH(上证50ETF期权)
周期类型 (period)
| 周期 | 说明 | 周期 | 说明 |
|---|---|---|---|
tick | 分笔数据 | 1q | 季度线 |
1m | 1分钟线 | 1hy | 半年线 |
5m | 5分钟线 | 1y | 年线 |
15m | 15分钟线 | 1w | 周线 |
30m | 30分钟线 | 1d | 日线 |
1h | 1小时线 | 1mon | 月线 |
复权类型 (dividend_type)
none- 不复权front- 前复权back- 后复权front_ratio- 等比前复权back_ratio- 等比后复权
交易市场 (market)
| 市场 | 常量 | 市场 | 常量 |
|---|---|---|---|
| 上海 | xtconstant.SH_MARKET | 中金所 | xtconstant.MARKET_ENUM_INDEX_FUTURE |
| 深圳 | xtconstant.SZ_MARKET | 上期所 | xtconstant.MARKET_ENUM_SHANGHAI_FUTURE |
| 北交所 | xtconstant.MARKET_ENUM_BEIJING | 郑商所 | xtconstant.MARKET_ENUM_ZHENGZHOU_FUTURE |
| 大商所 | xtconstant.MARKET_ENUM_DALIANG_FUTURE | 广期所 | xtconstant.MARKET_ENUM_GUANGZHOU_FUTURE |
账号类型 (account_type)
| 类型 | 常量 | 类型 | 常量 |
|---|---|---|---|
| 股票 | xtconstant.SECURITY_ACCOUNT | 沪港通 | xtconstant.HUGANGTONG_ACCOUNT |
| 期货 | xtconstant.FUTURE_ACCOUNT | 深港通 | xtconstant.SHENGANGTONG_ACCOUNT |
| 信用 | xtconstant.CREDIT_ACCOUNT | 期货期权 | xtconstant.FUTURE_OPTION_ACCOUNT |
| 股票期权 | xtconstant.STOCK_OPTION_ACCOUNT | - | - |
操作步骤
1. 确定需求 — 识别是行情数据获取还是交易操作 2. 选择模块 — xtdata 用于行情,xttrader 用于交易 3. 调用脚本 — 根据数据类型选择对应脚本 4. 解析结果 — 智能体分析返回的 JSON 格式数据
意图识别映射示例
| 用户提问 | 对应功能 | 调用方式 |
|---|---|---|
| "贵州茅台实时股价" | 实时行情快照 | xtdata.get_full_tick |
| "平安银行K线数据" | K线数据 | xtdata.get_market_data |
| "招商银行财务指标" | 财务报表 | xtdata.get_financial_data |
| "半导体板块成分股" | 板块成分股 | xtdata.get_stock_list_in_sector |
| "今日可转债信息" | ETF/可转债数据 | xtdata.get_cb_info |
| "新股申购" | 新股信息 | xtdata.get_ipo_info |
| "下单买入平安银行" | 交易下单 | xttrader.order_stock |
| "查询持仓" | 持仓查询 | xttrader.query_stock_positions |
| "撤单" | 撤单操作 | xttrader.cancel_order_stock |
使用示例
示例1:获取股票实时行情
import xtdata
# 获取全推行情快照
ticks = xtdata.get_full_tick(['600519.SH', '000001.SZ'])
# 订阅单股实时行情
def on_data(datas):
for code in datas:
print(code, datas[code])
xtdata.subscribe_quote('600519.SH', period='tick', callback=on_data)
xtdata.run()示例2:获取K线历史数据
import xtdata
# 下载历史K线数据
xtdata.download_history_data2(['600519.SH'], period='1d', start_time='')
# 获取K线数据
data = xtdata.get_market_data(
field_list=['open', 'high', 'low', 'close', 'volume'],
stock_list=['600519.SH'],
period='1d',
start_time='20240101',
end_time='',
count=100,
dividend_type='front'
)示例3:交易下单
from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback
from xtquant.xttype import StockAccount
from xtquant import xtconstant
# 配置路径和会话
path = 'D:\\迅投极速交易终端\\userdata_mini'
session_id = 123456
xt_trader = XtQuantTrader(path, session_id)
# 创建账号对象
acc = StockAccount('1000000365') # 替换为实际账号
# 连接交易
xt_trader.start()
connect_result = xt_trader.connect()
subscribe_result = xt_trader.subscribe(acc)
# 下单买入
order_id = xt_trader.order_stock(
acc,
'600519.SH',
xtconstant.STOCK_BUY,
100, # 100股
xtconstant.FIX_PRICE,
1800.0, # 价格
'strategy1',
'remark'
)
# 查询资产
asset = xt_trader.query_stock_asset(acc)
print(f"可用资金: {asset.cash}")示例4:订阅行情并实时处理
import xtdata
def on_tick_data(datas):
for code in datas:
tick = datas[code]
print(f"{code}: 现价={tick['lastPrice']}, 成交量={tick['volume']}")
# 订阅多只股票
xtdata.subscribe_whole_quote(['SH', 'SZ'], callback=on_tick_data)
xtdata.run()资源索引
行情数据脚本
- 行情快照:
python scripts/market_data.py snapshot --code 600519.SH - K线数据:
python scripts/market_data.py kline --code 600519.SH --period 1d --count 100 - 分笔数据:
python scripts/market_data.py tick --code 600519.SH --count 100 - 实时行情:
python scripts/market_data.py full_tick --codes 600519.SH,000001.SZ
板块与财务脚本
- 板块列表:
python scripts/sector_data.py sector_list - 板块成分股:
python scripts/sector_data.py sector_stocks --sector 半导体 - 财务数据:
python scripts/financial_data.py financial --code 600519.SH --tables Balance,Income
交易脚本
- 下单:
python scripts/trade.py order --code 600519.SH --type buy --volume 100 --price 1800.0 - 撤单:
python scripts/trade.py cancel --order_id 12345 - 查询持仓:
python scripts/trade.py positions - 查询委托:
python scripts/trade.py orders - 查询资产:
python scripts/trade.py asset - 查询成交:
python scripts/trade.py trades
参考文档
- xtdata 行情模块 API(何时读取:需要查看行情数据接口时)
- xtdata行情数据字段与数据字典 (何时读取:需要查看行情数据字段、数据字典时)
- xttrader 交易模块 API(何时读取:需要查看交易接口、数据结构说明时)
- 安装与下载指南(何时读取:首次安装 XtQuant 或遇到安装问题时)
- 常见问题(何时读取:遇到常见问题时)
- 代码示例(何时读取:需要参考完整代码示例时)
- 更新日志(何时读取:查看版本更新历史时)
注意事项
环境要求
- 必须运行 MiniQMT:xttrader 交易模块需要 MiniQMT 客户端在后台运行
- 路径配置:确保
userdata_mini路径正确,否则连接会失败 - 行情订阅限制:单股订阅建议不超过 50 只,较多时建议使用全推数据
数据获取注意
- 数据补下载:历史数据需先通过
download_history_data2下载 - 权限限制:Level2 数据需要终端有相应权限
- 时间格式:K线时间参数格式为
'20240101'或'20240101000000'
交易注意
- 账号格式:股票账号直接使用资金账号字符串,期货账号需指定
'FUTURE' - 委托数量:股票以"股"为单位,债券以"张"为单位,期货以"手"为单位
- 订单编号:下单成功后返回正整数 order_id,-1 表示失败
- 异步操作:交易操作支持同步/异步两种模式,异步模式需配合回调使用
性能优化
- 批量请求:多只股票数据建议使用
get_market_data批量获取 - 缓存利用:已订阅的数据会自动缓存,无需重复订阅
- 线程安全:xttrader 支持多策略,但需使用不同的 session_id
版本信息
- 2020-09-01
- 初稿
- 2020-09-07
- 添加获取除权数据的接口
get_divid_factors,附录添加除权数据字段说明 - 获取合约信息、获取合约类型接口完善
- 获取交易日列表接口
get_trading_dates支持指定日期范围 - 2020-09-13
- 添加财务数据接口,调整获取和下载财务数据接口的说明,添加财务数据报表字段列表
- 将 “补充” 字样调整为 “下载”,“supply” 接口调整为 “download”
- 2020-09-13
- 将
volumn拼写错误修正为volume,影响范围: tick和l2quote周期行情数据 - 成交量字段- 合约基础信息 - 总股本、流通股本
- 2020-11-23
- 合约基础信息
CreateDateOpenDate字段类型由int调整为str - 添加数据字典部分,添加level2数据字段枚举值说明
- 2021-07-20
- 添加新版下载数据接口
- 下载行情数据
download_history_data2 - 下载财务数据
download_financial_data2 - 2021-12-30
- 数据字典调整
- 委托方向、成交类型添加关于上交所、深交所撤单信息的区分说明
- 2022-06-27
- 数据字典调整
- K线添加前收价、停牌标记字段
- 2022-09-30
- 添加交易日历相关接口
- 获取节假日数据
get_holidays - 获取交易日历
get_trading_calendar - 获取交易时段
get_trade_times - 2023-01-04
- 添加千档行情获取
- 2023-01-31
- 可转债基础信息的下载
download_cb_data - 可转债基础信息的获取
get_cb_info - 2023-02-06
- 添加连接到指定ip端口的接口
reconnect - 2023-02-07
- 支持QMT的本地Python模式
- 优化多个QMT同时存在的场景,自动选择xtdata连接的端口
- 2023-03-27
- 新股申购信息获取
get_ipo_info - 2023-04-13
- 本地python模式下运行VBA函数
- 2023-07-27
- 文档部分描述修改
- 2023-08-21
- 数据接口支持投研版特色数据
- 参考
接口概述-常用类型说明-周期-投研版 - 特色数据 - 获取合约基础信息
get_instrument_detail返回字段调整 - 增加
ExchangeCodeUniCode - 添加获取可用周期列表的接口
get_period_list - 2023-10-11
get_market_data_ex支持获取ETF申赎清单数据- 数据字典添加 现金替代标志
- 2023-11-09
download_history_data添加增量下载参数,支持指定起始时间的增量下载- 2023-11-22
get_trading_calendar不再支持tradetimes参数- 2023-11-27
- ETF申赎清单信息下载
download_etf_info - ETF申赎清单信息获取
get_etf_info - 2023-11-28
- 添加节假日下载
download_holiday_data - 2023-12-27
- 获取板块成份股列表接口增加北交所板块
- 2024-01-19
get_market_data_ex支持获取期货历史主力合约数据get_option_detail_data支持获取商品期权品种的数据get_market_data_ex支持获取日线以上周期的K线数据- 周线
1w、月线1mon、季度线1q、半年线1hy、年线1y - 2024-01-22
get_trade_times改名为get_trading_timeget_trading_time更新实现逻辑- 2024-01-26
- 获取合约基础信息
get_instrument_detail支持获取全部合约信息字段 - 2024-05-15
- 获取最新交易日k线数据
get_full_kline - 2024-05-27
get_stock_list_in_sector增加real_timetag参数
行情示例
获取行情示例
新手示例
# 用前须知
## xtdata提供和MiniQmt的交互接口,本质是和MiniQmt建立连接,由MiniQmt处理行情数据请求,再把结果回传返回到python层。使用的行情服务器以及能获取到的行情数据和MiniQmt是一致的,要检查数据或者切换连接时直接操作MiniQmt即可。
## 对于数据获取接口,使用时需要先确保MiniQmt已有所需要的数据,如果不足可以通过补充数据接口补充,再调用数据获取接口获取。
## 对于订阅接口,直接设置数据回调,数据到来时会由回调返回。订阅接收到的数据一般会保存下来,同种数据不需要再单独补充。
# 代码讲解
# 从本地python导入xtquant库,如果出现报错则说明安装失败
from xtquant import xtdata
import time
# 设定一个标的列表
code_list = ["000001.SZ"]
# 设定获取数据的周期
period = "1d"
# 下载标的行情数据
if 1:
## 为了方便用户进行数据管理,xtquant的大部分历史数据都是以压缩形式存储在本地的
## 比如行情数据,需要通过download_history_data下载,财务数据需要通过
## 所以在取历史数据之前,我们需要调用数据下载接口,将数据下载到本地
for i in code_list:
xtdata.download_history_data(i,period=period,incrementally=True) # 增量下载行情数据(开高低收,等等)到本地
xtdata.download_financial_data(code_list) # 下载财务数据到本地
xtdata.download_sector_data() # 下载板块数据到本地
# 更多数据的下载方式可以通过数据字典查询
# 读取本地历史行情数据
history_data = xtdata.get_market_data_ex([],code_list,period=period,count=-1)
print(history_data)
print("=" * 20)
# 如果需要盘中的实时行情,需要向服务器进行订阅后才能获取
# 订阅后,get_market_data函数于get_market_data_ex函数将会自动拼接本地历史行情与服务器实时行情
# 向服务器订阅数据
for i in code_list:
xtdata.subscribe_quote(i,period=period,count=-1) # 设置count = -1来取到当天所有实时行情
# 等待订阅完成
time.sleep(1)
# 获取订阅后的行情
kline_data = xtdata.get_market_data_ex([],code_list,period=period)
print(kline_data)
# 获取订阅后的行情,并以固定间隔进行刷新,预期会循环打印10次
for i in range(10):
# 这边做演示,就用for来循环了,实际使用中可以用while True
kline_data = xtdata.get_market_data_ex([],code_list,period=period)
print(kline_data)
time.sleep(3) # 三秒后再次获取行情
# 如果不想用固定间隔触发,可以以用订阅后的回调来执行
# 这种模式下当订阅的callback回调函数将会异步的执行,每当订阅的标的tick发生变化更新,callback回调函数就会被调用一次
# 本地已有的数据不会触发callback
# 定义的回测函数
## 回调函数中,data是本次触发回调的数据,只有一条
def f(data):
# print(data)
code_list = list(data.keys()) # 获取到本次触发的标的代码
kline_in_callabck = xtdata.get_market_data_ex([],code_list,period = period) # 在回调中获取klines数据
print(kline_in_callabck)
for i in code_list:
xtdata.subscribe_quote(i,period=period,count=-1,callback=f) # 订阅时设定回调函数
# 使用回调时,必须要同时使用xtdata.run()来阻塞程序,否则程序运行到最后一行就直接结束退出了。
xtdata.run()连接VIP服务器
# 导入 xtdatacenter 模块
import sys
print("Python 版本:", sys.version)
import time
import pandas as pd
from xtquant import xtdatacenter as xtdc
from xtquant import xtdata
'''
设置用于登录行情服务的token,此接口应该先于 init_quote 调用
token可以从投研用户中心获取
https://xuntou.net/#/userInfo
'''
xtdc.set_token('这里输入token')
'''
设置连接池,使服务器只在连接池内优选
建议将VIP服务器设为连接池
'''
addr_list = [
'115.231.218.73:55310',
'115.231.218.79:55310',
'42.228.16.211:55300',
'42.228.16.210:55300',
'36.99.48.20:55300',
'36.99.48.21:55300'
]
xtdc.set_allow_optmize_address(addr_list)
xtdc.set_kline_mirror_enabled(True) # 开启K线全推功能(vip),以获取全市场实时K线数据
"""
初始化
"""
xtdc.init()
## 监听端口
port = xtdc.listen(port = 58621) # 指定固定端口进行连接
# port = xtdc.listen(port = (58620, 58630))[1] 通过指定port范围,可以让xtdc在范围内自动寻找可用端口
xtdata.connect(port=port)
print('-----连接上了------')
print(xtdata.data_dir)
servers = xtdata.get_quote_server_status()
# print(servers)
for k, v in servers.items():
print(k, v)
xtdata.run()连接指定服务器
import time
from xtquant import xtdata
#用token方式连接,不需要账号密码
#其他连接方式,需要账号密码
info = {"ip": '115.231.218.73', "port": 55300, "username": '', "pwd": ''}
connect_success = 0
def func(d):
ip = d.get('ip', '')
port = d.get('port')
status = d.get('status', 'disconnected')
global connect_success
if ip == info['ip'] and port == info['port']:
if status == 'connected':
connect_success = 1
else:
connect_success = 2
# 注册连接回调信息
xtdata.watch_quote_server_status(func)
# 行情连接
qs = xtdata.QuoteServer(info)
qs.connect()
# 获取当前数据连接站点
data_server_info = xtdata.get_quote_server_status()
# 显示当前数据连接站点
if 1:
for k,v in data_server_info.items():
print(f"data:{k}, connect info:{v.info}")
# 等待连接状态
while connect_success == 0:
time.sleep(0.3)
if connect_success == 2:
print("连接失败")指定初始化行情连接范围
if 1:
from xtquant import xtdatacenter as xtdc
## 设置数据目录
xtdc.set_data_home_dir('data')
## 设置token
token = "你的token"
xtdc.set_token(token)
## 限定行情站点的优选范围
opt_list = [
'115.231.218.73:55310',
'115.231.218.79:55310',
'42.228.16.210:55300',
'42.228.16.211:55300',
'36.99.48.20:55300',
'36.99.48.21:55300',
]
xtdc.set_allow_optmize_address(opt_list)
## 开启指定市场的K线全推
xtdc.set_kline_mirror_markets(['SH', 'SZ', 'BJ'])
## 设置要初始化的市场列表
init_markets = [
'SH', 'SZ', 'BJ',
#'DF', 'GF', 'IF', 'SF', 'ZF', 'INE',
#'SHO', 'SZO',
]
xtdc.set_init_markets(init_markets)
## 初始化xtdc模块
xtdc.init(start_local_service = False)
## 监听端口
#xtdc.listen(port = 58620)
listen_port = xtdc.listen(port = (58620, 58650))
#import code; code.interact(local = locals())
import xtquant.xtdata as xtdata
xtdata.connect(port = listen_port)
import code; code.interact(local = locals())订阅全推数据/下载历史数据
# 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_data(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()获取对手价
# 以卖出为例
import pandas as pd
import numpy as np
from xtquant import xtdata
to_do_trade_list = ["000001.SZ"]
tick = xtdata.get_full_tick(to_do_trade_list)
# 取买一价为对手价,若买一价为0,说明已经跌停,则取最新价
for i in tick:
fix_price = tick[i]["bidPrice"][0] if tick[i]["bidPrice"][0] != 0 else tick[i]["lastPrice"]
print(fix_price)10.01复权计算方式
#coding:utf-8
import numpy as np
import pandas as pd
from xtquant import xtdata
#def gen_divid_ratio(quote_datas, divid_datas):
# drl = []
# for qi in range(len(quote_datas)):
# q = quote_datas.iloc[qi]
# dr = 1.0
# for di in range(len(divid_datas)):
# d = divid_datas.iloc[di]
# if d.name <= q.name:
# dr *= d['dr']
# drl.append(dr)
# return pd.DataFrame(drl, index = quote_datas.index, columns = quote_datas.columns)
def gen_divid_ratio(quote_datas, divid_datas):
drl = []
dr = 1.0
qi = 0
qdl = len(quote_datas)
di = 0
ddl = len(divid_datas)
while qi < qdl and di < ddl:
qd = quote_datas.iloc[qi]
dd = divid_datas.iloc[di]
if qd.name >= dd.name:
dr *= dd['dr']
di += 1
if qd.name <= dd.name:
drl.append(dr)
qi += 1
while qi < qdl:
drl.append(dr)
qi += 1
return pd.DataFrame(drl, index = quote_datas.index, columns = quote_datas.columns)
def process_forward_ratio(quote_datas, divid_datas):
drl = gen_divid_ratio(quote_datas, divid_datas)
drlf = drl / drl.iloc[-1]
result = (quote_datas * drlf).apply(lambda x: round(x, 2))
return result
def process_backward_ratio(quote_datas, divid_datas):
drl = gen_divid_ratio(quote_datas, divid_datas)
result = (quote_datas * drl).apply(lambda x: round(x, 2))
return result
def process_forward(quote_datas1, divid_datas):
quote_datas = quote_datas1.copy()
def calc_front(v, d):
return ((v - d['interest'] + d['allotPrice'] * d['allotNum'])
/ (1 + d['allotNum'] + d['stockBonus'] + d['stockGift']))
for qi in range(len(quote_datas)):
q = quote_datas.iloc[qi]
for di in range(len(divid_datas)):
d = divid_datas.iloc[di]
if d.name <= q.name:
continue
q.iloc[0] = calc_front(q.iloc[0], d)
return quote_datas
def process_backward(quote_datas1, divid_datas):
quote_datas = quote_datas1.copy()
def calc_back(v, d):
return ((v * (1.0 + d['stockGift'] + d['stockBonus'] + d['allotNum'])
+ d['interest'] - d['allotNum'] * d['allotPrice']))
for qi in range(len(quote_datas)):
q = quote_datas.iloc[qi]
for di in range(len(divid_datas) - 1, -1, -1):
d = divid_datas.iloc[di]
if d.name > q.name:
continue
q.iloc[0] = calc_back(q.iloc[0], d)
return quote_datas
#--------------------------------
s = '002594.SZ'
#xtdata.download_history_data(s, '1d', '20100101', '')
dd = xtdata.get_divid_factors(s)
print(dd)
#复权计算用于处理价格字段
field_list = ['open', 'high', 'low', 'close']
datas_ori = xtdata.get_market_data(field_list, [s], '1d', dividend_type = 'none')['close'].T
#print(datas_ori)
#等比前复权
datas_forward_ratio = process_forward_ratio(datas_ori, dd)
print('datas_forward_ratio', datas_forward_ratio)
#等比后复权
datas_backward_ratio = process_backward_ratio(datas_ori, dd)
print('datas_backward_ratio', datas_backward_ratio)
#前复权
datas_forward = process_forward(datas_ori, dd)
print('datas_forward', datas_forward)
#后复权
datas_backward = process_backward(datas_ori, dd)
print('datas_backward', datas_backward)根据商品期货期权代码获取对应的商品期货合约代码
from xtquant import xtdata
def get_option_underline_code(code:str) -> str:
"""
注意:该函数不适用于股指期货期权与ETF期权
Todo: 根据商品期权代码获取对应的具体商品期货合约
Args:
code:str 期权代码
Return:
对应的期货合约代码
"""
Exchange_dict = {
"SHFE":"SF",
"CZCE":"ZF",
"DCE":"DF",
"INE":"INE",
"GFEX":"GF"
}
if code.split(".")[-1] not in [v for k,v in Exchange_dict.items()]:
raise KeyError("此函数不支持该交易所合约")
info = xtdata.get_option_detail_data(code)
underline_code = info["OptUndlCode"] + "." + Exchange_dict[info["OptUndlMarket"]]
return underline_code
if __name__ == "__main__":
symbol_code = get_option_underline_code('sc2403C465.INE') # 获取期权合约'sc2403C465.INE'对应的期货合约代码
print(symbol_code)'sc2403.INE'根据指数代码,返回对应的期货合约
from xtquant import xtdata
import re
def get_financial_futures_code_from_index(index_code:str) -> list:
"""
ToDo:传入指数代码,返回对应的期货合约(当前)
Args:
index_code:指数代码,如"000300.SH","000905.SH"
Retuen:
list: 对应期货合约列表
"""
financial_futures = xtdata.get_stock_list_in_sector("中金所")
future_list = []
pattern = r'^[a-zA-Z]{1,2}\d{3,4}\.[A-Z]{2}$'
for i in financial_futures:
if re.match(pattern,i):
future_list.append(i)
ls = []
for i in future_list:
_info = xtdata._get_instrument_detail(i)
_index_code = _info["ExtendInfo"]['OptUndlCode'] + "." + _info["ExtendInfo"]['OptUndlMarket']
if _index_code == index_code:
ls.append(i)
return ls
if __name__ == "__main__":
ls = get_financial_futures_code_from_index("000905.SH")
print(ls)['IC2402.IF', 'IC2403.IF', 'IC2406.IF', 'IC2409.IF']交易示例
简单买卖各一笔示例
需要调整的参数:
98行的path变量需要改为本地客户端路径,券商端指定到 f"{安装目录}\\userdata_mini",投研端指定到f"{安装目录}\\userdata"107行的资金账号需要调整为自身资金账号
# 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()
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, f"委托方向(48买 49卖) {trade.offset_flag} 成交价格 {trade.traded_price} 成交数量 {trade.traded_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)
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")
# 指定客户端所在路径, 券商端指定到 userdata_mini文件夹
# 注意:如果是连接投研端进行交易,文件目录需要指定到f"{安装目录}\\userdata"
path = r'D:\\qmt\\投研\\迅投极速交易终端睿智融科版\\userdata'
# 生成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 的证券账号对象 股票账号为STOCK 信用CREDIT 期货FUTURE
acc = StockAccount('2000128', '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)
#取账号信息
account_info = xt_trader.query_stock_asset(acc)
#取可用资金
available_cash = account_info.m_dCash
print(acc.account_id, '可用资金', available_cash)
#查账号持仓
positions = xt_trader.query_stock_positions(acc)
#取各品种 总持仓 可用持仓
position_total_dict = {i.stock_code : i.m_nVolume for i in positions}
position_available_dict = {i.stock_code : i.m_nCanUseVolume for i in positions}
print(acc.account_id, '持仓字典', position_total_dict)
print(acc.account_id, '可用持仓字典', position_available_dict)
#买入 浦发银行 最新价 两万元
stock = '600000.SH'
target_amount = 20000
full_tick = xtdata.get_full_tick([stock])
print(f"{stock} 全推行情: {full_tick}")
current_price = full_tick[stock]['lastPrice']
#买入金额 取目标金额 与 可用金额中较小的
buy_amount = min(target_amount, available_cash)
#买入数量 取整为100的整数倍
buy_vol = int(buy_amount / current_price / 100) * 100
print(f"当前可用资金 {available_cash} 目标买入金额 {target_amount} 买入股数 {buy_vol}股")
async_seq = xt_trader.order_stock_async(acc, stock, xtconstant.STOCK_BUY, buy_vol, xtconstant.FIX_PRICE, current_price,
'strategy_name', stock)
#卖出 500股
stock = '513130.SH'
#目标数量
target_vol = 500
#可用数量
available_vol = position_available_dict[stock] if stock in position_available_dict else 0
#卖出量取目标量与可用量中较小的
sell_vol = min(target_vol, available_vol)
print(f"{stock} 目标卖出量 {target_vol} 可用数量 {available_vol} 卖出 {sell_vol}股")
if sell_vol > 0:
async_seq = xt_trader.order_stock_async(acc, stock, xtconstant.STOCK_SELL, sell_vol, xtconstant.LATEST_PRICE,
-1,
'strategy_name', stock)
print(f"下单完成 等待回调")
# 阻塞主线程退出
xt_trader.run_forever()
# 如果使用vscode pycharm等本地编辑器 可以进入交互模式 方便调试 (把上一行的run_forever注释掉 否则不会执行到这里)
interact()单股订阅实盘示例
需要调整的参数:
113行的path变量需要改为本地客户端路径,券商端指定到 f"{安装目录}\\userdata_mini",投研端指定到f"{安装目录}\\userdata"122行的资金账号需要调整为自身资金账号
# 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):
print(data)
now = datetime.datetime.now()
for stock in data:
if stock not in A.hsa:
continue
cuurent_price = data[stock][0]['close']
pre_price = data[stock][0]['preClose']
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} 100股")
async_seq = xt_trader.order_stock_async(acc, stock, xtconstant.STOCK_BUY, 100, 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")
# 指定客户端所在路径, 券商端指定到 userdata_mini文件夹
# 注意:如果是连接投研端进行交易,文件目录需要指定到f"{安装目录}\userdata"
path = r'D:\\qmt\\投研\\迅投极速交易终端睿智融科版\\userdata'
# 生成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 的证券账号对象 股票账号为STOCK 信用CREDIT 期货FUTURE
acc = StockAccount('2000128', '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)
#订阅的品种列表
code_list = ['600000.SH', '000001.SZ']
for code in code_list:
xtdata.subscribe_quote(code, '1d', callback = f)
# 阻塞主线程退出
xt_trader.run_forever()
# 如果使用vscode pycharm等本地编辑器 可以进入交互模式 方便调试 (把上一行的run_forever注释掉 否则不会执行到这里)
interact()全推订阅实盘示例
本示例用于展示如何订阅上海及深圳市场全推,对于沪深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][0]['lastPrice']
pre_price = data[stock][0]['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")
#指定客户端所在路径,
# 注意:如果是连接投研端进行交易,文件目录需要指定到f"{安装目录}\\userdata"
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()定时判断实盘示例
# 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()
# print(data)
for stock in data:
if stock not in A.hsa:
continue
cuurent_price = data[stock].iloc[-1, 0]
pre_price = data[stock].iloc[-2, 0]
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} 100股")
async_seq = xt_trader.order_stock_async(acc, stock, xtconstant.STOCK_BUY, 100, 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")
# 指定客户端所在路径, 券商端指定到 userdata_mini文件夹
# 注意:如果是连接投研端进行交易,文件目录需要指定到f"{安装目录}\\userdata"
path = r'D:\\qmt\\投研\\迅投极速交易终端睿智融科版\\userdata'
# 生成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 的证券账号对象 股票账号为STOCK 信用CREDIT 期货FUTURE
acc = StockAccount('2000128', '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)
#订阅的品种列表
code_list = ['600000.SH', '000001.SZ']
#遍历品种 下载历史k线 订阅当日行情
for code in code_list:
xtdata.download_history_data(code, period='1d', start_time='20200101')
xtdata.subscribe_quote(code, '1d', callback = None)
while True:
now = datetime.datetime.now()
now_time = now.strftime('%H%M%S')
if not '093000' <= now_time < '150000':
print(f"{now} 非交易时间 循环退出")
break
#取k线数据
data = xtdata.get_market_data_ex(['close'], code_list, period= '1d', start_time= '20240101')
#判断交易
f(data)
#每次循环 睡眠三秒后继续
time.sleep(3)
# 阻塞主线程退出
xt_trader.run_forever()
# 如果使用vscode pycharm等本地编辑器 可以进入交互模式 方便调试 (把上一行的run_forever注释掉 否则不会执行到这里)
interact()交易接口重连
该示例演示交易连接断开时重连的代码处理。
提示
1. 该示例 不是线程安全 的,仅演示断开连接时应该怎么处理重连代码,实际使用时请注意避免潜在的问题 2. 本策略只用于提供策略写法及参考,若您直接进行实盘下单,造成损失本网站不负担责任。
#本文用一个均线策略演示交易连接断开时怎么处理交易接口重连
# 策略本身不严谨,不能作为实盘策略或者参考策略,本策略仅是演示重连用法
import time
from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback
from xtquant.xttype import StockAccount
from xtquant import xtconstant
from xtquant import xtdata
class MyXtQuantTraderCallback(XtQuantTraderCallback):
# 更多说明见 http://dict.thinktrader.net/nativeApi/xttrader.html?id=I3DJ97#%E5%A7%94%E6%89%98xtorder
def on_disconnected(self):
"""
连接断开
:return:
"""
print("connection lost, 交易接口断开,即将重连")
global xt_trader
xt_trader = None
def on_stock_order(self, order):
print(f'委托回报: 股票代码:{order.stock_code} 账号:{order.account_id}, 订单编号:{order.order_id} 柜台合同编号:{order.order_sysid}
委托状态:{order.order_status} 成交数量:{order.order_status} 委托数量:{order.order_volume} 已成数量:{order.traded_volume}')
def on_stock_trade(self, trade):
print(f'成交回报: 股票代码:{trade.stock_code} 账号:{trade.account_id}, 订单编号:{trade.order_id} 柜台合同编号:{trade.order_sysid}
成交编号:{trade.traded_id} 成交数量:{trade.traded_volume} 委托数量:{trade.direction} ')
def on_order_error(self, order_error):
print(f"报单失败: 订单编号:{order_error.order_id} 下单失败具体信息:{order_error.error_msg} 委托备注:{order_error.order_remark}")
def on_cancel_error(self, cancel_error):
print(f"撤单失败: 订单编号:{cancel_error.order_id} 失败具体信息:{cancel_error.error_msg} 市场:{cancel_error.market}")
def on_order_stock_async_response(self, response):
print(f"异步下单的请求序号:{response.seq}, 订单编号:{response.order_id} ")
def on_account_status(self, status):
print(f"账号状态发生变化, 账号:{status.account_id} 最新状态:{status.status}")
def create_trader(xt_acc,path, session_id):
trader = XtQuantTrader(path, session_id,callback=MyXtQuantTraderCallback())
trader.start()
connect_result = trader.connect()
trader.subscribe(xt_acc)
return trader if connect_result == 0 else None
def try_connect(xt_acc,path):
session_id_range = [i for i in range(100, 120)]
import random
random.shuffle(session_id_range)
# 遍历尝试session_id列表尝试连接
for session_id in session_id_range:
trader = create_trader(xt_acc,path, session_id)
if trader:
print('连接成功,session_id:{}', session_id)
return trader
else:
print('连接失败,session_id:{},继续尝试下一个id', session_id)
continue
print('所有id都尝试后仍失败,放弃连接')
return None
def get_xttrader(xt_acc,path):
global xt_trader
if xt_trader is None:
xt_trader = try_connect(xt_acc,path)
return xt_trader
if __name__ == "__main__":
# 注意实际连接XtQuantTrader时不要写类似while True 这种无限循环的尝试,因为每次连接都会用session_id创建一个对接文件,这样就会占满硬盘导致电脑运行异常
# 要控制session_id在有限的范围内尝试,这里提供10个session_id供重连尝试
# 当所有session_id都尝试后,程序会抛出异常。实际使用过程中当session_id用完时,可以增加邮件等通知方式提醒人工处理
#指定客户端所在路径
path = 'E:\\qmt\\userdata_mini'
xt_trader = None
xt_acc = StockAccount('2000204')
xt_trader = get_xttrader(xt_acc,path)
if not xt_trader:
raise Exception('交易接口连接失败')
print('交易接口连接成功, 策略开始')
stock = '513050.SH'
xtdata.subscribe_quote(stock, '5m','','',count=-1)
time.sleep(1)
order_record = []
while '093000'<=time.strftime('%H%M%S')<'150000':
time.sleep(3)
xt_trader = get_xttrader(xt_acc,path)
price = xtdata.get_market_data_ex(['close'],[stock],period='5m',)[stock]
#计算均线
ma5 = price['close'].rolling(5).mean()
ma10 = price['close'].rolling(10).mean()
if ma5.iloc[-1]>ma5.iloc[-10]:
t = price.index[-1]
order_flag = (t, '买')
if order_flag not in order_record: #防止重复下单
print(f'发起买入 {stock} k线时间:{t}')
# 用最新价买100股
xt_trader.order_stock_async(xt_acc, stock, xtconstant.STOCK_BUY,100,xtconstant.LATEST_PRICE,0)
order_record.append(order_flag)
elif ma5.iloc[-1]<ma5[-10]:
t = price.index[-1]
order_flag = (t, '卖')
if order_flag not in order_record: #防止重复下单
print(f'发起卖出 {stock} k线时间:{t}')
# 用最新价买100股
xt_trader.order_stock_async(xt_acc, stock, xtconstant.STOCK_SELL,100,xtconstant.LATEST_PRICE,0)
order_record.append(order_flag)指定session id范围连接交易
该示例演示指定session重试连接次数的代码处理。
#coding:utf-8
def connect(path, session):
from xtquant import xttrader
trader = xttrader.XtQuantTrader(path, session)
trader.start()
connect_result = trader.connect()
return trader if connect_result == 0 else None
def try_connect_range():
# 随机 session_id 的待尝试列表
# 100以内的id保留
ids = [i for i in range(100, 200)]
import random
random.shuffle(ids)
# 要连接到的对接路径
path = r'userdata_mini'
# 遍历id列表尝试连接
for session_id in ids:
print(f'尝试id:{session_id}')
trader = connect(path, session_id)
if trader:
print('连接成功')
return trader
else:
print('连接失败,继续尝试下一个id')
continue
# 所有id都尝试后仍失败,放弃连接
raise Exception('XtQuantTrader 连接失败,请重试')
try:
trader = try_connect_range()
except Exception as e:
import traceback
print(e, traceback.format_exc())
import time
while True:
print('.', end = '')
time.sleep(2)信用账号执行还款
本示例用于展示如何使用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_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, repay_money, xtconstant.FIX_PRICE, -1, 'strategy_name', 'remark')
# 阻塞线程,接收交易推送
xt_trader.run_forever()下单后通过回调撤单
import pandas as pd
import numpy as np
import datetime
from xtquant import xtdata,xttrader
from xtquant.xttype import StockAccount
from xtquant import xtconstant
from xtquant.xttrader import XtQuantTraderCallback
import sys
import time
"""
异步下单委托流程为
1.order_stock_async发出委托
2.回调on_order_stock_async_response收到回调信息
3.回调on_stock_order收到委托信息
4.回调cancel_order_stock_sysid_async发出异步撤单指令
5.回调on_cancel_order_stock_async_response收到撤单回调信息
6.回调on_stock_order收到委托信息
"""
strategy_name = "委托撤单测试"
class MyXtQuantTraderCallback(XtQuantTraderCallback):
# 用于接收回调信息的类
def on_stock_order(self, order):
"""
委托回报推送
:param order: XtOrder对象
:return:
"""
# 属性赋值
account_type = order.account_type # 账号类型
account_id = order.account_id # 资金账号
stock_code = order.stock_code # 证券代码,例如"600000.SH"
order_id = order.order_id # 订单编号
order_sysid = order.order_sysid # 柜台合同编号
order_time = order.order_time # 报单时间
order_type = order.order_type # 委托类型,参见数据字典
order_volume = order.order_volume # 委托数量
price_type = order.price_type # 报价类型,该字段在返回时为柜台返回类型,不等价于下单传入的price_type,枚举值不一样功能一样,参见数据字典
price = order.price # 委托价格
traded_volume = order.traded_volume # 成交数量
traded_price = order.traded_price # 成交均价
order_status = order.order_status # 委托状态,参见数据字典
status_msg = order.status_msg # 委托状态描述,如废单原因
strategy_name = order.strategy_name # 策略名称
order_remark = order.order_remark # 委托备注
direction = order.direction # 多空方向,股票不适用;参见数据字典
offset_flag = order.offset_flag # 交易操作,用此字段区分股票买卖,期货开、平仓,期权买卖等;参见数据字典
# 打印输出
print(f"""
=============================
委托信息
=============================
账号类型: {order.account_type},
资金账号: {order.account_id},
证券代码: {order.stock_code},
订单编号: {order.order_id},
柜台合同编号: {order.order_sysid},
报单时间: {order.order_time},
委托类型: {order.order_type},
委托数量: {order.order_volume},
报价类型: {order.price_type},
委托价格: {order.price},
成交数量: {order.traded_volume},
成交均价: {order.traded_price},
委托状态: {order.order_status},
委托状态描述: {order.status_msg},
策略名称: {order.strategy_name},
委托备注: {order.order_remark},
多空方向: {order.direction},
交易操作: {order.offset_flag}
""")
if order.strategy_name == strategy_name:
# 该委托是由本策略发出
ssid = order.order_sysid
status = order.order_status
market = order.stock_code.split(".")[1]
# print(ssid)
if ssid and status in [50,55]:
## 使用cancel_order_stock_sysid_async时,投研端market参数可以填写为0,券商端按实际情况填写
print(xt_trade.cancel_order_stock_sysid_async(account,0,ssid))
def on_stock_trade(self, trade):
"""
成交变动推送
:param trade: XtTrade对象
:return:
"""
print(datetime.datetime.now(), '成交回调', trade.order_remark,trade.stock_code,trade.traded_volume,trade.offset_flag)
def on_order_stock_async_response(self, response):
"""
异步下单回报推送
:param response: XtOrderResponse 对象
:return:
"""
print(datetime.datetime.now(),'异步下单编号为:',response.seq)
def on_cancel_order_stock_async_response(self, response):
"""
异步撤单回报
:param response: XtCancelOrderResponse 对象
:return:
"""
account_type = response.account_type # 账号类型
account_id = response.account_id # 资金账号
order_id = response.order_id # 订单编号
order_sysid = response.order_sysid # 柜台委托编号
cancel_result = response.cancel_result # 撤单结果
seq = response.seq # 异步撤单的请求序号
print(f"""
===========================
异步撤单回调信息
===========================
账号类型: {response.account_type},
资金账号: {response.account_id},
订单编号: {response.order_id},
柜台委托编号: {response.order_sysid},
撤单结果: {response.cancel_result},
异步撤单的请求序号: {response.seq}""")
pass
callback = MyXtQuantTraderCallback()
# 填投研端的期货账号
account = StockAccount("1000024",account_type = "FUTURE")
# 填写投研端的股票账号
# account = StockAccount("2000567")
# 填投研端的userdata路径,miniqmt指定到userdata_mini
xt_trade = xttrader.XtQuantTrader(r"C:\\Program Files\\测试1\\迅投极速交易终端睿智融科版\\userdata",int(time.time()))
# 注册接受回调
xt_trade.register_callback(callback)
# 启动交易线程
xt_trade.start()
# 链接交易
connect_result = xt_trade.connect()
# 订阅账号信息,接受这个账号的回调,回调是账号维度的
subscribe_result = xt_trade.subscribe(account)
print(subscribe_result)
code = "rb2410.SF"
# code = "000001.SZ"
tick = xtdata.get_full_tick([code])[code]
last_price = tick["lastPrice"] # 最新价
ask_price = round(tick["askPrice"][0],3) # 卖方1档价
bid_price = round(tick["bidPrice"][4],3) # 买方5档价
symbol_info = xtdata.get_instrument_detail(code)
up_limit = symbol_info["UpStopPrice"]
down_limit = symbol_info["DownStopPrice"]
lots = 1
res_id = xt_trade.order_stock_async(account, code, xtconstant.FUTURE_OPEN_LONG, lots, xtconstant.FIX_PRICE, down_limit, strategy_name, "跌停价/固定手数")
# lots = 100
# res_id = xt_trade.order_stock_async(account, code, xtconstant.STOCK_BUY, lots, xtconstant.FIX_PRICE, bid_price, strategy_name, "跌停价/固定手数")
xtdata.run()| 更新日期 | 版本 | 下载 | 更新说明 |
|---|---|---|---|
| 20250516 | xtquant_250516 | 点击下载<br>压缩包目录结构已调整到和之前一致,带有xtquant文件夹 | 支持python3.13版本<br>xttrader 支持银证转账<br> 银行信息查询 xttrader.query_bank_info()<br>银行账户余额查询xttrader.query_bank_amount()<br> 银证转账转入 xttrader.bank_transfer_in()<br> 银证转账转出 xttrader.bank_transfer_out()<br> 银行卡流水记录查询xttrader.query_bank_transfer_stream()<br>xttrader 支持期货和期权资金划转<br>权资金转期货 xttrader.ctp_transfer_option_to_future()<br>期货资金转期权 xttrader.ctp_transfer_future_to_option()<br>xttrader支持北交所<br>xtconstant 添加北交所市价报价方式说明<br>xttrader 交易数据字段调整<br>委托 XtOrder 新增<br>股东代码 secu_account<br>证券名称 instrument_name<br>成交 XtTrade 新增<br>股东代码 secu_account<br>证券名称 instrument_name<br>持仓 XtPosition 新增<br>股东代码 secu_account<br>证券名称 instrument_name<br>当前价 last_price<br>盈亏比例 profit_rate<br>浮动盈亏 float_profit<br>持仓盈亏 position_profit<br>开仓日期 open_date(只对期货可用)<br>账号资金 XtAsset 新增<br>可取余额 fetch_balance<br>当前余额 current_balance(当前余额 = 可用资金 + 冻结资金)<br>xtdata获取数据函数支持以datetime形式传入时间范围<br>合约信息添加交易日字段 TradingDay<br>xtdata.get_instrument_detail()<br>支持获取大单统计数据(需要vip权限)<br>xtdata.get_transactioncount()<br>支持获取带有分类信息的板块列表(需要投研版本)<br>xtdata.get_sector_info()<br>期权合约信息添加期权预估保证金 OptEstimatedMargin(需要投研版本)<br>xtdata.get_option_detail_data()<br>郑商所期货、期权品种提供标准化代码的字段(如 MA2504.ZF)(需要投研版本)<br>xtdata获取数据函数支持ATM市场<br>xtdata.get_market_data()<br>xtdata.get_market_data_ex()<br>BugFix: 订阅数据问题 |
| 20241017 | xtquant_241014 | 点击下载 | xtdata.get_option_detail_data()期权多空方向类型判断调整<br>xtdata.get_trading_calendar() 自动下载所需的节假日数据<br>xtdata.get_instrument_detail() 字段ExpireDate类型由int调整为str<br>tick数据增加现手字段(tickvol),即当前tick累计成交量与上条数据的差值<br>新增函数xtdata.get_formula_result(),用于获取subscribe_formula()的模型结果<br>修复token模式下启用K线全推后单支订阅数据周期错误的问题 |
| 20240926 | xtquant_240920a | 有已知缺陷,暂不提供下载<br>在token模式下,启用K线全推后单支订阅数据周期错误 | 修复xtdata.subscribe_quote()返回订阅号为None的问题 |
| 20240923 | xtquant_240920 | 有已知缺陷,暂不提供下载 | token模式,可以设置初始化的市场列表<br>xtdatacenter.set_init_markets()<br>函数xtdata.get_period_list() 结果结构调整<br>添加函数 xtdata.get_trading_contract_list()<br>获取当前主力合约可交易标的列表<br>添加用于获取交易时段的系列函数<br>xtdata.get_trading_period()<br>xtdata.get_all_trading_periods()<br>xtdata.get_all_kline_trading_periods()<br>添加函数 xtdata.subscribe_quote2()<br>支持复权方式参数 |
| 20240822 | xtquant_240812 | 点击下载 | 期货夜盘显示真实时间功能默认开启<br>未开启时, 周六凌晨的行情数据时间为周一<br>开启时,周六凌晨的行情数据时间为周六<br>新增板块:过期上交所、过期深交所<br>沪港通深港通板块不再显示历史标的<br>撤单接口的市场参数支持字符串格式,如SH、SF<br>xttrader.cancel_order_stock_sysid()和xttrader.cancel_order_stock_sysid_async()<br>添加函数xtdata.get_his_option_list_batch()和xtdata.get_his_option_list()<br>获取历史上某段时间的指定品种期权信息列表<br>依赖数据'optionhistorycontract'<br>期权函数支持商品期权品种 xtdata.get_option_undl_data()和xtdata.get_option_list()<br>郑商所期权标的代码调整为4位 xtdata.get_option_detail_data()<br>移除郑商所过滤重复tick的逻辑 |
| 20240617 | xtquant_240613 | 点击下载 | 支持python3.12版本<br>xtdata支持选择端口范围,在范围内自动连接<br>添加函数xtdata.get_full_kline() 批量获取当日K线数据(需要开启K线全推)<br>支持获取新闻公告数据<br>xtdata.get_market_data()系列函数 数据周期:announcement<br>支持获取涨跌停连板数据<br>xtdata.get_market_data()系列函数 数据周期:limitupperformance<br>支持获取港股通持股明细数据<br>xtdata.get_market_data()系列函数 数据周期:hktdetails,hktstatistics<br>支持获取外盘的行情数据(需购买相应服务)<br>行情订阅xtdata.subscribe_quote()和行情获取xtdata.get_market_data()系列函数,支持美股品种的获取<br>支持订阅vba模型(连接投研端)<br>xtdata.subscribe_formula()<br>token模式下初始化全推市场可选<br>xtdatacenter.set_wholequote_market_list()<br>token模式下行情连接优选机制调整<br>xtdatacenter.set_allow_optmize_address()会使用第一个地址作为全推连接<br>token模式下期货周末夜盘数据时间模式可选,可以选择展示为周一凌晨时间或真实的周六凌晨时间<br>xtdatacenter.set_future_realtime_mode() |
| 20240329 | xtquant_240329 | 点击下载 | 郑商所期货品种支持使用4位年月代码(例如:CF2303.ZF)<br>xtdata.get_instrument_detail()支持使用4位年月代码获取<br>历史主力合约数据 新增4位年月代码字段<br>支持获取etf的iopv数据<br>分笔数据添加iopv字段(pe)<br>xtdata.get_market_data()系列函数 数据周期:etfiopv1m(分钟级) etfiopv1d(日级)<br>期权函数xtdata.get_option_detail_data() 新增标的品种代码字段 OptUndlCodeFull<br>新增板块 上证转债、沪深转债、T+0基金<br>连接状态监听接口回调数据结构调整<br>xtdata.watch_quote_server_status()<br>xtdata.watch_xtquant_status()<br>新增接口 xtdata.subscribe_formula() 支持连接投研端调用vba<br>token模式下支持按用户权限放开并行接入数量 <br>本地python回测支持多线程<br>优化7\*24连续交易的问题 |
| 20240205 | xtquant_240119b | 点击下载 | 修复token模式下偶发的订阅数据异常问题<br>有问题的版本:240119, 240119a<br>token模式下并行接入数量放宽至10个 |
| 20240129 | xtquant_240119a | 点击下载 | 合约信息接口支持参数控制获取全部字段<br>xtdata.get_instrument_detail(iscomplete = True)并添加以下字段<br>期货和期权手续费方式(ChargeType)<br>开仓手续费(率)(ChargeOpen)<br>平仓手续费(率)(ChargeClose)<br>开今仓(日内开仓)手续费(率)(ChargeTodayOpen)<br>平今仓(日内平仓)手续费(率)(ChargeTodayClose)<br>交割月持仓倍数(OpenInterestMultiple)<br>添加客户端连接状态监听接口 xtdata.watch_xtquant_status()<br>支持获取退市可转债数据<br>xtdata.get_market_data()系列函数 数据周期:delistchangebond<br>支持获取待发可转债数据<br>xtdata.get_market_data()系列函数 数据周期:replacechangebond<br>优化K线全推的断线重连逻辑 |
| 20240119 | xtquant_240119 | 点击下载 | xtdata.subscribe_quote()和xtdata.get_market_data()系列函数,添加新的K线数据周期<br>新周期包含:周线(1w)、月线(1mon)、季度线(1q)、半年线(1hy)、年线(1y)<br>支持获取千档委买委卖队列数据(待后续迅投lv2数据源上线后可用)<br>订阅函数 xtdata.subscribe_l2thousand_queue()<br>获取函数 xtdata.get_l2thousand_queue()<br>支持港股lv2数据(待后续迅投lv2数据源上线后可用)<br>支持获取港股席位数据<br>订阅函数 xtdata.subscribe_quote(period = 'brokerqueue')<br>获取函数 xtdata.get_broker_queue_data()<br>xtdata.get_full_tick()在VIP模式下提供成交笔数字段(transactionNum)<br>xtdata.get_option_detail_data()支持获取商品期权数据<br>支持获取历史主力合约数据<br>xtdata.get_market_data()系列函数 数据周期:historymaincontract<br>修复 获取上证期权、深证期权tick行情数据价格精度错误的问题<br>修复 期货夜盘分钟线获取不到的问题<br>优化下载数据流程<br>支持设置行情源自动连接目标地址范围<br>xtdatacenter.set_allow_optmize_address()<br>xtdata.get_local_data()支持指定数据路径 |
| 20231228 | xtquant_231209a | 点击下载 | 修复xtdata.get_trading_calendar()获取历史范围返回数据重复的问题<br>添加xtdata.get_trading_calendar()目前仅支持SH,SZ市场的说明(其他市场交易日历陆续对接中)<br>添加快照指标数据周期 'snapshotindex'(包含量比、涨速、换手等字段)<br>修复板块指数(BKZS)分钟线获取不到的问题<br>添加xtdatacenter中的北交所、沪深京A股板块<br>修复xtdata.subscribe_whole_quote()订阅全推数据中的pvolume字段单位错误<br>(股票、转债的pvolume单位为股,所有品种volume单位均为手,其余品种情况详见网页文档) |
| 20231209 | xtquant_231209 | 点击下载 | 添加ETF申赎清单信息相关接口<br>下载数据 xtdata.download_etf_info()<br>获取数据 xtdata.get_etf_info()<br>添加节假日下载的接口 download_holiday_data(获取交易日历依赖节假日)<br>添加涨跌停数据,数据周期'stoppricedata'<br>添加连接成功时连接状态日志<br>添加财务数据文档中十大股东、股东数的字段说明<br>修复历史st数据获取失败的问题<br>修复xtdatacenter提供数据时,和接收进程运行目录不同出现获取失败的问题<br>优化模块退出时的表现<br>移除xtdata.get_industry()接口 |
| 20231124 | xtquant_231101c | 点击下载 | 修复xtdata.get_market_data()系列的内存泄漏问题<br>xtdatacenter.init()在重要市场初始化失败时抛出异常信息<br>全推数据在第一次使用时订阅,减少不必要的带宽占用<br>修复xtdatacenter退出时崩溃的问题<br>修复同目录下xtdatacenter重复启动卡住的问题<br>补全期货全推的月份连续合约(例如 ag01.SF)和交易合约(例如 ag2401.SF)<br>日志相关优化 |
| 20231110 | xtquant_231101b | 点击下载 | 修复过期合约板块成分为空的问题<br>优化xtdatatcenter监听端口后连接接入的时序<br>xtdata.download_history_data添加增量下载参数,支持指定起始时间的增量下载<br>修复token无效时调用接口崩溃的问题 |
| 20231106 | xtquant_231101a | 点击下载 | 修复退出时发生异常的问题<br>优化初始化过程中行情连接和数据订阅的时序 |
| 20231101 | xtquant_231101 | 点击下载 | 添加xtdatacenter,支持以token方式登录行情服务<br>添加xtdata.QuoteServer,支持通过xtdata控制、监控行情连接<br>补充xtdata中对转债交易场景、ETF交易场景的数据支持<br>调整了一些底层数据交互的实现方式<br>完善xttrader期货交易场景下的开平仓方向字段 |
| 20230920 | xtquant_230825b | 点击下载 | 对应当前QMT券商版公版的下载python库<br>券商版会有版本升级跟不上的情况,通常请使用这个公版版本以保证兼容性 |
| 20230905 | xtquant_230825a | 点击下载 | - |
| 20230825 | xtquant_230825 | 点击下载 | - |
| 20230301 | xtquant_230301 | 点击下载 | - |
| 20220817 | xtquant_220817 | 点击下载 | - |
导入xtquant库时提示 NO module named 'xtquant.IPythonAPiClient'
目前xtquant支持的python版本为 64 位 python3.6-3.11,请使用支持的 python 版本重试
连接 xtquant 时失败,返回-1及解决方法
1. 客户端是否以极简模式登录(登录qmt系统时需要勾选极简模式) 2. 检查路径是否正确
miniqmt:路径指定到安装目录下\userdata_mini文件夹投研端:路径指定到安装目录下\userdata文件夹
3. 客户端安装在C盘的话,每次都需要用管理员权限运行策略,才能正常连接,否则有权限问题。
不建议安装在C盘。
可以通过以下测试来验证是否有写入权限:
file_path = r"d:\qmt\userdata_mini\example.txt" # 设置文件路径和名称
# 使用open函数创建文件,并指定写入模式("w"表示写入模式)
with open(file_path, "w") as file:
file.write("123") # 向文件写入内容如果出现PermissionError,则说明存在文件权限问题
4. 路径正确时换个session(任意整数即可)
由于机制限制,同一个session的两次python进程 connect之间必须超过3秒钟
5. 如果miniqmt开启后, userdata_mini文件夹内没有up_queue_xtquant文件,说明没有用户没有对应函数下单的权限,需要联系券商开启
执行xtdatacenter.init时提示监听58609端口失败
说明当前环境的58609端口被其他程序占用,通常是启动了两个xtdc服务导致的
方法1. 可用通过指定xtdc.init(False)后,使用xtdc.listen(port)指定自己需要的端口
from xtquant import xtdatacenter as xtdc
xtdc.set_token("这里输入token")
xtdc.init(False)
port = 58601
xtdc.listen(port=port)
print(f"服务启动,开放端口:{port}")方法2. 关闭所有py程序,或重启电脑,再执行xtdc.init
下单后,查询委托的投资备注只有前半部分
极简客户端的order_remark字段有长度限制,最大 24 个英文字符(一个中文占3个), 超出的部分会丢弃。大qmt 没有长度限制。
userdata_mini目录下,生成大量down_queue文件
该文件是xttrade指定新的session产生的文件,可以参考下方示例来控制session产生的范围,避免该文件大量产生, 该文件可以删除
指定session id范围连接交易
XtQuant 能提供哪些服务
XtQuant是基于迅投MiniQMT衍生出来的一套完善的Python策略运行框架,对外以Python库的形式提供策略交易所需要的行情和交易相关的API接口。
XtQuant 运行依赖环境
XtQuant 目前提供的库包括 64 位 Python 3.6、3.7、3.8、3.9、3.10、3.11、3.12版本,不同版本的 Python 导入时会自动切换。 在运行使用 XtQuant 的程序前需要先启动 MiniQMT 客户端。
XtQuant 运行逻辑
Xtdata 作为行情模块,本模块旨在提供精简直接的数据满足量化交易者的数据需求,主要提供行情数据(历史和实时的K线和分笔)、财务数据、合约基础信息、板块和行业分类信息等通用的行情数据。
Xttrader 作为交易模块,封装了策略交易所需要的 Python API 接口,可以和 MiniQMT 客户端交互进行报单、撤单、查询资产、查询委托、查询成交、查询持仓以及接收资金、委托、成交和持仓等变动的主推消息。
附录:xtdata行情数据字段与数据字典详情
行情数据字段列表
tick - 分笔数据
'time' #时间戳
'lastPrice' #最新价
'open' #开盘价
'high' #最高价
'low' #最低价
'lastClose' #前收盘价
'amount' #成交总额
'volume' #成交总量
'pvolume' #原始成交总量
'stockStatus' #证券状态
'openInt' #持仓量
'lastSettlementPrice' #前结算
'askPrice' #委卖价
'bidPrice' #委买价
'askVol' #委卖量
'bidVol' #委买量
'transactionNum' #成交笔数1m / 5m / 1d - K线数据
'time' #时间戳
'open' #开盘价
'high' #最高价
'low' #最低价
'close' #收盘价
'volume' #成交量
'amount' #成交额
'settelementPrice' #今结算
'openInterest' #持仓量
'preClose' #前收价
'suspendFlag' #停牌标记 0 - 正常 1 - 停牌 -1 - 当日起复牌除权数据
'interest' #每股股利(税前,元)
'stockBonus' #每股红股(股)
'stockGift' #每股转增股本(股)
'allotNum' #每股配股数(股)
'allotPrice' #配股价格(元)
'gugai' #是否股改, 对于股改,在算复权系数时,系统有特殊算法
'dr' #除权系数l2quote - level2实时行情快照
'time' #时间戳
'lastPrice' #最新价
'open' #开盘价
'high' #最高价
'low' #最低价
'amount' #成交额
'volume' #成交总量
'pvolume' #原始成交总量
'openInt' #持仓量
'stockStatus' #证券状态
'transactionNum' #成交笔数
'lastClose' #前收盘价
'lastSettlementPrice' #前结算
'settlementPrice' #今结算
'pe' #市盈率
'askPrice' #多档委卖价
'bidPrice' #多档委买价
'askVol' #多档委卖量
'bidVol' #多档委买量l2order - level2逐笔委托
'time' #时间戳
'price' #委托价
'volume' #委托量
'entrustNo' #委托号
'entrustType' #委托类型
'entrustDirection' #委托方向l2transaction - level2逐笔成交
'time' #时间戳
'price' #成交价
'volume' #成交量
'amount' #成交额
'tradeIndex' #成交记录号
'buyNo' #买方委托号
'sellNo' #卖方委托号
'tradeType' #成交类型
'tradeFlag' #成交标志l2quoteaux - level2实时行情补充(总买总卖)
'time' #时间戳
'avgBidPrice' #委买均价
'totalBidQuantity' #委买总量
'avgOffPrice' #委卖均价
'totalOffQuantity' #委卖总量
'withdrawBidQuantity' #买入撤单总量
'withdrawBidAmount' #买入撤单总额
'withdrawOffQuantity' #卖出撤单总量
'withdrawOffAmount' #卖出撤单总额l2orderqueue - level2委买委卖一档委托队列
'time' #时间戳
'bidLevelPrice' #委买价
'bidLevelVolume' #委买量
'offerLevelPrice' #委卖价
'offerLevelVolume' #委卖量
'bidLevelNumber' #委买数量
'offLevelNumber' #委卖数量数据字典
证券状态
0,10 - 默认为未知
11 - 开盘前S
12 - 集合竞价时段C
13 - 连续交易T
14 - 休市B
15 - 闭市E
16 - 波动性中断V
17 - 临时停牌P
18 - 收盘集合竞价U
19 - 盘中集合竞价M
20 - 暂停交易至闭市N
21 - 获取字段异常
22 - 盘后固定价格行情
23 - 盘后固定价格行情完毕委托类型
- level2逐笔委托 -
entrustType委托类型 - level2逐笔成交 -
tradeType成交类型
0 - 未知
1 - 正常交易业务
2 - 即时成交剩余撤销
3 - ETF基金申报
4 - 最优五档即时成交剩余撤销
5 - 全额成交或撤销
6 - 本方最优价格
7 - 对手方最优价格委托方向
- level2逐笔委托 -
entrustDirection委托方向 - 注:上交所的撤单信息在逐笔委托的委托方向,区分撤买撤卖
1 - 买入
2 - 卖出
3 - 撤买(上交所)
4 - 撤卖(上交所)成交标志
- level2逐笔成交 -
tradeFlag成交标志 - 注:深交所的在逐笔成交的成交标志,只有撤单,没有方向
0 - 未知
1 - 外盘
2 - 内盘
3 - 撤单(深交所)现金替代标志
- ETF申赎清单成份股现金替代标志
0 - 禁止现金替代(必须有股票)
1 - 允许现金替代(先用股票,股票不足的话用现金替代
2 - 必须现金替代
3 - 非沪市(股票)退补现金替代
4 - 非沪市(股票)必须现金替代
5 - 非沪深退补现金替代
6 - 非沪深必须现金替代
7 - 港市退补现金替代(仅适用于跨沪深ETF产品)
8 - 港市必须现金替代(仅适用于跨沪深港ETF产品)财务数据字段列表
Balance - 资产负债表
'm_anntime' #披露日期
'm_timetag' #截止日期
'internal_shoule_recv' #内部应收款
'fixed_capital_clearance' #固定资产清理
'should_pay_money' #应付分保账款
'settlement_payment' #结算备付金
'receivable_premium' #应收保费
'accounts_receivable_reinsurance' #应收分保账款
'reinsurance_contract_reserve' #应收分保合同准备金
'dividends_payable' #应收股利
'tax_rebate_for_export' #应收出口退税
'subsidies_receivable' #应收补贴款
'deposit_receivable' #应收保证金
'apportioned_cost' #待摊费用
'profit_and_current_assets_with_deal' #待处理流动资产损益
'current_assets_one_year' #一年内到期的非流动资产
'long_term_receivables' #长期应收款
'other_long_term_investments' #其他长期投资
'original_value_of_fixed_assets' #固定资产原值
'net_value_of_fixed_assets' #固定资产净值
'depreciation_reserves_of_fixed_assets' #固定资产减值准备
'productive_biological_assets' #生产性生物资产
'public_welfare_biological_assets' #公益性生物资产
'oil_and_gas_assets' #油气资产
'development_expenditure' #开发支出
'right_of_split_share_distribution' #股权分置流通权
'other_non_mobile_assets' #其他非流动资产
'handling_fee_and_commission' #应付手续费及佣金
'other_payables' #其他应交款
'margin_payable' #应付保证金
'internal_accounts_payable' #内部应付款
'advance_cost' #预提费用
'insurance_contract_reserve' #保险合同准备金
'broker_buying_and_selling_securities' #代理买卖证券款
'acting_underwriting_securities' #代理承销证券款
'international_ticket_settlement' #国际票证结算
'domestic_ticket_settlement' #国内票证结算
'deferred_income' #递延收益
'short_term_bonds_payable' #应付短期债券
'long_term_deferred_income' #长期递延收益
'undetermined_investment_losses' #未确定的投资损失
'quasi_distribution_of_cash_dividends' #拟分配现金股利
'provisions_not' #预计负债
'cust_bank_dep' #吸收存款及同业存放
'provisions' #预计流动负债
'less_tsy_stk' #减:库存股
'cash_equivalents' #货币资金
'loans_to_oth_banks' #拆出资金
'tradable_fin_assets' #交易性金融资产
'derivative_fin_assets' #衍生金融资产
'bill_receivable' #应收票据
'account_receivable' #应收账款
'advance_payment' #预付款项
'int_rcv' #应收利息
'other_receivable' #其他应收款
'red_monetary_cap_for_sale' #买入返售金融资产
'agency_bus_assets' #以公允价值计量且其变动计入当期损益的金融资产
'inventories' #存货
'other_current_assets' #其他流动资产
'total_current_assets' #流动资产合计
'loans_and_adv_granted' #发放贷款及垫款
'fin_assets_avail_for_sale' #可供出售金融资产
'held_to_mty_invest' #持有至到期投资
'long_term_eqy_invest' #长期股权投资
'invest_real_estate' #投资性房地产
'accumulated_depreciation' #累计折旧
'fix_assets' #固定资产
'constru_in_process' #在建工程
'construction_materials' #工程物资
'long_term_liabilities' #长期负债
'intang_assets' #无形资产
'goodwill' #商誉
'long_deferred_expense' #长期待摊费用
'deferred_tax_assets' #递延所得税资产
'total_non_current_assets' #非流动资产合计
'tot_assets' #资产总计
'shortterm_loan' #短期借款
'borrow_central_bank' #向中央银行借款
'loans_oth_banks' #拆入资金
'tradable_fin_liab' #交易性金融负债
'derivative_fin_liab' #衍生金融负债
'notes_payable' #应付票据
'accounts_payable' #应付账款
'advance_peceipts' #预收账款
'fund_sales_fin_assets_rp' #卖出回购金融资产款
'empl_ben_payable' #应付职工薪酬
'taxes_surcharges_payable' #应交税费
'int_payable' #应付利息
'dividend_payable' #应付股利
'other_payable' #其他应付款
'non_current_liability_in_one_year' #一年内到期的非流动负债
'other_current_liability' #其他流动负债
'total_current_liability' #流动负债合计
'long_term_loans' #长期借款
'bonds_payable' #应付债券
'longterm_account_payable' #长期应付款
'grants_received' #专项应付款
'deferred_tax_liab' #递延所得税负债
'other_non_current_liabilities' #其他非流动负债
'non_current_liabilities' #非流动负债合计
'tot_liab' #负债合计
'cap_stk' #实收资本(或股本)
'cap_rsrv' #资本公积
'specific_reserves' #专项储备
'surplus_rsrv' #盈余公积
'prov_nom_risks' #一般风险准备
'undistributed_profit' #未分配利润
'cnvd_diff_foreign_curr_stat' #外币报表折算差额
'tot_shrhldr_eqy_excl_min_int' #归属于母公司股东权益合计
'minority_int' #少数股东权益
'total_equity' #所有者权益合计
'tot_liab_shrhldr_eqy' #负债和股东权益总计Income - 利润表
'm_anntime' #披露日期
'm_timetag' #截止日期
'revenue_inc' #营业收入
'earned_premium' #已赚保费
'real_estate_sales_income' #房地产销售收入
'total_operating_cost' #营业总成本
'real_estate_sales_cost' #房地产销售成本
'research_expenses' #研发费用
'surrender_value' #退保金
'net_payments' #赔付支出净额
'net_withdrawal_ins_con_res' #提取保险合同准备金净额
'policy_dividend_expenses' #保单红利支出
'reinsurance_cost' #分保费用
'change_income_fair_value' #公允价值变动收益
'futures_loss' #期货损益
'trust_income' #托管收益
'subsidize_revenue' #补贴收入
'other_business_profits' #其他业务利润
'net_profit_excl_merged_int_inc' #被合并方在合并前实现净利润
'int_inc' #利息收入
'handling_chrg_comm_inc' #手续费及佣金收入
'less_handling_chrg_comm_exp' #手续费及佣金支出
'other_bus_cost' #其他业务成本
'plus_net_gain_fx_trans' #汇兑收益
'il_net_loss_disp_noncur_asset' #非流动资产处置收益
'inc_tax' #所得税费用
'unconfirmed_invest_loss' #未确认投资损失
'net_profit_excl_min_int_inc' #归属于母公司所有者的净利润
'less_int_exp' #利息支出
'other_bus_inc' #其他业务收入
'revenue' #营业总收入
'total_expense' #营业成本
'less_taxes_surcharges_ops' #营业税金及附加
'sale_expense' #销售费用
'less_gerl_admin_exp' #管理费用
'financial_expense' #财务费用
'less_impair_loss_assets' #资产减值损失
'plus_net_invest_inc' #投资收益
'incl_inc_invest_assoc_jv_entp' #联营企业和合营企业的投资收益
'oper_profit' #营业利润
'plus_non_oper_rev' #营业外收入
'less_non_oper_exp' #营业外支出
'tot_profit' #利润总额
'net_profit_incl_min_int_inc' #净利润
'net_profit_incl_min_int_inc_after' #净利润(扣除非经常性损益后)
'minority_int_inc' #少数股东损益
's_fa_eps_basic' #基本每股收益
's_fa_eps_diluted' #稀释每股收益
'total_income' #综合收益总额
'total_income_minority' #归属于少数股东的综合收益总额
'other_compreh_inc' #其他收益CashFlow - 现金流量表
'm_anntime' #披露日期
'm_timetag' #截止日期
'cash_received_ori_ins_contract_pre' #收到原保险合同保费取得的现金
'net_cash_received_rei_ope' #收到再保险业务现金净额
'net_increase_insured_funds' #保户储金及投资款净增加额
'Net' #处置交易性金融资产净增加额 increase_in_disposal
'cash_for_interest' #收取利息、手续费及佣金的现金
'net_increase_in_repurchase_funds' #回购业务资金净增加额
'cash_for_payment_original_insurance' #支付原保险合同赔付款项的现金
'cash_payment_policy_dividends' #支付保单红利的现金
'disposal_other_business_units' #处置子公司及其他收到的现金
'cash_received_from_pledges' #减少质押和定期存款所收到的现金
'cash_paid_for_investments' #投资所支付的现金
'net_increase_in_pledged_loans' #质押贷款净增加额
'cash_paid_by_subsidiaries' #取得子公司及其他营业单位支付的现金净额
'increase_in_cash_paid' #增加质押和定期存款所支付的现金
'cass_received_sub_abs' #其中子公司吸收现金
'cass_received_sub_investments' #其中:子公司支付给少数股东的股利、利润
'minority_shareholder_profit_loss' #少数股东损益
'unrecognized_investment_losses' #未确认的投资损失
'ncrease_deferred_income' #递延收益增加(减:减少)
'projected_liability' #预计负债
'increase_operational_payables' #经营性应付项目的增加
'reduction_outstanding_amounts_less' #已完工尚未结算款的减少(减:增加)
'reduction_outstanding_amounts_more' #已结算尚未完工款的增加(减:减少)
'goods_sale_and_service_render_cash' #销售商品、提供劳务收到的现金
'net_incr_dep_cob' #客户存款和同业存放款项净增加额
'net_incr_loans_central_bank' #向中央银行借款净增加额(万元
'net_incr_fund_borr_ofi' #向其他金融机构拆入资金净增加额
'net_incr_fund_borr_ofi' #拆入资金净增加额
'tax_levy_refund' #收到的税费与返还
'cash_paid_invest' #投资支付的现金
'other_cash_recp_ral_oper_act' #收到的其他与经营活动有关的现金
'stot_cash_inflows_oper_act' #经营活动现金流入小计
'goods_and_services_cash_paid' #购买商品、接受劳务支付的现金
'net_incr_clients_loan_adv' #客户贷款及垫款净增加额
'net_incr_dep_cbob' #存放中央银行和同业款项净增加额
'handling_chrg_paid' #支付利息、手续费及佣金的现金
'cash_pay_beh_empl' #支付给职工以及为职工支付的现金
'pay_all_typ_tax' #支付的各项税费
'other_cash_pay_ral_oper_act' #支付其他与经营活动有关的现金
'stot_cash_outflows_oper_act' #经营活动现金流出小计
'net_cash_flows_oper_act' #经营活动产生的现金流量净额
'cash_recp_disp_withdrwl_invest' #收回投资所收到的现金
'cash_recp_return_invest' #取得投资收益所收到的现金
'net_cash_recp_disp_fiolta' #处置固定资产、无形资产和其他长期投资收到的现金
'other_cash_recp_ral_inv_act' #收到的其他与投资活动有关的现金
'stot_cash_inflows_inv_act' #投资活动现金流入小计
'cash_pay_acq_const_fiolta' #购建固定资产、无形资产和其他长期投资支付的现金
'other_cash_pay_ral_oper_act' #支付其他与投资的现金
'stot_cash_outflows_inv_act' #投资活动现金流出小计
'net_cash_flows_inv_act' #投资活动产生的现金流量净额
'cash_recp_cap_contrib' #吸收投资收到的现金
'cash_recp_borrow' #取得借款收到的现金
'proc_issue_bonds' #发行债券收到的现金
'other_cash_recp_ral_fnc_act' #收到其他与筹资活动有关的现金
'stot_cash_inflows_fnc_act' #筹资活动现金流入小计
'cash_prepay_amt_borr' #偿还债务支付现金
'cash_pay_dist_dpcp_int_exp' #分配股利、利润或偿付利息支付的现金
'other_cash_pay_ral_fnc_act' #支付其他与筹资的现金
'stot_cash_outflows_fnc_act' #筹资活动现金流出小计
'net_cash_flows_fnc_act' #筹资活动产生的现金流量净额
'eff_fx_flu_cash' #汇率变动对现金的影响
'net_incr_cash_cash_equ' #现金及现金等价物净增加额
'cash_cash_equ_beg_period' #期初现金及现金等价物余额
'cash_cash_equ_end_period' #期末现金及现金等价物余额
'net_profit' #净利润
'plus_prov_depr_assets' #资产减值准备
'depr_fa_coga_dpba' #固定资产折旧、油气资产折耗、生产性物资折旧
'amort_intang_assets' #无形资产摊销
'amort_lt_deferred_exp' #长期待摊费用摊销
'decr_deferred_exp' #待摊费用的减少
'incr_acc_exp' #预提费用的增加
'loss_disp_fiolta' #处置固定资产、无形资产和其他长期资产的损失
'loss_scr_fa' #固定资产报废损失
'loss_fv_chg' #公允价值变动损失
'fin_exp' #财务费用
'invest_loss' #投资损失
'decr_deferred_inc_tax_assets' #递延所得税资产减少
'incr_deferred_inc_tax_liab' #递延所得税负债增加
'decr_inventories' #存货的减少
'decr_oper_payable' #经营性应收项目的减少
'others' #其他
'im_net_cash_flows_oper_act' #经营活动产生现金流量净额
'conv_debt_into_cap' #债务转为资本
'conv_corp_bonds_due_within_1y' #一年内到期的可转换公司债券
'fa_fnc_leases' #融资租入固定资产
'end_bal_cash' #现金的期末余额
'less_beg_bal_cash' #现金的期初余额
'plus_end_bal_cash_equ' #现金等价物的期末余额
'less_beg_bal_cash_equ' #现金等价物的期初余额
'im_net_incr_cash_cash_equ' #现金及现金等价物的净增加额
'tax_levy_refund' #收到的税费返还PershareIndex - 主要指标
's_fa_ocfps' #每股经营活动现金流量
's_fa_bps' #每股净资产
's_fa_eps_basic' #基本每股收益
's_fa_eps_diluted' #稀释每股收益
's_fa_undistributedps' #每股未分配利润
's_fa_surpluscapitalps' #每股资本公积金
'adjusted_earnings_per_share' #扣非每股收益
'du_return_on_equity' #净资产收益率
'sales_gross_profit' #销售毛利率
'inc_revenue_rate' #主营收入同比增长
'du_profit_rate' #净利润同比增长
'inc_net_profit_rate' #归属于母公司所有者的净利润同比增长
'adjusted_net_profit_rate' #扣非净利润同比增长
'inc_total_revenue_annual' #营业总收入滚动环比增长
'inc_net_profit_to_shareholders_annual' #归属净利润滚动环比增长
'adjusted_profit_to_profit_annual' #扣非净利润滚动环比增长
'equity_roe' #加权净资产收益率
'net_roe' #摊薄净资产收益率
'total_roe' #摊薄总资产收益率
'gross_profit' #毛利率
'net_profit' #净利率
'actual_tax_rate' #实际税率
'pre_pay_operate_income' #预收款 / 营业收入
'sales_cash_flow' #销售现金流 / 营业收入
'gear_ratio' #资产负债比率
'inventory_turnover' #存货周转率
'm_anntime' #公告日
'm_timetag' #报告截止日Capital - 股本表
'total_capital' #总股本
'circulating_capital' #已上市流通A股
'restrict_circulating_capital' #限售流通股份
'm_timetag' #报告截止日
'm_anntime' #公告日Top10holder/Top10flowholder - 十大股东/十大流通股东
'declareDate' #公告日期
'endDate' #截止日期
'name' #股东名称
'type' #股东类型
'quantity' #持股数量
'reason' #变动原因
'ratio' #持股比例
'nature' #股份性质
'rank' #持股排名Holdernum - 股东数
'declareDate' #公告日期
'endDate' #截止日期
'shareholder' #股东总数
'shareholderA' #A股东户数
'shareholderB' #B股东户数
'shareholderH' #H股东户数
'shareholderFloat' #已流通股东户数
'shareholderOther' #未流通股东户数合约信息字段列表
'ExchangeID' #合约市场代码
'InstrumentID' #合约代码
'InstrumentName' #合约名称
'Abbreviation' #合约名称的拼音简写
'ProductID' #合约的品种ID(期货)
'ProductName' #合约的品种名称(期货)
'UnderlyingCode' #标的合约
'ExtendName' #扩位名称
'ExchangeCode' #交易所代码
'RzrkCode' #rzrk代码
'UniCode' #统一规则代码
'CreateDate' #上市日期(期货)
'OpenDate' #IPO日期(股票)
'ExpireDate' #退市日或者到期日
'PreClose' #前收盘价格
'SettlementPrice' #前结算价格
'UpStopPrice' #当日涨停价
'DownStopPrice' #当日跌停价
'FloatVolume' #流通股本
'TotalVolume' #总股本
'AccumulatedInterest' #自上市付息日起的累积未付利息额(债券)
'LongMarginRatio' #多头保证金率
'ShortMarginRatio' #空头保证金率
'PriceTick' #最小变价单位
'VolumeMultiple' #合约乘数(对期货以外的品种,默认是1)
'MainContract' #主力合约标记,1、2、3分别表示第一主力合约,第二主力合约,第三主力合约
'MaxMarketOrderVolume' #市价单最大下单量
'MinMarketOrderVolume' #市价单最小下单量
'MaxLimitOrderVolume' #限价单最大下单量
'MinLimitOrderVolume' #限价单最小下单量
'MaxMarginSideAlgorithm' #上期所大单边的处理算法
'DayCountFromIPO' #自IPO起经历的交易日总数
'LastVolume' #昨日持仓量
'InstrumentStatus' #合约停牌状态
'IsTrading' #合约是否可交易
'IsRecent' #是否是近月合约
'IsContinuous' #是否是连续合约
'bNotProfitable' #是否非盈利状态
'bDualClass' #是否同股不同权
'ContinueType' #连续合约类型
'secuCategory' #证券分类
'secuAttri' #证券属性
'MaxMarketSellOrderVolume' #市价卖单最大单笔下单量
'MinMarketSellOrderVolume' #市价卖单最小单笔下单量
'MaxLimitSellOrderVolume' #限价卖单最大单笔下单量
'MinLimitSellOrderVolume' #限价卖单最小单笔下单量
'MaxFixedBuyOrderVol' #盘后定价委托数量的上限(买)
'MinFixedBuyOrderVol' #盘后定价委托数量的下限(买)
'MaxFixedSellOrderVol' #盘后定价委托数量的上限(卖)
'MinFixedSellOrderVol' #盘后定价委托数量的下限(卖)
'HSGTFlag' #标识港股是否为沪港通或深港通标的证券。沪港通:0-非标的,1-标的,2-历史标的;深港通:0-非标的,3-标的,4-历史标的,5-是沪港通也是深港通
'BondParValue' #债券面值
'QualifiedType' #投资者适当性管理分类
'PriceTickType' #价差类别(港股用),1-股票,3-债券,4-期权,5-交易所买卖基金
'tradingStatus' #交易状态
'OptUnit' #期权合约单位
'MarginUnit' #期权单位保证金
'OptUndlCode' #期权标的证券代码或可转债正股标的证券代码
'OptUndlMarket' #期权标的证券市场或可转债正股标的证券市场
'OptLotSize' #期权整手数
'OptExercisePrice' #期权行权价或可转债转股价
'NeeqExeType' #全国股转转让类型,1-协议转让方式,2-做市转让方式,3-集合竞价+连续竞价转让方式(当前全国股转并未实现),4-集合竞价转让
'OptExchFixedMargin' #交易所期权合约保证金不变部分
'OptExchMiniMargin' #交易所期权合约最小保证金
'Ccy' #币种
'IbSecType' #IB安全类型,期货或股票
'OptUndlRiskFreeRate' #期权标的无风险利率
'OptUndlHistoryRate' #期权标的历史波动率
'EndDelivDate' #期权行权终止日
'RegisteredCapital' #注册资本(单位:百万)
'MaxOrderPriceRange' #最大有效申报范围
'MinOrderPriceRange' #最小有效申报范围
'VoteRightRatio' #同股同权比例
'm_nMinRepurchaseDaysLimit' #最小回购天数
'm_nMaxRepurchaseDaysLimit' #最大回购天数
'DeliveryYear' #交割年份
'DeliveryMonth' #交割月
'ContractType' #标识期权,1-过期,2-当月,3-下月,4-下季,5-隔季,6-隔下季
'ProductTradeQuota' #期货品种交易配额
'ContractTradeQuota' #期货合约交易配额
'ProductOpenInterestQuota' #期货品种持仓配额
'ContractOpenInterestQuota' #期货合约持仓配额
'ChargeType' #期货和期权手续费方式,0-未知,1-按元/手,2-按费率
'ChargeOpen' #开仓手续费率,-1表示没有
'ChargeClose' #平仓手续费率,-1表示没有
'ChargeClose' #平仓手续费率,-1表示没有
'ChargeTodayOpen' #开今仓(日内开仓)手续费率,-1表示没有
'ChargeTodayClose' #平今仓(日内平仓)手续费率,-1表示没有
'OptionType' #期权类型,-1为非期权,0为期权认购,1为期权认沽
'OpenInterestMultiple' #交割月持仓倍数代码示例
时间戳转换
import time
def conv_time(ct):
'''
conv_time(1476374400000) --> '20161014000000.000'
'''
local_time = time.localtime(ct / 1000)
data_head = time.strftime('%Y%m%d%H%M%S', local_time)
data_secs = (ct - int(ct)) * 1000
time_stamp = '%s.%03d' % (data_head, data_secs)
return time_stamp# MiniQMT scripts package
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
MiniQMT 财务数据获取脚本
支持:财务数据下载/获取、股东信息、股本数据
"""
import argparse
import json
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from xtquant import xtdata
xtdata.enable_hello = False
def cmd_financial(args):
"""获取财务数据"""
result = {
"status": "success",
"data_type": "financial",
"code": args.code,
"tables": args.tables
}
try:
# 解析表格列表
tables = [t.strip() for t in args.tables.split(',')] if args.tables else []
# 下载财务数据
xtdata.download_financial_data([args.code], tables)
# 获取财务数据
data = xtdata.get_financial_data(
stock_list=[args.code],
table_list=tables,
start_time=args.start or '',
end_time=args.end or '',
report_type=args.report_type or 'report_time'
)
if args.code in data:
result["data"] = {}
for table_name, df in data[args.code].items():
if df is not None and not df.empty:
result["data"][table_name] = {
"columns": df.columns.tolist(),
"data": df.to_dict('records')
}
else:
result["data"][table_name] = {"columns": [], "data": []}
else:
result["data"] = {}
except Exception as e:
result["status"] = "error"
result["message"] = str(e)
return result
def cmd_download_financial(args):
"""下载财务数据"""
result = {"status": "success", "data_type": "download_financial", "code": args.code}
try:
tables = [t.strip() for t in args.tables.split(',')] if args.tables else []
xtdata.download_financial_data([args.code], tables)
result["message"] = "下载完成"
except Exception as e:
result["status"] = "error"
result["message"] = str(e)
return result
def cmd_period_list(args):
"""获取可用周期列表"""
result = {"status": "success", "data_type": "period_list"}
try:
periods = xtdata.get_period_list()
result["data"] = periods
except Exception as e:
result["status"] = "error"
result["message"] = str(e)
return result
def add_args(parser):
"""添加命令行参数"""
subparsers = parser.add_subparsers(dest='cmd', help='子命令')
# financial
p = subparsers.add_parser('financial', help='获取财务数据')
p.add_argument('--code', '-c', required=True, help='证券代码')
p.add_argument('--tables', '-t', default='Balance,Income,CashFlow', help='表格列表,逗号分隔')
p.add_argument('--start', '-s', default='', help='起始时间 YYYYMMDD')
p.add_argument('--end', '-e', default='', help='结束时间 YYYYMMDD')
p.add_argument('--report_type', default='report_time', help='报告类型: report_time/announce_time')
# download_financial
p = subparsers.add_parser('download_financial', help='下载财务数据')
p.add_argument('--code', '-c', required=True, help='证券代码')
p.add_argument('--tables', '-t', default='', help='表格列表,逗号分隔')
# period_list
p = subparsers.add_parser('period_list', help='可用周期列表')
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='MiniQMT 财务数据获取')
add_args(parser)
args = parser.parse_args()
cmd_map = {
'financial': cmd_financial,
'download_financial': cmd_download_financial,
'period_list': cmd_period_list,
}
if args.cmd in cmd_map:
result = cmd_map[args.cmd](args)
print(json.dumps(result, ensure_ascii=False, indent=2))
else:
parser.print_help()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
MiniQMT 板块与分类数据获取脚本
支持:板块列表、板块成分股、股票所属板块、指数成分权重、ETF信息
"""
import argparse
import json
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from xtquant import xtdata
xtdata.enable_hello = False
def cmd_sector_list(args):
"""获取板块列表"""
result = {"status": "success", "data_type": "sector_list"}
try:
sectors = xtdata.get_sector_list()
result["data"] = {"count": len(sectors), "sectors": sectors}
except Exception as e:
result["status"] = "error"
result["message"] = str(e)
return result
def cmd_sector_stocks(args):
"""获取板块成分股"""
result = {"status": "success", "data_type": "sector_stocks", "sector": args.sector}
try:
stocks = xtdata.get_stock_list_in_sector(args.sector)
result["data"] = {"stocks": stocks, "count": len(stocks)}
except Exception as e:
result["status"] = "error"
result["message"] = str(e)
return result
def cmd_stock_sectors(args):
"""获取股票所属板块"""
result = {"status": "success", "data_type": "stock_sectors", "code": args.code}
try:
# 尝试获取股票类型信息
info = xtdata.get_instrument_type(args.code)
result["data"] = {"info": info, "sectors": []}
except Exception as e:
result["status"] = "error"
result["message"] = str(e)
return result
def cmd_index_weight(args):
"""获取指数成分权重"""
result = {"status": "success", "data_type": "index_weight", "index": args.index}
try:
weights = xtdata.get_index_weight(args.index)
result["data"] = {"count": len(weights), "weights": weights}
except Exception as e:
result["status"] = "error"
result["message"] = str(e)
return result
def cmd_etf_info(args):
"""获取ETF信息"""
result = {"status": "success", "data_type": "etf_info"}
try:
xtdata.download_etf_info()
etf_data = xtdata.get_etf_info()
result["data"] = {"count": len(etf_data), "items": etf_data}
except Exception as e:
result["status"] = "error"
result["message"] = str(e)
return result
def cmd_cb_info(args):
"""获取可转债信息"""
result = {"status": "success", "data_type": "cb_info", "code": args.code}
try:
xtdata.download_cb_data()
info = xtdata.get_cb_info(args.code)
result["data"] = info if info else {}
except Exception as e:
result["status"] = "error"
result["message"] = str(e)
return result
def cmd_instrument_type(args):
"""获取合约类型"""
result = {"status": "success", "data_type": "instrument_type", "code": args.code}
try:
info = xtdata.get_instrument_type(args.code)
result["data"] = info
except Exception as e:
result["status"] = "error"
result["message"] = str(e)
return result
def cmd_stock_list(args):
"""获取市场股票列表"""
result = {"status": "success", "data_type": "stock_list", "market": args.market}
try:
stocks = xtdata.get_stock_list_in_sector(args.market)
result["data"] = {"count": len(stocks), "stocks": stocks}
except Exception as e:
result["status"] = "error"
result["message"] = str(e)
return result
def add_args(parser):
"""添加命令行参数"""
subparsers = parser.add_subparsers(dest='cmd', help='子命令')
# sector_list
p = subparsers.add_parser('sector_list', help='板块列表')
# sector_stocks
p = subparsers.add_parser('sector_stocks', help='板块成分股')
p.add_argument('--sector', '-s', required=True, help='板块名称')
# stock_sectors
p = subparsers.add_parser('stock_sectors', help='股票所属板块')
p.add_argument('--code', '-c', required=True, help='证券代码')
# index_weight
p = subparsers.add_parser('index_weight', help='指数成分权重')
p.add_argument('--index', '-i', required=True, help='指数代码,如 000300.SH')
# etf_info
p = subparsers.add_parser('etf_info', help='ETF信息')
# cb_info
p = subparsers.add_parser('cb_info', help='可转债信息')
p.add_argument('--code', '-c', required=True, help='可转债代码')
# instrument_type
p = subparsers.add_parser('instrument_type', help='合约类型')
p.add_argument('--code', '-c', required=True, help='证券代码')
# stock_list
p = subparsers.add_parser('stock_list', help='市场股票列表')
p.add_argument('--market', '-m', default='沪深A股', help='市场名称')
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='MiniQMT 板块数据获取')
add_args(parser)
args = parser.parse_args()
cmd_map = {
'sector_list': cmd_sector_list,
'sector_stocks': cmd_sector_stocks,
'stock_sectors': cmd_stock_sectors,
'index_weight': cmd_index_weight,
'etf_info': cmd_etf_info,
'cb_info': cmd_cb_info,
'instrument_type': cmd_instrument_type,
'stock_list': cmd_stock_list,
}
if args.cmd in cmd_map:
result = cmd_map[args.cmd](args)
print(json.dumps(result, ensure_ascii=False, indent=2))
else:
parser.print_help()