期货部分成交后仓位对不上:以 position 为准的自动修正
2026/6/22 6:13:08 网站建设 项目流程

前言

国内期货实盘里,报 3 手只成交 1 手是常态:限价排队、盘口变薄、流控、临近涨跌停,都会造成部分成交。策略里若用自建变量my_pos=3记“我以为的仓位”,而柜台get_position(symbol).pos只有 1,后续风控、加仓、止损都会按 3 手算,越偏越远,甚至触发错误的全平或重复开仓。

部分成交不是程序 bug,是执行层现实。天勤在每次api.wait_update()后更新持仓对象与委托对象:pos.pos是净持仓真相,order.volume_left是该单还剩几手没成,order.trade_records记录已成交明细。下面说明何时核对、如何以 position 为准自动修正、与TargetPosTask如何配合,以及日志应记哪些英文字段方便和期货公司账单对照。

一、真相源与缓存:谁说了算

名称天勤里是什么能否当唯一真相
get_position(symbol)该合约持仓对象是,柜台认可净仓
pos.pos净持仓手数(正多负空)
pos_long / pos_short多空分列持仓锁仓策略要看分列
get_order()当前委托字典看在途单
status委托状态,ALIVE=在途,FINISHED=结束判断单是否还在
volume_left该委托未成交手数部分成交时 >0 且 < 原始量
volume_orign委托原始手数与 volume_left 对比
trade_records该单成交记录对账明细
state[“target_vol”]策略自建目标否,须与 pos 对齐
TargetPosTask调仓工具,持续把 pos 推向目标执行层,不替代读 pos

进程重启后仍以 position 为准,本地 JSON 若写 3 手而 pos 是 1,以 pos 为准(见状态恢复专题)。

二、何时触发核对(三个时机)

  1. 持仓变化:api.is_changing(pos, "pos")pos_long/pos_short变化;
  2. 委托状态变化:is_changing(order, "status")且进入FINISHED,或last_msg更新;
  3. 周期性:每个 K 线datetime变时,对多合约做一次全品种快照(防漏网)。
pos=api.get_position(symbol)target=state.get("target_vol",0)whileTrue:api.wait_update()ifapi.is_changing(pos,"pos"):actual=pos.posifactual!=target:log_mismatch(target,actual,api.get_order())# 见下文:补单还是接受

is_changing是天勤判断“本帧该对象某字段是否刚更新”的函数,避免每个循环全量扫。

三、发现不一致后:补单还是接受

团队要先在策略说明书里定规则,开发和运维才不会吵:

  • 趋势策略:常接受部分成交,把state["target_vol"]暂改为actual,下一根 K 线再set_target_volume全目标;task 在后续wait_update里通常会继续补剩余,除非 PASSIVE 价格太远。
  • 套利/多腿:部分成交破坏腿比例,可能要先set_target_volume回平衡或告警人工,不能无脑补单。
  • 重报要有上限:配合拒单专题,同一信号连续重报不超过 N 次,否则停机。
state["target_vol"]=actual# 先承认现实ifpolicy=="retry_to_full":task.set_target_volume(intended_full_target)elifpolicy=="accept_partial":task.set_target_volume(actual)# 或等下一 bar 再追

四、TargetPosTask 在部分成交时的行为

set_target_volume(3)后,若只成交 1 手,pos.pos变为 1,volume_left可能仍 >0(单还在 ALIVE)。继续wait_update,task 一般会尝试把净仓补到 3;若price="PASSIVE"排队价离市价远,可能挂很久。监控应同时看volume_leftpos.pos的差距,夜盘无人值守专题里的“有单无成交”告警与此相关。

同一合约不要 task 与手写insert_order混用,否则部分成交归属难查。

五、日志字段建议(方便对账)

每次 mismatch 记录:时间戳、symbol、intended target、actual pos、order_id、volume_orign、volume_left、最近成交价、last_msg。与期货公司日账单或快期 APP 对照时,能回答“少的那 2 手是撤了还是还在排队”。

六、回测与实盘的差距

TqBacktest/TqSim有模拟成交模型,部分成交行为与实盘仍有差。应用TqKq在薄盘口时段观察一次,不要把回测“总是全成”当成实盘默认。

总结

部分成交不是偶发插曲,而是国内期货执行里很常见的现实:同一笔指令可能只成交一部分,余量还在队列或被撤回。要让系统不被偏差累积,就必须以柜台认可的positionpos.pos、必要时含 pos_long/pos_short)作为真相源,并在仓位变化或委托结束时及时对齐 state。然后根据策略类型做明确选择:接受部分成交就更新目标并等待下一次 set;若需要补回则配合拒单/熔断规则与重报上限,避免无限补单。把“部分成交如何处理”写进流程后,策略的后续决策链条才不会被错误仓位带偏。

FAQ

1)task 会自动补剩余手数吗?

一般会,取决于 price 模式与盘口;PASSIVE 久不补要告警。

2)多空分列锁仓?

看 pos_long/pos_short,净 pos 为 0 仍可能有敞口。

3)多合约组合?

每个 symbol 独立核对,组合比例策略要额外算腿比例。

4)FINISHED 且 volume_left>0?

可能是撤单或拒单结束,读 last_msg,不单当部分成交。

风险提示

以上内容用于仓位核对参考,不构成投资建议。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询