目的:
下单时需要填写交易所代码,但每个合约来自的交易所是固定的,下单时可以省去填写交易所,所以我们需要把每个合约来自那个交易所保存到本地。
发送请求函数:ReqQryInstrument

先查阅官方文档,可以知道以下重要信息:
1、需要发送的文件名是CThostFtdcQryInstrumentField;
2、是否可作为过滤条件,意味着并非是必填项,可以什么都不填,则查询所有合约,所以这里什么参数都没有填
3、它的响应是:OnRspQryInstrument
根据以上信息可以写出查询合约的代码:
# 查询合约
def qryInstrument(self):
# 请求查询合约,填空可以查询到所有合约。
queryFile = tdapi.CThostFtdcQryInstrumentField() # 创建程序文件
ret = self.tduserapi.ReqQryInstrument(queryFile, 0) # 发送请求
if ret == 0:
print('发送查询合约成功!')
else:
print('发送查询合约失败!')
judge_ret(ret)
while ret != 0:
queryFile = tdapi.CThostFtdcQryInstrumentField()
ret = self.tduserapi.ReqQryInstrument(queryFile, 0)
print('正在查询合约...')
time.sleep(5)
time.sleep(1)
响应函数:OnRspQryInstrument

在官方文档里我们可以得到以下重要信息:
1、函数原型中带bIsLast,指示该次返回是否为最后一次返回,意思是返回多条数据,其中if bIsLast为真时,则已经查询结束,并返回最后一条数据(这个是细节,后面再详细讲讲)。
2、返回的存储信息为pInstrument,获取想要的信息则使用pInstrument.(信息名称),返回的信息有很多,但我们这里只要pInstrument.InstrumentID,合约代码和pInstrument.ExchangeID 合约名称,如果有其他查询需求更改函数即可。
响应函数的代码:
import json
from program.function import *
class CTraderSpi(tdapi.CThostFtdcTraderSpi):
def __init__(self, tduserapi, Account):
tdapi.CThostFtdcTraderSpi.__init__(self)
self.tduserapi = tduserapi
self.Account = Account
# 连接前台
def OnFrontConnected(self):
print("开始建立交易连接")
authfield = tdapi.CThostFtdcReqAuthenticateField()
authfield.BrokerID = str(self.Account.broker_id)
authfield.UserID = str(self.Account.investor_id)
authfield.AppID = str(self.Account.app_id)
authfield.AuthCode = str(self.Account.auth_code)
ret = self.tduserapi.ReqAuthenticate(authfield, 0)
if ret == 0:
print('发送穿透式认证请求成功!')
else:
print('发送穿透式认证请求失败!')
judge_ret(ret)
# 穿透式认证响应
def OnRspAuthenticate(self, pRspAuthenticateField, pRspInfo, nRequestID: 'int', bIsLast: 'bool'):
if pRspInfo.ErrorID != 0 and pRspInfo != None:
print('穿透式认证失败\n错误信息为:{}\n错误代码为:{}'.format(pRspInfo.ErrorMsg, pRspInfo.ErrorID))
else:
print('穿透式认证成功!')
# 发送登录请
本主题为课程学员专享,成为股票量化投资课程学员后可免费阅读
成为学员