#!/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()
|