Hello CTP(八)——REM仓位计算

一、仓位查询

1、仓位查询API

virtual RESULT QueryAccountPosition(const char* accountId, int nReqId)  = 0 ;
virtual void OnQueryAccountPosition(const char* pAccount, EES_AccountPosition* pAccoutnPosition, int nReqId, bool bFinish);

2、仓位计算

EES_AccountPosition字段如下:

EES_Account m_actId:账户

EES_Symbol m_Symbol:合约代码

EES_PosiDirection m_PosiDirection:多空方向,多头(1),空头(5)

unsigned int m_InitOvnQty:隔夜仓初始数量,不会变化

unsigned int m_OvnQty:当前隔夜仓数量,可以为0

unsigned int m_FrozenOvnQty:冻结的昨仓数量

unsigned int m_TodayQty:当前今仓数量,可能为0

unsigned int m_FrozenTodayQty:冻结的今仓数量

double m_OvnMargin:隔夜仓占用保证金

double m_TodayMargin:今仓占用的保证金

double m_PositionCost:持仓成本

EES_HedgeFlag m_HedgeFlag:仓位对应的投机套利标志

REM持仓查询结果会根据账户合约的持仓多空方向分批进行推送,m_PosiDirection字段值为EES_PosiDirection_long(1)表示多头持仓,EES_PosiDirection_short(5)表示空头持仓。

LongPosition = m_TodayQty

ShortPosition = m_TodayQty

LongOpenPosition = m_TodayQty - m_OvnQty

ShortOpenPositon = m_TodayQty - m_OvnQty

YdPosition = m_InitOvnQty

二、实时仓位计算

REM成交回报通过OnOrderExecution推送。

virtual void OnOrderExecution(EES_OrderExecutionField* pExec);

EES_UserID m_Userid:UserID

EES_Nanosecond m_Timestamp:成交时间,从1970年1月1日0时0分0秒开始的纳秒时间

EES_ClientToken m_ClientOrderToken:订单token

EES_MarketToken m_MarketOrderToken:REM订单号

unsigned int m_Quantity:订单成交量

double m_Price:订单成交价

EES_MarketToken m_ExecutionID:订单成交号(TAG 1017)

EES_MarketExecId m_MarketExecID:交易所成交号

基于成交回报的EES_ClientToken m_ClientOrderToken字符串格式化的订单引用OrderRef维护订单状态,根据订单状态OrderStatus的InstrumentID和OrderSide确定合约及其多空持仓、平仓,实时计算合约仓位信息。

在计算合约冻结仓位数量时,可以在OnOrderAccept增加合约冻结仓位数量,在OnOrderMarketReject、OnOrderExecution或OnOrderCxled减少合约冻结仓位数量,需要根据订单状态开平标识区分多空开平标识。