ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

TqSdk 持仓怎么看才安全?从净仓到活动委托的基础检查

TqSdk 持仓怎么看才安全?从净仓到活动委托的基础检查 读取position.pos只能得到净持仓概览不能单独证明账户已经处于安全状态。多空仓可能互相抵消净值活动委托可能稍后产生新仓位资金和持仓也可能仍在等待最新回报。基础风险检查至少要把账户、持仓、活动委托和成交放在同一时刻观察再与策略的目标状态比较。先读取动态账户与持仓对象下面使用本地模拟账户展示读取结构不创建订单。具体合约只是示例运行时要换成当时有效且确实需要观察的月份合约。import os from tqsdk import TqApi, TqAuth, TqSim symbol SHFE.rb2610 sim TqSim(init_balance100000) api TqApi( sim, authTqAuth(os.environ[TQ_USER], os.environ[TQ_PASSWORD]), ) account sim.get_account() position sim.get_position(symbol) orders sim.get_order() try: while True: api.wait_update() if api.is_changing(position) or api.is_changing(account): alive [o for o in orders.values() if o.status ALIVE] print( 多头, position.pos_long, 空头, position.pos_short, 净仓, position.pos, 活动委托, len(alive), 可用资金, account.available, ) finally: api.close()这些对象都会随wait_update更新。程序启动后不能只读取一次就长期使用每次风险判断要确认数据已经进入事件循环并且所需对象处在可解释状态。净持仓为什么可能隐藏风险净持仓是多头与空头合并后的结果。净值为零时账户可能完全空仓也可能同时持有相等的多头和空头。两种状态的保证金、费用和后续平仓处理不同因此策略若需要“真正空仓”还要分别检查pos_long与pos_short。同样净持仓为一手不代表只有一笔简单多头。它可能由多笔不同时间的多空交易组成。期货平仓还可能涉及今仓与昨仓正式执行不能只根据净值猜测开平标志。风险检查要围绕策略实际管理的仓位范围。如果账户里还有人工交易或其他策略持仓单个策略不能擅自把整个账户净仓当作自己的仓位。最好使用独立账户或清楚的归属记录并在启动时验证边界。持仓上限也不应只写成一个绝对手数。不同合约价值、保证金与波动不同同样十手对应的风险可能完全不同。基础程序可以先使用保守手数上限后续再结合账户权益、合约参数和策略风险预算但任何计算都要保留单位和数据时间。活动委托是尚未落地的未来仓位当前持仓符合目标时仍可能存在尚未成交的买卖委托。例如目标是零仓持仓也为零但一笔开仓单仍处于ALIVE它稍后成交后账户就不再为空。任何“允许新订单”的判断都应先扫描活动委托。活动委托不能只按数量统计还要按合约、方向、开平和剩余手数分析。一个平仓委托和一个开仓委托对风险的影响不同。若程序准备撤单也要等撤单回报完成再重新计算潜在仓位。可以计算一个保守的待成交暴露在当前持仓基础上把活动开仓委托的剩余手数作为可能新增风险单独列出。它不是最终仓位预测却能阻止程序在已有未决请求时继续叠加订单。账户资金要结合订单与行情解释available表示可用资金但下降原因可能是保证金占用、委托冻结、浮动亏损或其他账户变化。只设置一个固定阈值并不能解释风险来源。检查时应同时记录权益、可用资金、持仓和活动委托并明确阈值与策略规模的关系。模拟环境中的保证金和手续费参数会影响资金表现。换到实盘前需要按实际账户与品种重新验证不能沿用本地模拟数字当作承诺。行情剧烈变化时风险也不止是当前可用资金还包括未成交委托和持仓可能继续变化。资金不足时安全行为通常是停止新增风险并报告状态而不是自动缩小手数反复尝试。自动调整若没有清楚规则会让真实动作偏离原策略排错时也很难还原当时意图。启动、运行与退出的三个时点启动时先确认账户登录、现有持仓、活动委托和策略保存状态一致。发现未知持仓或未知订单时应停止新动作先人工或按既定恢复规则处理。不能因为程序刚启动就假设账户也是全新状态。运行中在信号出现前做前置检查在委托变化和成交后做后置检查。前置检查回答“现在是否允许发出动作”后置检查回答“动作是否按预期改变了账户”。两类检查不能只保留一个。退出时停止产生新信号处理程序创建的活动委托再确认最终持仓与退出策略一致。是否要求平仓由业务规则决定但必须明确记录强制结束进程不能代替账户层收尾。重启后从账户事实重建状态而不是从上次内存变量继续推测。保存的目标和日志可以帮助解释但订单、成交和持仓对象才说明账户当前发生了什么。风险状态也要有更新时间。如果行情继续变化而账户回报暂未更新程序不能把来自不同轮次的值拼成一个确定结论。可以在触发交易前要求账户、持仓和委托都完成初始化并在关键对象变化后重新运行检查。多合约账户还需要汇总层。单合约都没有超限不代表账户总保证金和总体方向安全。先让每个合约返回标准化风险结果再由账户层汇总可用资金、活动委托和全部仓位职责会更清楚。风险函数应返回原因只返回True或False不利于排错。检查函数可以返回是否通过、失败代码和关键数值让日志知道究竟是资金不足、存在活动委托、仓位超过限制还是状态尚未准备。def basic_risk_check(position, orders, max_abs_pos): alive [o for o in orders.values() if o.status ALIVE] if alive: return False, ACTIVE_ORDER if abs(position.pos) max_abs_pos: return False, POSITION_LIMIT return True, OK这是最小结构不包含完整实盘风控。实际规则还要按账户、合约和策略补充资金、交易时段、价格有效性与异常状态。重点是让每次拒绝都有可追溯原因而不是静默跳过。持仓风险清单分别读取多头、空头与净持仓不用净值掩盖对锁状态。新动作前检查同合约活动委托及其剩余手数、方向和开平。账户资金、持仓、委托与成交一起解释不从单一字段推断全过程。启动恢复、运行前置、成交后置和退出收尾都有独立检查。风险拒绝返回明确原因与关键值未知状态默认停止新增风险。安全读取持仓的目标不是多打印几个字段而是让当前事实、潜在变化和策略目标处在同一张图里。只有能说明账户现在有什么、还有什么可能成交、下一步为何允许或禁止风险检查才真正有用。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进