前言国内期货实盘里报 3 手只成交 1 手是常态限价排队、盘口变薄、流控、临近涨跌停都会造成部分成交。策略里若用自建变量my_pos3记“我以为的仓位”而柜台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 为准见状态恢复专题。二、何时触发核对三个时机持仓变化api.is_changing(pos, pos)或pos_long/pos_short变化委托状态变化is_changing(order, status)且进入FINISHED或last_msg更新周期性每个 K 线datetime变时对多合约做一次全品种快照防漏网。posapi.get_position(symbol)targetstate.get(target_vol,0)whileTrue:api.wait_update()ifapi.is_changing(pos,pos):actualpos.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# 先承认现实ifpolicyretry_to_full:task.set_target_volume(intended_full_target)elifpolicyaccept_partial:task.set_target_volume(actual)# 或等下一 bar 再追四、TargetPosTask 在部分成交时的行为set_target_volume(3)后若只成交 1 手pos.pos变为 1volume_left可能仍 0单还在 ALIVE。继续wait_updatetask 一般会尝试把净仓补到 3若pricePASSIVE排队价离市价远可能挂很久。监控应同时看volume_left与pos.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若需要补回则配合拒单/熔断规则与重报上限避免无限补单。把“部分成交如何处理”写进流程后策略的后续决策链条才不会被错误仓位带偏。FAQ1task 会自动补剩余手数吗一般会取决于 price 模式与盘口PASSIVE 久不补要告警。2多空分列锁仓看 pos_long/pos_short净 pos 为 0 仍可能有敞口。3多合约组合每个 symbol 独立核对组合比例策略要额外算腿比例。4FINISHED 且 volume_left0可能是撤单或拒单结束读 last_msg不单当部分成交。风险提示以上内容用于仓位核对参考不构成投资建议。
期货部分成交后仓位对不上:以 position 为准的自动修正
发布时间:2026/6/8 22:45:23
前言国内期货实盘里报 3 手只成交 1 手是常态限价排队、盘口变薄、流控、临近涨跌停都会造成部分成交。策略里若用自建变量my_pos3记“我以为的仓位”而柜台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 为准见状态恢复专题。二、何时触发核对三个时机持仓变化api.is_changing(pos, pos)或pos_long/pos_short变化委托状态变化is_changing(order, status)且进入FINISHED或last_msg更新周期性每个 K 线datetime变时对多合约做一次全品种快照防漏网。posapi.get_position(symbol)targetstate.get(target_vol,0)whileTrue:api.wait_update()ifapi.is_changing(pos,pos):actualpos.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# 先承认现实ifpolicyretry_to_full:task.set_target_volume(intended_full_target)elifpolicyaccept_partial:task.set_target_volume(actual)# 或等下一 bar 再追四、TargetPosTask 在部分成交时的行为set_target_volume(3)后若只成交 1 手pos.pos变为 1volume_left可能仍 0单还在 ALIVE。继续wait_updatetask 一般会尝试把净仓补到 3若pricePASSIVE排队价离市价远可能挂很久。监控应同时看volume_left与pos.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若需要补回则配合拒单/熔断规则与重报上限避免无限补单。把“部分成交如何处理”写进流程后策略的后续决策链条才不会被错误仓位带偏。FAQ1task 会自动补剩余手数吗一般会取决于 price 模式与盘口PASSIVE 久不补要告警。2多空分列锁仓看 pos_long/pos_short净 pos 为 0 仍可能有敞口。3多合约组合每个 symbol 独立核对组合比例策略要额外算腿比例。4FINISHED 且 volume_left0可能是撤单或拒单结束读 last_msg不单当部分成交。风险提示以上内容用于仓位核对参考不构成投资建议。