前言
写天勤量化下单逻辑时,若手数、保证金和盈亏对不上账,我一般会先查合约规格有没有读错。乘数、最小变动价位(一跳)、涨跌停价都在Quote里,用统一字段做预算,比手算或硬编码合约表更不容易在换月后踩坑。
一、为什么要从 Quote 读
同一品种不同月份合约,乘数通常一致,但价格水平和 tick 可能变化;新品种上线时硬编码表容易漏改。get_quote订阅后,规格字段随合约更新,适合写在下单与风控公共函数里。
fromtqsdkimportTqApi,TqAuth,TqSim api=TqApi(TqSim(),auth=TqAuth("账户","密码"))q=api.get_quote("SHFE.rb2510")api.wait_update()volume_multiple=q.volume_multiple# 合约乘数price_tick=q.price_tick# 最小变动价位print(volume_multiple,price_tick)字段名以当前版本文档为准,策略启动时打印一次做核对。
二、盈亏与一跳价值
近似计算(线性合约):
- 价格变动 ΔP(元/吨等)
- 盈亏 ≈ ΔP × 手数 ×
volume_multiple
一跳盈亏(1 手):
- 每跳盈亏 ≈
price_tick×volume_multiple
用于评估止损距离是否合理,以及限价单改价是否跨过有效 tick。
defone_tick_pnl(quote,lots=1):returnquote.price_tick*quote.volume_multiple*lots三、手数与保证金预算
保证金依赖期货公司标准与账户参数,策略层常用名义价值做上限:
notional=q.last_price*q.volume_multiple*lots再用账户balance、margin字段(需wait_update后读取)判断是否够开仓。具体保证金率以柜台回报为准,程序侧宜留余量。
四、限价单价格对齐 tick
限价应落在 tick 整数倍上,否则可能被拒单或自动对齐到不利价位:
defround_to_tick(price,tick):returnround(price/tick)*tick limit=round_to_tick(q.last_price+2*q.price_tick,q.price_tick)买开、卖开方向不同,取整方向可按业务约定调整。
五、与涨跌停联合检查
下单前可读upper_limit、lower_limit(字段以文档为准),确认limit_price在合法区间。触及涨跌停时,即使价格对齐 tick,也可能无法按预期成交。
六、换月时记得换 quote
乘数多数不变,但合约代码必须切换到新月份get_quote("SHFE.rb2510"),并重新wait_update等首包规格有效,避免沿用旧合约乘数算新手数。
总结
合约乘数和最小变动价位是下单预算的基础。天勤量化里从Quote动态读取,能减少硬编码错误;盈亏估算、tick 取整、名义价值上限三件事建议在公共函数里统一实现,换月只改 symbol。
FAQ
1)乘数为 0 或 nan 怎么办?
首包未到,跳过交易逻辑并等待wait_update。
2)不同交易所 tick 规则不同?
以price_tick为准,勿假设所有品种都是 1 元。
3)组合合约怎么算?
各腿分别读 quote,分别算乘数。
4)回测里规格从哪来?
回测环境同样提供 quote 对象,字段含义与实盘一致,仍应核对。
5)盈亏与柜台不一致?
检查平今手续费、是否双向持仓、成交价是否含滑点。
风险提示
本文用于期货量化技术实践讨论,不构成投资建议。