CTP-API开发系列之九:行情登录及订阅代码

CTP-API开发系列之九:行情登录及订阅代码

前情回顾

CTP-API开发系列之一:各版本更新说明(持续更新)
CTP-API开发系列之二:问题汇总(持续更新)
CTP-API开发系列之三:柜台系统简介
CTP-API开发系列之四:接口对接准备
CTP-API开发系列之五:SimNow环境介绍
CTP-API开发系列之六:交易登录及查询流程
CTP-API开发系列之七:报撤单及回报顺序
CTP-API开发系列之八:报撤单代码实现

在前面,交易相关常用的功能基本已经实现完成了,相比交易API的功能,行情API的功能就要简单的多了,今天分享一下行情登录、行情订阅的代码,以及相关的注意事项。

全局配置参数

行情初始化代码

c 复制代码
def start_mdapi():
	mduserapi = mdapi.CThostFtdcMdApi_CreateFtdcMdApi("logs//md_con//")
	log.info("1.CreateFtdcMdApi:" + mduserapi.GetApiVersion())
	mduserspi = CFtdcMdSpi(mduserapi)
	log.info("2.RegisterFront:" + MdFrontAddr)
	mduserapi.RegisterFront(MdFrontAddr)
	log.info("3.RegisterSpi")
	mduserapi.RegisterSpi(mduserspi)
	log.info("4.Init")
	mduserapi.Init()
	log.info("5.Join")
	mduserapi.Join()

行情登录

c 复制代码
def OnFrontConnected(self) -> "void":
	log.info("OnFrontConnected mdfront")
	loginfield = mdapi.CThostFtdcReqUserLoginField()
	loginfield.BrokerID = BROKERID
	loginfield.UserID = USERID
	loginfield.Password = PASSWORD
	loginfield.UserProductInfo = "ctp_quant"
	self.tapi.ReqUserLogin(loginfield, 0)
	log.info("send ReqUserLogin: " + api_struct_serialize(loginfield))

行情订阅

c 复制代码
def OnRspUserLogin(self, pRspUserLogin: 'CThostFtdcRspUserLoginField', pRspInfo: 'CThostFtdcRspInfoField', nRequestID: 'int', bIsLast: 'bool') -> "void":
	log.info(f"OnRspUserLogin, SessionID={pRspUserLogin.SessionID},ErrorID={pRspInfo.ErrorID},ErrorMsg={pRspInfo.ErrorMsg}")

	if not pRspInfo.ErrorID:
		# 登录成功,订阅行情
		# subID:存储所有需要订阅行情的合约ID
		ret = self.tapi.SubscribeMarketData([id.encode('utf-8') for id in subID], len(subID))
		log.info('send SubscribeMarketData, size:' + str(len(subID)))
	else:
		log.error("login failed! " + api_struct_serialize(pRspInfo))

行情接收

c 复制代码
def OnRtnDepthMarketData(self, pDepthMarketData: 'CThostFtdcDepthMarketDataField') -> "void":
	log.info(api_struct_serialize(pDepthMarketData))
	######## TODO STH ############

def OnRspSubMarketData(self, pSpecificInstrument: 'CThostFtdcSpecificInstrumentField', pRspInfo: 'CThostFtdcRspInfoField', nRequestID: 'int', bIsLast: 'bool') -> "void":
	log.info('OnRspSubMarketData: ' + api_struct_serialize(pSpecificInstrument))
	if pRspInfo.ErrorID != 0:
		log.error('OnRspSubMarketData: ' +  api_struct_serialize(pRspInfo))

注意事项

1.行情服务不会对登录账号密码进行验证(不知道后续上期技术是否会验证)

2.进行测试时,交易地址可以使用simnow环境,行情可以订阅期货公司的正式行情(simnow行情存在一定延迟)

3.期货公司行情地址获取方式:选择一家期货公司,从官方下载快期交易终端,在登陆页面点测速,就可以看到行情地址

4.所有合约的ID是通过交易API获取的,也可以落地存储,从文件或者DB拉取合约ID

c 复制代码
## 交易API:请求查询合约响应
def OnRspQryInstrument(self, pInstrument: 'CThostFtdcInstrumentField', pRspInfo: 'CThostFtdcRspInfoField', nRequestID: 'int', bIsLast: 'bool') -> "void":
	global subID
	subID.append(pInstrument.InstrumentID)

5.在OnRtnDepthMarketData函数中,接收到最新的行情数据后,不能在该函数内进行处理(单线程的),需要将数据扔给其他线程进行处理,比如k线数据合成、指标计算、数据转储等

相关推荐
ATMQuant1 天前
量化指标解码13:WaveTrend波浪趋势 - 震荡行情的超买超卖捕手
人工智能·ai·金融·区块链·量化交易·vnpy
belldeep13 天前
隐私计算技术有哪些?
量化交易·隐私计算
DeepVis Research14 天前
【AGI/Simulation】2026年度通用人工智能图灵测试与高频博弈仿真基准索引 (Benchmark Index)
大数据·人工智能·算法·数据集·量化交易
量化风云17 天前
2026量化新基建(二) - sqlite 与 sqlite-utils
数据库·python·sqlite·量化交易·量化交易课程
孙琦Ray19 天前
GitHub开源项目日报 · 2025年12月30日 · 开源热榜精选概览
开源·量化交易·文本转语音·嵌入式与高性能·ai 助手与协作·跨平台工具·自托管
ATMQuant2 个月前
量化指标解码11:挤压动量 - 捕捉低波动后的爆发行情
人工智能·ai·量化交易·vnpy
jiucaixiuyang3 个月前
散户如何做手机T0程序化交易(下)
股票·量化交易·t0交易
天一生水water3 个月前
均值回归(配对交易)策略
均值算法·回归·kotlin·量化交易
DolphinDB智臾科技3 个月前
多资产回测实战 | 用 DolphinDB 搭建股票期货对冲与期权套利策略
时序数据库·量化交易·dolphindb
滚雪球~3 个月前
okx欧易注册与量化设置
量化·程序化交易