一、CTP仓位
LongOpenPosition:多头开仓量
LongOpenFrozen:多头开仓冻结
LongYdPosition:多头昨仓
LongTdPosition:多头今仓
LongCloseTdFrozen:多头平今仓冻结
LongCloseYdFrozen:多头平昨仓冻结
ShortOpenPosition:空头开仓量
ShortTdPosition:空头今仓
ShortYdPosition:空头昨仓
ShortCloseTdFrozen:空头平今仓冻结
ShortCloseYdFrozen:空头平昨仓冻结
LongFrozenAmount:多头冻结金额
ShortFrozenAmount:空头冻结金额
FrozenMargin:冻结保证金
FrozenCommission:冻结手续费
二、仓位查询
1、仓位查询
交易系统启动时会获取账号的当前持仓状况,只能通过查询CTP得到。交易过程中如果有报单或者成交,会有相应的持仓冻结及仓位变化,由于CTP查询流控以及确保仓位更新实时性,通常会自己根据订单回报更新仓位状态。
2、仓位查询API
仓位查询请求API:
virtual int ReqQryInvestorPosition(CThostFtdcQryInvestorPositionField *pQryInvestorPosition, int nRequestID) = 0;
仓位回报回调函数:
virtual void OnRspQryInvestorPosition(CThostFtdcInvestorPositionField *pInvestorPosition, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
3、仓位计算
CThostFtdcInvestorPositionField返回仓位字段如下:
BrokerID:经纪公司代码
InvestorID:投资者代码
PosiDirection:持仓多空方向
HedgeFlag:投机套保标志
PositionDate:持仓日期
YdPosition:上日持仓
Position:当前持仓
LongFrozen:多头冻结
ShortFrozen:空头冻结
LongFrozenAmount:开仓冻结金额
ShortFrozenAmount:开仓冻结金额
OpenVolume:开仓量
CloseVolume:平仓量
OpenAmount:开仓金额
CloseAmount:平仓金额
PositionCost:持仓成本
PreMargin:上次占用保证金
UseMargin:占用保证金
FrozenMargin:冻结保证金
FrozenCash:冻结资金
FrozenCommission:冻结手续费
CashIn:资金差额
Commission:手续费
CloseProfit:平仓盈亏
PositionProfit:持仓盈亏
PreSettlementPrice:上次结算价
SettlementPrice:本次结算价
SettlementID:结算编号
OpenCost:开仓成本
ExchangeMargin:交易所保证金
CombPosition:组合成交形成持仓
CombLongFrozen:组合多头冻结
CombShortFrozen:组合空头冻结
CloseProfitByDate:逐日盯市平仓盈亏
CloseProfitByTrade:逐笔对冲平仓盈亏
TodayPosition:今日新开仓
MarginRateByMoney:保证金率
MarginRateByVolume:保证金率(按手数)
StrikeFrozen:执行冻结
StrikeFrozenAmount:执行冻结金额
ExchangeID:交易所代码
YdStrikeFrozen:执行冻结昨仓
InvestUnitID:投资单元代码
InstrumentID:合约代码
CTP持仓查询结果会根据账户合约的持仓多空方向分批进行推送,PosiDirection字段值为THOST_FTDC_PD_Long('2')表示多头持仓,THOST_FTDC_PD_Short('3')表示空头持仓。
LongPosition = Position
ShortPosition = Position
LongOpenPosition = OpenVolume
ShortOpenPositon = OpenVolume
LongClosePosition = CloseVolume
ShortClosePosition = CloseVolume
CurrentYdPosition = Position - TodayPosition
YdPosition = YdPosition
三、实时仓位计算
1、平仓操作
CTP成交回报和报单回报返回数据中,Direction字段值为THOST_FTDC_D_Buy('0')表示买入,THOST_FTDC_D_Sell('1')表示卖出。OffsetFlag开平标识字段值为THOST_FTDC_OF_Open('0')表示开仓,THOST_FTDC_OF_Close('1')表示平仓,THOST_FTDC_OF_ForceClose('2')表示强平,THOST_FTDC_OF_CloseToday('3')表示平今,THOST_FTDC_OF_CloseYesterday('4')表示平昨,THOST_FTDC_OF_ForceOff('5')表示强减,THOST_FTDC_OF_LocalForceClose('6')表示本地强平。
中金所平仓不分平今仓和平昨仓,一旦开仓,多头或空头的所有昨仓将会视为今仓,因此平仓操作成交回报只会返回THOST_FTDC_OF_Close('1'),需要根据Direction以及合约持仓的LongTdPosition、ShortTdPosition进行判断。如果LongTdPosition、ShortTdPosition大于0,平仓操作为平今仓,否则为平昨仓。
2、成交回报仓位计算
virtual void OnRtnTrade(CThostFtdcTradeField *pTrade);
CThostFtdcTradeField字段如下:
BrokerID:经纪公司代码
InvestorID:投资者代码
OrderRef:报单引用
UserID:用户代码
ExchangeID:交易所代码
TradeID:成交编号
Direction:买卖方向
OrderSysID:交易所报单编号
ParticipantID:会员代码
OffsetFlag:开平标识
HedgeFlag:投机套保标识
Price:价格
Volume:数量
TradeType:成交类型
TraderID:交易员代码
OrderLocalID:本地报单编号
SettlementID:结算编号
InstrumentID:合约代码
if(pTrade->Direction == THOST_FTDC_D_Buy && pTrade->OffsetFlag[0] == THOST_FTDC_OF_Close)
{
if(ShortTdPosition > 0)
{
// Close Short Today Position
}
else
{
// Close Short YesToday Position
}
}
else if(pTrade->Direction == THOST_FTDC_D_Sell && pTrade->OffsetFlag[0] == THOST_FTDC_OF_Close)
{
if(LongTdPosition > 0)
{
// Close Long Today Position
}
else
{
// Close Long YesToday Position
}
}
3、报单回报仓位计算
virtual void OnRtnOrder(CThostFtdcOrderField *pOrder);
CThostFtdcOrderField字段如下:
BrokerID:经纪公司代码
InvestorID:投资者代码
OrderRef:报单引用
UserID:用户代码
OrderPriceType:报单价格条件
Direction:买卖方向
CombOffsetFlag:组合开平标识
CombHedgeFlag:组合投机套保标识
LimitPrice:价格
VolumeTotalOriginal:数量
TimeCondition:有效期类型
VolumeCondition:成交量类型
MinVolume:最小成交量
ContingentCondition:触发条件
StopPrice:止损价
ForceCloseReason:强平原因
RequestID:请求编号
OrderLocalID:本地报单编号
ExchangeID:交易所代码
ParticipantID:会员代码
TraderID:交易员代码
OrderSubmitStatus:报单提交状态
SettlementID:结算编号
OrderSysID:交易所报单编号
OrderStatus:报单状态
OrderType:报单类型
VolumeTraded:今成交数量
VolumeTotal:剩余数量
FrontID:前置编号
SessionID:会话编号
StatusMsg:订单状态信息
AccountID:资金帐号
InstrumentID:合约代码
VolumeTraded:今成交数量
VolumeTotal:剩余数量
VolumeTotalOriginal:数量
if(pOrder->Direction == THOST_FTDC_D_Buy && pOrder->CombOffsetFlag[0] == THOST_FTDC_OF_Close)
{
if(ShortTdPosition > 0)
{
// Close Short Today Position
}
else
{
// Close Short YesToday Position
}
}
else if(pOrder->Direction == THOST_FTDC_D_Sell && pOrder->CombOffsetFlag[0] == THOST_FTDC_OF_Close)
{
if(LongTdPosition > 0)
{
// Close Long Today Position
}
else
{
// Close Long YesToday Position
}
}