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

news2025/1/14 1:04:40

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

    • 前情回顾
    • 全局配置参数
    • 行情初始化代码
    • 行情登录
    • 行情订阅
    • 行情接收
    • 注意事项

前情回顾

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

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

全局配置参数

在这里插入图片描述

行情初始化代码

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()

行情登录

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))

行情订阅

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))

行情接收

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1513927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ONLYOFFICE 文档开发者版,为您的平台带来强大的文档编辑功能

你是否在寻找一个可自主部署、可定制、易集成的文档编辑器解决方案?如果是这样,那么ONLYOFFICE 文档开发者版,也许就是你想要的答案。下面让我们一起来看看它有哪些特点,并能为您带来哪些好处。 什么是 ONLYOFFICE 文档 ONLYOFFI…

06-kafka及异步通知文章上下架-黑马头条

kafka及异步通知文章上下架 1)自媒体文章上下架 需求分析 2)kafka概述 消息中间件对比 特性ActiveMQRabbitMQRocketMQKafka开发语言javaerlangjavascala单机吞吐量万级万级10万级100万级时效性msusmsms级以内可用性高(主从)高(主从&#…

OpenMP 编程模型

OpenMP 内存模型 共享内存模型: OpenMP 专为多处理器/核心、共享内存机器设计,底层架构可以是共享内存UMA或NUM OpenMP 执行模型 基于线程的并行: OpenMP 程序基于多线程来实现并行, 线程是操作系统可以调度的最小执行单元。 …

【C++】string进一步介绍

个人主页 : zxctscl 如有转载请先通知 文章目录 1. 前言2. 迭代器2.1 反向迭代器2.2 const对象迭代器 3. Capacity3.1 size和length3.2 max_size3.3 capacity3.4 clear3.5 shrink_to_fit (了解即可)3.6 reserve3.7 resize 4. Element access4…

Orange3数据预处理(离散化组件)

离散化:将数值属性转换为分类属性。 输出 数据:具有离散化值的数据集 设置离散化的默认方法。 选择变量以为每个变量设置特定的离散化方法。将鼠标悬停在变量上显示区间。 离散化方法Keep numeric(保持数值):保持变量不变。Remove (移除)&a…

【强化学习抓取】偏机器人领域(略)

文章目录 1. A Grasp Pose is All You Need: Learning Multi-fingered Grasping with Deep Reinforcement Learning from Vision and Touch摘要和结论引言相关工作模型框架 1. A Grasp Pose is All You Need: Learning Multi-fingered Grasping with Deep Reinforcement Learni…

2024年GitHub标星2-9K的Android基础——高级面试题合集

3、横竖屏切换时候 Activity 的生命周期 4、AsyncTask 的缺陷和问题,说说他的原理。 5、onSaveInstanceState() 与 onRestoreIntanceState() Android高级面试题 1、你们做了哪些稳定性方面的优化? 2、性能稳定性是怎么做的? 3、业务稳定性如…

计算机如何处理异常

前言 大家好,我是jiantaoyab,这篇文章主要计算机究竟是如何处理异常的,异常可以分成中断、陷阱、故障、中止这样四种情况。这四种异常,分别对应着 I/O 设备的输入、程序主动触发的状态切换、异常情况下的程序出错以及出错之后无可…

新手做抖音小店怎么能做起来吗?手把手教你,从零到做好只需3步

大家好,我是电商花花。 做抖音小店的新手卖家都会把月入过万作为做抖音小店的目标,在没有接触抖音小店之前都羡慕别人的店铺能够够稳定出单,月入过万,甚至更多。 可当自己在操作店铺的时候,要么就是没有流量&#xf…

CVE-2024-2074 SpringBoot迷你天猫商城Mini-Tmall sql注入漏洞分析

漏洞简介 Mini-Tmall是一个基于Spring Boot的迷你天猫商城。Mini-Tmall在20231017版本及之前存在一个严重的漏洞,攻击者可以利用该漏洞通过远程执行特定操作来注入恶意SQL语句,从而获取敏感信息或控制数据库。此漏洞影响文件?rtmall/admin/user/1/1的一…

C语言例2-2:从键盘输入两个整数,计算其乘积(利用用户自定义函数实现)

代码如下&#xff1a; //从键盘输入两个整数&#xff0c;计算其乘积&#xff08;利用用户自定义函数实现&#xff09;。 #include<stdio.h> int mul(int a, int b) //定义一个函数mul {int c; //定义一个整型…

深克隆和浅克隆有什么区别?

1、典型回答 克隆是指创建一个对象的副本&#xff0c;使副本具有与原始对象相同的属性和状态。在计算机编程中&#xff0c;克隆是一种常见的操作&#xff0c;用于复制数据、对象或数据结构&#xff0c;以便在不影响原始数据的情况下进行操作、修改或分发。 克降最典型的使用场…

Linux -- 线程互斥

一 线程互斥的概念 大部分情况&#xff0c;线程使用的数据都是局部变量&#xff0c;变量的地址空间在线程栈空间内&#xff0c;这种情况&#xff0c;变量归属单个线程&#xff0c;其他线程无法获得这种变量。但有时候&#xff0c;很多变量都需要在线程间共享&#xff0c;这样的…

【网络原理】TCP三次握手四次挥手

文章目录 &#x1f332;三次握手四次挥手总览&#x1f340;三次握手&#xff08;建立连接&#xff09;&#x1f338;为什么需要第三次通信 &#xff1f; &#x1f384;四次挥手&#xff08;断开连接&#xff09;&#x1f338;四次挥手中涉及到的两个重要的状态 ⭕总结 &#x1…

nginx学习记录-nginx初步配置

1. 虚拟机安装系统并配置网络 系统网上找个能用的镜像就行&#xff0c;我用的是阿里的镜像&#xff0c;地址是centos安装包下载_开源镜像站-阿里云 (aliyun.com) 以下是我本地的虚拟机配置 配置过程中按照提示操作系统即可。 安装好系统后&#xff0c;配置centos的ip&#x…

C++进阶之路---我们在何种情况下使用set和map

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 前言 在之前的学习中&#xff0c;我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、for…

【多智能体强化学习02---训练范式+独立学习+多智能体策略梯度算法】

文章目录 多智能体强化学习训练和执行范式CTCEDTDECTDE MARL符号表示分布式学习&#xff08;Independent Learning)基于值函数的分布式学习&#xff08;Independent value-based learning)基于策略梯度的分布式学习&#xff08;Independent policy gradient learning) 多智能体…

力扣:数组篇

1、数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合。 需要两点注意的是 数组下标都是从0开始的。数组内存空间的地址是连续的 因为数组的在内存空间的地址是连续的&#xff0c;所以我们在删除或者增添元素的时候&#xff0c;就难免要移动其他元素的地址。 …

LLM之RAG实战(二十九)| 探索RAG PDF解析

对于RAG来说&#xff0c;从文档中提取信息是一种不可避免的场景&#xff0c;确保从源文件中提取出有效的内容对于提高最终输出的质量至关重要。 文件解析过程在RAG中的位置如图1所示&#xff1a; 在实际工作中&#xff0c;非结构化数据比结构化数据丰富得多。如果这些海量数据无…

免费视频背景素材下载

找免费视频素材、背景就上这6个网站&#xff0c;高质量&#xff0c;无版权可商用。 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库虽然是个设计素材网站&#xff0c;但除了设计类素材之外还有很多视频、音频、办公类等素材&#xff0c;视频素材就有上…