#!/usr/bin/python # -*- coding: UTF-8 -*- import time import xmdapi level1_data_dict = { } def get_sh_codes(): with open("res/codes_sh.txt", encoding="utf-8") as f: lines = f.readlines() codes = [] for line in lines: if line and len(line) >= 6: codes.append(line[2:].strip().encode("utf-8")) return codes def get_sz_codes(): with open("res/codes_sz.txt", encoding="utf-8") as f: lines = f.readlines() codes = [] for line in lines: if line and len(line) >= 6: codes.append(line[2:].strip().encode("utf-8")) return codes class MdSpi(xmdapi.CTORATstpXMdSpi): def __init__(self, api): xmdapi.CTORATstpXMdSpi.__init__(self) self.__api = api def OnFrontConnected(self): print("OnFrontConnected") # 请求登录,目前未校验登录用户,请求域置空即可 login_req = xmdapi.CTORATstpReqUserLoginField() self.__api.ReqUserLogin(login_req, 1) def OnRspUserLogin(self, pRspUserLoginField, pRspInfoField, nRequestID): if pRspInfoField.ErrorID == 0: print('Login success! [%d]' % nRequestID) ''' 订阅行情 当sub_arr中只有一个"00000000"的合约且ExchangeID填TORA_TSTP_EXD_SSE或TORA_TSTP_EXD_SZSE时,订阅单市场所有合约行情 当sub_arr中只有一个"00000000"的合约且ExchangeID填TORA_TSTP_EXD_COMM时,订阅全市场所有合约行情 其它情况,订阅sub_arr集合中的合约行情 ''' sub_arr = get_sh_codes() ret = self.__api.SubscribeMarketData(sub_arr, xmdapi.TORA_TSTP_EXD_SSE) if ret != 0: print('SubscribeMarketData fail, ret[%d]' % ret) else: print('SubscribeMarketData success, ret[%d]' % ret) sub_arr = get_sz_codes() ret = self.__api.SubscribeMarketData(sub_arr, xmdapi.TORA_TSTP_EXD_SZSE) if ret != 0: print('SubscribeMarketData fail, ret[%d]' % ret) else: print('SubscribeMarketData success, ret[%d]' % ret) # sub_arr = [b'600004'] # ret = self.__api.UnSubscribeMarketData(sub_arr, xmdapi.TORA_TSTP_EXD_SSE) # if ret != 0: # print('UnSubscribeMarketData fail, ret[%d]' % ret) # else: # print('SubscribeMarketData success, ret[%d]' % ret) else: print('Login fail!!! [%d] [%d] [%s]' % (nRequestID, pRspInfoField.ErrorID, pRspInfoField.ErrorMsg)) def OnRspSubMarketData(self, pSpecificSecurityField, pRspInfoField): if pRspInfoField.ErrorID == 0: print('OnRspSubMarketData: OK!') else: print('OnRspSubMarketData: Error! [%d] [%s]' % (pRspInfoField.ErrorID, pRspInfoField.ErrorMsg)) def OnRspUnSubMarketData(self, pSpecificSecurityField, pRspInfoField): if pRspInfoField.ErrorID == 0: print('OnRspUnSubMarketData: OK!') else: print('OnRspUnSubMarketData: Error! [%d] [%s]' % (pRspInfoField.ErrorID, pRspInfoField.ErrorMsg)) def OnRtnMarketData(self, pMarketDataField): close_price = round(pMarketDataField.UpperLimitPrice / 1.1, 2) rate = round((pMarketDataField.LastPrice - close_price) * 100 / close_price, 2) # print(pMarketDataField.SecurityID, pMarketDataField.SecurityName, rate, pMarketDataField.Volume) level1_data_dict[pMarketDataField.SecurityID] = ( pMarketDataField.SecurityID, rate, pMarketDataField.Volume, time.time()) # print( # "SecurityID[%s] SecurityName[%s] LastPrice[%.2f] Volume[%d] Turnover[%.2f] BidPrice1[%.2f] BidVolume1[%d] AskPrice1[%.2f] AskVolume1[%d] UpperLimitPrice[%.2f] LowerLimitPrice[%.2f]" # % (pMarketDataField.SecurityID, pMarketDataField.SecurityName, pMarketDataField.LastPrice, # pMarketDataField.Volume, # pMarketDataField.Turnover, pMarketDataField.BidPrice1, pMarketDataField.BidVolume1, # pMarketDataField.AskPrice1, # pMarketDataField.AskVolume1, pMarketDataField.UpperLimitPrice, pMarketDataField.LowerLimitPrice)) if __name__ == "__main__": print(get_sh_codes()) print(get_sz_codes()) # 打印接口版本号 print(xmdapi.CTORATstpXMdApi_GetApiVersion()) # 创建接口对象 api = xmdapi.CTORATstpXMdApi_CreateTstpXMdApi(xmdapi.TORA_TSTP_MST_MCAST) # 创建回调对象 spi = MdSpi(api) # 注册回调接口 api.RegisterSpi(spi) # 注册单个行情前置服务地址 # api.RegisterFront("tcp://224.224.1.19:7880") # 注册多个行情前置服务地址,用逗号隔开 # api.RegisterFront("tcp://10.0.1.101:6402,tcp://10.0.1.101:16402") # 注册名字服务器地址,支持多服务地址逗号隔开 # api.RegisterNameServer('tcp://224.224.3.19:7888') # api.RegisterNameServer('tcp://10.0.1.101:52370,tcp://10.0.1.101:62370') api.RegisterMulticast("udp://224.224.1.19:7880", None, "") # 启动接口 api.Init() # 等待程序结束 while True: print("数量", len(level1_data_dict)) time.sleep(3) # 释放接口对象 api.Release()