前言:
ctp讲完下单和撤单,这一篇讲通过CTP API获取实时行情,有人测试过,ctp获取的行情数据的速度是要比快期快那么一点的,而且登录的时候,ctp基本是秒登录,这也是它的优点之一,快期就要等一段时间才行。但是缺点也有,就是没有历史数据,K线数据,这个要自己合成,不过这个解决的方法有很多,我这里就先不涉及这么多了,就单纯获取实时的行情数据,如果研究策略时遇到问题再想办法解决吧。
CTP行情API流程:
CTP API分为行情和交易两类,两者是完全独立的。

实盘展示:

CTP 发出的行情正是转发的交易所的行情,所以也是500ms 一次快照,一般业内也将这个快照数据称之为tick,虽然这不是真正的tick,但我们依照惯例,下面都称之为tick 数据。但CTP 不推送K线数据,所以需要客户自己根据tick 数据计算得出。我这里就单单获取tick数据,K线的合成就不涉及了,后面有需要再弄,我这里想到的是用快期的K线数据,然后用CTP交易,毕竟CTP交易方面,无论是tick数据还是交易都是快点的。
代码:
使用时注意一下交易时间和非交易时间
from program.function import *
class CFtdcMdSpi(mdapi.CThostFtdcMdSpi):
def __init__(self, tapi, account):
mdapi.CThostFtdcMdSpi.__init__(self) # 初始化环境
self.tapi = tapi
self.account = account
def OnFrontConnected(self) -> "void": # 连接通知
print("连接通知OnFrontConnected")
loginfield = mdapi.CThostFtdcReqUserLoginField()
loginfield.BrokerID = str(self.account.broker_id) # 9999
loginfield.UserID = str(self.account.investor_id) # b'218493'账号
loginfield.Password = str(self.account.password) # 密码
loginfield.UserProductInfo = "python dll"
self.tapi.ReqUserLogin(loginfield, 0) # 登录账户
# 登录通知
def OnRspUserLogin(self, pRspUserLogin: 'CThostFtdcRspUserLoginField', pRspInfo: 'CThostFtdcRspInfoField',
nRequestID: 'int', bIsLast: 'bool') -> "void":
print(
f"登录通知OnRspUserLogin, SessionID={pRspUserLogin.SessionID},ErrorID={pRspInfo.ErrorID},ErrorMsg={pRspInfo.ErrorMsg}")
ret = self.tapi.SubscribeMarketData([id.encode('utf-8') for id in self.account.subscribe_list],
len(self.account.subscribe_list)) # 订阅行情
本主题为课程学员专享,成为股票量化投资课程学员后可免费阅读
成为学员