CTP程序化交易入门系列之四:行情订阅常见问题解答

10 篇文章 6 订阅
7 篇文章 6 订阅

前言

这一章总结了大家订阅行情最常问的一些问题的相关解答,希望能有帮助。如有不对的地方,欢迎指正。后期会在这里更新迭代,欢迎到这底下提问!

更新时间:20201112

1 获取行情的地址在哪里可以查到?

simnow发的即是实时行情,官网上可以看到该行情地址。

期货公司行情地址可咨询期货公司,或者到对应公司官网下载个快期,点击测速就可以看到。主要期货公司的行情地址可以在公众号(微信搜索:QuantRoad2019)后台回复 “地址” 得到。

多提一点,行情订阅不需要密码,但是ReqUserLogin还是要调用的,如下就可以:

CThostFtdcReqUserLoginField reqUserLogin = {0};
m_pUserMdApi->ReqUserLogin(&reqUserLogin, nRequestID++);

2 怎么知道有哪些合约正在交易(有行情)?

行情API里面很坑的一点是没有查询合约的功能。虽然二代行情里面加了ReqQryMulticastInstrument接口,但也仅是查询组播合约,需要咨询期货公司是否连接到相关交易所组播行情。所以有三种做法获取合约号:

1)通过交易API登录调用函数ReqQryInstrument查询;

2)爬交易所网站获得可交易合约;

3)交易所可交易合约有规则,例如上期白银为当前月开始的下个月的连续12个合约,当前为8月,那即是从ag1909到ag2008,找出这些规则生成合约编码即可。

3 API调用init后为啥没有任何反应?

和demo运行没有任何反应或者没有OnFrontConnected回调问题类似。

1)先检查网络链路是否畅通,可以telnet一下行情前置地址,是否通畅。

2)再检查API版本是否正确,连生产或者simnow现必须是6.3.15版本api,版本不正确将没有回调。

提醒:simnow正常地址是交易时间使用,7*24小时地址是非交易时段可以使用。

4 为什么登陆上了订阅显示成功但没有行情?/Simnow订阅期权合约没有行情?

首先确保是否订阅成功。CTP坑的是无论你订阅什么合约id,都会返回你"CTP:No Error",但只有你填对了合约编码才有相应行情。所以:

1)检查编码是否正确。这里坑的是各交易所对命名格式并不统一,

期货合约如下:前面字母代表品种名,后面数字代表合约到期日。

上期/能源所小写+4个数字(rb1909代表rb品种,19年9月份到期)
中金所大写+4个数字
郑商所大写+3个数字(TA001代表TA品种,20年01月份到期)
大商所小写+4个数字

期权合约如下:标的期货合约+看涨/看跌+行权价

上期所小写+四个数字+C(或者P)+行权价,如cu1912C43000
大商所小写+四个数字+ -C-(或者-P-)+ 行权价,如c2001-C-1800
郑商所大写+三个数字+C(或者P)+行权价,如CF001C11200
中金所大写+四个数字+ -C-(或者-P-)+ 行权价,如IO1908-C-2100

组合合约如下:

郑商所跨期

SPD 第一腿&第二腿 例如: SPD TA009&TA011

郑商所跨品种

IPS 第一腿&第二腿 例如: IPS CF009&CY009

大商所跨期

SP 第一腿&第二腿 例如: SP m2009&m2101

大商所跨品种

SPC 第一腿&第二腿 例如: SPC a2009&m2009

2)检查你订阅的行情是否过期。如果现在是19年8月份,那你订阅的是rb1905这种5月份到期的合约那肯定是没有行情的。

3)检查是否订阅的合约是冷门合约,冷门合约行情跳动比较少。可以打开相应客户端看下,找主力合约订阅。

4)目前Simnow不支持期权及组合报单,也没有相关行情。想要获取请参照1直接从生产上获取。

5 CTP提供的是实时tick数据吗?

CTP提供的是实时tick数据,但不是真正的tick数据。tick数据一般是指市场上的逐笔数据,例如一笔委托会产生一笔行情,一笔成交也会产生一笔行情。目前国内期货交易所还不支持推送这种逐笔的数据,只推送切片(快照)数据。切片数据是指将一定时间内的逐笔数据统一成一个快照发出,一般是1秒2笔。但郑商所有点特殊,可能是1s多笔,就不展开来讲了。

6 TradingDay和ActionDay有什么区别?

在CTP的设计里,TradingDay用来表示交易日,ActionDay表示当前实际日期。期货交易分为日夜盘,这两个日期在日盘的时候是一致的,但在夜盘就有了区别,是因为当天夜盘是属于第二天这个交易日。例如20190830(周五)晚上21点开始交易,交易日TradingDay是20190902(周一),但实际日期ActionDay是20190830。

这是设计的初衷,但事实上夜盘各交易所这两个日期很混乱。我们以20190830晚上夜盘交易举例:

 tradingday actionday
上期/能源2019090220190830
大商所2019090220190902
郑商所2019083020190830

总结就是,大商所夜盘两个日期都是tradingday,郑商所日夜盘都是当天日期。

7 可以通过CTP API获得K线,现手等数据吗?

没法直接获得k线数据,需要根据ctp推送的行情数据自己合成。如何合成,参考上篇文章。同样无法获得现手增仓等数据,需要自己计算,后面会讲。

8 CTP支持股票/股票期权行情么?

一般提及CTP是指CTP期货柜台,只提供国内五大期货交易所期货行情。但CTP也有股票及股票期权柜台,这些柜台是与期货柜台独立的。也就是说,期货,股票,股票期权在上期技术是三套系统。目前股票系统已经停止维护了,股票期权系统仍然有维护,客户不多,具体哪些期货公司上线了这套系统,需要自行咨询上期技术或者期货公司。

9 可以通过CTP API获得历史行情吗?

不可以,CTP只提供实时行情。获取历史行情,目前免费的可以从天勤获取,仅提供所有期货合约。收费的可以和作者联系沟通(联系方式见置顶文章),提供国内股票,期货及美国股票及期货相关所有历史数据。

10 CTP提供level2行情吗?

level2行情是指深度行情,不同于level1只有1档,level2有多档。但除上期和能源外,一般交易所多档行情是收费行情,所以深度行情需要咨询相应期货公司。

目前上期和能源的level2行情对期货公司是免费的,但各个期货公司用哪家系统转发,要不要收费就要看他们自己了。所以最好去咨询期货公司,可以多咨询几家。至于在有些客户端上为啥能看到五档行情,因为那些客户端是接了自己公司的行情服务器,不一定是连CTP收的。

11 非交易时段收到行情是怎么回事?

日盘盘前可能会收到行情,是因为CTP日盘起动时会重演夜盘的流水,所以有可能会将夜盘的行情再推送一遍。日盘结束后也会收到行情,这是交易所结算完成发出的行情,这里面的结算价字段是当日结算价,一般推送时间在3点~3点半。建议按照交易时间过滤掉这些非盘中行情,以免影响交易逻辑。

12 组合合约行情如何获得?

CTP是不会去计算组合合约的行情的,只是转发交易所行情,所以要看交易所推不推。事实上直接以组合合约号订阅行情的话,郑商所和大商所都会推,但比实际情况下少不少。所以建议订阅各个单腿合约的行情,计算价差自己得到组合行情。

13 如何获取当前切片内的成交量?

Volume字段是累计成交量,这里是指这个交易日内的累计成交量。如需要这个切片内的成交量,需要用这个切片的该字段值,减去上个切片相应值,差额即是这个切片内成交量。

14 UpdateMillisec毫秒时间戳字段有效吗?

上期/能源/中金三个交易所会出现0和500两种值,大商所值是切片时真实毫秒时间,郑州该值都是0。

15 为什么有的字段值特别大?

行情中常看到有数值是1.7976931348623157e+308,这是double类型的上限值,在CTP内部是表示无效的。例如盘中的时候,本次结算价字段SettlementPrice即为无效值。

16 行情均价AveragePrice字段有什么坑?

AveragePrice这个字段除郑商所可以直接拿过来用之外,其它四大交易所要除以合约乘数,才是真正的均价。至于合约乘数是什么百度吧,可以通过用交易API查询合约获得,或者去交易所网站上查询获得。

17 CTP上可以查到什么是主力合约吗?

查不到,自己根据持仓量和成交量筛选,注意换月时逻辑。

18 行情里面的Exchange ID字段为空?

是的,发过来就是空值,需要自己维护,可以从交易接口查询合约ReqQryInstrument得到。

19 行情中UpdateTime和UpdateMillisec字段不是每500毫秒一次连续的,是缺数据吗?

首先,不连续不代表就是缺失数据,行情如果没有更新就不会回调OnRtnDepthMarketData函数,这个时间自然不是连续的。其次,通常来说,在simnow同时在线用户多,卡顿的情况下有可能缺失数据,但是在生产上不大可能。请参考第1问,不能说的更直接了,能连生产数据为啥还要连simnow呢?不过也不排除生产上会丢数据,不放心的话可以同时接入几路生产地址互相比对。

20 期货合约是每500ms都推送行情吗?为何同一时期主力和非主力合约一个交易日tick数量相差巨大?

以下图2020年11月份rb为例,主力rb2101和非主力rb2105的tick数量两个交易日相差将近8000个。这其实和19问相似,因为CTP只有行情有更新时才推送,否则不推送,所以主力合约会多不少。行情更新是指行情回调接口中相关字段有所变化。

往期推荐

● CTP程序化交易入门系列之一:准备

● CTP程序化交易入门系列之二:API基本架构及初始化

● CTP程序化交易入门系列之三:获取实时行情及K线合成

 

下节预告:

交易所行情知多少?

CTPapi_交易开发实例 class CTraderSpi : public CThostFtdcTraderSpi { public: ///当客户端与交易后台建立起通信连接时(还未登录前),该方法被调用。 virtual void OnFrontConnected(); ///登录请求响应 virtual void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///投资者结算结果确认响应 virtual void OnRspSettlementInfoConfirm(CThostFtdcSettlementInfoConfirmField *pSettlementInfoConfirm, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///请求查询合约响应 virtual void OnRspQryInstrument(CThostFtdcInstrumentField *pInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///请求查询资金账户响应 virtual void OnRspQryTradingAccount(CThostFtdcTradingAccountField *pTradingAccount, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///请求查询投资者持仓响应 virtual void OnRspQryInvestorPosition(CThostFtdcInvestorPositionField *pInvestorPosition, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///报单录入请求响应 virtual void OnRspOrderInsert(CThostFtdcInputOrderField *pInputOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///报单操作请求响应 virtual void OnRspOrderAction(CThostFtdcInputOrderActionField *pInputOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///错误应答 virtual void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///当客户端与交易后台通信连接断开时,该方法被调用。当发生这个情况后,API会自动重新连接,客户端可不做处理。 virtual void OnFrontDisconnected(int nReason); ///心跳超时警告。当长时间未收到报文时,该方法被调用。 virtual void OnHeartBeatWarning(int nTimeLapse); ///报单通知 virtual void OnRtnOrder(CThostFtdcOrderField *pOrder); ///成交通知 virtual void OnRtnTrade(CThostFtdcTradeField *pTrade); private: ///用户登录请求 void ReqUserLogin(); ///投资者结算结果确认 void ReqSettlementInfoConfirm(); ///请求查询合约 void ReqQryInstrument(); ///请求查询资金账户 void ReqQryTradingAccount(); ///请求查询投资者持仓 void ReqQryInvestorPosition(); ///报单录入请求 void ReqOrderInsert(); ///报单操作请求 void ReqOrderAction(CThostFtdcOrderField *pOrder); // 是否收到成功的响应 bool IsErrorRspInfo(CThostFtdcRspInfoField *pRspInfo); // 是否我的报单回报 bool IsMyOrder(CThostFtdcOrderField *pOrder); // 是否正在交易的报单 bool IsTradingOrder(CThostFtdcOrderField *pOrder); };
您好!对于CTP期货交易,您可以使用Python编程语言进行开发。CTP(中国金融期货交易所)是国内常用的期货交易接口之一,可以通过它来进行期货交易。 在Python中,您可以使用CTP官方提供的API接口进行开发。首先,您需要下载并安装CTP的API。然后,您可以使用Python编写代码调用API来连接到CTP服务器,并进行相关的交易操作。 以下是一个简单的示例代码,演示了如何使用Python进行CTP期货交易: ```python from time import sleep from ctypes import * from threading import Thread # 加载CTP动态链接库 ctp = cdll.LoadLibrary('thosttraderapi_se.dll') class MyTrader: def __init__(self): self.api = ctp.CThostFtdcTraderApi_CreateFtdcTraderApi() self.api.RegisterSpi(self) # 设置服务器信息等 self.api.RegisterFront("tcp://xxx.xxx.xxx.xxx:xxxx") self.api.Init() # 实现相关回调函数 def OnFrontConnected(self): print("已连接到服务器") # 登录账户 req = ctp.CThostFtdcReqUserLoginField() # 设置账户信息等 self.api.ReqUserLogin(req, 0) # 其他回调函数... # 实现具体的交易逻辑 def do_trade(self): # 下单逻辑... pass if __name__ == '__main__': trader = MyTrader() # 创建交易对象 Thread(target=ctp.CThostFtdcTraderApi_Init, args=(trader.api,)).start() # 在新线程中初始化API sleep(1) # 等待API初始化完成 trader.do_trade() # 执行交易逻辑 ``` 在上述代码中,您需要根据您自己的账户信息和服务器地址进行相应的设置。然后,您可以根据需要实现各种回调函数和交易逻辑。 请注意,上述代码仅为示例,实际使用时可能需要根据具体情况进行适当的修改和完善。同时,为了保证交易的稳定性和安全性,建议您在实际应用中进行充分的测试和验证。 希望以上信息能对您有所帮助!如果您还有其他问题,请随时提问。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值