多合约期货策略目标持仓怎么更新不容易乱
前言组合里同时交易螺纹、铁矿、豆粕时最怕共用一个target_pos变量或 A 合约还在调仓 B 合约已改信号。目标持仓应按合约维度拆表执行层一 symbol 一条线。天勤TargetPosTask对同一账户同一合约保证单例源码用account_key#symbol作 key。下面讲数据结构、更新顺序和常见冲突。一、per-symbol 状态表fromtqsdk.libimportTargetPosTask symbols[SHFE.rb2510,DCE.i2509]tasks{s:TargetPosTask(api,s)forsinsymbols}targets{s:0forsinsymbols}klines{s:api.get_kline_serial(s,300,data_length200)forsinsymbols}信号函数返回{symbol: target_volume}禁止用全局 int 表示“做多做空”。二、单例与构造参数重复TargetPosTask(api, s, priceACTIVE)参数一致则返回同一实例offset_priority或price不一致会抛错。多品种若平今规则不同应为不同 symbol 建不同 task每个 symbol 本来就要独立实例。文档强调set_target_volume不立刻下单在后续wait_update执行多合约循环里 set 多个 symbol 后必须继续wait_update不要在中途 sleep。三、更新节奏whileTrue:api.wait_update()forsinsymbols:klklines[s]ifnotapi.is_changing(kl.iloc[-1],datetime):continuetcalc_target(kl)# 仅算该合约iftisNone:continuetargets[s]t tasks[s].set_target_volume(t)信号层只写targets[s]不在calc_target里insert_order。四、价差腿成对更新双腿价差同一帧内算好两条腿目标再依次set_target_volume缩短单腿裸露时间。组合合约SP则按一个 symbol 一个 task勿与双腿混规则。五、禁止混用 insert_order同一合约上TargetPosTask与insert_order并用会冲突官方明确禁止。多合约若部分手写报单按 symbol 划清边界。六、收盘核对每个 symbol 打印target、pos.pos、在途ALIVE委托数status 以文档为准。偏差先查部分成交与 set 后未 wait_update。总结多合约目标持仓字典维护 targets 与 tasksK 线 datetime 按合约分别触发成对价差同帧更新。利用 TargetPosTask 单例构造参数一次定终身调仓只改 set_target_volume。不与 insert_order 混用按 symbol 日志与 position 核对。FAQ1十个合约会很慢吗合约越多每帧潜在 work 越大可只订阅必要品种。2一个 task 管多合约不能一 task 一 symbol。3targets 与 position 不一致以 get_position 为准查成交与 wait_update 是否跟上。4多账户task 构造传 account各账户独立字典。风险提示本文讨论仓位管理技术不构成投资建议。