期货(CTP)“按照下单价格获取可下单笔数”计算方法详解 -- 看这一篇文章就够!

当下我们使用券商的期货客户端的时候,我们会发现:当我们输入的价格变化的时候,他的可下单手数也是变化的。但是也有一些券商的,这个地方并没有任何变化,因此
这对于一些用户来说是挺不方便的,因此,这篇文章来讲一些如何动态计算这个下单手数。以下都是干货。
    我们先记住两个公式:
        手数 = 可用资金 / 1手保证金  值取整
        某合约的1手保证金额 = 开仓成交价 * 交易单位(合约乘数) * 1手
    上面两个公式就是计算手数需要。先用两个上期所的客户端来验证一下与否。如下图所示,我们看到,在上期所的客户端直接买入一个合约,填写完价格后,会自动给出可交易笔数:

期货(CTP)“按照下单价格获取可下单笔数”计算方法详解 -- 看这一篇文章就够!

就在这个软件中,我们用不同的价格记录对应的手数,获取如下一组数据

使用ag2012合约获取的数据
价格 可用手数(取整) 备注
4000 278 超出了涨跌幅,按照跌停价计算
4900 275  
5068 266  
5100 264  
5500 245  
5800 232  
6000 227 超出了涨跌幅,按照涨停价计算

 

特别注意上图中的备注: 一些券商的计算是在涨跌幅之类的,但是有一些券商并不会在意涨跌幅。当天的ag2012的涨跌幅如图所示:

期货(CTP)“按照下单价格获取可下单笔数”计算方法详解 -- 看这一篇文章就够!

我们在这个客户端查询一下用户资金:

期货(CTP)“按照下单价格获取可下单笔数”计算方法详解 -- 看这一篇文章就够!

然后按照公式计算一下:上面表格中的值,看是否正确:

目前已知:用户可用资金:1620726.15;ag2012 的保证金率=0.08;交易单位(合约乘数)=15千克/手;关于合约保证金和合约乘数,一开始是从网上获取的(比如合约行情页面相关信息),文章的后面会告知如何通过接口查询

计算结果如下:

这当价格为 4000的时候 保证金 = 4852* 15 * 0.08 = 5822.4    ---> 手数 1620726.15/5822.4=278  (超出了涨跌幅,按照跌停价计算)
这当价格为 4900 的时候 保证金 = 4900 * 15 * 0.08 = 5880    ---> 手数 1620726.15/5880=275
这当价格为 5068 的时候 保证金 = 5068 * 15 * 0.08 = 6081.6  ---> 手数 1620726.15/6081.6=266
这当价格为 5100 的时候 保证金 = 5100 * 15 * 0.08 = 6120    ---> 手数 1620726.15/6120=264
这当价格为 5500 的时候 保证金 = 5500 * 15 * 0.08 = 6600    ---> 手数 1620726.15/6600=245
这当价格为 5800 的时候 保证金 = 5800 * 15 * 0.08 = 6960    ---> 手数 1620726.15/6960=232
这当价格为 6000 的时候 保证金 = 5931 * 15 * 0.08 = 7117.2  ---> 手数 1620726.15/7117.2=227  (超出了涨跌幅,按照涨停价计算)

由此可见,计算公式是完全是正确的。

可能有朋友会说了,你这仅仅是一个合约,其他合约也能正确吗?这里我用p2101这个合约做了验证,是完全正确的。计算过程如下:

期货(CTP)“按照下单价格获取可下单笔数”计算方法详解 -- 看这一篇文章就够!

用上期所客户端填写价格后,获取的手数如下表所示

使用p2101获取的数据
价格 可用手数(取整) 备注
3000 541 超出跌停价
5984 541  
6250 518  
6550 494  
7024 461  
8000 461 超出涨停价

 

手动验算两条:其中保证金率和合约乘数都是从网络(比如合约行情页面相关信息)获取,文章后面会讲如何从接口获取。

价格为 6250 : 保证金 = 6250 * 10 * 0.05 = 3125 --> 1620726.15/3125 = 518
价格为 6900 :  保证金 = 6900 * 10 * 0.05 = 3450 --> 1620726.15/3450 = 469

最后,说一下如何通过CTP接口获得所需要的的数据。

这里面最重要的是获取三个数据信息:
1 用户可用资金
2 合约对应的保证金率
3 合约对应的交易单位
查看上期所提供的变成API,我们只要关注这两个接口即可:


第一个接口:合约查询
int ReqQryInstrument(CThostFtdcQryInstrumentField &p_refReq, const char *p_pszRouteInfo);
OnRspQryInstrument(CThostFtdcInstrumentField *pTradingCode, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
在结构体 CThostFtdcInstrumentField 中,有两个字段:
///合约数量乘数  ---->对应交易单位(或者叫做合约单位)
TThostFtdcVolumeMultipleType    VolumeMultiple;
///多头保证金率  --->对应保证金率
TThostFtdcRatioType    LongMarginRatio;
///空头保证金率   ---->对应保证金率
TThostFtdcRatioType    ShortMarginRatio;
注意 这里的两个保证金率值都是一样的。
如图所示:

期货(CTP)“按照下单价格获取可下单笔数”计算方法详解 -- 看这一篇文章就够!

第二个接口:查询资金账户
int ReqQryTradingAccount(CThostFtdcQryTradingAccountField &p_refReq, const char *p_pszRouteInfo);
virtual void OnRspQryTradingAccount(CThostFtdcTradingAccountField *pTradingAccount, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
在这个CThostFtdcTradingAccountField 结构体中有如下字段:
///可用资金
TThostFtdcMoneyType    Available;  ----> 对应用户可用资金

(这里就不截图了)

通过上述两个接口,获取对应信息,计算不同的价格可下单的笔数。(完!)