持仓风控是程序化交易的必备风控之一,而持仓风控准确的前提是自己的交易系统要有准确的初始持仓及准确的后续更新持仓更新规则。
一般启动交易系统会做一系列初始化的操作,其中重要的一步便是获取该账号的当前持仓状况,这只能通过查询CTP得到。而后续的交易过程中如果有报单或者成交,就会有相应的持仓冻结及仓位变化,由于CTP的查询流控及为了确保仓位更新的实时性,我们一般会自己根据相应回报去更新仓位状态(当然如果是趋势性策略不在乎一丁点延时,直接去查询CTP而省去麻烦的更新也可以),这就涉及到一定的更新规则。

  1. 持仓函数与报文
    1.1. 持仓查询请求
    查询所有持仓
    CThostFtdcQryInvestorPositionField qrypositionfield = {0};
    m_pTradeApi->ReqQryInvestorPosition(&qrypositionfield, 0);
    1.2. 持仓查询返回
    对应的查询结果返回函数为:
    ///请求查询投资者持仓响应
    virtual void OnRspQryInvestorPosition(CThostFtdcInvestorPositionField *pInvestorPosition, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};

1.2.1. pInvestorPosition
返回结果在第一个参数中pInvestorPosition中,参数类型为CThostFtdcInvestorPositionField,

1.持仓记录键值
///合约代码
InstrumentID;
///经纪公司代码
BrokerID;
///投资者代码
InvestorID;
///持仓多空方向
PosiDirection;
///投机套保标志
HedgeFlag;
///持仓日期
PositionDate;
开头这6个字段我们称之为持仓记录的键值(Key),通过这6个字段就可以区分唯一一条持仓记录。
InstrumentID记录的是合约ID,例如通过这个字段可以区分究竟是au2012的持仓还是ag2012的持仓记录。
PosiDirection是枚举值,'2’表示多头持仓;‘3’表示空头持仓,可见同一合约的不同方向的持仓在CTP是通过不同的记录来返回的。
HedgeFlag是投机套保标志枚举值,多数投资者是’1’,表示为投机仓。
PositionDate是区分是否历史仓的枚举值,‘1’表示当前交易日持仓;‘2’表示是历史仓(昨仓)。只有上期/能源交易所的合约才可能有PositionDate为‘2’的持仓记录,因为上期/能源区分今仓和昨仓记录,昨仓平仓需要单独指定平昨仓。
经过上面分析,对于个人投资者关键键值字段为合约,方向,持仓日期这3个,有这3个基本就能确定唯一持仓。

  1. 持仓数量
    ///上日持仓
    YdPosition;
    ///今日持仓
    Position;
    ///今日持仓
    TodayPosition;
    Position是当前键值下的总持仓,随着客户开仓平仓而变动
    TodayPosition是当前键值下的今日新持仓数量,随着客户开仓平今而变动
    YdPosition是当前键值下的昨仓,需要注意:
  1. 这是一个静态值,为当前交易日开始时客户该合约的历史仓位,并不会随着客户平昨仓而减小;
  2. 当前真实的昨仓值为Position-TodayPosition;
  3. 对于非上期/能源的交易所,合约的昨仓YdPosition和今仓TodayPosition在一条记录里面,而上期/能源是分成了两条记录。
  1. 冻结仓位
    ///多头冻结
    LongFrozen;
    ///空头冻结
    ShortFrozen;
    冻结是指已报单但未成交的数量,对于多头持仓,多头冻结是指新开多头未成交的数量,空头冻结是指平多头仓位报单未成交的数量;空头持仓与之相反。

4.其他字段
///开仓量,当天该键值上总的开仓量
OpenVolume;
///平仓量, 当天该键值上总的平仓量
CloseVolume;
///持仓成本, 当天新开仓按开仓价计算,昨仓则是用昨结算价计算,计算公式为pricevolumeRateMultiple
PositionCost;
///开仓成本, 新老仓都是按照开仓价计算的成本,如果无昨仓与持仓成本字段是相同的值
OpenCost;
///平仓盈亏, 等于下面的逐日盯市平仓盈亏
CloseProfit;
///持仓盈亏, 按最新价计算出来的持仓值与持仓成本的差值
PositionProfit;
///逐日盯市平仓盈亏, 昨仓是平仓价与昨结算价计算出的盈亏,今仓是平仓价与开仓价计算出的盈亏 ,计算公式为(closeprice - openprice或preSettlementPrice)volumeRateMultiple
CloseProfitByDate;
///逐笔对冲平仓盈亏, 平仓价与开仓价计算出的盈亏
CloseProfitByTrade;
///保证金率, 该合约的交易保证金率,同查询所得值一致。昨仓无此值。
MarginRateByMoney;
///保证金率(按手数), 该合约的交易保证金率(按手数),同查询所得值一致。昨仓无此值。
MarginRateByVolume;
1.2.2. pRspInfo
为NULL空指针,无用。
1.2.3. nRequestID
与请求函数中客户填写的nRequestID值一致,是为了将查询结果与请求对应起来。
1.2.4. bIsLast
bool变量,用于判断是否是最后一条查询结果。上面讲过,如果客户有多条持仓记录的话会多次回调函数返回结果,那如何判断所有的结果都已经回调给客户了呢?就是通过bIsLast判断。当bIsLast是true的时候表示该次回调为这次查询的最后一条结果。

  1. 持仓更新流程
    2.1. 报单请求
    持仓操作主要是进行冻结,如下:
    买:多头冻结
    卖:空头冻结

买开仓报单则在多头对应的持仓记录上增加多头冻结(LongFrozen),多头冻结金额(LongFrozenAmount),冻结的保证金(FrozenMargin),冻结的手续费(FrozenCommission)。

买平仓报单则在空头对应的持仓记录上增加多头冻结(LongFrozen),多头冻结金额(LongFrozenAmount),冻结的手续费(FrozenCommission),因为是平仓操作所以没有冻结的保证金。

卖开仓报单则在空头对应的持仓记录上增加空头冻结(ShortFrozen),空头冻结金额(ShortFrozenAmount),冻结的保证金(FrozenMargin),冻结的手续费(FrozenCommission)。

卖平仓报单则在空头对应的持仓记录上增加空头冻结(ShortFrozen),空头冻结金额(ShortFrozenAmount),冻结的手续费(FrozenCommission),因为是平仓操作所以没有冻结的保证金。

对于开仓来说相应的冻结资金字段比较重要,因为这些冻结资金字段涉及到可用资金的计算,关系到客户后面能继续开仓的数量;
对于平仓来说冻结持仓字段比较重要,因为冻结持仓数量涉及到可平仓数量的计算。
平仓时可平仓数量的计算公式:
多头持仓下可平数量=持仓数量—空头冻结数量;
空头持仓下可平数量=持仓数量—多头冻结数量;
2.2. 收到成交回报
收到成交回报时,解冻,释放冻结
2.3. 主动撤单
撤单时,解冻,释放冻结

2.4. 收到报单被拒绝
收到报单被拒绝时进行撤单,解冻,释放冻结

期货ctp持仓查询与更新相关推荐

  1. 分布式高频量化交易系统架构讲解(企业版,期货ctp,股票xtp,数字货币,附全部源码)(值得收藏)

    目录 1.量化交易系统简介 1.1行情数据 1.2交易策略 1.3交易 2.    分布式高频量化交易系统 2.1.    架构图 2.1.1量化交易系统教程地址 2.1.2量化交易系统教程中讲解的期 ...

  2. 量化交易期货ctp使用说明(企业版,穿透式监管)(值得收藏)

    1.代码说明 本文章中的期货ctp代码来自分布式高频量化交易系统 联系作者,获取源码:高频量化交易系统的学习交流群 - 简书 (jianshu.com) 2.期货ctp介绍, 2.1 期货账户 要连接 ...

  3. CTP下单与持仓查询

    一.下单 下单用限价单方法,目前支持市价单的只有郑商所和大商所.但是如果想要在其他交易所下市价单,也可通过下限价为跌停价或者涨停价的限价单达到同样的效果. 二.查询持仓 CTP查询持仓直接调用交易AP ...

  4. 期货CTP接口C++源码与C#应用程序的对接

    大家知道,期货CTP接口是由上期技术公司提供的,它提供的源码和范例都是用C++语言写的,这在应用上有一定局限性.比如我在实盘中需要数据库,需要程序化,需要K线图,需要这样那样的功能,下单之前要做一堆一 ...

  5. Python - 期货CTP常见问题解答

    Python - 期货CTP常见问题解答 文章目录 Python - 期货CTP常见问题解答 前言 CTP接口说明 一.提示网络连接失败 问题详情 解决方法 二.导入CTP接口报错 问题详情 解决方法 ...

  6. 期货的交易量和持仓量(期货的持仓量和成交量)

    期货的成交量,持仓量,日增仓都各代表什么意思 期货的成交量是指已经成交的合约数量:持仓量也称空盘量或未平仓合约量,是指买入或卖出后尚未对冲及进行实物交割的某种商品期货合约的数量:日增仓是当天的持仓的增 ...

  7. 另类数据:跟踪期货高手持仓策略(完整录播)

    数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学,点击下方链接报名: 量化投资速成营(入门课程) Python股票量化投资 Python期货量化投资 Python数 ...

  8. VNPY官方发布VNTrader,VNPY性能提升380%,python的便捷,C++性能加持, 期货CTP接口Python和PyQT框架

    VNPY官方 VNTrader (基于期货CTP接口专用量化交易开源软件) 介绍 VNTrader是VNPY官方 http://www.vnpy.cn 推出的一款国内期货量化交易开源软件, 基于MIT ...

  9. 期货CTP接口与程序化(量化交易)的对接(2)——基本概念

    上一讲:期货CTP接口与程序化(量化交易)的对接(1) 先理清几个概念. 策略 这是交易思路. 举一个简单的例子.下文都用这个例子来说明问题. 假如我给自己规定:"每当出现长阳,我就买进,每 ...

最新文章

  1. Transformer在CV领域有可能替代CNN吗?还有哪些应用前景?
  2. Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现)
  3. 比较windows phone程序启动和android程序启动原理
  4. 光辉之章事件有哪些常规操作?天谕手游事后的补偿真的很安慰?
  5. 用汇编语言写的第一个DOS程序
  6. 二叉树非递归后序遍历算法
  7. MVVM更容易内存泄露吗?
  8. ARMS在APM工具选型中的实践
  9. python小游戏之二
  10. jenkins 安装 和自动部署的 一些配置
  11. Android控制文字水平间距android:letterSpacing
  12. 《团队-科学计算器-模块开发过程》
  13. DPM 2010(二)---BMR裸机恢复域控制器
  14. 深度学习中的数据增强方法
  15. 五分钟深入 Hadoop 内核
  16. python白鹅类型_fluent python 11.10节 鹅的行为有可能像鸭子
  17. java的dataset怎么用,C# DataSet的基本用法
  18. 远程过程调用(RPC)详解
  19. 多线程输出奇数和偶数
  20. 微信小程序 自定义日期选择器

热门文章

  1. matlab 呼吸灯,STM32的呼吸灯.doc
  2. AutoCAD2016安装破解教程
  3. 计算机桌面空白地方鼠标右击没有属性选项,Win7系统右键计算机属性不见了怎么办...
  4. iOS arc weak指针原理
  5. C语言 : weak_alias描述
  6. 操作体验极度舒适的多功能软件卸载工具 - iObit Uninstaller PRO
  7. 2029. 石子游戏 IX(C++解法与思路)
  8. 计算机图形学(1)——概论
  9. 服务器部署系统启动失败,安装程序配置服务器失败Microsoft SQL Server Desktop Engine...
  10. Unity VFX学习系列 —— Operators 详细说明