根据CTP接口计算现手、增仓、开平、对手盘 (1)
2017-12-22 13:35
381 查看
1、前言
在同花顺软件中有显示全市场的成交明细如下图所示,API中只推自己的成交回报,那全市场的哪来的呢?其实这些数据都是可以根据CTP API接口自己通过计算得到,下面就来讲讲。首先来看下CTP的mduserapi中深度行情结构体如下所示
///深度行情 struct CThostFtdcDepthMarketDataField { ///交易日 TThostFtdcDateType TradingDay; ///合约代码 TThostFtdcInstrumentIDType InstrumentID; ///交易所代码 TThostFtdcExchangeIDType ExchangeID; ///合约在交易所的代码 TThostFtdcExchangeInstIDType ExchangeInstID; ///最新价 TThostFtdcPriceType LastPrice; ///上次结算价 TThostFtdcPriceType PreSettlementPrice; ///昨收盘 TThostFtdcPriceType PreClosePrice; ///昨持仓量 TThostFtdcLargeVolumeType PreOpenInterest; ///今开盘 TThostFtdcPriceType OpenPrice; ///最高价 TThostFtdcPriceType HighestPrice; ///最低价 TThostFtdcPriceType LowestPrice; ///数量 TThostFtdcVolumeType Volume; ///成交金额 TThostFtdcMoneyType Turnover; ///持仓量 TThostFtdcLargeVolumeType OpenInterest; ///今收盘 TThostFtdcPriceType ClosePrice; ///本次结算价 TThostFtdcPriceType SettlementPrice; ///涨停板价 TThostFtdcPriceType UpperLimitPrice; ///跌停板价 TThostFtdcPriceType LowerLimitPrice; ///昨虚实度 TThostFtdcRatioType PreDelta; ///今虚实度 TThostFtdcRatioType CurrDelta; ///最后修改时间 TThostFtdcTimeType UpdateTime; ///最后修改毫秒 TThostFtdcMillisecType UpdateMillisec; ///申买价一 TThostFtdcPriceType BidPrice1; ///申买量一 TThostFtdcVolumeType BidVolume1; ///申卖价一 TThostFtdcPriceType AskPrice1; ///申卖量一 TThostFtdcVolumeType AskVolume1; ///申买价二 TThostFtdcPriceType BidPrice2; ///申买量二 TThostFtdcVolumeType BidVolume2; ///申卖价二 TThostFtdcPriceType AskPrice2; ///申卖量二 TThostFtdcVolumeType AskVolume2; ///申买价三 TThostFtdcPriceType BidPrice3; ///申买量三 TThostFtdcVolumeType BidVolume3; ///申卖价三 TThostFtdcPriceType AskPrice3; ///申卖量三 TThostFtdcVolumeType AskVolume3; ///申买价四 TThostFtdcPriceType BidPrice4; ///申买量四 TThostFtdcVolumeType BidVolume4; ///申卖价四 TThostFtdcPriceType AskPrice4; ///申卖量四 TThostFtdcVolumeType AskVolume4; ///申买价五 TThostFtdcPriceType BidPrice5; ///申买量五 TThostFtdcVolumeType BidVolume5; ///申卖价五 TThostFtdcPriceType AskPrice5; ///申卖量五 TThostFtdcVolumeType AskVolume5; ///当日均价 TThostFtdcPriceType AveragePrice; ///业务日期 TThostFtdcDateType ActionDay; };
客户调用CTP的行情接口就会收到CTP发来的行情,这个是行情快照。
2、现手和增仓
根据前后两次行情就可以计算出现手,增仓,公式如下。现手 volume_delta = 后一笔Volume - 前一笔volume (1)
增仓 open_interest_delta = 后一笔OpenInterest - 前一笔OpenInterest (2)
代码如下:
volume_delta = data['Volume'] - self.PreDepthMarketData['Volume']
open_interest_delta = int(data['OpenInterest'] - self.PreDepthMarketData['OpenInterest'])
3、开平
根据现手和增仓我们可以计算出开平(不带方向),如下逻辑(3)增仓=0,现手=0:未知
增仓=0,现手>0:换手
增仓>0,现手=增仓:双开
增仓>0,现手<>增仓:开仓
增仓<0,现手+增仓=0:双平
增仓<0,现手+增仓<>0:平仓
函数如下:
def get_open_interest_delta_forward(open_interest_delta, volume_delta): """根据成交量的差和持仓量的差来获取仓位变化的方向 return: open_interest_delta_forward_enum """ if open_interest_delta == 0 and volume_delta == 0: local_open_interest_delta_forward = open_interest_delta_forward_enum.NONE elif open_interest_delta == 0 and volume_delta > 0: local_open_interest_delta_forward = open_interest_delta_forward_enum.EXCHANGE elif open_interest_delta > 0: if open_interest_delta - volume_delta == 0: local_open_interest_delta_forward = open_interest_delta_forward_enum.OPENFWDOUBLE else: local_open_interest_delta_forward = open_interest_delta_forward_enum.OPEN elif open_interest_delta < 0: if open_interest_delta + volume_delta == 0: local_open_interest_delta_forward = open_interest_delta_forward_enum.CLOSEFWDOUBLE else: local_open_interest_delta_forward = open_interest_delta_forward_enum.CLOSE return local_open_interest_delta_forward
有了逻辑(3)之后,我们还需要知道价格趋势才能计算出方向,然后才能计算出真正的开平。根据价格比较我们可以计算出当前成交时价格是向上还是向下,如下逻辑(4)
后一笔最新价LastPrice >= 前一笔卖价一AskPrice1 :向上
后一笔最新价LastPrice <= 前一笔买价一BidPrice1 :向下
后一笔最新价LastPrice >= 后一笔卖价一AskPrice1 :向上
后一笔最新价LastPrice <= 后一笔买价一BidPrice1 :向下
除上面四种外:不变
代码如下:
def get_order_forward(last_price, ask_price1, bid_price1, pre_last_price, pre_ask_price1, pre_bid_price1): """获取成交的区域,根据当前tick的成交价和上个tick的ask和bid价格进行比对 return: order_forward_enum """ if TickAnalysis.float_bigger_equal(last_price, pre_ask_price1): local_order_forward = order_forward_enum.UP elif TickAnalysis.float_smaller_equal(last_price, pre_bid_price1): local_order_forward = order_forward_enum.DOWN else: if TickAnalysis.float_bigger_equal(last_price, ask_price1): local_order_forward = order_forward_enum.UP elif TickAnalysis.float_smaller_equal(last_price, bid_price1): local_order_forward = order_forward_enum.DOWN else: local_order_forward = order_forward_enum.MIDDLE return local_order_forward
现在有了逻辑(3)和(4)之后,可以计算出真正的开平了,逻辑如下(5)
换手,向上:多换,红色
换手,向下:空换,绿色
换手,不变:未知换,白色
双开,向上:双开,红色
双开,向下:双开,绿色
双开,不变:双开,白色
......
平仓,向上:空平,红色
平仓,向下:多平,绿色
平仓,不变:未知平,白色
对应上面的6种开平(不带方向),3种方向组合,一共是得到18种开平情况(带方向)
代码如下:
tick_type_cal_dict = { open_interest_delta_forward_enum.NONE: { order_forward_enum.UP: {tick_type_key_enum.TICKTYPE: tick_type_enum.NOCHANGE, tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE}, order_forward_enum.DOWN: {tick_type_key_enum.TICKTYPE: tick_type_enum.NOCHANGE, tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE}, order_forward_enum.MIDDLE: {tick_type_key_enum.TICKTYPE: tick_type_enum.NOCHANGE, tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE} }, open_interest_delta_forward_enum.EXCHANGE: { order_forward_enum.UP: {tick_type_key_enum.TICKTYPE: tick_type_enum.EXCHANGELONG, tick_type_key_enum.TICKCOLOR: tick_color_enum.RED}, order_forward_enum.DOWN: {tick_type_key_enum.TICKTYPE: tick_type_enum.EXCHANGESHORT, tick_type_key_enum.TICKCOLOR: tick_color_enum.GREEN}, order_forward_enum.MIDDLE: {tick_type_key_enum.TICKTYPE: tick_type_enum.EXCHANGEUNKOWN, tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE} }, open_interest_delta_forward_enum.OPENFWDOUBLE: { order_forward_enum.UP: {tick_type_key_enum.TICKTYPE: tick_type_enum.OPENDOUBLE, tick_type_key_enum.TICKCOLOR: tick_color_enum.RED}, order_forward_enum.DOWN: {tick_type_key_enum.TICKTYPE: tick_type_enum.OPENDOUBLE, tick_type_key_enum.TICKCOLOR: tick_color_enum.GREEN}, order_forward_enum.MIDDLE: {tick_type_key_enum.TICKTYPE: tick_type_enum.OPENDOUBLE, tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE} }, open_interest_delta_forward_enum.OPEN: { order_forward_enum.UP: {tick_type_key_enum.TICKTYPE: tick_type_enum.OPENLONG, tick_type_key_enum.TICKCOLOR: tick_color_enum.RED}, order_forward_enum.DOWN: {tick_type_key_enum.TICKTYPE: tick_type_enum.OPENSHORT, tick_type_key_enum.TICKCOLOR: tick_color_enum.GREEN}, order_forward_enum.MIDDLE: {tick_type_key_enum.TICKTYPE: tick_type_enum.OPENUNKOWN, tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE} }, open_interest_delta_forward_enum.CLOSEFWDOUBLE: { order_forward_enum.UP: {tick_type_key_enum.TICKTYPE: tick_type_enum.CLOSEDOUBLE, tick_type_key_enum.TICKCOLOR: tick_color_enum.RED}, order_forward_enum.DOWN: {tick_type_key_enum.TICKTYPE: tick_type_enum.CLOSEDOUBLE, tick_type_key_enum.TICKCOLOR: tick_color_enum.GREEN}, order_forward_enum.MIDDLE: {tick_type_key_enum.TICKTYPE: tick_type_enum.CLOSEDOUBLE, tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE} }, open_interest_delta_forward_enum.CLOSE: { order_forward_enum.UP: {tick_type_key_enum.TICKTYPE: tick_type_enum.CLOSESHORT, tick_type_key_enum.TICKCOLOR: tick_color_enum.RED}, order_forward_enum.DOWN: {tick_type_key_enum.TICKTYPE: tick_type_enum.CLOSELONG, tick_type_key_enum.TICKCOLOR: tick_color_enum.GREEN}, order_forward_enum.MIDDLE: {tick_type_key_enum.TICKTYPE: tick_type_enum.CLOSEUNKOWN, tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE} }, }
4、对手单
最后讲一下对手单,关于对手单的计算我自己也有疑问,我就按照别人的思路先来说说。先举一个例子,现在有现手24手,增仓-8手,性质是空平。现手即成交了24手,这是双边,单边即成交了12手,空平说明这12手是空单主动买入平仓,12手(单边)空平。 增仓-8说明双边共减持8手,那单边就是减持4手,即有4手是多头平仓,4手是空头平仓(这包括在12手空头主动平仓中)。所以对手单就是4手多头平仓,12-4=8手空头开仓。
公式如下:
设S是对手单中开平方向相同的操作,O是对手单中开平方向相反的操作。
S+O=volume_delta/2
S-O=abs(open_interest_delta )-volume_delta/2
解以上方程得到
S=abs(open_interest_delta )/2
O=volume_delta/2 - S
再举下面的例子可以验证一下公式:
现手 增仓 开平 对手单
44 +22 空开 从+22可知道仓差是由11手空开与11手多开影响的,另外就是11手空开与11手空平的空换,总的就是22空开,11多开,11空平
100 0 空换 50手空开与50手空平的空换
18 +12 多开 从+12可知仓差是由6手多开与6手空开形象的,另外就是3手多开与3手多平的多换,总的就是9多开,6空开,3多平
226 -30 多平 从-30可知仓差是由15手多平与15手空平影响的,另外就是98手多平98手的多开的换手-多换,总的就是113多开,98多平,15空平
100 0 多换 50手多开与50手多平的多换
100 +100 双开 50手多开与50手空开
100 -100 双平 50手多平与50手空平
代码如下
def get_order_combination(open_interest_delta, volume_delta): """根据成交量变化和持仓量的变化计算出对手单的组合 仓位变化方向相反的单 order_opposite 仓位变化方向相同的单 order_similar """ open_interest_delta = open_interest_delta if open_interest_delta > 0 else -open_interest_delta order_similar = open_interest_delta / 2.0 order_opposite = volume_delta / 2.0 - order_similar return int(order_opposite), int(order_similar)
下面一篇文章将会贴出根据API实现的C++代码和Python代码。
参考如下:
用CTP接口实现期货交易明细分析(1)
用CTP接口实现期货交易明细分析(2)
期货中的现手、仓差的计算方法---实例
相关文章推荐
- 根据CTP接口计算现手、增仓、开平、对手盘 (2)
- 1.已知接口ComputerAverage,和主类Estimator,编写程序完成SongGame和School类。SongGame类能够根据歌手得分去掉一个最高分,去掉一个最低分,计算其余得分的平均
- linux命令--根据接口日志TPS计算方法
- linux命令--根据接口日志TPS计算方法
- PHP根据经纬度计算两点间实际距离
- 如何使用snmp计算接口带宽
- java与接口实现素数个数计算
- ios 根据总数和列数 计算显示行数
- C# 根据经度纬度计算两点的距离
- 根据结构体里面元素的某个地址计算机构体地址
- Calendar根据输入的年份和周数计算该周的开始日期和结束日期
- 根据年月日计算星期几
- 根据ip解析相应的地址,调用淘宝接口
- 利用基姆拉尔森公式根据日期计算星期
- java调用百度地图api接口---转换非百度坐标和根据百度坐标转换地理位置
- PHP根据经纬度,计算2点之间的距离的2种方法
- 根据Label的文字内容动态计算Label高度
- Calculate distance, bearing and more between Latitude/Longitude points——根据两点经纬度计算距离,角度及其他
- CTP: NET封装后接口中序列化数据的问题
- 根据两点经纬度计算距离