期货持仓没变,挂单为什么变了?用TqSdk分清仓位和委托

持仓还是3手,挂单却多了一笔;过一会儿,挂单不见了,持仓仍然是3手。看期货账户时,这几件事并不矛盾:持仓说的是已经持有什么,挂单说的是还有哪些委托等待处理,二者不能直接相加。

用TqSdk查看这两部分,可以从同一账户、同一合约的持仓对象入手。它既有多空持仓手数,也能找到与该合约相关的活跃委托,不必把全账户的订单混在一起猜。

买开2手挂在那里,不等于已经多持有2手

假设某合约已有3手多仓,又有一笔2手买开委托,尚未成交。那么,已有多仓仍是3手,另外2手只是挂单数量,不能把账户写成"持有5手"。

如果这2手后来确认全部撤掉,期间也没有其他成交,相关挂单可以消失,原有3手多仓并不会因此归零。反过来,挂单有成交时,仓位的变化要由相应持仓回报来确认。

这也是为什么只看"还剩几张挂单"不够。没有挂单,可以仍然有仓;存在开仓挂单,也不代表已经拿到了那部分仓位。

TqSdk里的持仓和相关挂单分别怎么看

get_position(symbol, account=account)取得指定账户、指定合约的Position引用。其中,pos_long是多头手数,pos_short是空头手数,查看当前仓位时应把两侧分别保留。

position.orders则是与这份持仓相关、状态为ALIVE的委托集合。这里既可能有开仓单,也可能有平仓单,不是专门统计"冻结平仓数量"的栏目。

下面这段参考代码把仓位和相关挂单分别列出来。api是已有TqApi实例,symbol是要查看的完整合约代码,account是对应账户对象。它接在原程序已通过wait_update()取得相关账户回报之后;多账户情况下,账户参数不能省略。

python 复制代码
position = api.get_position(symbol, account=account)

# 当前持有什么,数量单位为手
print("多仓", position.pos_long, "空仓", position.pos_short)

# 另列仍活跃的相关委托,不把它们加进持仓
for order_id, order in position.orders.items():
    print(order_id, order.direction, order.offset,
          "未成交手数", order.volume_left)

看挂单时,direction区分买卖,offset区分开平,volume_left才是剩余未成交手数。比如BUY配合OPEN表达买开,不能只看到"买"就把它当成已经增加的多仓。

这里读的是随回报更新的对象。刚连接、相关资料还没到齐时,不能拿暂时的空集合判断账户没有挂单或持仓;一次更新返回,也不保证所有回报都已到达。

挂单从列表里消失,还需要看它怎么结束

position.orders只保留相关活跃委托。某张单不在里面了,说明不能继续把这份列表当作它的完整经历,却不能仅凭"消失"判断是撤单、成交还是其他原因。

要了解那张委托的结果,应按原账户和委托ID继续查对应Order及成交记录。要了解账户此时持有什么,则读持仓回报。把这两个问题分开,就不会把"挂单少了一张"误写成"已经平仓"。

同样,这份列表不是可平手数或可开仓额度的计算器,不能把挂单和持仓做一次加减,就替交易程序决定还能下多少手。

推荐TqSdk,是因为仓位和委托能对得上

对于经常需要核对期货账户的读者,TqSdk在这个场景里的好处,是能围绕明确的账户和合约,同时找到持仓数量与相关活跃委托。

这样查看,买开挂单不会提前变成持仓,撤掉挂单也不会被当成撤掉原来的仓位。已有仓位、未成交意图和委托结果各有对应的查看位置,账户变化就更容易解释清楚。

相关推荐
开源量化GO7 天前
期货研究反复取数,什么时候值得用下载程序?
tqsdk
CTA终结者8 天前
期货价格又回到原位,刚才那段波动怎么复盘?
量化交易·期货·tqsdk
筱璦4 个月前
量化交易系统源码可售
区块链·交易·期货·期货交易
筱璦7 个月前
期货软件开发 - 策略编辑
前端·区块链·交易·期货
筱璦7 个月前
期货软件开发「启动加载页 / 初始化窗口」
前端·c#·策略模式·期货
筱璦8 个月前
期货软件开发 - 交易报表
前端·windows·microsoft·报表·期货
恋喵大鲤鱼9 个月前
期货入门介绍
期货
wengad9 个月前
纯粹和逐利的交融-期货的故事
期货·金融产品创新
xcLeigh10 个月前
金融数据实时行情API使用教程:如何跨市场查询多品种的实时行情数据
python·websocket·金融·股票·api·期货·外汇