量化交易:Ptrade接口详解,与miniQMT的6大区别

6大核心维度对比:一表看懂区别

很多人纠结在QMT和Ptrade之间,先用一张表把本质区别说清楚:

对比维度 miniQMT(迅投) Ptrade(恒生)
运行方式 本地客户端,需开机 云端服务器,关机也跑
策略语言 Python VBA 仅 Python
交易品种 股票/ETF/期货/期权/两融/港股 股票/ETF/两融/可转债
行情数据 自行下载,Tick从2018年起 自带免费L2实时行情
策略数量 不限(取决于本机配置) 实盘8个,模拟5个
策略隐私 本地加密,代码不外泄 上传云端,存隐私风险
编程门槛 需自己搭建环境,灵活度高 有可视化生成器,零基础可用
接口风格 xtdata xttrader 模块化 事件驱动框架,类Zipline风格

选择建议

懂编程 多品种 重隐私 → 选 miniQMT

要省心 纯股票ETF 不怕关机 → 选 Ptrade

都要?两个都开通,本地开发用QMT,实盘托管用Ptrade

Ptrade 框架结构:事件驱动机制

Ptrade 采用事件驱动框架,你不需要写主循环,平台按时间轴自动调用你写好的函数:

函数名 执行时机 功能说明 是否必选
initialize(context) 策略启动时(仅一次) 全局初始化,设置参数/股票池 必选
handle_data(context, data) 日线级14:50 / 分钟级每分钟 核心逻辑:信号判断和下单 必选
before_trading_start(context) 每日 9:10 盘前准备:更新股票池/过滤股票 可选
after_trading_end(context) 每日 15:30 盘后处理:统计收益/保存日志 可选
tick_data(context, data) Tick级别约每3秒 高频行情处理/盘口捕捉 可选
run_daily(context, func, time) 指定时间 定时任务:如10:00调仓 可选
run_interval(context, func, seconds) 自定义间隔≥3秒 灵活高频控制 可选
on_order_response(context, order_list) 委托状态变化 跟踪委托进度/拒单处理 可选
on_trade_response(context, trade_list) 成交发生时 成交后处理:止损/补仓/通知 可选

▶ 策略框架最简模板:

行情接口:怎么拿数据

Ptrade 行情接口分两类:历史数据用 get_history,实时快照用 get_snapshot:

函数名 功能 参数示例
get_history() 历史K线数据(最常用) get_history(stock, count, '1d', ['close'])
get_price() 指定时间段行情 get_price('600519.SH', '20240101', '20241231')
get_snapshot() 实时行情快照 get_snapshot('600519.SH')
data.current() handle_data中获取当前行情 data.current('600519.SH', 'close')
get_individual_entrust() L2逐笔委托(需L2权限) get_individual_entrust('600519.SH')
get_gear_price() 五档盘口数据 get_gear_price('600519.SH')
get_fundamentals() 财务基本面数据 get_fundamentals(['600519.SH'], date=None)
get_index_stocks() 指数成分股列表 get_index_stocks('000300.SH')

▶ 实战代码:拿历史K线 实时快照

交易接口:下单/撤单/查询

Ptrade 的下单接口比 miniQMT 更「高级」,直接支持按金额、按仓位比例下单:

函数名 功能 参数示例
order() 按股数买卖(最常用) order('600519.SH', 100, LimitOrderStyle(price))
order_target() 调整至目标股数 order_target('600519.SH', 0)  # 清仓
order_value() 按金额下单 order_value('600519.SH', 50000)  # 买5万元
order_target_value() 调整至目标市值 order_target_value('600519.SH', 100000)
order_market() 市价单 order_market('600519.SH', 100, 'buy')
order_tick() Tick触发下单 在tick_data中使用
after_trading_order() 盘后固定价委托 after_trading_order('600519.SH', 100, 'buy')
cancel_order() 撤单 cancel_order(order_id)
cancel_order_ex() 撤单(扩展版) cancel_order_ex(order_id)
get_open_orders() 未完成订单列表 orders = get_open_orders()
get_orders() 全部订单 get_orders()
get_trades() 当日成交 get_trades()
get_position() 单只股票持仓 pos = get_position('600519.SH')
get_positions() 多只股票持仓 get_positions(['600519.SH', '000001.SZ'])

▶ 实战代码:完整买卖流程

Context 对象:账户信息怎么读

Ptrade 把账户状态都封装在 context 对象里,不需要单独调查询接口:

函数名 功能 参数示例
context.portfolio.cash 可用资金(元) cash = context.portfolio.cash
context.portfolio.total_value 账户总资产 total = context.portfolio.total_value
context.portfolio.positions 全部持仓字典 pos = context.portfolio.positions.get(code)
context.portfolio.positions[code].total_amount 某股持仓总量 vol = pos.total_amount
context.portfolio.positions[code].avg_cost 持仓均价/成本 cost = pos.avg_cost
context.portfolio.positions[code].market_value 持仓市值 mv = pos.market_value
context.blotter.current_dt 当前策略时间 dt = context.blotter.current_dt

miniQMT vs Ptrade 接口风格对比

miniQMT:主动查询风格,xt_trader.query_stock_asset(acc)

Ptrade:被动框架风格,直接读 context.portfolio.cash

Ptrade 代码更简洁,miniQMT 控制权更强

两者都支持回调推送,但触发方式不同

Ptrade 高频避坑点

坑1:initialize 和 handle_data 都不能省

哪怕什么都不做,也要写上 pass,缺少任何一个策略直接报错

坑2:handle_data 里不要写耗时操作

Ptrade按分钟推送,函数执行时间超过60秒会被跳过,复杂计算放 before_trading_start

坑3:策略数量上限

实盘最多8个,超出无法新增,旧策略必须先停止或删除

坑4:策略上传云端有隐私风险

帝纳波利策略等核心逻辑不建议放Ptrade实盘,建议用miniQMT本地跑

坑5:外部数据接入受限

Ptrade不支持pip安装第三方库,只能通过 get_research_path() 读取本地文件

坑6:order() 返回值不是数字

Ptrade的order()返回 Order 对象,不是像QMT那样的int,撤单要传整个对象

总结

关注"叩富问财"公众号,回复"资深吴经理",联系专属客户经理开通量化交易权限!

立即行动:打开微信,搜索"叩富问财",在对话框中输入"资深吴经理",开启你的量化交易之旅!



温馨提示:投资有风险,选择需谨慎。

相关文章