#!/usr/bin/python
|
# -*- coding: UTF-8 -*-
|
|
import sys
|
import lev2mdapi
|
|
Front_Address = "tcp://10.0.1.101:6900"
|
Multicast_Address = "udp://224.224.2.19:7889"
|
Multicast_Address2 = "udp://224.224.224.234:7890"
|
Local_Interface_Address = "192.168.84.75"
|
Sender_Interface_Address = "10.0.1.101"
|
|
g_SubMarketData = True;
|
g_SubTransaction = True;
|
g_SubOrderDetail = True;
|
g_SubXTSTick = True;
|
g_SubXTSMarketData = True;
|
g_SubNGTSTick = True;
|
g_SubBondMarketData = True;
|
g_SubBondTransaction = True;
|
g_SubBondOrderDetail = True;
|
|
SH_Securities = [b"600035", b"510050", b"600000"];
|
SH_XTS_Securities = [b"018003", b"113565"];
|
|
SZ_Securities = [b"000001", b"128048", b"128125"];
|
SZ_Bond_Securities = [b"100303", b"109559", b"112617"];
|
|
|
class Lev2MdSpi(lev2mdapi.CTORATstpLev2MdSpi):
|
def __init__(self, api):
|
lev2mdapi.CTORATstpLev2MdSpi.__init__(self)
|
self.__api = api
|
|
def OnFrontConnected(self):
|
print("OnFrontConnected")
|
# 请求登录
|
login_req = lev2mdapi.CTORATstpReqUserLoginField()
|
self.__api.ReqUserLogin(login_req, 1)
|
|
def OnRspUserLogin(self, pRspUserLogin, pRspInfo, nRequestID, bIsLast):
|
print("OnRspUserLogin: ErrorID[%d] ErrorMsg[%s] RequestID[%d] IsLast[%d]" % (
|
pRspInfo['ErrorID'], pRspInfo['ErrorMsg'], nRequestID, bIsLast))
|
if pRspInfo['ErrorID'] == 0:
|
if g_SubMarketData:
|
self.__api.SubscribeMarketData(SH_Securities, lev2mdapi.TORA_TSTP_EXD_SSE);
|
self.__api.SubscribeMarketData(SZ_Securities, lev2mdapi.TORA_TSTP_EXD_SZSE);
|
|
if g_SubTransaction:
|
self.__api.SubscribeTransaction(SH_Securities, lev2mdapi.TORA_TSTP_EXD_SSE);
|
self.__api.SubscribeTransaction(SZ_Securities, lev2mdapi.TORA_TSTP_EXD_SZSE);
|
|
if g_SubOrderDetail:
|
self.__api.SubscribeOrderDetail(SH_Securities, lev2mdapi.TORA_TSTP_EXD_SSE);
|
self.__api.SubscribeOrderDetail(SZ_Securities, lev2mdapi.TORA_TSTP_EXD_SZSE);
|
|
if g_SubXTSTick:
|
self.__api.SubscribeXTSTick(SH_XTS_Securities, lev2mdapi.TORA_TSTP_EXD_SSE);
|
|
if g_SubXTSMarketData:
|
self.__api.SubscribeXTSMarketData(SH_XTS_Securities, lev2mdapi.TORA_TSTP_EXD_SSE);
|
|
if g_SubBondMarketData:
|
self.__api.SubscribeBondMarketData(SZ_Bond_Securities, lev2mdapi.TORA_TSTP_EXD_SZSE);
|
|
if g_SubBondTransaction:
|
self.__api.SubscribeBondTransaction(SZ_Bond_Securities, lev2mdapi.TORA_TSTP_EXD_SZSE);
|
|
if g_SubBondOrderDetail:
|
self.__api.SubscribeBondOrderDetail(SZ_Bond_Securities, lev2mdapi.TORA_TSTP_EXD_SZSE);
|
# 4.0.5版本接口
|
if g_SubNGTSTick:
|
self.__api.SubscribeNGTSTick(SH_Securities, lev2mdapi.TORA_TSTP_EXD_SSE);
|
|
def OnRspSubMarketData(self, pSpecificSecurity, pRspInfo, nRequestID, bIsLast):
|
print("OnRspSubMarketData")
|
|
def OnRspSubIndex(self, pSpecificSecurity, pRspInfo, nRequestID, bIsLast):
|
print("OnRspSubIndex")
|
|
def OnRspSubTransaction(self, pSpecificSecurity, pRspInfo, nRequestID, bIsLast):
|
print("OnRspSubTransaction")
|
|
def OnRspSubOrderDetail(self, pSpecificSecurity, pRspInfo, nRequestID, bIsLast):
|
print("OnRspSubOrderDetail")
|
|
def OnRspSubBondMarketData(self, pSpecificSecurity, pRspInfo, nRequestID, bIsLast):
|
print("OnRspSubBondMarketData")
|
|
def OnRspSubBondTransaction(self, pSpecificSecurity, pRspInfo, nRequestID, bIsLast):
|
print("OnRspSubBondTransaction")
|
|
def OnRspSubBondOrderDetail(self, pSpecificSecurity, pRspInfo, nRequestID, bIsLast):
|
print("OnRspSubBondOrderDetail")
|
|
def OnRspSubXTSMarketData(self, pSpecificSecurity, pRspInfo, nRequestID, bIsLast):
|
print("OnRspSubXTSMarketData")
|
|
def OnRspSubXTSTick(self, pSpecificSecurity, pRspInfo, nRequestID, bIsLast):
|
print("OnRspSubXTSTick")
|
|
# 4.0.5版本接口
|
def OnRspSubNGTSTick(self, pSpecificSecurity, pRspInfo, nRequestID, bIsLast):
|
print("OnRspSubNGTSTick")
|
|
def OnRtnMarketData(self, pDepthMarketData, FirstLevelBuyNum, FirstLevelBuyOrderVolumes, FirstLevelSellNum,
|
FirstLevelSellOrderVolumes):
|
# 输出行情快照数据
|
print(
|
"OnRtnMarketData SecurityID[%s] LastPrice[%.2f] TotalVolumeTrade[%d] TotalValueTrade[%.2f] BidPrice1[%.2f] BidVolume1[%d] AskPrice1[%.2f] AskVolume1[%d]" % (
|
pDepthMarketData['SecurityID'],
|
pDepthMarketData['LastPrice'],
|
pDepthMarketData['TotalValueTrade'],
|
pDepthMarketData['TotalValueTrade'],
|
pDepthMarketData['BidPrice1'],
|
pDepthMarketData['BidVolume1'],
|
pDepthMarketData['AskPrice1'],
|
pDepthMarketData['AskVolume1']))
|
# 输出一档价位买队列前50笔委托数量
|
for buy_index in range(0, FirstLevelBuyNum):
|
print("first level buy [%d] : [%d]" % (buy_index, FirstLevelBuyOrderVolumes[buy_index]))
|
|
# 输出一档价位卖队列前50笔委托数量
|
for sell_index in range(0, FirstLevelSellNum):
|
print("first level sell [%d] : [%d]" % (sell_index, FirstLevelSellOrderVolumes[sell_index]))
|
|
def OnRtnIndex(self, pIndex):
|
# 输出指数行情数据
|
print(
|
"OnRtnIndex SecurityID[%s] LastIndex[%.2f] LowIndex[%.2f] HighIndex[%.2f] TotalVolumeTraded[%d] Turnover[%.2f]" % (
|
pIndex['SecurityID'],
|
pIndex['LastIndex'],
|
pIndex['LowIndex'],
|
pIndex['HighIndex'],
|
pIndex['TotalVolumeTraded'],
|
pIndex['Turnover']))
|
|
def OnRtnTransaction(self, pTransaction):
|
# 输出逐笔成交数据
|
print(
|
"OnRtnTransaction SecurityID[%s] TradePrice[%.2f] TradeVolume[%d] TradeTime[%d] MainSeq[%d] SubSeq[%d] BuyNo[%d] SellNo[%d]" % (
|
pTransaction['SecurityID'],
|
pTransaction['TradePrice'],
|
pTransaction['TradeVolume'],
|
pTransaction['TradeTime'],
|
pTransaction['MainSeq'],
|
pTransaction['SubSeq'],
|
pTransaction['BuyNo'],
|
pTransaction['SellNo']))
|
|
def OnRtnOrderDetail(self, pOrderDetail):
|
# 输出逐笔委托数据
|
print(
|
"OnRtnOrderDetail SecurityID[%s] Price[%.2f] Volume[%d] Side[%s] OrderType[%s] OrderTime[%d] MainSeq[%d] SubSeq[%d]" % (
|
pOrderDetail['SecurityID'],
|
pOrderDetail['Price'],
|
pOrderDetail['Volume'],
|
pOrderDetail['Side'],
|
pOrderDetail['OrderType'],
|
pOrderDetail['OrderTime'],
|
pOrderDetail['MainSeq'],
|
pOrderDetail['SubSeq']))
|
|
def OnRtnBondMarketData(self, pDepthMarketData, FirstLevelBuyNum, FirstLevelBuyOrderVolumes, FirstLevelSellNum,
|
FirstLevelSellOrderVolumes):
|
# 输出行情快照数据
|
print(
|
"OnRtnBondMarketData SecurityID[%s] LastPrice[%.2f] TotalVolumeTrade[%d] TotalValueTrade[%.2f] BidPrice1[%.2f] BidVolume1[%d] AskPrice1[%.2f] AskVolume1[%d]" % (
|
pDepthMarketData['SecurityID'],
|
pDepthMarketData['LastPrice'],
|
pDepthMarketData['TotalValueTrade'],
|
pDepthMarketData['TotalValueTrade'],
|
pDepthMarketData['BidPrice1'],
|
pDepthMarketData['BidVolume1'],
|
pDepthMarketData['AskPrice1'],
|
pDepthMarketData['AskVolume1']))
|
|
# 输出一档价位买队列前50笔委托数量
|
for buy_index in range(0, FirstLevelBuyNum):
|
print("first level buy [%d] : [%d]" % (buy_index, FirstLevelBuyOrderVolumes[buy_index]))
|
|
# 输出一档价位卖队列前50笔委托数量
|
for sell_index in range(0, FirstLevelSellNum):
|
print("first level sell [%d] : [%d]" % (sell_index, FirstLevelSellOrderVolumes[sell_index]))
|
|
def OnRtnBondTransaction(self, pTransaction):
|
# 输出逐笔成交数据
|
print(
|
"OnRtnBondTransaction SecurityID[%s] TradePrice[%.2f] TradeVolume[%d] TradeTime[%d] MainSeq[%d] SubSeq[%d] BuyNo[%d] SellNo[%d]" % (
|
pTransaction['SecurityID'],
|
pTransaction['TradePrice'],
|
pTransaction['TradeVolume'],
|
pTransaction['TradeTime'],
|
pTransaction['MainSeq'],
|
pTransaction['SubSeq'],
|
pTransaction['BuyNo'],
|
pTransaction['SellNo']))
|
|
def OnRtnBondOrderDetail(self, pOrderDetail):
|
# 输出逐笔委托数据
|
print(
|
"OnRtnBondOrderDetail SecurityID[%s] Price[%.2f] Volume[%d] Side[%s] OrderType[%s] OrderTime[%d] MainSeq[%d] SubSeq[%d]" % (
|
pOrderDetail['SecurityID'],
|
pOrderDetail['Price'],
|
pOrderDetail['Volume'],
|
pOrderDetail['Side'],
|
pOrderDetail['OrderType'],
|
pOrderDetail['OrderTime'],
|
pOrderDetail['MainSeq'],
|
pOrderDetail['SubSeq']))
|
|
def OnRtnXTSMarketData(self, pDepthMarketData, FirstLevelBuyNum, FirstLevelBuyOrderVolumes, FirstLevelSellNum,
|
FirstLevelSellOrderVolumes):
|
# 输出行情快照数据
|
print(
|
"OnRtnXTSMarketData SecurityID[%s] LastPrice[%.2f] TotalVolumeTrade[%d] TotalValueTrade[%.2f] BidPrice1[%.2f] BidVolume1[%d] AskPrice1[%.2f] AskVolume1[%d]" % (
|
pDepthMarketData['SecurityID'],
|
pDepthMarketData['LastPrice'],
|
pDepthMarketData['TotalValueTrade'],
|
pDepthMarketData['TotalValueTrade'],
|
pDepthMarketData['BidPrice1'],
|
pDepthMarketData['BidVolume1'],
|
pDepthMarketData['AskPrice1'],
|
pDepthMarketData['AskVolume1']))
|
|
# 输出一档价位买队列前50笔委托数量
|
for buy_index in range(0, FirstLevelBuyNum):
|
print("first level buy [%d] : [%d]" % (buy_index, FirstLevelBuyOrderVolumes[buy_index]))
|
|
# 输出一档价位卖队列前50笔委托数量
|
for sell_index in range(0, FirstLevelSellNum):
|
print("first level sell [%d] : [%d]" % (sell_index, FirstLevelSellOrderVolumes[sell_index]))
|
|
def OnRtnXTSTick(self, pTick):
|
# 输出上海债券逐笔数据’
|
print(
|
"OnXTSTick TickType[%s] SecurityID[%s] Price[%.2f] Volume[%d] TickTime[%d] MainSeq[%d] SubSeq[%d] BuyNo[%d] SellNo[%d]" % (
|
pTick['TickType'],
|
pTick['SecurityID'],
|
pTick['Price'],
|
pTick['Volume'],
|
pTick['TickTime'],
|
pTick['MainSeq'],
|
pTick['SubSeq'],
|
pTick['BuyNo'],
|
pTick['SellNo']))
|
|
def OnRtnNGTSTick(self, pTick):
|
# 输出上海股基逐笔数据’
|
print(
|
"OnRtnNGTSTick TickType[%s] SecurityID[%s] Price[%.2f] Volume[%d] TickTime[%d] MainSeq[%d] SubSeq[%d] BuyNo[%d] SellNo[%d]" % (
|
pTick['TickType'],
|
pTick['SecurityID'],
|
pTick['Price'],
|
pTick['Volume'],
|
pTick['TickTime'],
|
pTick['MainSeq'],
|
pTick['SubSeq'],
|
pTick['BuyNo'],
|
pTick['SellNo']))
|
|
|
if __name__ == "__main__":
|
print(lev2mdapi.CTORATstpLev2MdApi_GetApiVersion())
|
# case 1: Tcp方式
|
# g_SubMode=lev2mdapi.TORA_TSTP_MST_TCP
|
# case 2: 组播方式
|
g_SubMode = lev2mdapi.TORA_TSTP_MST_MCAST
|
|
# case 1缓存模式
|
global api
|
api = lev2mdapi.CTORATstpLev2MdApi_CreateTstpLev2MdApi(g_SubMode, True)
|
# case 2非缓存模式
|
# api = lev2mdapi.CTORATstpLev2MdApi_CreateTstpLev2MdApi(g_SubMode, False)
|
global spi
|
spi = Lev2MdSpi(api)
|
api.RegisterSpi(spi)
|
|
if g_SubMode != lev2mdapi.TORA_TSTP_MST_MCAST:
|
api.RegisterFront(Front_Address)
|
else:
|
# case 1 从一个组播地址收取行情
|
api.RegisterMulticast(Multicast_Address, Local_Interface_Address, "")
|
|
# case 2:注册多个组播地址同时收行情
|
# api.RegisterMulticast(Multicast_Address, Local_Interface_Address, Sender_Interface_Address);
|
# api.RegisterMulticast(Multicast_Address2, Local_Interface_Address, Sender_Interface_Address);
|
|
# case 3:efvi模式收行情
|
# api.RegisterMulticast(Multicast_Address, Local_Interface_Address, Sender_Interface_Address, "enp101s0f0",4096, True);
|
|
# case 1 不绑核运行
|
api.Init()
|
# case 2 绑核运行
|
# api.Init("2,17")
|
str = input("\n")
|