CTP查询持仓和持仓明细的那些事儿

这篇具有很好参考价值的文章主要介绍了CTP查询持仓和持仓明细的那些事儿。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

很多CTP API初学者遇到的一个头疼的事情,就是持仓和持仓明细的查询。这里简单介绍一下这二者的查询的处理,希望对大家有所帮助。

首先讲一下啥是持仓,以及啥是持仓明细

CTP里的持仓明细,则是由开仓成交产生的逐笔持仓数据,而持仓,实际是持仓明细按合约、买卖方向、持仓日期类型等汇总而成的持仓数据,可能把它叫"持仓汇总"会更贴切。

举个例子来方便大家理解:

假设在沪深300指数六月(IF2406)和九月(IF2409)合约上初始时没有持仓。今天(2024年3月28日)陆续在这两个合约上分别报入了一个委托,而且这两个委托都是开仓20手,并且都成交了。订单和成交流水如下:

合约代码 订单编号 方向 报单价格/元 成交编号 成交数量/手 成交价格/元
IF2406 00001 买入/开仓 3500 T10000 20 3500
IF2409 00002 卖出/开仓 3450 T10086 8 3450.2
T10099 12 3450.4

则最终账户里有3笔持仓明细,如下所示:

持仓明细序号 合约代码 持仓明细买卖方向 开仓成交编号 开仓日期 开仓成交价格/元 数量/手
1 IF2406 买入 T10000 20240328 3500 20
2 IF2409 卖出 T10086 20240328 3450.2 8
3 IF2409 卖出 T10099 20240328 3450.4 12

最终有2笔持仓,如下所示:

持仓序号 合约代码 持仓方向 持仓日期类型 持仓均价/元 数量/手
1 IF2406 多头 今仓 3500 20
2 IF2409 空头 今仓 3450.32 20

聪明的你可能已经猜到了,在同一个账户里,持仓持仓明细的KEY是什么。

持仓明细的KEY是以下字段的组合:

  • 买卖方向(Direction)
  • 开仓日期(OpenDate)
  • 开仓成交编号(TradeID)
  • 成交类型(TradeType)
    • 成交类型一般是组合衍生的成交或普通成交,如果不涉及组合套利合约的交易,一般都是普通成交。
  • 投机套保标志(HedgeFlag)
    • 投机套保标志分为投机和套保(套期保值)等,投机持仓和套保持仓是互相独立的,当然,普通投资者订单一般都是投机标志。

 对于不涉及套期保值和组合合约交易的大部分投资者来说,可以忽略HedgeFlagTradeType字段.如果不考虑自成交的情况,可以忽略Direction字段。同时,由于CTP中不同的交易日的成交编号有可能重复(不能扔掉开仓日期),因此对单个账户的持仓明细的key可以简化为:

开仓日期(OpenDate) + 开仓成交编号(TradeID)

开发者可以根据此KEY,来区分及储存持仓明细

持仓的KEY是以下字段的组合:

  • 持仓多空方向(PosiDirection)
  • 持仓日期类型(PositionDate)
  • 投机套保标志(HedgeFlag)

目前,上期所(SHFE)和能源中心(INE)这两个交易所是区分今仓和昨仓(历史仓),因此它们的持仓在持仓日期类型(PositionDate)上有区分(即THOST_FTDC_PSD_Today今仓和THOST_FTDC_PSD_History昨仓)。其他交易所则不区分,持仓日期类型的值无多大意义,一般值都是THOST_FTDC_PSD_Today(今仓)。

在上面的例子里,由于是中金所合约的持仓,所以查询得到的这两条持仓记录中的持仓日期类型都是THOST_FTDC_PSD_Today(今仓),即使是(当天结算后)到了第二天的交易日,这两个持仓(已经变成了昨仓)它们的持仓日期类型仍然还是THOST_FTDC_PSD_Today(今仓)。

如果你动手能力够强,可以自行由持仓明细合成出持仓汇总

查询持仓明细

CTP查询持仓明细的请求函数是:

int ReqQryInvestorPositionDetail
(CThostFtdcQryInvestorPositionDetailField*pQryInvestorPositionDetail, int nRequestID);

返回值:
0,代表成功。
-1,表示网络连接失败;
-2,表示未处理请求超过许可数;
-3,表示每秒发送请求数超过许可数。

查询持仓明细的响应函数是:

void OnRspQryInvestorPositionDetail
(CThostFtdcInvestorPositionDetailField* pInvestorPositionDetail,
CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);

用户可以根据交易所代码和合约代码等来查询持仓明细。下面是一个示例:

void CCTPTrade::QueryPositionDetail(const std::string& contract)
{
	CThostFtdcQryInvestorPositionDetailField req = { 0 };
	::strcpy(req.BrokerID, m_BrokerID.c_str());
	::strcpy(req.InvestorID, m_userID.c_str());
	::strcpy(req.InstrumentID, contract.c_str());
	::strcpy(req.ExchangeID, "");

	int ret = m_pAPI->ReqQryInvestorPositionDetail(&req, ++m_requestId);
	if (ret != 0) {
		std::cerr << "Query position detail failed!" << std::endl;
		return;
	}
}

         和其他查询类似, 查询持仓明细受到查询流控的影响, 在途查询仅能有一笔, 同时有两次查询时间间隔的限制(一般为间隔1秒)。用户可以通过一些字段来对查询范围做出限制,如可以不填BrokerIDInvestor, 若如此做, 则为默认查询登录的此账户的持仓明细. 查询时, 可以不填InstrumentID合约代码ExchangeID交易所代码, 若如此做, 则为InstrumentIDExchangeID不做限制, 即查询满足其他条件的任意合约或任意交易所的合约的持仓明细

举个例子:

1. InstrumentID填"IF2409",其他填为空,则查询账户中的所有的IF2409合约的持仓明细,在上面的例子中,会查询返回2条记录。

2. ExchangeID填"DCE",其他填为空,则查询账户中的所有的DCE交易所(大商所)的合约的持仓明细,在上面的例子中,会查询返回0条记录。

        查询持仓明细的响应OnRspQryInvestorPositionDetail中:

  1. 若有多条满足条件的持仓明细,则分成多次返回,最后一条的记录bIsLast值为true。
  2. 若没有任何满足条件的持仓明细,则仅返回一次(空的记录),其bIsLast值为true,pInvestorPositionDetail参数空指针

在上面的例子里,如果不限制查询的条件则能查询到3条持仓明细记录,返回第3条记录时,bIslast值为true。

需要提到的是,有时候会查询得到持仓数量为0的持仓明细记录,这表明这个持仓明细在今天已经被完全平仓了。盘后结算时,已全部平仓的持仓明细将被清除,第二天就无法再查询到了。

查询持仓

CTP查询持仓的请求函数是:

int ReqQryInvestorPosition
(CThostFtdcQryInvestorPositionField *pQryInvestorPosition, int nRequestID);

返回值:
0,代表成功。
-1,表示网络连接失败;
-2,表示未处理请求超过许可数;
-3,表示每秒发送请求数超过许可数。

查询持仓的响应函数是:

void OnRspQryInvestorPosition
(CThostFtdcInvestorPositionField *pInvestorPosition,
CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);

用户可以根据交易所代码和合约代码等来查询持仓。下面是一个示例:

void CCTPTrade::QueryPosition(const std::string& contract)
{
	CThostFtdcQryInvestorPositionField req = { 0 };
	::strcpy(req.BrokerID, m_BrokerID.c_str());
	::strcpy(req.InvestorID, m_userID.c_str());
	::strcpy(req.InstrumentID, contract.c_str());
	::strcpy(req.ExchangeID, "");

	int ret = m_pAPI->ReqQryInvestorPosition(&req, ++m_requestId);
	if (ret != 0) {
		std::cerr << "Query position failed!" << std::endl;
		return;
	}
}

查询持仓和查询持仓明细的方法类似,这里不做赘述。

CThostFtdcInvestorPositionField 持仓数据结构部分字段的说明:

Position: 表示当前持仓数量(手数)

TodayPosition: 表示今日新开仓数量,也就是当前持仓数量里的今仓的数量

YdPosition: 表示昨日收盘时持仓数量(≠ 当前的昨仓数量, 静态, 日间不随着开平仓而变化)

YdStrikeFrozen: 该字段是给个股期权用的, 期货期权里一直保持为0

OpenVolume: 当日累计开仓量,一天之内只会增加不会减少

CloseVolume: 当日累计平仓量,一天之内只会增加不会减少

OpenAmount: 当日开仓成交的成交额,一天之内只会增加不会减少

CloseAmount: 当日平仓成交的成交额,一天之内只会增加不会减少

LongFrozen: 多头冻结. 未成交的买入委托(含开仓和平仓)的未成交数量

ShortFrozen: 空头冻结. 未成交的卖出委托(含开仓和平仓)的未成交数量

OpenCost: 开仓成本, 等于汇总的各笔持仓明细的开仓成本的和

PositionCost: 持仓成本, 等于汇总的各笔持仓明细的持仓成本的和

FrozenMargin: 冻结的保证金, 开仓未成交的委托占用的冻结的保证金

PositionProfit: (当日的)(逐日盯市)持仓盈亏. 期权没有持仓盈亏, 为0.

CloseProfit: (当日的)(逐日盯市)平仓盈亏. 期权没有平仓盈亏, 为0.

        例如, CF101的多头持仓4手, 平仓掉1手, 则这笔平仓成交产生的平仓盈亏会计入到剩下的这3手的CF101多头持仓记录中。


持仓字段中没有当前昨仓数量, 开仓均价, 持仓均价, 可用持仓(即可平持仓)数量等字段, 它们需要我们自己来算:

当前的昨仓数量 = Position - TodayPosition

开仓均价 = OpenCost / (Position * 合约乘数)

持仓均价 = PositionCost / (Position * 合约乘数)

可用数量:

        可用数量(对于多头持仓) = Position - ShortFrozen - CombShortFrozen

        可用数量(对于空头持仓) = Position - LongFrozen - CombLongFrozen

持仓明细类似,有时候会查询得到持仓数量为0的持仓记录,这表明这个持仓在今天已经被完全平仓了,或者今天曾有过开仓报单但报单还没有成交过。当然,这种持仓中的平仓盈亏(CloseProfit)和平仓量(CloseVolume)等数据可能是有数值(而非0)的。盘后结算时,已全部平仓的持仓将被清除,第二天就无法再查询到了。

如果有更多想要了解的,欢迎加入QQ交流群 736174420,一起讨论交流CTP API的使用!文章来源地址https://www.toymoban.com/news/detail-850562.html

到了这里,关于CTP查询持仓和持仓明细的那些事儿的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch第七讲:ES查询速度为什么那么快

    介绍给大家一个开源SpringCloud项目。整合了大部分开源中间件,详情信息可以查看文档: spring cloud开源组件开发 另外自己以后博客所讲解的代码内容,都会我的Git上同步(GitHub同步)GIT地址 ES使用的数据结构是倒排索引,在对搜索内容进行分词的时候,会根据搜索内容分词结

    2023年04月19日
    浏览(41)
  • Mysql8.0为什么取消了缓存查询的功能

    首先我们介绍一下 MySQL的缓存机制 【MySQL缓存机制】 简单的说就是缓存sql文本及查询结果,如果运行完全相同的SQL,服务器直接从缓存中取到结果,而不需要再去解析和执行SQL。 但如果表中任何数据或是结构发生改变,包括INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或

    2023年04月20日
    浏览(44)
  • mysql查询慢是为什么 怎么改善43.242.205.12

    MySQL查询速度慢是一个令人头痛的问题,它可能会导致应用程序性能下降,影响用户体验。为了解决这个问题,需要了解MySQL查询速度慢的原因,并采取相应的改善措施。 一、MySQL查询速度慢的原因43.242.205.1 查询语句不合理 不合理的查询语句是导致MySQL查询速度慢的常见原因

    2024年02月12日
    浏览(31)
  • pycharm创建的虚拟环境为什么用conda env list命令查询不到?

    问题描述:pycharm创建的虚拟环境为什么用conda env list命令查询不到。 pycharm开发环境可以创建虚拟环境,目的是为隔绝其他环境种库带来的版本干扰,但是发现一个问题,无论是在windows终端、anaconda终端、Pycharm开发环境中的终端使用conda env list命令都查不到venv环境。

    2024年02月10日
    浏览(39)
  • Netty为什么高效,为什么这么受欢迎?

    上篇文章通过 Java NIO 的处理流程与 Netty 的总体流程比较,并结合 Netty 的源码,可以更加清晰地理解Netty。本文将结合源码详细解析Netty的高效和强大功能的设计原理,学习 Netty 是如何实现其卓越的性能和功能特性,也希望可以在日后工作中利用到 Netty 的设计思想。 我们先看

    2024年02月12日
    浏览(57)
  • Redis—Redis介绍(是什么/为什么快/为什么做MySQL缓存等)

    一、Redis是什么 Redis 是一种 基于内存的数据库 ,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于 缓存,消息队列、分布式锁等场景 。         Redis 提供了多种数据类型来支持不同的业务场景,比如 String(字符串)、Hash(哈希)、 List (列表)、Set(集合)、

    2024年02月10日
    浏览(52)
  • AIMD 为什么收敛(tcp reno/cubic 为什么好)

    TCP 拥塞控制目标是缓解并解除网络拥塞,让所有流量公平共享带宽,合在一起就是公平收敛。 AIMD(几乎所有与拥塞控制相关的协议或算法都有 AIMD 的影子,包括 RoCE,BBRv2) 为什么收敛?我一般会给出下面的老图: 虽然只展示了两条流的收敛,但 n 条流收敛的展示无非就是将

    2024年02月06日
    浏览(64)
  • tcp 为什么要三次握手,两次不行吗?为什么?

    TCP使用三次握手(Three-Way Handshake)的过程是为了确保双方建立起可靠的通信连接,并在连接的建立过程中协商必要的参数。两次握手是不够的,原因主要有以下几点: 防止已失效的连接请求被接受: 假设有A和B两台主机,A向B发送了一个连接请求,但由于某些原因导致连接建

    2024年02月20日
    浏览(50)
  • 为什么美国加息,会让硅谷银行破产?美联储为什么要加息?

    所有回答由 AI 生产 答 : 美国加息会导致国债利率上升,此时购买国债的银行获得的利息收益会比利率较低时少,因此国债的市场价格就会下降,从而导致银行持有的这些国债资产减值。 答 : 美国加息意味着美国央行(即联邦储备委员会)将提高其官方基准利率,这意味着

    2023年04月23日
    浏览(51)
  • 为什么用python做人工智能,为什么人工智能用python

    大家好,给大家分享一下python人工智能为什么放到最后才学,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! Source code download: 本文相关源码 一、为何人工智能(AI)首选Python? 读完这篇文章你就知道了。我们看谷歌的TensorFlow基本上所有的代码都是C++和Python,

    2024年02月22日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包