trade项目代为交易
- 初始项目名: xtquant
- 项目目的: 对xtquant(迅投)这个库的梳理和结构化
- 之后的项目变迁历史:
- 2025-05-23: 新建项目
- 2025-05-24: 改名: 记录自己的交易
- 2025-07-09: 改名: qmt web server
- 2025-07-12: 改名: trade项目, 代为交易
笔记归档/历史演草
- xttrade交易
- 2020初稿
- 快速入门:
- xtquant.xttrader下引入:
- XtQuantTrader, XtQuantTraderCallback
- (吐槽: 全都xt开头)
- 基础用法: 继承class MyXtQuantTraderCallback(XtQuantTraderCallback)
- 定义一个自己的callback类, 下面各种情形的callback
- xtquant.xttype引入:
- StockAccount
- xtquant引入:
- xtconstant
- 基础用法/流程:
- path = ‘D:\迅投极速交易终端 睿智融科版\userdata_mini’. 指向这个文件夹
- 不同策略可以使用不同sessionid
- 实例化XtQuantTrader -> 获得一个trader
- 实例化StockAccount(‘1000000365’)
- 实例化回调类, 并绑定到trader
- —以上是初始化变量部分—
- trader.start(), 启动, 不知道干嘛的(默认为启动miniqmt exe)
- trader.connect()获得connect, 默认为miniqmt exe连接到交易所
- subscribe_result = trader.subscribe(acc), “对交易回调进行订阅,订阅后可以收到交易主推”. 默认为, 只有订阅才能之后获得下单是否成功等消息
- (吐槽: 暴漏太多环节, 不够简洁与小白, 要是我, 直接提供账户与认证就能下单了. 下单自动返回回调/或下单时填入回调函数)
- — 以上是网络连接 —
- trader.order_stock(…). 填入账户/股票代码, 可选填入xtconstant.STOCK_BUY(买还是卖), 数量(200/100的倍数). xtconstant.FIX_PRICE(定价挂单还是卖一价), 策略名, 备注 -> 后面这两个就其实迅投不用提供/提供也行
- — 以上是下单 —, 也就一行代码
- trader.cancel_order_stock, 撤单
- trader.order_stock_async, 异步下单
- 更多trader.相关函数: query_stock_orders, 查询当日所有委托. 查询当日所有成交: query_stock_trades, 查询当日所有持仓: query_stock_positions, 查询对应股票的持仓: query_stock_position
- trader.run_forever(): 阻塞线程,接收交易推送: 似乎是callback的地盘了
- xtquant.xttrader下引入:
- 数据字典, xtconstant.下的变量
- 市场: xtconstant.SH_MARKET上交, SZ_MARKET深交
- 账号类型: SECURITY_ACCOUNT: 股票
- (即, 自己使用到的是很少的内容, 1/5或1/10的内容, 或者说, 股票本身只有百行以内的内容/有限且少, 去除期货/港股通/信用与两融)
- 委托类型: STOCK_BUY买入, STOCK_SELL卖出
- 报价: LATEST_PRICE最新价, FIX_PRICE定价, MARKET_SH_CONVERT_5_CANCEL(最优五档即时成交剩余撤销), MARKET_SH_CONVERT_5_LIMIT(最优五档即时成交剩转限价?), 对手方最优价格委托: xtconstant.MARKET_PEER_PRICE_FIRST, 本方最优价格委托: xtconstant.MARKET_MINE_PRICE_FIRST
- 委托状态: 现查就行. 例如.ORDER_SUCCEEDED, 值为56, 已成. .ORDER_XXX
- 账号状态: 例如ACCOUNT_STATUS_OK, 正常, 值为0
- 数据结构, 各种类
- XtAsset资产: 资金账号, 可用资金, 市值, 等
- XtOrder委托: 账号, 订单号, 股票号, 数量, 价格, 均价, 等
- XtTrade成交: 账号, 股票号, 成交时间, 数量, 金额, 等
- XtPosition持仓: “账号/股票号, 算是经典必带成员变量了”, 这里是单个股票的持仓, 上面asset是用户总资产
- 其他XtXXX各种, 例如XtCancelError撤单失败: 订单编号, 失败码, 失败信息
- api接口, 函数
- (注: 上面是预定义/变量声明环节, 这里才是具备动态性/逻辑流程相关的)
- (注: 只有操作接口和系统设置接口是需要看下的. 其他都无需要, 或比较直观/简单: 查询接口)
- 操作接口也就下单和撤单, (附加同步和异步两种区分)
- (注: 即, xtquant这里的下单只是最纯粹的裸下单接口. 无任何回测/策略级别的内容)
- 笔记归档: 记录自己的交易
- 核心目的: 将交易记录添加到每周diary中
- 细分目的:
- 1, 建立一个trader项目, 专门只用于下单, 不涉及行情, 不涉及策略. 只是一个代购员/采购员
- 2, 利出一孔, 我的手动下单也由这个trader来代为完成
- miniqmt打开后只能下单
- 目的3:
- 1, 自律, 反思自己的操作, 优化自己的操作
- 而操作的可选项/可改进项只有: 股票代码, 买入还是卖出/以及价格
- 1, 自律, 反思自己的操作, 优化自己的操作
- 笔记归档: xtquant库
- 放在python库里: pip3 –version:
- /usr/lib/python3/dist-packages/
- C:\storage\software\python3.11.4\Lib\site-packages\
- 前置项目: AI读代码
- 结论: 还是windsurf
- 放在python库里: pip3 –version:
- 笔记归档: 记录的形式
- 形式1: 周账户变动对比
- 即, 把周账户作为一个etf曲线来监控
- 形式2: 关注于笔数
- 券商中的死数据/无法看出盈亏: 买入卖出, 成交笔数, 成交价格
- 关于胜率/平均盈利点数/平均持有时长
- 数学期望
- 凯利公式等是之后的事
- 数学期望
- 分析1:
- 1, 目的1: 可优化项就是需要关注项: 股票代码, 买还是卖, 价格/数量
- 2, 整体账户的资金利用率要做起来
- 分析2/deepseek:
- 交易记录的颗粒度、归因逻辑和资金流动干扰,直接影响绩效分析的准确性
- 1, 总资产: 模糊但必要
- 整体资金曲线
- 2, 区分各个策略的账户
- 注明注资与抽资
- 3, 每笔交易
- 策略标签, 交易意图(试探性建仓/止盈/止损/主力买入/跌破20日均线)
- 主力买入必须严格符合入场条件
- 4, 仓位全平后计算总盈亏
- (注: 税务视角, FIFO): 卖出最早买入的份额
- 5, 隔离新老资金
- 新资金视为新一期投资, 单独计算收益率
- 定期再平衡: 定期调整各策略划拨的资金量
- 形式1: 周账户变动对比
- 笔记归档: 走势图小组件
- 用处/目的: 放在周报里 -> 核心用处
- 实际交易下单
- 其他地方的笔记合并过来:
- 纳指ETF日频+石油黄金ETF轮动, 手动条件单下单
- 回测系统
- k线, 技术指标
- “沉迷交易者要拯救小魅魔”
- 同花顺k线训练营
基础信息
- 交易端:
- 账号: ██████████
- 密码: ██████
- 模拟端:
- 账号: ████████
- 密码: ██████
- 股票代码: 513000.SH
项目设想与调研
- 项目名: qmt web server
- 待做:
- 1, 将exe和机器绑定的操作和访问, 变为web接口是必要的
- 2, 开发gkxk.qmt模块, 让自己随时能调取交易数据, 是必要的 -> 因此必然是访问web接口/而非操作xtquant
- qmt web项目
- 待做: 1, 先看下github上已有的 -> 就如同one api已经完美地完成了所有工作一样
- 已有的项目:
- https://github.com/dfkai/xtquantai : MCP
- https://github.com/guangxiangdebizi/QMT-MCP : MCP
- https://github.com/cy-chengyan/XtQuantGateway : 完美符合我的需求和设想:
- XtQuantGateway 是对 XtQuant 的 二次封装,成为一个独立的交易网关微服务。使得:1, 解决了 XtQuant 只能在 Windows 本机使用的局限。2, 方便查看和统计历史数据。
- server是java代码, python库打了个供java使用的lib
- https://github.com/ai4trade/XtQuant : xtquant的各种用法, 公众号文章讲解
- 仅供参考代码量/侧面影响:
- https://github.com/kljzxh0905/klj_xtquant : 一个不太好的xtquant个人试验级代码
- https://github.com/Xuntou/XtQuant : 已完工的长单页代码/个人无文档
- https://github.com/84194041/hello-qmt-xtquant : 个人/无文档
- https://github.com/WolfgangBai/open-quant-app : 已完工/个人无文档
- https://github.com/zillionare/zillionare : 卖课的, 5%的概率得到侧面知识影响
- https://github.com/ruyisee/vnpy_qmt : qmt连接到vnpy
- https://github.com/zsrl/xtquant-doc : miniquant的一个api文档, 机器生成, 比源码还难懂/无注释与自然语言
- https://github.com/happybeta/xtquantservice : 一个空仓库, 但readme描述的是我需要的
- 持仓查询、资金查询、委托订单、成交订单查询
- 支持执行回调
- https://github.com/gearlessHU/xt_qmt_func : 各种工具函数/个人所用的工具库
- 小结, 可用的repo链接:
- 熟悉 xtquant 库并封装为微服务
- 微服务:是一整套架构理念,包含:独立部署单元, 明确的业务边界, 自治性(包含自己的数据存储), 轻量级通信机制
xtquant二次封装
- 以终为始, 先看下qmt.py内需要支持什么用法
- “具体到实施, 我打算新建一个qmt repo. 内部有两个文件夹: server(搭在windows上, 用于操控qmt并提供flask接口) 和 qmt (一个文件夹, 之后会作为module被import后使用, 用于请求flask url接口, 返回数据). 我当前打算以终为始, 先确定下qmt这个模组需要支持什么用法. 你有好的建议吗? 我打算分为: order.py(用于下单), query_market.py(用于查询当前行情/历史行情/股票总列表等), query_profile.py(用于查询我自己的相关信息: 持仓查询/资金查询/委托订单查询/成交历史查询). 你有修改或补充吗”
- qmt/
- trade.py
- account.py
- market.py
- server/
- connect.py
- qmt
- trade.py
- account.py
- market.py
- server.py
- 实现顺序:
- 先实现基础连接和认证
- 实现查询类接口(账户/持仓)
- 实现行情订阅基础功能
- 实现下单/撤单基础功能
- 补充:
- 1, uptime监控页接口 -> /health接口, 2xx/3xx视为up
- 2, 错误码体系
- 旁支任务: wsl1安装
- Proxifier安装
- (注: 这类旁支任务可以绕过, 以核心任务为要)
- 看公众号文章
- 基于tick/kline -> 传统版本
- xtdata, xttrader
- 行情: 订阅, 查询
- pandas, 缩写: np, pd
- 板块分类信息等静态信息更新频率低,无需频繁下载,按周或按日定期下载更新即可
- 附录:
- 1, ETF轮动无需关注财务数据: 资产, 负债, 利润
- 2, ETF需要关心资金规模, 跟踪误差
- xtquant接口文档
- xtdata
- download_history_data(‘90000967.SZO’, period=’tick’)
- get_local_data(field_list=[], stock_code=[‘90000967.SZO’], period=’tick’, count=10)
- 附录:
- 1, 000001.SZ 600000.SH
- 2, tick - 分笔数据, 1m - 1分钟线, 5m - 5分钟线, 15m - 15分钟线, 30m - 30分钟线, 1h - 1小时线, 1d - 日线, 1w - 周线, 1mon - 月线, 1q - 季度线, 1hy - 半年线, 1y - 年线
- 3, 时间范围: [start_time, end_time]
- 4, dividend_type /除权方式: none 不复权, front 前复权, back 后复权, front_ratio 等比前复权, back_ratio 等比后复权
- xtdata
akshare行情封装
- gkxk.market包的开发: 调用akshare, 不存入db, 只存入本地cache
- get_data
- get_list
- 参数:
- period:
- 1m, 5m, 15m, 30m, 1h, 1d, 1w, 1mon, 1q, 1hy, 1y
- code:
- 123456.SZ, .SH -> code.exchange
- start_time = ‘’
- end_time: 为空则视为最早/最晚时间
- dividend_type: none 不复权, front 前复权, back 后复权, front_ratio 等比前复权, back_ratio 等比后复权
- period:
- 数据
- k线数据:
1 | 'time' #时间戳 |
- Exceptions:
- 证券状态: 闭市, 网络中断
- 经验教训:
- fund_name_em, fund_individual_basic_info_xq, fund_info_index_em, fund_purchase_em: 这些都是基金/经理类型的
- 实时全品种行情
- fund_etf_spot_em:
- 代码, 名称, 最新价, IOPV实时估值, 基金折价率, 涨跌额, 涨跌幅, 成交量, 成交额, 开盘价, 最高价, 最低价, 昨收, 振幅, 换手率, 量比, 委比, 外盘, 内盘, 主力净流入-净额, 主力净流入-净占比, 超大单净流入-净额, 超大单净流入-净占比, 大单净流入-净额, 大单净流入-净占比, 中单净流入-净额, 中单净流入-净占比, 小单净流入-净额, 小单净流入-净占比, 现手, 买一, 卖一, 最新份额, 流通市值, 总市值, 数据日期, 更新时间
- fund_etf_spot_ths:
- 序号, 基金代码, 基金名称, 当前-单位净值, 当前-累计净值, 前一日-单位净值, 前一日-累计净值, 增长值, 增长率, 赎回状态, 申购状态, 最新-交易日, 最新-单位净值, 最新-累计净值, 基金类型, 查询日期
- fund_lof_spot_em
- fund_etf_category_sina
- fund_etf_spot_em:
- 单支历史行情:
- 交易经验:
- 封闭式基金不能买:
- 1, 封闭式基金68个, LOF385个, ETF1212个
- 2, 到期日干扰:封闭式基金到期后会转为开放式基金(“封转开”),价格强制回归净值。临近到期时,K线可能出现非市场因素的剧烈波动(如折价套利资金涌入)
- 3, 流动性陷阱:68只封闭式基金中,80%日均成交额不足100万,容易被小额资金操控(如突然拉高出货),策略容易被“假突破”坑
- LOF可买的原因:
- 1, 主动型LOF:如163406(兴全合宜)、161903(万家行业优选),这些主动基金的K线可能跑赢指数(但需承担基金经理风格风险)。
- 2, 小众指数LOF:如164824(印度基金)、160216(原油基金),ETF无替代品。
- 关于LOF和ETF的配比/配合: 最优选择:ETF为主 + LOF补充
- 剔除:
- 剔除日均成交额<500万的LOF(避免流动性风险)。
- 剔除规模<2亿元的LOF(避免清盘风险)
- 封闭式基金不能买:
- yfinance: 自带cache
trade项目代为下单
- 首先要确定的: 对于我的需求, 需要开放哪些http接口