增加vn.rpc模块

This commit is contained in:
chenxy123 2016-10-02 23:19:51 +08:00
parent 19bc8ce4fe
commit d7d6ecf840
46 changed files with 278 additions and 65218 deletions

View File

@ -1,5 +1,5 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<SubscriptionDataContainer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:Microsoft.VisualStudio.WindowsAzure.CommonAzureTools.Authentication.CacheManagement"> <SubscriptionDataContainer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:Microsoft.VisualStudio.WindowsAzure.CommonAzureTools.Authentication.CacheManagement">
<Items /> <Items />
<TokenCache>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAhuIZgFnYcU6wvp5DI4FozAAAAAACAAAAAAAQZgAAAAEAACAAAAAEnSq6DlHvPj2amWbgMtqa1m2ELpAnBlEJyoRyDjDxsgAAAAAOgAAAAAIAACAAAACrX89865S5WWunExh6aF71QHKHa87uVQVvsnn0+riPcRAAAABDBs23sQKZAf7wk26UVETjQAAAAEpIyMmA+AvwZxOZekWx/EcDwGZ23fzLHsoD0smvLK34lZolgZJP/DdmHnM7XHV5qUeUY/Ujmea+emXzxQ8R5Wo=</TokenCache> <TokenCache>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAhuIZgFnYcU6wvp5DI4FozAAAAAACAAAAAAAQZgAAAAEAACAAAADbHX9MGY1db5F4b+OyG6c/B78GOMBlEj6iQbaFcLZJCAAAAAAOgAAAAAIAACAAAADn7kKZgsW4pBHXuVEmex+oXTGG5hNRZGiXkpNGYXsFPBAAAACHqHiPVtiM03bftyY0V78iQAAAACpQVRyEMAhwGyl6Ekto5M6tZRU4Nu9lGQ6I+0d85GOVYFPsld6n8j1heCXRQ5facD4R4R9fqjq858G/Iyjl0vQ=</TokenCache>
</SubscriptionDataContainer> </SubscriptionDataContainer>

33
vn.rpc/testClient.py Normal file
View File

@ -0,0 +1,33 @@
# encoding: UTF-8
from time import sleep
from vnrpc import RpcClient
########################################################################
class TestClient(RpcClient):
""""""
#----------------------------------------------------------------------
def __init__(self, reqAddress, subAddress):
"""Constructor"""
super(TestClient, self).__init__(reqAddress, subAddress)
#----------------------------------------------------------------------
def callback(self, data):
"""回调函数实现"""
print 'client received:', data
if __name__ == '__main__':
reqAddress = 'tcp://localhost:2014'
subAddress = 'tcp://localhost:0602'
tc = TestClient(reqAddress, subAddress)
tc.start()
while 1:
print tc.add(1, 3)
sleep(2)

37
vn.rpc/testServer.py Normal file
View File

@ -0,0 +1,37 @@
# encoding: UTF-8
from time import sleep, time
from vnrpc import RpcServer
########################################################################
class TestServer(RpcServer):
"""测试服务器"""
#----------------------------------------------------------------------
def __init__(self, repAddress, pubAddress):
"""Constructor"""
super(TestServer, self).__init__(repAddress, pubAddress)
self.register(self.add)
#----------------------------------------------------------------------
def add(self, a, b):
"""测试函数"""
print 'receiving: %s, %s' % (a,b)
return a + b
if __name__ == '__main__':
repAddress = 'tcp://*:2014'
pubAddress = 'tcp://*:0602'
ts = TestServer(repAddress, pubAddress)
ts.start()
while 1:
content = 'current server time is %s' % time()
print content
ts.publish(content)
sleep(2)

190
vn.rpc/vnrpc.py Normal file
View File

@ -0,0 +1,190 @@
# encoding: UTF-8
import threading
import traceback
import zmq
from msgpack import packb, unpackb
########################################################################
class RpcServer(object):
"""RPC服务器"""
#----------------------------------------------------------------------
def __init__(self, repAddress, pubAddress):
"""Constructor"""
# 保存功能函数的字典key是函数名value是函数对象
self.__functions = {}
# zmq端口相关
self.__context = zmq.Context()
self.__socketREP = self.__context.socket(zmq.REP) # 请求回应socket
self.__socketREP.bind(repAddress)
self.__socketPUB = self.__context.socket(zmq.PUB) # 数据广播socket
self.__socketPUB.bind(pubAddress)
# 工作线程相关
self.__active = False # 服务器的工作状态
self.__thread = threading.Thread(target=self.__run) # 服务器的工作线程
#----------------------------------------------------------------------
def start(self):
"""启动服务器"""
# 将服务器设为启动
self.__active = True
# 启动工作线程
self.__thread.start()
#----------------------------------------------------------------------
def stop(self):
"""停止服务器"""
# 将服务器设为停止
self.__active = False
# 等待工作线程退出
self.__thread.join()
#----------------------------------------------------------------------
def __run(self):
"""连续运行函数"""
while self.__active:
# 从请求响应socket收取请求数据
reqb = self.__socketREP.recv()
# 用msgpack解包
req = unpackb(reqb)
# 获取函数名和参数
name, args, kwargs = req
# 获取引擎中对应的函数对象,并执行调用,如果有异常则捕捉后返回
try:
func = self.__functions[name]
r = func(*args, **kwargs)
rep = [True, r]
except Exception as e:
rep = [False, traceback.format_exc()]
# 用msgpack打包
repb = packb(rep)
# 通过请求响应socket返回调用结果
self.__socketREP.send(repb)
#----------------------------------------------------------------------
def publish(self, data):
"""广播推送数据"""
# 使用msgpack序列化数据
datab = packb(data)
# 通过广播socket发送数据
self.__socketPUB.send(datab)
#----------------------------------------------------------------------
def register(self, func):
"""注册函数"""
self.__functions[func.__name__] = func
########################################################################
class RpcClient(object):
"""RPC客户端"""
#----------------------------------------------------------------------
def __init__(self, reqAddress, subAddress):
"""Constructor"""
# zmq端口相关
self.__reqAddress = reqAddress
self.__subAddress = subAddress
self.__context = zmq.Context()
self.__socketREQ = self.__context.socket(zmq.REQ) # 请求发出socket
self.__socketSUB = self.__context.socket(zmq.SUB) # 广播订阅socket
# 工作线程相关,用于处理服务器推送的数据
self.__active = False # 客户端的工作状态
self.__thread = threading.Thread(target=self.__run) # 客户端的工作线程
#----------------------------------------------------------------------
def __getattr__(self, name):
"""实现远程调用功能"""
# 执行远程调用任务
def dorpc(*args, **kwargs):
# 生成请求
req = [name, args, kwargs]
# 用msgpack打包请求
reqb = packb(req)
# 发送请求并等待回应
self.__socketREQ.send(reqb)
repb = self.__socketREQ.recv()
# 用msgpack解包回应
rep = unpackb(repb)
# 若正常则返回结果,调用失败则触发异常
if rep[0]:
return rep[1]
else:
raise RemoteException, rep[1]
return dorpc
#----------------------------------------------------------------------
def start(self):
"""启动客户端"""
# 连接端口
self.__socketREQ.connect(self.__reqAddress)
self.__socketSUB.connect(self.__subAddress)
self.__socketSUB.setsockopt(zmq.SUBSCRIBE, '') # 订阅全部数据,不做过滤
# 将服务器设为启动
self.__active = True
# 启动工作线程
self.__thread.start()
#----------------------------------------------------------------------
def stop(self):
"""停止客户端"""
# 将客户端设为停止
self.__active = False
# 等待工作线程退出
self.__thread.join()
#----------------------------------------------------------------------
def __run(self):
"""连续运行函数"""
while self.__active:
# 从订阅socket收取广播数据
datab = self.__socketSUB.recv()
# 用msgpack解包
data = unpackb(datab)
# 调用回调函数处理
self.callback(data)
#----------------------------------------------------------------------
def callback(self, data):
"""回调函数,必须由用户实现"""
raise NotImplementedError
########################################################################
class RemoteException(Exception):
"""RPC远程异常"""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
pass

View File

@ -65,6 +65,9 @@ class MainWindow(QtGui.QMainWindow):
connectLtsAction = QtGui.QAction(u'连接LTS', self) connectLtsAction = QtGui.QAction(u'连接LTS', self)
connectLtsAction.triggered.connect(self.connectLts) connectLtsAction.triggered.connect(self.connectLts)
connectXtpAction = QtGui.QAction(u'连接XTP', self)
connectXtpAction.triggered.connect(self.connectXtp)
connectKsotpAction = QtGui.QAction(u'连接金仕达期权', self) connectKsotpAction = QtGui.QAction(u'连接金仕达期权', self)
connectKsotpAction.triggered.connect(self.connectKsotp) connectKsotpAction.triggered.connect(self.connectKsotp)
@ -125,6 +128,8 @@ class MainWindow(QtGui.QMainWindow):
sysMenu.addAction(connectCtpAction) sysMenu.addAction(connectCtpAction)
if 'LTS' in self.mainEngine.gatewayDict: if 'LTS' in self.mainEngine.gatewayDict:
sysMenu.addAction(connectLtsAction) sysMenu.addAction(connectLtsAction)
if 'XTP' in self.mainEngine.gatewayDict:
sysMenu.addAction(connectXtpAction)
if 'FEMAS' in self.mainEngine.gatewayDict: if 'FEMAS' in self.mainEngine.gatewayDict:
sysMenu.addAction(connectFemasAction) sysMenu.addAction(connectFemasAction)
if 'XSPEED' in self.mainEngine.gatewayDict: if 'XSPEED' in self.mainEngine.gatewayDict:
@ -204,6 +209,11 @@ class MainWindow(QtGui.QMainWindow):
"""连接LTS接口""" """连接LTS接口"""
self.mainEngine.connect('LTS') self.mainEngine.connect('LTS')
#----------------------------------------------------------------------
def connectXtp(self):
"""连接XTP接口"""
self.mainEngine.connect('XTP')
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def connectKsotp(self): def connectKsotp(self):
"""连接金仕达期权接口""" """连接金仕达期权接口"""

View File

@ -61,6 +61,13 @@ class MainEngine(object):
except Exception, e: except Exception, e:
print e print e
try:
from xtpGateway.xtpGateway import XtpGateway
self.addGateway(XtpGateway, 'XTP')
self.gatewayDict['XTP'].setQryEnabled(True)
except Exception, e:
print e
try: try:
from ksotpGateway.ksotpGateway import KsotpGateway from ksotpGateway.ksotpGateway import KsotpGateway
self.addGateway(KsotpGateway, 'KSOTP') self.addGateway(KsotpGateway, 'KSOTP')

View File

@ -1,128 +0,0 @@
# encoding: UTF-8
__author__ = u'用Python的交易员'
# C++和python类型的映射字典
type_dict = {
'int': 'int',
'char': 'string',
'double': 'float',
'short': 'int',
'XTP_EXCHANGE_TYPE': 'int'
}
#----------------------------------------------------------------------
def process_line(line):
"""处理每行"""
# 注释
if line[:3] == '///': # 注释
py_line = process_comment(line)
# 枚举
elif 'enum' in line:
py_line = process_enum(line)
# 常量
elif '#define' in line:
py_line = process_define(line)
# 类型定义
elif 'typedef' in line:
py_line = process_typedef(line)
# 空行
elif line == '\n':
py_line = line
# 其他忽略
else:
py_line = ''
return py_line
#----------------------------------------------------------------------
def process_enum(line):
"""处理枚举"""
content = line.replace('\n', '').split(' ')
type_ = 'int'
keyword = content[1]
py_line = 'typedefDict["%s"] = "%s"\n' % (keyword, type_)
return py_line
#----------------------------------------------------------------------
def process_comment(line):
"""处理注释"""
py_line = line.replace('/', '#')
return py_line
#----------------------------------------------------------------------
def process_typedef(line):
"""处理类型定义"""
content = line.split(' ')
type_ = type_dict[content[1]]
keyword = content[2]
if '[' in keyword:
i = keyword.index('[')
keyword = keyword[:i]
else:
keyword = keyword.replace(';\n', '') # 删除行末分号
if 'char' in line:
if '[' in line:
type_ = 'string'
else:
type_ = 'char'
py_line = 'typedefDict["%s"] = "%s"\n' % (keyword, type_)
return py_line
#----------------------------------------------------------------------
def process_define(line):
"""处理常量"""
content = line.split(' ')
constant = content[1]
if len(content)>2:
value = content[-1]
#py_line = 'defineDict["%s"] = %s' % (constant, value)
py_line = '%s = %s' %(constant, value)
else:
py_line = ''
return py_line
#----------------------------------------------------------------------
def replaceTabs(f):
"""把Tab用4个空格替代"""
l = []
for line in f:
line.replace('\t', ' ')
l.append(line)
return l
#----------------------------------------------------------------------
def main():
"""主函数"""
fcpp = open('xtp_api_data_type.h','r')
fpy = open('xtp_data_type.py', 'w')
fpy.write('# encoding: UTF-8\n')
fpy.write('\n')
fpy.write('typedefDict = {}\n')
fpy.write('\n')
lcpp = replaceTabs(fcpp)
for n, line in enumerate(lcpp):
py_line = process_line(line)
if py_line:
fpy.write(py_line.decode('gbk').encode('utf-8'))
fcpp.close()
fpy.close()
print u'data_type.py生成过程完成'
if __name__ == '__main__':
main()

View File

@ -1,295 +0,0 @@
# encoding: UTF-8
__author__ = 'CHENXY'
from string import join
from lts_struct import structDict
def processCallBack(line):
orignalLine = line
line = line.replace('\tvirtual void ', '') # 删除行首的无效内容
line = line.replace('{};\n', '') # 删除行尾的无效内容
content = line.split('(')
cbName = content[0] # 回调函数名称
cbArgs = content[1] # 回调函数参数
if cbArgs[-1] == ' ':
cbArgs = cbArgs.replace(') ', '')
else:
cbArgs = cbArgs.replace(')', '')
cbArgsList = cbArgs.split(', ') # 将每个参数转化为列表
cbArgsTypeList = []
cbArgsValueList = []
for arg in cbArgsList: # 开始处理参数
content = arg.split(' ')
if len(content) > 1:
cbArgsTypeList.append(content[0]) # 参数类型列表
cbArgsValueList.append(content[1]) # 参数数据列表
createTask(cbName, cbArgsTypeList, cbArgsValueList, orignalLine)
createProcess(cbName, cbArgsTypeList, cbArgsValueList)
# 生成.h文件中的process部分
process_line = 'void process' + cbName[2:] + '(Task *task);\n'
fheaderprocess.write(process_line)
fheaderprocess.write('\n')
# 生成.h文件中的on部分
if 'OnRspError' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict error, int id, bool last) {};\n'
elif 'OnRsp' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict data, dict error, int id, bool last) {};\n'
elif 'OnRtn' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict data) {};\n'
elif 'OnErrRtn' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict data, dict error) {};\n'
else:
on_line = ''
fheaderon.write(on_line)
fheaderon.write('\n')
# 生成封装部分
createWrap(cbName)
#----------------------------------------------------------------------
def createWrap(cbName):
"""在Python封装段代码中进行处理"""
# 生成.h文件中的on部分
if 'OnRspError' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict error, int id, bool last)\n'
override_line = '("on' + cbName[2:] + '")(error, id, last);\n'
elif 'OnRsp' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict data, dict error, int id, bool last)\n'
override_line = '("on' + cbName[2:] + '")(data, error, id, last);\n'
elif 'OnRtn' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict data)\n'
override_line = '("on' + cbName[2:] + '")(data);\n'
elif 'OnErrRtn' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict data, dict error)\n'
override_line = '("on' + cbName[2:] + '")(data, error);\n'
else:
on_line = ''
if on_line is not '':
fwrap.write(on_line)
fwrap.write('{\n')
fwrap.write('\ttry\n')
fwrap.write('\t{\n')
fwrap.write('\t\tthis->get_override'+override_line)
fwrap.write('\t}\n')
fwrap.write('\tcatch (error_already_set const &)\n')
fwrap.write('\t{\n')
fwrap.write('\t\tPyErr_Print();\n')
fwrap.write('\t}\n')
fwrap.write('};\n')
fwrap.write('\n')
def createTask(cbName, cbArgsTypeList, cbArgsValueList, orignalLine):
# 从回调函数生成任务对象,并放入队列
funcline = orignalLine.replace('\tvirtual void ', 'void ' + apiName + '::')
funcline = funcline.replace('{};', '')
ftask.write(funcline)
ftask.write('{\n')
ftask.write("\tTask* task = new Task();\n")
ftask.write("\ttask->task_name = " + cbName.upper() + ";\n")
# define常量
global define_count
fdefine.write("#define " + cbName.upper() + ' ' + str(define_count) + '\n')
define_count = define_count + 1
# switch段代码
fswitch.write("case " + cbName.upper() + ':\n')
fswitch.write("{\n")
fswitch.write("\tthis->" + cbName.replace('On', 'process') + '(task);\n')
fswitch.write("\tbreak;\n")
fswitch.write("}\n")
fswitch.write("\n")
for i, type_ in enumerate(cbArgsTypeList):
if type_ == 'int':
ftask.write("\ttask->task_id = " + cbArgsValueList[i] + ";\n")
elif type_ == 'bool':
ftask.write("\ttask->task_last = " + cbArgsValueList[i] + ";\n")
elif 'RspInfoField' in type_:
ftask.write("\n")
ftask.write("\tif (pRspInfo)\n")
ftask.write("\t{\n")
ftask.write("\t\t" + type_ + ' *task_error = new ' + type_ + '();\n')
ftask.write("\t\t" + '*task_error = ' + cbArgsValueList[i] + ';\n')
ftask.write("\t\ttask->task_error = task_error;\n")
ftask.write("\t}\n")
ftask.write("\n")
else:
ftask.write("\n")
ftask.write("\tif (" + cbArgsValueList[i][1:] + ")\n")
ftask.write("\t{\n")
ftask.write("\t\t" + type_ + ' *task_data = new ' + type_ + '();\n')
ftask.write("\t\t" + '*task_data = ' + cbArgsValueList[i] + ';\n')
ftask.write("\t\ttask->task_data = task_data;\n")
ftask.write("\t}\n")
ftask.write("\tthis->task_queue.push(task);\n")
ftask.write("};\n")
ftask.write("\n")
def createProcess(cbName, cbArgsTypeList, cbArgsValueList):
# 从队列中提取任务并转化为python字典
fprocess.write("void " + apiName + '::' + cbName.replace('On', 'process') + '(Task *task)' + "\n")
fprocess.write("{\n")
fprocess.write("\tPyLock lock;\n")
onArgsList = []
for i, type_ in enumerate(cbArgsTypeList):
if 'RspInfoField' in type_:
fprocess.write("\t"+ "dict error;\n")
fprocess.write("\tif (task->task_error)\n")
fprocess.write("\t{\n")
fprocess.write("\t\t"+ type_ + ' *task_error = (' + type_ + '*) task->task_error;\n')
struct = structDict[type_]
for key in struct.keys():
fprocess.write("\t\t"+ 'error["' + key + '"] = task_error->' + key + ';\n')
fprocess.write("\t\tdelete task->task_error;\n")
fprocess.write("\t}\n")
fprocess.write("\n")
onArgsList.append('error')
elif type_ in structDict:
fprocess.write("\t"+ "dict data;\n")
fprocess.write("\tif (task->task_data)\n")
fprocess.write("\t{\n")
fprocess.write("\t\t"+ type_ + ' *task_data = (' + type_ + '*) task->task_data;\n')
struct = structDict[type_]
for key in struct.keys():
fprocess.write("\t\t"+ 'data["' + key + '"] = task_data->' + key + ';\n')
fprocess.write("\t\tdelete task->task_data;\n")
fprocess.write("\t}\n")
fprocess.write("\n")
onArgsList.append('data')
elif type_ == 'bool':
onArgsList.append('task->task_last')
elif type_ == 'int':
onArgsList.append('task->task_id')
onArgs = join(onArgsList, ', ')
fprocess.write('\tthis->' + cbName.replace('On', 'on') + '(' + onArgs +');\n')
fprocess.write('\tdelete task;\n')
fprocess.write("};\n")
fprocess.write("\n")
def processFunction(line):
line = line.replace('\tvirtual int ', '') # 删除行首的无效内容
line = line.replace(') = 0;\n', '') # 删除行尾的无效内容
content = line.split('(')
fcName = content[0] # 回调函数名称
fcArgs = content[1] # 回调函数参数
fcArgs = fcArgs.replace(')', '')
fcArgsList = fcArgs.split(', ') # 将每个参数转化为列表
fcArgsTypeList = []
fcArgsValueList = []
for arg in fcArgsList: # 开始处理参数
content = arg.split(' ')
if len(content) > 1:
fcArgsTypeList.append(content[0]) # 参数类型列表
fcArgsValueList.append(content[1]) # 参数数据列表
if len(fcArgsTypeList)>0 and fcArgsTypeList[0] in structDict:
createFunction(fcName, fcArgsTypeList, fcArgsValueList)
# 生成.h文件中的主动函数部分
if 'Req' in fcName:
req_line = 'int req' + fcName[3:] + '(dict req, int nRequestID);\n'
fheaderfunction.write(req_line)
fheaderfunction.write('\n')
def createFunction(fcName, fcArgsTypeList, fcArgsValueList):
type_ = fcArgsTypeList[0]
struct = structDict[type_]
ffunction.write('int MdApi::req' + fcName[3:] + '(dict req, int nRequestID)\n')
ffunction.write('{\n')
ffunction.write('\t' + type_ +' myreq = ' + type_ + '();\n')
ffunction.write('\tmemset(&myreq, 0, sizeof(myreq));\n')
for key, value in struct.items():
if value == 'string':
line = '\tgetString(req, "' + key + '", myreq.' + key + ');\n'
elif value == 'char':
line = '\tgetChar(req, "' + key + '", &myreq.' + key + ');\n'
elif value == 'int':
line = '\tgetInt(req, "' + key + '", &myreq.' + key + ');\n'
elif value == 'double':
line = '\tgetDouble(req, "' + key + '", &myreq.' + key + ');\n'
ffunction.write(line)
ffunction.write('\tint i = this->api->' + fcName + '(&myreq, nRequestID);\n')
ffunction.write('\treturn i;\n')
ffunction.write('};\n')
ffunction.write('\n')
#########################################################
apiName = 'MdApi'
fcpp = open('SecurityFtdcMdApi.h', 'r')
ftask = open('lts_md_task.cpp', 'w')
fprocess = open('lts_md_process.cpp', 'w')
ffunction = open('lts_md_function.cpp', 'w')
fdefine = open('lts_md_define.cpp', 'w')
fswitch = open('lts_md_switch.cpp', 'w')
fheaderprocess = open('lts_md_header_process.h', 'w')
fheaderon = open('lts_md_header_on.h', 'w')
fheaderfunction = open('lts_md_header_function.h', 'w')
fwrap = open('lts_md_wrap.cpp', 'w')
define_count = 1
for line in fcpp:
if "\tvirtual void On" in line:
processCallBack(line)
elif "\tvirtual int" in line:
processFunction(line)
fcpp.close()
ftask.close()
fprocess.close()
ffunction.close()
fswitch.close()
fdefine.close()
fheaderprocess.close()
fheaderon.close()
fheaderfunction.close()
fwrap.close()

View File

@ -1,295 +0,0 @@
# encoding: UTF-8
__author__ = 'CHENXY'
from string import join
from lts_struct import structDict
def processCallBack(line):
orignalLine = line
line = line.replace('\tvirtual void ', '') # 删除行首的无效内容
line = line.replace('{};\n', '') # 删除行尾的无效内容
content = line.split('(')
cbName = content[0] # 回调函数名称
cbArgs = content[1] # 回调函数参数
if cbArgs[-1] == ' ':
cbArgs = cbArgs.replace(') ', '')
else:
cbArgs = cbArgs.replace(')', '')
cbArgsList = cbArgs.split(', ') # 将每个参数转化为列表
cbArgsTypeList = []
cbArgsValueList = []
for arg in cbArgsList: # 开始处理参数
content = arg.split(' ')
if len(content) > 1:
cbArgsTypeList.append(content[0]) # 参数类型列表
cbArgsValueList.append(content[1]) # 参数数据列表
createTask(cbName, cbArgsTypeList, cbArgsValueList, orignalLine)
createProcess(cbName, cbArgsTypeList, cbArgsValueList)
# 生成.h文件中的process部分
process_line = 'void process' + cbName[2:] + '(Task *task);\n'
fheaderprocess.write(process_line)
fheaderprocess.write('\n')
# 生成.h文件中的on部分
if 'OnRspError' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict error, int id, bool last) {};\n'
elif 'OnRsp' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict data, dict error, int id, bool last) {};\n'
elif 'OnRtn' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict data) {};\n'
elif 'OnErrRtn' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict data, dict error) {};\n'
else:
on_line = ''
fheaderon.write(on_line)
fheaderon.write('\n')
# 生成封装部分
createWrap(cbName)
#----------------------------------------------------------------------
def createWrap(cbName):
"""在Python封装段代码中进行处理"""
# 生成.h文件中的on部分
if 'OnRspError' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict error, int id, bool last)\n'
override_line = '("on' + cbName[2:] + '")(error, id, last);\n'
elif 'OnRsp' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict data, dict error, int id, bool last)\n'
override_line = '("on' + cbName[2:] + '")(data, error, id, last);\n'
elif 'OnRtn' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict data)\n'
override_line = '("on' + cbName[2:] + '")(data);\n'
elif 'OnErrRtn' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict data, dict error)\n'
override_line = '("on' + cbName[2:] + '")(data, error);\n'
else:
on_line = ''
if on_line is not '':
fwrap.write(on_line)
fwrap.write('{\n')
fwrap.write('\ttry\n')
fwrap.write('\t{\n')
fwrap.write('\t\tthis->get_override'+override_line)
fwrap.write('\t}\n')
fwrap.write('\tcatch (error_already_set const &)\n')
fwrap.write('\t{\n')
fwrap.write('\t\tPyErr_Print();\n')
fwrap.write('\t}\n')
fwrap.write('};\n')
fwrap.write('\n')
def createTask(cbName, cbArgsTypeList, cbArgsValueList, orignalLine):
# 从回调函数生成任务对象,并放入队列
funcline = orignalLine.replace('\tvirtual void ', 'void ' + apiName + '::')
funcline = funcline.replace('{};', '')
ftask.write(funcline)
ftask.write('{\n')
ftask.write("\tTask* task = new Task();\n")
ftask.write("\ttask->task_name = " + cbName.upper() + ";\n")
# define常量
global define_count
fdefine.write("#define " + cbName.upper() + ' ' + str(define_count) + '\n')
define_count = define_count + 1
# switch段代码
fswitch.write("case " + cbName.upper() + ':\n')
fswitch.write("{\n")
fswitch.write("\tthis->" + cbName.replace('On', 'process') + '(task);\n')
fswitch.write("\tbreak;\n")
fswitch.write("}\n")
fswitch.write("\n")
for i, type_ in enumerate(cbArgsTypeList):
if type_ == 'int':
ftask.write("\ttask->task_id = " + cbArgsValueList[i] + ";\n")
elif type_ == 'bool':
ftask.write("\ttask->task_last = " + cbArgsValueList[i] + ";\n")
elif 'RspInfoField' in type_:
ftask.write("\n")
ftask.write("\tif (pRspInfo)\n")
ftask.write("\t{\n")
ftask.write("\t\t" + type_ + ' *task_error = new ' + type_ + '();\n')
ftask.write("\t\t" + '*task_error = ' + cbArgsValueList[i] + ';\n')
ftask.write("\t\ttask->task_error = task_error;\n")
ftask.write("\t}\n")
ftask.write("\n")
else:
ftask.write("\n")
ftask.write("\tif (" + cbArgsValueList[i][1:] + ")\n")
ftask.write("\t{\n")
ftask.write("\t\t" + type_ + ' *task_data = new ' + type_ + '();\n')
ftask.write("\t\t" + '*task_data = ' + cbArgsValueList[i] + ';\n')
ftask.write("\t\ttask->task_data = task_data;\n")
ftask.write("\t}\n")
ftask.write("\tthis->task_queue.push(task);\n")
ftask.write("};\n")
ftask.write("\n")
def createProcess(cbName, cbArgsTypeList, cbArgsValueList):
# 从队列中提取任务并转化为python字典
fprocess.write("void " + apiName + '::' + cbName.replace('On', 'process') + '(Task *task)' + "\n")
fprocess.write("{\n")
fprocess.write("\tPyLock lock;\n")
onArgsList = []
for i, type_ in enumerate(cbArgsTypeList):
if 'RspInfoField' in type_:
fprocess.write("\t"+ "dict error;\n")
fprocess.write("\tif (task->task_error)\n")
fprocess.write("\t{\n")
fprocess.write("\t\t"+ type_ + ' *task_error = (' + type_ + '*) task->task_error;\n')
struct = structDict[type_]
for key in struct.keys():
fprocess.write("\t\t"+ 'error["' + key + '"] = task_error->' + key + ';\n')
fprocess.write("\t\tdelete task->task_error;\n")
fprocess.write("\t}\n")
fprocess.write("\n")
onArgsList.append('error')
elif type_ in structDict:
fprocess.write("\t"+ "dict data;\n")
fprocess.write("\tif (task->task_data)\n")
fprocess.write("\t{\n")
fprocess.write("\t\t"+ type_ + ' *task_data = (' + type_ + '*) task->task_data;\n')
struct = structDict[type_]
for key in struct.keys():
fprocess.write("\t\t"+ 'data["' + key + '"] = task_data->' + key + ';\n')
fprocess.write("\t\tdelete task->task_data;\n")
fprocess.write("\t}\n")
fprocess.write("\n")
onArgsList.append('data')
elif type_ == 'bool':
onArgsList.append('task->task_last')
elif type_ == 'int':
onArgsList.append('task->task_id')
onArgs = join(onArgsList, ', ')
fprocess.write('\tthis->' + cbName.replace('On', 'on') + '(' + onArgs +');\n')
fprocess.write('\tdelete task;\n')
fprocess.write("};\n")
fprocess.write("\n")
def processFunction(line):
line = line.replace('\tvirtual int ', '') # 删除行首的无效内容
line = line.replace(') = 0;\n', '') # 删除行尾的无效内容
content = line.split('(')
fcName = content[0] # 回调函数名称
fcArgs = content[1] # 回调函数参数
fcArgs = fcArgs.replace(')', '')
fcArgsList = fcArgs.split(', ') # 将每个参数转化为列表
fcArgsTypeList = []
fcArgsValueList = []
for arg in fcArgsList: # 开始处理参数
content = arg.split(' ')
if len(content) > 1:
fcArgsTypeList.append(content[0]) # 参数类型列表
fcArgsValueList.append(content[1]) # 参数数据列表
if len(fcArgsTypeList)>0 and fcArgsTypeList[0] in structDict:
createFunction(fcName, fcArgsTypeList, fcArgsValueList)
# 生成.h文件中的主动函数部分
if 'Req' in fcName:
req_line = 'int req' + fcName[3:] + '(dict req, int nRequestID);\n'
fheaderfunction.write(req_line)
fheaderfunction.write('\n')
def createFunction(fcName, fcArgsTypeList, fcArgsValueList):
type_ = fcArgsTypeList[0]
struct = structDict[type_]
ffunction.write('int QryApi::req' + fcName[3:] + '(dict req, int nRequestID)\n')
ffunction.write('{\n')
ffunction.write('\t' + type_ +' myreq = ' + type_ + '();\n')
ffunction.write('\tmemset(&myreq, 0, sizeof(myreq));\n')
for key, value in struct.items():
if value == 'string':
line = '\tgetString(req, "' + key + '", myreq.' + key + ');\n'
elif value == 'char':
line = '\tgetChar(req, "' + key + '", &myreq.' + key + ');\n'
elif value == 'int':
line = '\tgetInt(req, "' + key + '", &myreq.' + key + ');\n'
elif value == 'double':
line = '\tgetDouble(req, "' + key + '", &myreq.' + key + ');\n'
ffunction.write(line)
ffunction.write('\tint i = this->api->' + fcName + '(&myreq, nRequestID);\n')
ffunction.write('\treturn i;\n')
ffunction.write('};\n')
ffunction.write('\n')
#########################################################
apiName = 'QryApi'
fcpp = open('SecurityFtdcQueryApi.h', 'r')
ftask = open('lts_qry_task.cpp', 'w')
fprocess = open('lts_qry_process.cpp', 'w')
ffunction = open('lts_qry_function.cpp', 'w')
fdefine = open('lts_qry_define.cpp', 'w')
fswitch = open('lts_qry_switch.cpp', 'w')
fheaderprocess = open('lts_qry_header_process.h', 'w')
fheaderon = open('lts_qry_header_on.h', 'w')
fheaderfunction = open('lts_qry_header_function.h', 'w')
fwrap = open('lts_qry_wrap.cpp', 'w')
define_count = 1
for line in fcpp:
if "\tvirtual void On" in line:
processCallBack(line)
elif "\tvirtual int" in line:
processFunction(line)
fcpp.close()
ftask.close()
fprocess.close()
ffunction.close()
fswitch.close()
fdefine.close()
fheaderprocess.close()
fheaderon.close()
fheaderfunction.close()
fwrap.close()

View File

@ -1,76 +0,0 @@
# encoding: UTF-8
__author__ = 'CHENXY'
from xtp_data_type import *
type_dict = {
'uint64_t': 'int',
'uint32_t': 'int',
'int64_t': 'int',
'char': 'string',
'double': 'float'
}
typedefDict.update(type_dict)
def main():
"""主函数"""
fcpp = open('xoms_api_struct.h', 'r')
fpy = open('xtp_struct_oms.py', 'w')
fpy.write('# encoding: UTF-8\n')
fpy.write('\n')
fpy.write('structDict = {}\n')
fpy.write('\n')
for line in fcpp:
# 结构体申明注释
if '///' in line and '\t' not in line:
py_line = '#' + line[3:]
# 结构体变量注释
elif '\t///' in line:
py_line = '#' + line[4:]
# 结构体申明
elif 'struct ' in line:
content = line.split(' ')
name = content[1].replace('\n','')
py_line = '%s = {}\n' % name
# 结构体变量
elif ' ' == line[0:4] or '\t' == line[0]:
content = line.split(' ')
content = [k for k in content if k]
print content
typedef = content[0].replace('\t', '')
type_ = typedefDict[typedef]
variable = content[1]
variable = variable.replace(';', "")
variable = variable.replace('\n', "")
if '[' in variable:
k = variable.index('[')
variable = variable[0:k]
py_line = '%s["%s"] = "%s"\n' % (name, variable, type_)
# 结构体结束
elif '}' in line:
py_line = "structDict['%s'] = %s\n\n" % (name, name)
# 结构体开始
elif '{' in line:
py_line = ''
# 其他
else:
py_line = '\n'
fpy.write(py_line.decode('gbk').encode('utf-8'))
if __name__ == '__main__':
main()

View File

@ -1,76 +0,0 @@
# encoding: UTF-8
__author__ = 'CHENXY'
from xtp_data_type import *
type_dict = {
'uint64_t': 'int',
'uint32_t': 'int',
'int64_t': 'int',
'char': 'string',
'double': 'float'
}
typedefDict.update(type_dict)
def main():
"""主函数"""
fcpp = open('xquote_api_struct.h', 'r')
fpy = open('xtp_struct_quote.py', 'w')
fpy.write('# encoding: UTF-8\n')
fpy.write('\n')
fpy.write('structDict = {}\n')
fpy.write('\n')
for line in fcpp:
# 结构体申明注释
if '///' in line and '\t' not in line:
py_line = '#' + line[3:]
# 结构体变量注释
elif '\t///' in line:
py_line = '#' + line[4:]
# 结构体申明
elif 'struct ' in line:
content = line.split(' ')
name = content[1].replace('\n','')
py_line = '%s = {}\n' % name
# 结构体变量
elif ' ' == line[0:4] or '\t' == line[0]:
content = line.split(' ')
content = [k for k in content if k]
print content
typedef = content[0].replace('\t', '')
type_ = typedefDict[typedef]
variable = content[1]
variable = variable.replace(';', "")
variable = variable.replace('\n', "")
if '[' in variable:
k = variable.index('[')
variable = variable[0:k]
py_line = '%s["%s"] = "%s"\n' % (name, variable, type_)
# 结构体结束
elif '}' in line:
py_line = "structDict['%s'] = %s\n\n" % (name, name)
# 结构体开始
elif '{' in line:
py_line = ''
# 其他
else:
py_line = '\n'
fpy.write(py_line.decode('gbk').encode('utf-8'))
if __name__ == '__main__':
main()

View File

@ -1,295 +0,0 @@
# encoding: UTF-8
__author__ = 'CHENXY'
from string import join
from lts_struct import structDict
def processCallBack(line):
orignalLine = line
line = line.replace('\tvirtual void ', '') # 删除行首的无效内容
line = line.replace('{};\n', '') # 删除行尾的无效内容
content = line.split('(')
cbName = content[0] # 回调函数名称
cbArgs = content[1] # 回调函数参数
if cbArgs[-1] == ' ':
cbArgs = cbArgs.replace(') ', '')
else:
cbArgs = cbArgs.replace(')', '')
cbArgsList = cbArgs.split(', ') # 将每个参数转化为列表
cbArgsTypeList = []
cbArgsValueList = []
for arg in cbArgsList: # 开始处理参数
content = arg.split(' ')
if len(content) > 1:
cbArgsTypeList.append(content[0]) # 参数类型列表
cbArgsValueList.append(content[1]) # 参数数据列表
createTask(cbName, cbArgsTypeList, cbArgsValueList, orignalLine)
createProcess(cbName, cbArgsTypeList, cbArgsValueList)
# 生成.h文件中的process部分
process_line = 'void process' + cbName[2:] + '(Task *task);\n'
fheaderprocess.write(process_line)
fheaderprocess.write('\n')
# 生成.h文件中的on部分
if 'OnRspError' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict error, int id, bool last) {};\n'
elif 'OnRsp' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict data, dict error, int id, bool last) {};\n'
elif 'OnRtn' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict data) {};\n'
elif 'OnErrRtn' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict data, dict error) {};\n'
else:
on_line = ''
fheaderon.write(on_line)
fheaderon.write('\n')
# 生成封装部分
createWrap(cbName)
#----------------------------------------------------------------------
def createWrap(cbName):
"""在Python封装段代码中进行处理"""
# 生成.h文件中的on部分
if 'OnRspError' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict error, int id, bool last)\n'
override_line = '("on' + cbName[2:] + '")(error, id, last);\n'
elif 'OnRsp' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict data, dict error, int id, bool last)\n'
override_line = '("on' + cbName[2:] + '")(data, error, id, last);\n'
elif 'OnRtn' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict data)\n'
override_line = '("on' + cbName[2:] + '")(data);\n'
elif 'OnErrRtn' in cbName:
on_line = 'virtual void on' + cbName[2:] + '(dict data, dict error)\n'
override_line = '("on' + cbName[2:] + '")(data, error);\n'
else:
on_line = ''
if on_line is not '':
fwrap.write(on_line)
fwrap.write('{\n')
fwrap.write('\ttry\n')
fwrap.write('\t{\n')
fwrap.write('\t\tthis->get_override'+override_line)
fwrap.write('\t}\n')
fwrap.write('\tcatch (error_already_set const &)\n')
fwrap.write('\t{\n')
fwrap.write('\t\tPyErr_Print();\n')
fwrap.write('\t}\n')
fwrap.write('};\n')
fwrap.write('\n')
def createTask(cbName, cbArgsTypeList, cbArgsValueList, orignalLine):
# 从回调函数生成任务对象,并放入队列
funcline = orignalLine.replace('\tvirtual void ', 'void ' + apiName + '::')
funcline = funcline.replace('{};', '')
ftask.write(funcline)
ftask.write('{\n')
ftask.write("\tTask* task = new Task();\n")
ftask.write("\ttask->task_name = " + cbName.upper() + ";\n")
# define常量
global define_count
fdefine.write("#define " + cbName.upper() + ' ' + str(define_count) + '\n')
define_count = define_count + 1
# switch段代码
fswitch.write("case " + cbName.upper() + ':\n')
fswitch.write("{\n")
fswitch.write("\tthis->" + cbName.replace('On', 'process') + '(task);\n')
fswitch.write("\tbreak;\n")
fswitch.write("}\n")
fswitch.write("\n")
for i, type_ in enumerate(cbArgsTypeList):
if type_ == 'int':
ftask.write("\ttask->task_id = " + cbArgsValueList[i] + ";\n")
elif type_ == 'bool':
ftask.write("\ttask->task_last = " + cbArgsValueList[i] + ";\n")
elif 'RspInfoField' in type_:
ftask.write("\n")
ftask.write("\tif (pRspInfo)\n")
ftask.write("\t{\n")
ftask.write("\t\t" + type_ + ' *task_error = new ' + type_ + '();\n')
ftask.write("\t\t" + '*task_error = ' + cbArgsValueList[i] + ';\n')
ftask.write("\t\ttask->task_error = task_error;\n")
ftask.write("\t}\n")
ftask.write("\n")
else:
ftask.write("\n")
ftask.write("\tif (" + cbArgsValueList[i][1:] + ")\n")
ftask.write("\t{\n")
ftask.write("\t\t" + type_ + ' *task_data = new ' + type_ + '();\n')
ftask.write("\t\t" + '*task_data = ' + cbArgsValueList[i] + ';\n')
ftask.write("\t\ttask->task_data = task_data;\n")
ftask.write("\t}\n")
ftask.write("\tthis->task_queue.push(task);\n")
ftask.write("};\n")
ftask.write("\n")
def createProcess(cbName, cbArgsTypeList, cbArgsValueList):
# 从队列中提取任务并转化为python字典
fprocess.write("void " + apiName + '::' + cbName.replace('On', 'process') + '(Task *task)' + "\n")
fprocess.write("{\n")
fprocess.write("\tPyLock lock;\n")
onArgsList = []
for i, type_ in enumerate(cbArgsTypeList):
if 'RspInfoField' in type_:
fprocess.write("\t"+ "dict error;\n")
fprocess.write("\tif (task->task_error)\n")
fprocess.write("\t{\n")
fprocess.write("\t\t"+ type_ + ' *task_error = (' + type_ + '*) task->task_error;\n')
struct = structDict[type_]
for key in struct.keys():
fprocess.write("\t\t"+ 'error["' + key + '"] = task_error->' + key + ';\n')
fprocess.write("\t\tdelete task->task_error;\n")
fprocess.write("\t}\n")
fprocess.write("\n")
onArgsList.append('error')
elif type_ in structDict:
fprocess.write("\t"+ "dict data;\n")
fprocess.write("\tif (task->task_data)\n")
fprocess.write("\t{\n")
fprocess.write("\t\t"+ type_ + ' *task_data = (' + type_ + '*) task->task_data;\n')
struct = structDict[type_]
for key in struct.keys():
fprocess.write("\t\t"+ 'data["' + key + '"] = task_data->' + key + ';\n')
fprocess.write("\t\tdelete task->task_data;\n")
fprocess.write("\t}\n")
fprocess.write("\n")
onArgsList.append('data')
elif type_ == 'bool':
onArgsList.append('task->task_last')
elif type_ == 'int':
onArgsList.append('task->task_id')
onArgs = join(onArgsList, ', ')
fprocess.write('\tthis->' + cbName.replace('On', 'on') + '(' + onArgs +');\n')
fprocess.write('\tdelete task;\n')
fprocess.write("};\n")
fprocess.write("\n")
def processFunction(line):
line = line.replace('\tvirtual int ', '') # 删除行首的无效内容
line = line.replace(') = 0;\n', '') # 删除行尾的无效内容
content = line.split('(')
fcName = content[0] # 回调函数名称
fcArgs = content[1] # 回调函数参数
fcArgs = fcArgs.replace(')', '')
fcArgsList = fcArgs.split(', ') # 将每个参数转化为列表
fcArgsTypeList = []
fcArgsValueList = []
for arg in fcArgsList: # 开始处理参数
content = arg.split(' ')
if len(content) > 1:
fcArgsTypeList.append(content[0]) # 参数类型列表
fcArgsValueList.append(content[1]) # 参数数据列表
if len(fcArgsTypeList)>0 and fcArgsTypeList[0] in structDict:
createFunction(fcName, fcArgsTypeList, fcArgsValueList)
# 生成.h文件中的主动函数部分
if 'Req' in fcName:
req_line = 'int req' + fcName[3:] + '(dict req, int nRequestID);\n'
fheaderfunction.write(req_line)
fheaderfunction.write('\n')
def createFunction(fcName, fcArgsTypeList, fcArgsValueList):
type_ = fcArgsTypeList[0]
struct = structDict[type_]
ffunction.write('int TdApi::req' + fcName[3:] + '(dict req, int nRequestID)\n')
ffunction.write('{\n')
ffunction.write('\t' + type_ +' myreq = ' + type_ + '();\n')
ffunction.write('\tmemset(&myreq, 0, sizeof(myreq));\n')
for key, value in struct.items():
if value == 'string':
line = '\tgetString(req, "' + key + '", myreq.' + key + ');\n'
elif value == 'char':
line = '\tgetChar(req, "' + key + '", &myreq.' + key + ');\n'
elif value == 'int':
line = '\tgetInt(req, "' + key + '", &myreq.' + key + ');\n'
elif value == 'double':
line = '\tgetDouble(req, "' + key + '", &myreq.' + key + ');\n'
ffunction.write(line)
ffunction.write('\tint i = this->api->' + fcName + '(&myreq, nRequestID);\n')
ffunction.write('\treturn i;\n')
ffunction.write('};\n')
ffunction.write('\n')
#########################################################
apiName = 'TdApi'
fcpp = open('SecurityFtdcTraderApi.h', 'r')
ftask = open('lts_td_task.cpp', 'w')
fprocess = open('lts_td_process.cpp', 'w')
ffunction = open('lts_td_function.cpp', 'w')
fdefine = open('lts_td_define.cpp', 'w')
fswitch = open('lts_td_switch.cpp', 'w')
fheaderprocess = open('lts_td_header_process.h', 'w')
fheaderon = open('lts_td_header_on.h', 'w')
fheaderfunction = open('lts_td_header_function.h', 'w')
fwrap = open('lts_td_wrap.cpp', 'w')
define_count = 1
for line in fcpp:
if "\tvirtual void On" in line:
processCallBack(line)
elif "\tvirtual int" in line:
processFunction(line)
fcpp.close()
ftask.close()
fprocess.close()
ffunction.close()
fswitch.close()
fdefine.close()
fheaderprocess.close()
fheaderon.close()
fheaderfunction.close()
fwrap.close()

File diff suppressed because it is too large Load Diff

View File

@ -1,161 +0,0 @@
/////////////////////////////////////////////////////////////////////////
///@author 中泰证券股份有限公司
///@file xtp_quote_api_compatible.h
///@brief 定义行情订阅客户端兼容接口
/////////////////////////////////////////////////////////////////////////
#ifndef _XTP_QUOTE_API_COMPATIBLE_H_
#define _XTP_QUOTE_API_COMPATIBLE_H_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "xtp_api_struct.h"
#include "xtp_api_struct_compatible.h"
#if defined(ISLIB) && defined(WIN32)
#ifdef LIB_MD_API_EXPORT
#define MD_API_EXPORT __declspec(dllexport)
#else
#define MD_API_EXPORT __declspec(dllimport)
#endif
#else
#define MD_API_EXPORT
#endif
/*!
* \class XTP::API::QuoteCompatibleSpi
*
* \brief
*
* \author
* \date 2015
*/
namespace XTP {
namespace API {
class QuoteCompatibleSpi
{
public:
///当客户端与交易后台通信连接断开时该方法被调用。当发生这个情况后API会自动重新连接客户端可不做处理。
///@param nReason 错误原因
/// 0x1001 网络读失败
/// 0x1002 网络写失败
/// 0x2001 接收心跳超时
/// 0x2002 发送心跳失败
/// 0x2003 收到错误报文
virtual void OnFrontDisconnected(int nReason) {};
///错误应答
///@param pRspInfo 错误信息
///@param nRequestID 请求的ID
///@param bIsLast 是否最后一个
virtual void OnRspError(CXTPRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///登出请求响应
///@param pUserLogout 用户登出的参数
///@param pRspInfo 错误信息
///@param nRequestID 请求的ID
///@param bIsLast 是否最后一个
virtual void OnRspUserLogout(CXTPUserLogoutField *pUserLogout, CXTPRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///订阅行情应答
///@param pSpecificInstrument 详细的合约订阅情况
///@param pRspInfo 错误信息
///@param nRequestID 请求的ID
///@param bIsLast 是否最后一个
virtual void OnRspSubMarketData(CXTPSpecificInstrumentField *pSpecificInstrument, CXTPRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///取消订阅行情应答
///@param pSpecificInstrument 详细的合约取消订阅情况
///@param pRspInfo 错误信息
///@param nRequestID 请求的ID
///@param bIsLast 是否最后一个
virtual void OnRspUnSubMarketData(CXTPSpecificInstrumentField *pSpecificInstrument, CXTPRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///深度行情通知
///@param pDepthMarketData 行情数据
virtual void OnRtnDepthMarketData(CXTPDepthMarketDataField *pDepthMarketData) {};
};
}
}
/*!
* \class XTP::API::QuoteCompatibleApi
*
* \brief
*
* \author
* \date 2015
*/
namespace XTP {
namespace API {
class MD_API_EXPORT QuoteCompatibleApi
{
public:
///创建QuoteApi
///@param pszFlowPath 存贮订阅信息文件的目录,默认为当前目录
///@return 创建出的UserApi
///modify for udp marketdata
static QuoteCompatibleApi *CreateQuoteApi(const char *pszFlowPath = "");
///删除接口对象本身
///@remark 不再使用本接口对象时,调用该函数删除接口对象
virtual void Release() = 0;
///等待接口线程结束运行
///@return 线程退出代码
virtual int Join() = 0;
///获取当前交易日
///@return 获取到的交易日
///@remark 只有登录成功后,才能得到正确的交易日
virtual const char *GetTradingDay() = 0;
///注册前置机网络地址
///@param pszFrontAddress 前置机网络地址。
///@remark 网络地址的格式为“protocol://ipaddress:port””tcp://127.0.0.1:17001”。
///@remark “tcp”代表传输协议“127.0.0.1”代表服务器地址。”17001”代表服务器端口号。
virtual void RegisterFront(char *pszFrontAddress) = 0;
///注册回调接口
///@param pSpi 派生自回调接口类的实例
virtual void RegisterSpi(QuoteCompatibleSpi *pSpi) = 0;
///订阅行情。
///@param ppInstrumentID 合约ID
///@param nCount 要订阅/退订行情的合约个数
///@param pExchageID 交易所代码
///@remark 可以一次性订阅同一证券交易所的多个合约
virtual int SubscribeMarketData(char *ppInstrumentID[], int nCount, XTP_EXCHANGE_TYPE pExchageID) = 0;
///退订行情。
///@param ppInstrumentID 合约ID
///@param nCount 要订阅/退订行情的合约个数
///@param pExchageID 交易所代码
///@remark 可以一次性取消订阅同一证券交易所的多个合约
virtual int UnSubscribeMarketData(char *ppInstrumentID[], int nCount, XTP_EXCHANGE_TYPE pExchageID) = 0;
///用户登录请求
///@return 登录是否成功“0”表示登录成功非“0”表示登录出错
///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作
virtual int ReqUserLogin(CXTPReqUserLoginField *pReqUserLoginField, int nRequestID) = 0;
///登出请求
///@return 登出是否成功“0”表示登出成功非“0”表示登出出错
virtual int ReqUserLogout(CXTPUserLogoutField *pUserLogout, int nRequestID) = 0;
protected:
~QuoteCompatibleApi() {};
};
}
}
#endif

View File

@ -1,258 +0,0 @@
/*!
* \file xoms_api_struct.h
* \date 2015/10/23 16:45
*
* \author howellxu
* Contact: user@company.com
*
* \brief
*
* TODO: long description
*
* \note
*/
#ifndef _XOMS_API_STRUCT_H_
#define _XOMS_API_STRUCT_H_
#include "xtp_api_data_type.h"
#define XTP_API_TICKER_LEN 13
#define XTP_API_TICKER_NAME_LEN 48
#define XTP_LOCAL_ORDER_LEN 11
#define XTP_ORDER_EXCH_LEN 17
#define XTP_ORDER_RES_LEN 4
#define XTP_SUBPBUID_LEN 7
#define XTP_BRANCH_PBU_LEN 7
#define XTP_SYS_INSTRUMENT_LEN 24
//=====================客户端接口定义=================================
///新订单请求
struct XTPOrderInsertInfo
{
///XTP系统订单ID
uint64_t order_xtp_id;
///报单引用,由客户自定义
uint32_t order_client_id;
///合约代码 客户端请求不带空格
char ticker[XTP_API_TICKER_LEN];
///交易市场
XTP_MARKET_TYPE market;
///价格
double price;
///止损价(保留字段)
double stop_price;
///数量
int64_t quantity;
///报单价格
XTP_PRICE_TYPE price_type;
///买卖方向
XTP_SIDE_TYPE side;
};
///撤单
struct XTPOrderCancel
{
///XTP系统订单ID
uint64_t order_cancel_xtp_id;
///报单操作引用
uint32_t order_cancel_client_id;
///合约代码
char ticker[XTP_API_TICKER_LEN];
///交易市场
XTP_MARKET_TYPE market;
///操作时间
int64_t action_time;
///报单引用
uint32_t order_client_id;
///操作对象订单的序号
uint64_t order_xtp_id;
};
///撤单失败响应消息
struct XTPOrderCancelInfo
{
///撤单XTPID
uint64_t order_cancel_xtp_id;
///原始订单XTPID
uint64_t order_xtp_id;
};
///报单响应结构体
struct XTPOrderInfo
{
///XTP系统订单ID
uint64_t order_xtp_id;
///报单引用,用户自定义
uint32_t order_client_id;
///报单操作引用,用户自定义
uint32_t order_cancel_client_id;
///撤单在XTP系统中的id
uint64_t order_cancel_xtp_id;
///合约代码
char ticker[XTP_API_TICKER_LEN];
///交易市场
XTP_MARKET_TYPE market;
///价格
double price;
///数量
int64_t quantity;
///报单价格条件
XTP_PRICE_TYPE price_type;
///买卖方向
XTP_SIDE_TYPE side;
///今成交数量
int64_t qty_traded;
///剩余数量
int64_t qty_left;
///委托时间
int64_t insert_time;
///最后修改时间
int64_t update_time;
///撤销时间
int64_t cancel_time;
///成交金额
double trade_amount;
///本地报单编号 OMS生成的单号
char order_local_id[XTP_LOCAL_ORDER_LEN];
///报单状态
XTP_ORDER_STATUS_TYPE order_status;
///报单提交状态
XTP_ORDER_SUBMIT_STATUS_TYPE order_submit_status;
///报单类型
TXTPOrderTypeType order_type;
};
///报单成交结构体
struct XTPTradeReport
{
///XTP系统订单ID
uint64_t order_xtp_id;
///报单引用
uint32_t order_client_id;
///合约代码
char ticker[XTP_API_TICKER_LEN];
///交易市场
XTP_MARKET_TYPE market;
///订单号
uint64_t local_order_id;
///成交编号
uint64_t exec_id;
///价格
double price;
///数量
int64_t quantity;
///成交时间
int64_t trade_time;
///成交金额
double trade_amount;
///成交序号 --回报记录号
uint64_t report_index;
///报单编号 --交易所单号
char order_exch_id[XTP_ORDER_EXCH_LEN];
///成交类型 --成交回报中的执行类型
TXTPTradeTypeType trade_type;
///买卖方向
XTP_SIDE_TYPE side;
///交易所交易员代码
char branch_pbu[XTP_BRANCH_PBU_LEN];
};
//////////////////////////////////////////////////////////////////////////
///报单查询
//////////////////////////////////////////////////////////////////////////
///报单查询请求-条件查询
struct XTPQueryOrderReq
{
///证券代码,可以为空,如果为空,则默认查询时间段内的所有成交回报
char ticker[XTP_API_TICKER_LEN];
///格式为YYYYMMDDHHMMSSsss为0则默认当前交易日0点
int64_t begin_time;
///格式为YYYYMMDDHHMMSSsss为0则默认当前时间
int64_t end_time;
};
///报单查询响应结构体
typedef XTPOrderInfo XTPQueryOrderRsp;
//////////////////////////////////////////////////////////////////////////
///成交回报查询
//////////////////////////////////////////////////////////////////////////
///查询成交报告请求-根据执行编号查询(保留字段)
struct XTPQueryReportByExecIdReq
{
///XTP订单系统ID
uint64_t order_xtp_id;
///成交执行编号
uint64_t exec_id;
};
///查询成交回报请求-查询条件
struct XTPQueryTraderReq
{
///证券代码,可以为空,如果为空,则默认查询时间段内的所有成交回报
char ticker[XTP_API_TICKER_LEN];
///开始时间格式为YYYYMMDDHHMMSSsss为0则默认当前交易日0点
int64_t begin_time;
///结束时间格式为YYYYMMDDHHMMSSsss为0则默认当前时间
int64_t end_time;
};
///成交回报查询响应结构体
typedef XTPTradeReport XTPQueryTradeRsp;
//////////////////////////////////////////////////////////////////////////
///账户资金查询响应结构体
//////////////////////////////////////////////////////////////////////////
struct XTPQueryAssetRsp
{
///总资产
double total_asset;
///可用资金
double buying_power;
///证券资产
double security_asset;
///累计买入成交证券占用资金(保留字段)
double fund_buy_amount;
///累计买入成交交易费用(保留字段)
double fund_buy_fee;
///累计卖出成交证券所得资金(保留字段)
double fund_sell_amount;
///累计卖出成交交易费用(保留字段)
double fund_sell_fee;
};
//////////////////////////////////////////////////////////////////////////
///查询股票持仓情况
//////////////////////////////////////////////////////////////////////////
struct XTPQueryStkPositionRsp
{
///证券代码
char ticker[XTP_API_TICKER_LEN];
///证券名称
char ticker_name[XTP_API_TICKER_NAME_LEN];
///当前持仓
int64_t total_qty;
///可用股份数
int64_t sellable_qty;
///持仓成本
double avg_price;
///浮动盈亏
double unrealized_pnl;
};
#endif //_XOMS_API_STRUCT_H_

View File

@ -1,160 +0,0 @@
/////////////////////////////////////////////////////////////////////////
///@author 中泰证券股份有限公司
///@file xquote_api_struct.h
///@brief 定义行情类相关数据结构
/////////////////////////////////////////////////////////////////////////
#ifndef _XQUOTE_API_STRUCT_H_
#define _XQUOTE_API_STRUCT_H_
#include <stdint.h>
#include "xtp_api_data_type.h"
///指定的合约
typedef struct XTPSpecificTickerStruct
{
///交易所代码
XTP_EXCHANGE_TYPE exchange_id;
///合约代码(不包含交易所信息)例如"600000 "
char ticker[XTP_TICKER_LEN];
} XTPST;
///行情
typedef struct XTPMarketDataStruct
{
// 代码
///交易所代码
XTP_EXCHANGE_TYPE exchange_id;
///合约代码(不包含交易所信息)
char ticker[XTP_TICKER_LEN];
// 股票等价格
///最新价
double last_price;
///昨收盘
double pre_close_price;
///今开盘
double open_price;
///最高价
double high_price;
///最低价
double low_price;
///今收盘
double close_price;
// 期货等数据
///昨持仓量(目前未填写)
double pre_open_interest;
///持仓量(目前未填写)
double open_interest;
///上次结算价(目前未填写)
double pre_settlement_price;
///本次结算价(目前未填写)
double settlement_price;
///涨停板价(目前未填写)
double upper_limit_price;
///跌停板价(目前未填写)
double lower_limit_price;
///昨虚实度(目前未填写)
double pre_delta;
///今虚实度(目前未填写)
double curr_delta;
/// 时间类
int64_t data_time;
// 量额数据
///数量
int32_t qty;
///成交金额
double turnover;
///当日均价
double avg_price;
// 买卖盘
///十档申买价
double bid[10];
///十档申卖价
double ask[10];
///十档申买量
int32_t bid_qty[10];
///十档申卖量
int32_t ask_qty[10];
// lts没有包含的数据目前未填写
///成交笔数
int32_t trades_count;
///当前交易状态说明
char ticker_status[8];
///委托买入总量
int32_t total_bid_qty;
///委托卖出总量
int32_t total_ask_qty;
///加权平均委买价格
double ma_bid_price;
///加权平均委卖价格
double ma_ask_price;
///债券加权平均委买价格
double ma_bond_bid_price;
///债券加权平均委卖价格
double ma_bond_ask_price;
///债券到期收益率
double yield_to_maturity;
///ETF净值估值
double iopv;
///ETF申购笔数
int32_t etf_buy_count;
///ETF赎回笔数
int32_t etf_sell_count;
///ETF申购数量
double etf_buy_qty;
///ETF申购金额
double etf_buy_money;
///ETF赎回数量
double etf_sell_qty;
///ETF赎回金额
double etf_sell_money;
///权证执行的总数量
double total_warrant_exec_qty;
///权证跌停价格(元)
double warrant_lower_price;
///权证涨停价格(元)
double warrant_upper_price;
///买入撤单笔数
int32_t cancel_buy_count;
///卖出撤单笔数
int32_t cancel_sell_count;
///买入撤单数量
double cancel_buy_qty;
///卖出撤单数量
double cancel_sell_qty;
///买入撤单金额
double cancel_buy_money;
///卖出撤单金额
double cancel_sell_money;
///买入总笔数
int32_t total_buy_count;
///卖出总笔数
int32_t total_sell_count;
///买入委托成交最大等待时间
int32_t duration_after_buy;
///卖出委托成交最大等待时间
int32_t duration_after_sell;
///买方委托价位数
int32_t num_bid_orders;
///卖方委托价位数
int32_t num_ask_orders;
///成交时间UA3113
int32_t exec_time;
///闭市标志UA103/UA104
char is_market_closed[4];
///合约持仓量UA103
double total_position;
///市盈率1UA103
double pe_ratio1;
///市盈率2UA103
double pe_ratio2;
} XTPMD;
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,15 +0,0 @@
/////////////////////////////////////////////////////////////////////////
///@author 中泰证券股份有限公司
///@file xtp_api_struct.h
///@brief 定义业务数据结构
/////////////////////////////////////////////////////////////////////////
#ifndef _XTP_API_STRUCT_H_
#define _XTP_API_STRUCT_H_
#include "xtp_api_struct_common.h"
#include "xquote_api_struct.h"
#include "xoms_api_struct.h"
#endif // !_XTP_API_STRUCT_H_

View File

@ -1,23 +0,0 @@
/////////////////////////////////////////////////////////////////////////
///@author 中泰证券股份有限公司
///@file xtp_api_struct_common.h
///@brief 定义业务公共数据结构
/////////////////////////////////////////////////////////////////////////
#ifndef _XTP_API_STRUCT_COMMON_H_
#define _XTP_API_STRUCT_COMMON_H_
#include <stdint.h>
#include "xtp_api_data_type.h"
///响应信息
#define XTP_ERR_MSG_LEN 76
typedef struct XTPRspInfoStruct
{
///错误代码
int32_t error_id;
///错误信息
char error_msg[XTP_ERR_MSG_LEN];
} XTPRI;
#endif // !_XTP_API_STRUCT_COMMON_H_

File diff suppressed because it is too large Load Diff

View File

@ -1,158 +0,0 @@
/////////////////////////////////////////////////////////////////////////
///@author 中泰证券股份有限公司
///@file xtp_quote_api.h
///@brief 定义行情订阅客户端接口
/////////////////////////////////////////////////////////////////////////
#ifndef _XTP_QUOTE_API_H_
#define _XTP_QUOTE_API_H_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "xtp_api_struct.h"
#if defined(ISLIB) && defined(WIN32)
#ifdef LIB_MD_API_EXPORT
#define MD_API_EXPORT __declspec(dllexport)
#else
#define MD_API_EXPORT __declspec(dllimport)
#endif
#else
#define MD_API_EXPORT
#endif
/*!
* \class XTP::API::QuoteSpi
*
* \brief
*
* \author
* \date 2015
*/
namespace XTP {
namespace API {
class QuoteSpi
{
public:
///当客户端与交易后台通信连接断开时,该方法被调用。
///@remark 保留函数,暂未支持
///@param reason 错误原因
virtual void OnDisconnected(int reason) {};
///错误应答
///@param error_info 错误信息
virtual void OnError(XTPRI *error_info) {};
///订阅行情应答
///@param ticker 详细的合约订阅情况
///@param error_info 订阅合约发生错误时的错误信息
///@param is_last 是否此次订阅的最后一个应答
///@remark 每条订阅的合约均对应一条订阅应答
virtual void OnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last) {};
///取消订阅行情应答
///@param ticker 详细的合约取消订阅情况
///@param error_info 错误信息
///@param is_last 是否此次取消订阅的最后一个应答
///@remark 每条取消订阅的合约均对应一条取消订阅应答
virtual void OnUnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last) {};
///行情通知
///@param market_data 行情数据
virtual void OnMarketData(XTPMD *market_data) {};
///查询可交易合约应答
///@remark 保留函数,此函数暂未支持
virtual void OnQueryAllTickers() {};
};
}
}
/*!
* \class XTP::API::QuoteApi
*
* \brief
*
* \author
* \date 2015
*/
namespace XTP {
namespace API {
class MD_API_EXPORT QuoteApi
{
public:
///创建QuoteApi
///@param save_file_path (保留字段)存贮订阅信息文件的目录,默认为当前目录
///@return 创建出的UserApi
static QuoteApi *CreateQuoteApi(const char *save_file_path = "");
///删除接口对象本身
///@remark 不再使用本接口对象时,调用该函数删除接口对象
virtual void Release() = 0;
///获取当前交易日
///@return 获取到的交易日
///@remark 只有登录成功后,才能得到正确的交易日
virtual const char *GetTradingDay() = 0;
///注册回调接口
///@param spi 派生自回调接口类的实例
virtual void RegisterSpi(QuoteSpi *spi) = 0;
///订阅行情。
///@return 订阅接口调用是否成功“0”表示接口调用成功非“0”表示接口调用出错
///@param ticker 合约ID数组
///@param count 要订阅/退订行情的合约个数
///@param exchage_id 交易所代码
///@remark 可以一次性订阅同一证券交易所的多个合约
virtual int SubscribeMarketData(char *ticker[], int count, XTP_EXCHANGE_TYPE exchage_id) = 0;
///退订行情。
///@return 取消订阅接口调用是否成功“0”表示接口调用成功非“0”表示接口调用出错
///@param ticker 合约ID数组
///@param count 要订阅/退订行情的合约个数
///@param exchage_id 交易所代码
///@remark 可以一次性取消订阅同一证券交易所的多个合约
virtual int UnSubscribeMarketData(char *ticker[], int count, XTP_EXCHANGE_TYPE exchage_id) = 0;
///用户登录请求
///@return 登录是否成功“0”表示登录成功“-1”表示连接服务器出错“-2”表示已存在连接不允许重复登录如果需要重连请先logout“-3”表示输入有错误
///@param ip 服务器地址
///@param port 服务器端口号
///@param user 登陆用户名
///@param password 登陆密码
///@param sock_type “1”代表TCP“2”代表UDP目前暂时只支持TCP
///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作
virtual int Login(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type) = 0;
///登出请求
///@return 登出是否成功“0”表示登出成功非“0”表示登出出错
///@remark 此函数为同步阻塞式,不需要异步等待登出,当函数返回即可进行后续操作
virtual int Logout() = 0;
///获取当前交易日可交易合约
///@return 查询是否成功“0”表示查询成功非“0”表示查询不成功
///@param exchage_id 交易所代码
///@remark 此函数暂未支持
virtual int QueryAllTickers(XTP_EXCHANGE_TYPE exchage_id) = 0;
protected:
~QuoteApi() {};
};
}
}
#endif

View File

@ -1,262 +0,0 @@
# encoding: UTF-8
structDict = {}
#新订单请求
XTPOrderInsertInfo = {}
# ///XTP系统订单ID
XTPOrderInsertInfo["order_xtp_id"] = "int"
# ///报单引用,由客户自定义
XTPOrderInsertInfo["order_client_id"] = "int"
# ///合约代码 客户端请求不带空格
XTPOrderInsertInfo["ticker"] = "string"
# ///交易市场
XTPOrderInsertInfo["market"] = "int"
# ///价格
XTPOrderInsertInfo["price"] = "float"
# ///止损价(保留字段)
XTPOrderInsertInfo["stop_price"] = "float"
# ///数量
XTPOrderInsertInfo["quantity"] = "int"
# ///报单价格
XTPOrderInsertInfo["price_type"] = "int"
# ///买卖方向
XTPOrderInsertInfo["side"] = "int"
structDict['XTPOrderInsertInfo'] = XTPOrderInsertInfo
#撤单
XTPOrderCancel = {}
# ///XTP系统订单ID
XTPOrderCancel["order_cancel_xtp_id"] = "int"
# ///报单操作引用
XTPOrderCancel["order_cancel_client_id"] = "int"
# ///合约代码
XTPOrderCancel["ticker"] = "string"
# ///交易市场
XTPOrderCancel["market"] = "int"
# ///操作时间
XTPOrderCancel["action_time"] = "int"
# ///报单引用
XTPOrderCancel["order_client_id"] = "int"
# ///操作对象订单的序号
XTPOrderCancel["order_xtp_id"] = "int"
structDict['XTPOrderCancel'] = XTPOrderCancel
#撤单失败响应消息
XTPOrderCancelInfo = {}
# ///撤单XTPID
XTPOrderCancelInfo["order_cancel_xtp_id"] = "int"
# ///原始订单XTPID
XTPOrderCancelInfo["order_xtp_id"] = "int"
structDict['XTPOrderCancelInfo'] = XTPOrderCancelInfo
#报单响应结构体
XTPOrderInfo = {}
# ///XTP系统订单ID
XTPOrderInfo["order_xtp_id"] = "int"
#报单引用,用户自定义
XTPOrderInfo["order_client_id"] = "int"
# ///报单操作引用,用户自定义
XTPOrderInfo["order_cancel_client_id"] = "int"
# ///撤单在XTP系统中的id
XTPOrderInfo["order_cancel_xtp_id"] = "int"
#合约代码
XTPOrderInfo["ticker"] = "string"
#交易市场
XTPOrderInfo["market"] = "int"
#价格
XTPOrderInfo["price"] = "float"
#数量
XTPOrderInfo["quantity"] = "int"
#报单价格条件
XTPOrderInfo["price_type"] = "int"
#买卖方向
XTPOrderInfo["side"] = "int"
#今成交数量
XTPOrderInfo["qty_traded"] = "int"
#剩余数量
XTPOrderInfo["qty_left"] = "int"
#委托时间
XTPOrderInfo["insert_time"] = "int"
#最后修改时间
XTPOrderInfo["update_time"] = "int"
#撤销时间
XTPOrderInfo["cancel_time"] = "int"
#成交金额
XTPOrderInfo["trade_amount"] = "float"
#本地报单编号 OMS生成的单号
XTPOrderInfo["order_local_id"] = "string"
#报单状态
XTPOrderInfo["order_status"] = "int"
#报单提交状态
XTPOrderInfo["order_submit_status"] = "int"
#报单类型
XTPOrderInfo["order_type"] = "char"
structDict['XTPOrderInfo'] = XTPOrderInfo
#报单成交结构体
XTPTradeReport = {}
# ///XTP系统订单ID
XTPTradeReport["order_xtp_id"] = "int"
# ///报单引用
XTPTradeReport["order_client_id"] = "int"
# ///合约代码
XTPTradeReport["ticker"] = "string"
# ///交易市场
XTPTradeReport["market"] = "int"
# ///订单号
XTPTradeReport["local_order_id"] = "int"
# ///成交编号
XTPTradeReport["exec_id"] = "int"
# ///价格
XTPTradeReport["price"] = "float"
# ///数量
XTPTradeReport["quantity"] = "int"
# ///成交时间
XTPTradeReport["trade_time"] = "int"
# ///成交金额
XTPTradeReport["trade_amount"] = "float"
# ///成交序号 --回报记录号
XTPTradeReport["report_index"] = "int"
# ///报单编号 --交易所单号
XTPTradeReport["order_exch_id"] = "string"
# ///成交类型 --成交回报中的执行类型
XTPTradeReport["trade_type"] = "char"
# ///买卖方向
XTPTradeReport["side"] = "int"
# ///交易所交易员代码
XTPTradeReport["branch_pbu"] = "string"
structDict['XTPTradeReport'] = XTPTradeReport
#///////////////////////////////////////////////////////////////////////
#报单查询
#///////////////////////////////////////////////////////////////////////
#报单查询请求-条件查询
XTPQueryOrderReq = {}
# ///证券代码,可以为空,如果为空,则默认查询时间段内的所有成交回报
XTPQueryOrderReq["ticker"] = "string"
# ///格式为YYYYMMDDHHMMSSsss为0则默认当前交易日0点
XTPQueryOrderReq["begin_time"] = "int"
# ///格式为YYYYMMDDHHMMSSsss为0则默认当前时间
XTPQueryOrderReq["end_time"] = "int"
structDict['XTPQueryOrderReq'] = XTPQueryOrderReq
#报单查询响应结构体
#///////////////////////////////////////////////////////////////////////
#成交回报查询
#///////////////////////////////////////////////////////////////////////
#查询成交报告请求-根据执行编号查询(保留字段)
XTPQueryReportByExecIdReq = {}
# ///XTP订单系统ID
XTPQueryReportByExecIdReq["order_xtp_id"] = "int"
# ///成交执行编号
XTPQueryReportByExecIdReq["exec_id"] = "int"
structDict['XTPQueryReportByExecIdReq'] = XTPQueryReportByExecIdReq
#查询成交回报请求-查询条件
XTPQueryTraderReq = {}
# ///证券代码,可以为空,如果为空,则默认查询时间段内的所有成交回报
XTPQueryTraderReq["ticker"] = "string"
# ///开始时间格式为YYYYMMDDHHMMSSsss为0则默认当前交易日0点
XTPQueryTraderReq["begin_time"] = "int"
# ///结束时间格式为YYYYMMDDHHMMSSsss为0则默认当前时间
XTPQueryTraderReq["end_time"] = "int"
structDict['XTPQueryTraderReq'] = XTPQueryTraderReq
#成交回报查询响应结构体
#///////////////////////////////////////////////////////////////////////
#账户资金查询响应结构体
#///////////////////////////////////////////////////////////////////////
XTPQueryAssetRsp = {}
#总资产
XTPQueryAssetRsp["total_asset"] = "float"
# ///可用资金
XTPQueryAssetRsp["buying_power"] = "float"
#证券资产
XTPQueryAssetRsp["security_asset"] = "float"
# ///累计买入成交证券占用资金(保留字段)
XTPQueryAssetRsp["fund_buy_amount"] = "float"
# ///累计买入成交交易费用(保留字段)
XTPQueryAssetRsp["fund_buy_fee"] = "float"
# ///累计卖出成交证券所得资金(保留字段)
XTPQueryAssetRsp["fund_sell_amount"] = "float"
# ///累计卖出成交交易费用(保留字段)
XTPQueryAssetRsp["fund_sell_fee"] = "float"
structDict['XTPQueryAssetRsp'] = XTPQueryAssetRsp
#///////////////////////////////////////////////////////////////////////
#查询股票持仓情况
#///////////////////////////////////////////////////////////////////////
XTPQueryStkPositionRsp = {}
# ///证券代码
XTPQueryStkPositionRsp["ticker"] = "string"
# ///证券名称
XTPQueryStkPositionRsp["ticker_name"] = "string"
# ///当前持仓
XTPQueryStkPositionRsp["total_qty"] = "int"
# ///可用股份数
XTPQueryStkPositionRsp["sellable_qty"] = "int"
# ///持仓成本
XTPQueryStkPositionRsp["avg_price"] = "float"
# ///浮动盈亏
XTPQueryStkPositionRsp["unrealized_pnl"] = "float"
structDict['XTPQueryStkPositionRsp'] = XTPQueryStkPositionRsp

View File

@ -1,20 +0,0 @@
# encoding: UTF-8
structDict = {}
#//////////////////////////////////////////////////////////////////////
#@author 中泰证券股份有限公司
#@file xquote_api_struct.h
#@brief 定义行情类相关数据结构
#//////////////////////////////////////////////////////////////////////
#指定的合约
struct = {}
# ///交易所代码
struct["exchange_id"] = "int"
# ///合约代码(不包含交易所信息)例如"600000 "

View File

@ -1,206 +0,0 @@
/////////////////////////////////////////////////////////////////////////
///@author 中泰证券股份有限公司
///@file xtp_trader_api.h
///@brief 定义客户端交易接口
/////////////////////////////////////////////////////////////////////////
#ifndef _XTP_TRADER_API_H_
#define _XTP_TRADER_API_H_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "xtp_api_struct.h"
#if defined(ISLIB) && defined(WIN32)
#ifdef LIB_TRADER_API_EXPORT
#define TRADER_API_EXPORT __declspec(dllexport)
#else
#define TRADER_API_EXPORT __declspec(dllimport)
#endif
#else
#define TRADER_API_EXPORT
#endif
/*!
* \class XTP::API::TraderSpi
*
* \brief
*
* \author
* \date 2015
*/
namespace XTP {
namespace API {
class TraderSpi
{
public:
///当客户端与交易后台通信连接断开时,该方法被调用。
///@remark 保留函数,暂未支持
///@param reason 错误原因
virtual void OnDisconnected(int reason) {};
///错误应答
///@param error_info 具体的错误代码和错误信息
virtual void OnError(XTPRI *error_info) {};
///报单通知
///@param order_info 订单响应具体信息
///@param error_info 订单被拒绝或者发生错误时错误代码和错误信息
///@remark 每次订单状态更新时,都会被调用
virtual void OnOrderEvent(XTPOrderInfo *order_info, XTPRI *error_info) {};
///成交通知
///@param trade_info 成交回报的具体信息
///@remark 订单有成交发生的时候,会被调用
virtual void OnTradeEvent(XTPTradeReport *trade_info) {};
///撤单出错响应
///@param cancel_info 撤单具体信息包括撤单单和待撤单的order_xtp_id
///@param error_info 撤单被拒绝或者发生错误时错误代码和错误信息
virtual void OnCancelOrderError(XTPOrderCancelInfo *cancel_info, XTPRI *error_info) {};
///请求查询报单响应
///@param order_info 查询到的报单
///@param error_info 错误信息
///@param request_id 此消息响应函数对应的请求ID
///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应
///@remark 由于支持分时段查询,一个查询请求可能对应多个响应
virtual void OnQueryOrder(XTPQueryOrderRsp *order_info, XTPRI *error_info, int request_id, bool is_last) {};
///请求查询成交响应
///@param trade_info 查询到的成交回报
///@param error_info 错误信息
///@param request_id 此消息响应函数对应的请求ID
///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应
///@remark 由于支持分时段查询,一个查询请求可能对应多个响应
virtual void OnQueryTrade(XTPQueryTradeRsp *trade_info, XTPRI *error_info, int request_id, bool is_last) {};
///请求查询投资者持仓响应
///@param position 查询到的持仓情况
///@param error_info 错误信息
///@param request_id 此消息响应函数对应的请求ID
///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应
///@remark 由于用户可能持有多个股票,一个查询请求可能对应多个响应
virtual void OnQueryPosition(XTPQueryStkPositionRsp *position, XTPRI *error_info, int request_id, bool is_last) {};
///请求查询资金账户响应
virtual void OnQueryAsset(XTPQueryAssetRsp *asset, XTPRI *error_info, int request_id, bool is_last) {};
};
}
}
/*!
* \class XTP::API::TraderApi
*
* \brief
*
* \author
* \date 2015
*/
namespace XTP {
namespace API {
class TRADER_API_EXPORT TraderApi
{
public:
///创建TraderApi
///@param save_file_path (保留字段)存贮订阅信息文件的目录,默认为当前目录
///@return 创建出的UserApi
static TraderApi *CreateTraderApi(const char *save_file_path = "");
///删除接口对象本身
///@remark 不再使用本接口对象时,调用该函数删除接口对象
virtual void Release() = 0;
///获取当前交易日
///@return 获取到的交易日
///@remark 只有登录成功后,才能得到正确的交易日
virtual const char *GetTradingDay() = 0;
///注册回调接口
///@param spi 派生自回调接口类的实例
virtual void RegisterSpi(TraderSpi *spi) = 0;
///用户登录请求
///@return 登录是否成功“0”表示登录成功“-1”表示连接服务器出错“-2”表示已存在连接不允许重复登录如果需要重连请先logout
///@param ip 服务器地址
///@param port 服务器端口号
///@param user 登录用户名
///@param password 登录密码
///@param sock_type “1”代表TCP“2”代表UDP目前暂时只支持TCP
///@param client_id 保留字段客户端id用于区分同一用户的不同连接
///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作
virtual int Login(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type, int client_id = 0) = 0;
///登出请求
///@return 登出是否成功“0”表示登出成功“-1”表示登出失败
virtual int Logout() = 0;
///报单录入请求
///@return 报单在XTP系统中的ID,如果为0表示报单失败用户需要记录下返回的order_xtp_id
///@param order 报单录入信息
virtual uint64_t InsertOrder(XTPOrderInsertInfo *order) = 0;
///报单操作请求
///@return 撤单单在XTP系统中的ID,如果为0表示撤单失败用户需要记录下返回的order_cancel_xtp_id
///@param order_xtp_id 需要撤销的委托单在XTP系统中的ID
virtual uint64_t CancelOrder(const uint64_t order_xtp_id) = 0;
///根据报单ID请求查询报单
///@return 查询是否成功“0”表示成功非“0”表示出错
///@param order_xtp_id 需要查询的报单在xtp系统中的ID
///@param request_id 用于用户定位查询响应的ID由用户自定义
virtual int QueryOrderByXTPID(const uint64_t order_xtp_id, int request_id) = 0;
///请求查询报单
///@return 查询是否成功“0”表示成功非“0”表示出错
///@param query_param 需要查询的订单相关筛选条件
///@param request_id 用于用户定位查询响应的ID由用户自定义
///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单
virtual int QueryOrders(const XTPQueryOrderReq *query_param, int request_id) = 0;
///根据委托编号请求查询相关成交
///@return 查询是否成功“0”表示成功非“0”表示出错
///@param order_xtp_id 需要查询的委托编号
///@param request_id 用于用户定位查询响应的ID由用户自定义
///@remark 此函数查询出的结果可能对应多个响应
virtual int QueryTradesByXTPID(const uint64_t order_xtp_id, int request_id) = 0;
///请求查询已成交
///@return 查询是否成功“0”表示成功非“0”表示出错
///@param query_param 需要查询的成交回报筛选条件
///@param request_id 用于用户定位查询响应的ID由用户自定义
///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有成交回报,否则查询时间段内所有跟股票代码相关的成交回报
virtual int QueryTrades(XTPQueryTraderReq *query_param, int request_id) = 0;
///请求查询投资者持仓
///@return 查询是否成功“0”表示成功非“0”表示出错
///@param ticker 需要查询的持仓股票,可以为空
///@param request_id 用于用户定位查询响应的ID由用户自定义
///@remark 该方法如果用户提供了股票代码,则会查询此股票的持仓信息,如果股票代码为空,则默认查询所有持仓信息
virtual int QueryPosition(const char *ticker, int request_id) = 0;
///请求查询资产
///@return 查询是否成功“0”表示成功非“0”表示出错
///@param request_id 用于用户定位查询响应的ID由用户自定义
virtual int QueryAsset(int request_id) = 0;
protected:
~TraderApi() {};
};
}
}
#endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,258 +0,0 @@
/*!
* \file xoms_api_struct.h
* \date 2015/10/23 16:45
*
* \author howellxu
* Contact: user@company.com
*
* \brief
*
* TODO: long description
*
* \note
*/
#ifndef _XOMS_API_STRUCT_H_
#define _XOMS_API_STRUCT_H_
#include "xtp_api_data_type.h"
#define XTP_API_TICKER_LEN 13
#define XTP_API_TICKER_NAME_LEN 48
#define XTP_LOCAL_ORDER_LEN 11
#define XTP_ORDER_EXCH_LEN 17
#define XTP_ORDER_RES_LEN 4
#define XTP_SUBPBUID_LEN 7
#define XTP_BRANCH_PBU_LEN 7
#define XTP_SYS_INSTRUMENT_LEN 24
//=====================客户端接口定义=================================
///新订单请求
struct XTPOrderInsertInfo
{
///XTP系统订单ID
uint64_t order_xtp_id;
///报单引用,由客户自定义
uint32_t order_client_id;
///合约代码 客户端请求不带空格
char ticker[XTP_API_TICKER_LEN];
///交易市场
XTP_MARKET_TYPE market;
///价格
double price;
///止损价(保留字段)
double stop_price;
///数量
int64_t quantity;
///报单价格
XTP_PRICE_TYPE price_type;
///买卖方向
XTP_SIDE_TYPE side;
};
///撤单
struct XTPOrderCancel
{
///XTP系统订单ID
uint64_t order_cancel_xtp_id;
///报单操作引用
uint32_t order_cancel_client_id;
///合约代码
char ticker[XTP_API_TICKER_LEN];
///交易市场
XTP_MARKET_TYPE market;
///操作时间
int64_t action_time;
///报单引用
uint32_t order_client_id;
///操作对象订单的序号
uint64_t order_xtp_id;
};
///撤单失败响应消息
struct XTPOrderCancelInfo
{
///撤单XTPID
uint64_t order_cancel_xtp_id;
///原始订单XTPID
uint64_t order_xtp_id;
};
///报单响应结构体
struct XTPOrderInfo
{
///XTP系统订单ID
uint64_t order_xtp_id;
///报单引用,用户自定义
uint32_t order_client_id;
///报单操作引用,用户自定义
uint32_t order_cancel_client_id;
///撤单在XTP系统中的id
uint64_t order_cancel_xtp_id;
///合约代码
char ticker[XTP_API_TICKER_LEN];
///交易市场
XTP_MARKET_TYPE market;
///价格
double price;
///数量
int64_t quantity;
///报单价格条件
XTP_PRICE_TYPE price_type;
///买卖方向
XTP_SIDE_TYPE side;
///今成交数量
int64_t qty_traded;
///剩余数量
int64_t qty_left;
///委托时间
int64_t insert_time;
///最后修改时间
int64_t update_time;
///撤销时间
int64_t cancel_time;
///成交金额
double trade_amount;
///本地报单编号 OMS生成的单号
char order_local_id[XTP_LOCAL_ORDER_LEN];
///报单状态
XTP_ORDER_STATUS_TYPE order_status;
///报单提交状态
XTP_ORDER_SUBMIT_STATUS_TYPE order_submit_status;
///报单类型
TXTPOrderTypeType order_type;
};
///报单成交结构体
struct XTPTradeReport
{
///XTP系统订单ID
uint64_t order_xtp_id;
///报单引用
uint32_t order_client_id;
///合约代码
char ticker[XTP_API_TICKER_LEN];
///交易市场
XTP_MARKET_TYPE market;
///订单号
uint64_t local_order_id;
///成交编号
uint64_t exec_id;
///价格
double price;
///数量
int64_t quantity;
///成交时间
int64_t trade_time;
///成交金额
double trade_amount;
///成交序号 --回报记录号
uint64_t report_index;
///报单编号 --交易所单号
char order_exch_id[XTP_ORDER_EXCH_LEN];
///成交类型 --成交回报中的执行类型
TXTPTradeTypeType trade_type;
///买卖方向
XTP_SIDE_TYPE side;
///交易所交易员代码
char branch_pbu[XTP_BRANCH_PBU_LEN];
};
//////////////////////////////////////////////////////////////////////////
///报单查询
//////////////////////////////////////////////////////////////////////////
///报单查询请求-条件查询
struct XTPQueryOrderReq
{
///证券代码,可以为空,如果为空,则默认查询时间段内的所有成交回报
char ticker[XTP_API_TICKER_LEN];
///格式为YYYYMMDDHHMMSSsss为0则默认当前交易日0点
int64_t begin_time;
///格式为YYYYMMDDHHMMSSsss为0则默认当前时间
int64_t end_time;
};
///报单查询响应结构体
typedef XTPOrderInfo XTPQueryOrderRsp;
//////////////////////////////////////////////////////////////////////////
///成交回报查询
//////////////////////////////////////////////////////////////////////////
///查询成交报告请求-根据执行编号查询(保留字段)
struct XTPQueryReportByExecIdReq
{
///XTP订单系统ID
uint64_t order_xtp_id;
///成交执行编号
uint64_t exec_id;
};
///查询成交回报请求-查询条件
struct XTPQueryTraderReq
{
///证券代码,可以为空,如果为空,则默认查询时间段内的所有成交回报
char ticker[XTP_API_TICKER_LEN];
///开始时间格式为YYYYMMDDHHMMSSsss为0则默认当前交易日0点
int64_t begin_time;
///结束时间格式为YYYYMMDDHHMMSSsss为0则默认当前时间
int64_t end_time;
};
///成交回报查询响应结构体
typedef XTPTradeReport XTPQueryTradeRsp;
//////////////////////////////////////////////////////////////////////////
///账户资金查询响应结构体
//////////////////////////////////////////////////////////////////////////
struct XTPQueryAssetRsp
{
///总资产
double total_asset;
///可用资金
double buying_power;
///证券资产
double security_asset;
///累计买入成交证券占用资金(保留字段)
double fund_buy_amount;
///累计买入成交交易费用(保留字段)
double fund_buy_fee;
///累计卖出成交证券所得资金(保留字段)
double fund_sell_amount;
///累计卖出成交交易费用(保留字段)
double fund_sell_fee;
};
//////////////////////////////////////////////////////////////////////////
///查询股票持仓情况
//////////////////////////////////////////////////////////////////////////
struct XTPQueryStkPositionRsp
{
///证券代码
char ticker[XTP_API_TICKER_LEN];
///证券名称
char ticker_name[XTP_API_TICKER_NAME_LEN];
///当前持仓
int64_t total_qty;
///可用股份数
int64_t sellable_qty;
///持仓成本
double avg_price;
///浮动盈亏
double unrealized_pnl;
};
#endif //_XOMS_API_STRUCT_H_

View File

@ -1,160 +0,0 @@
/////////////////////////////////////////////////////////////////////////
///@author 中泰证券股份有限公司
///@file xquote_api_struct.h
///@brief 定义行情类相关数据结构
/////////////////////////////////////////////////////////////////////////
#ifndef _XQUOTE_API_STRUCT_H_
#define _XQUOTE_API_STRUCT_H_
#include <stdint.h>
#include "xtp_api_data_type.h"
///指定的合约
typedef struct XTPSpecificTickerStruct
{
///交易所代码
XTP_EXCHANGE_TYPE exchange_id;
///合约代码(不包含交易所信息)例如"600000 "
char ticker[XTP_TICKER_LEN];
} XTPST;
///行情
typedef struct XTPMarketDataStruct
{
// 代码
///交易所代码
XTP_EXCHANGE_TYPE exchange_id;
///合约代码(不包含交易所信息)
char ticker[XTP_TICKER_LEN];
// 股票等价格
///最新价
double last_price;
///昨收盘
double pre_close_price;
///今开盘
double open_price;
///最高价
double high_price;
///最低价
double low_price;
///今收盘
double close_price;
// 期货等数据
///昨持仓量(目前未填写)
double pre_open_interest;
///持仓量(目前未填写)
double open_interest;
///上次结算价(目前未填写)
double pre_settlement_price;
///本次结算价(目前未填写)
double settlement_price;
///涨停板价(目前未填写)
double upper_limit_price;
///跌停板价(目前未填写)
double lower_limit_price;
///昨虚实度(目前未填写)
double pre_delta;
///今虚实度(目前未填写)
double curr_delta;
/// 时间类
int64_t data_time;
// 量额数据
///数量
int32_t qty;
///成交金额
double turnover;
///当日均价
double avg_price;
// 买卖盘
///十档申买价
double bid[10];
///十档申卖价
double ask[10];
///十档申买量
int32_t bid_qty[10];
///十档申卖量
int32_t ask_qty[10];
// lts没有包含的数据目前未填写
///成交笔数
int32_t trades_count;
///当前交易状态说明
char ticker_status[8];
///委托买入总量
int32_t total_bid_qty;
///委托卖出总量
int32_t total_ask_qty;
///加权平均委买价格
double ma_bid_price;
///加权平均委卖价格
double ma_ask_price;
///债券加权平均委买价格
double ma_bond_bid_price;
///债券加权平均委卖价格
double ma_bond_ask_price;
///债券到期收益率
double yield_to_maturity;
///ETF净值估值
double iopv;
///ETF申购笔数
int32_t etf_buy_count;
///ETF赎回笔数
int32_t etf_sell_count;
///ETF申购数量
double etf_buy_qty;
///ETF申购金额
double etf_buy_money;
///ETF赎回数量
double etf_sell_qty;
///ETF赎回金额
double etf_sell_money;
///权证执行的总数量
double total_warrant_exec_qty;
///权证跌停价格(元)
double warrant_lower_price;
///权证涨停价格(元)
double warrant_upper_price;
///买入撤单笔数
int32_t cancel_buy_count;
///卖出撤单笔数
int32_t cancel_sell_count;
///买入撤单数量
double cancel_buy_qty;
///卖出撤单数量
double cancel_sell_qty;
///买入撤单金额
double cancel_buy_money;
///卖出撤单金额
double cancel_sell_money;
///买入总笔数
int32_t total_buy_count;
///卖出总笔数
int32_t total_sell_count;
///买入委托成交最大等待时间
int32_t duration_after_buy;
///卖出委托成交最大等待时间
int32_t duration_after_sell;
///买方委托价位数
int32_t num_bid_orders;
///卖方委托价位数
int32_t num_ask_orders;
///成交时间UA3113
int32_t exec_time;
///闭市标志UA103/UA104
char is_market_closed[4];
///合约持仓量UA103
double total_position;
///市盈率1UA103
double pe_ratio1;
///市盈率2UA103
double pe_ratio2;
} XTPMD;
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,15 +0,0 @@
/////////////////////////////////////////////////////////////////////////
///@author 中泰证券股份有限公司
///@file xtp_api_struct.h
///@brief 定义业务数据结构
/////////////////////////////////////////////////////////////////////////
#ifndef _XTP_API_STRUCT_H_
#define _XTP_API_STRUCT_H_
#include "xtp_api_struct_common.h"
#include "xquote_api_struct.h"
#include "xoms_api_struct.h"
#endif // !_XTP_API_STRUCT_H_

View File

@ -1,23 +0,0 @@
/////////////////////////////////////////////////////////////////////////
///@author 中泰证券股份有限公司
///@file xtp_api_struct_common.h
///@brief 定义业务公共数据结构
/////////////////////////////////////////////////////////////////////////
#ifndef _XTP_API_STRUCT_COMMON_H_
#define _XTP_API_STRUCT_COMMON_H_
#include <stdint.h>
#include "xtp_api_data_type.h"
///响应信息
#define XTP_ERR_MSG_LEN 76
typedef struct XTPRspInfoStruct
{
///错误代码
int32_t error_id;
///错误信息
char error_msg[XTP_ERR_MSG_LEN];
} XTPRI;
#endif // !_XTP_API_STRUCT_COMMON_H_

View File

@ -1,158 +0,0 @@
/////////////////////////////////////////////////////////////////////////
///@author 中泰证券股份有限公司
///@file xtp_quote_api.h
///@brief 定义行情订阅客户端接口
/////////////////////////////////////////////////////////////////////////
#ifndef _XTP_QUOTE_API_H_
#define _XTP_QUOTE_API_H_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "xtp_api_struct.h"
#if defined(ISLIB) && defined(WIN32)
#ifdef LIB_MD_API_EXPORT
#define MD_API_EXPORT __declspec(dllexport)
#else
#define MD_API_EXPORT __declspec(dllimport)
#endif
#else
#define MD_API_EXPORT
#endif
/*!
* \class XTP::API::QuoteSpi
*
* \brief
*
* \author
* \date 2015
*/
namespace XTP {
namespace API {
class QuoteSpi
{
public:
///当客户端与交易后台通信连接断开时,该方法被调用。
///@remark 保留函数,暂未支持
///@param reason 错误原因
virtual void OnDisconnected(int reason) {};
///错误应答
///@param error_info 错误信息
virtual void OnError(XTPRI *error_info) {};
///订阅行情应答
///@param ticker 详细的合约订阅情况
///@param error_info 订阅合约发生错误时的错误信息
///@param is_last 是否此次订阅的最后一个应答
///@remark 每条订阅的合约均对应一条订阅应答
virtual void OnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last) {};
///取消订阅行情应答
///@param ticker 详细的合约取消订阅情况
///@param error_info 错误信息
///@param is_last 是否此次取消订阅的最后一个应答
///@remark 每条取消订阅的合约均对应一条取消订阅应答
virtual void OnUnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last) {};
///行情通知
///@param market_data 行情数据
virtual void OnMarketData(XTPMD *market_data) {};
///查询可交易合约应答
///@remark 保留函数,此函数暂未支持
virtual void OnQueryAllTickers() {};
};
}
}
/*!
* \class XTP::API::QuoteApi
*
* \brief
*
* \author
* \date 2015
*/
namespace XTP {
namespace API {
class MD_API_EXPORT QuoteApi
{
public:
///创建QuoteApi
///@param save_file_path (保留字段)存贮订阅信息文件的目录,默认为当前目录
///@return 创建出的UserApi
static QuoteApi *CreateQuoteApi(const char *save_file_path = "");
///删除接口对象本身
///@remark 不再使用本接口对象时,调用该函数删除接口对象
virtual void Release() = 0;
///获取当前交易日
///@return 获取到的交易日
///@remark 只有登录成功后,才能得到正确的交易日
virtual const char *GetTradingDay() = 0;
///注册回调接口
///@param spi 派生自回调接口类的实例
virtual void RegisterSpi(QuoteSpi *spi) = 0;
///订阅行情。
///@return 订阅接口调用是否成功“0”表示接口调用成功非“0”表示接口调用出错
///@param ticker 合约ID数组
///@param count 要订阅/退订行情的合约个数
///@param exchage_id 交易所代码
///@remark 可以一次性订阅同一证券交易所的多个合约
virtual int SubscribeMarketData(char *ticker[], int count, XTP_EXCHANGE_TYPE exchage_id) = 0;
///退订行情。
///@return 取消订阅接口调用是否成功“0”表示接口调用成功非“0”表示接口调用出错
///@param ticker 合约ID数组
///@param count 要订阅/退订行情的合约个数
///@param exchage_id 交易所代码
///@remark 可以一次性取消订阅同一证券交易所的多个合约
virtual int UnSubscribeMarketData(char *ticker[], int count, XTP_EXCHANGE_TYPE exchage_id) = 0;
///用户登录请求
///@return 登录是否成功“0”表示登录成功“-1”表示连接服务器出错“-2”表示已存在连接不允许重复登录如果需要重连请先logout“-3”表示输入有错误
///@param ip 服务器地址
///@param port 服务器端口号
///@param user 登陆用户名
///@param password 登陆密码
///@param sock_type “1”代表TCP“2”代表UDP目前暂时只支持TCP
///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作
virtual int Login(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type) = 0;
///登出请求
///@return 登出是否成功“0”表示登出成功非“0”表示登出出错
///@remark 此函数为同步阻塞式,不需要异步等待登出,当函数返回即可进行后续操作
virtual int Logout() = 0;
///获取当前交易日可交易合约
///@return 查询是否成功“0”表示查询成功非“0”表示查询不成功
///@param exchage_id 交易所代码
///@remark 此函数暂未支持
virtual int QueryAllTickers(XTP_EXCHANGE_TYPE exchage_id) = 0;
protected:
~QuoteApi() {};
};
}
}
#endif

View File

@ -1,206 +0,0 @@
/////////////////////////////////////////////////////////////////////////
///@author 中泰证券股份有限公司
///@file xtp_trader_api.h
///@brief 定义客户端交易接口
/////////////////////////////////////////////////////////////////////////
#ifndef _XTP_TRADER_API_H_
#define _XTP_TRADER_API_H_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "xtp_api_struct.h"
#if defined(ISLIB) && defined(WIN32)
#ifdef LIB_TRADER_API_EXPORT
#define TRADER_API_EXPORT __declspec(dllexport)
#else
#define TRADER_API_EXPORT __declspec(dllimport)
#endif
#else
#define TRADER_API_EXPORT
#endif
/*!
* \class XTP::API::TraderSpi
*
* \brief
*
* \author
* \date 2015
*/
namespace XTP {
namespace API {
class TraderSpi
{
public:
///当客户端与交易后台通信连接断开时,该方法被调用。
///@remark 保留函数,暂未支持
///@param reason 错误原因
virtual void OnDisconnected(int reason) {};
///错误应答
///@param error_info 具体的错误代码和错误信息
virtual void OnError(XTPRI *error_info) {};
///报单通知
///@param order_info 订单响应具体信息
///@param error_info 订单被拒绝或者发生错误时错误代码和错误信息
///@remark 每次订单状态更新时,都会被调用
virtual void OnOrderEvent(XTPOrderInfo *order_info, XTPRI *error_info) {};
///成交通知
///@param trade_info 成交回报的具体信息
///@remark 订单有成交发生的时候,会被调用
virtual void OnTradeEvent(XTPTradeReport *trade_info) {};
///撤单出错响应
///@param cancel_info 撤单具体信息包括撤单单和待撤单的order_xtp_id
///@param error_info 撤单被拒绝或者发生错误时错误代码和错误信息
virtual void OnCancelOrderError(XTPOrderCancelInfo *cancel_info, XTPRI *error_info) {};
///请求查询报单响应
///@param order_info 查询到的报单
///@param error_info 错误信息
///@param request_id 此消息响应函数对应的请求ID
///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应
///@remark 由于支持分时段查询,一个查询请求可能对应多个响应
virtual void OnQueryOrder(XTPQueryOrderRsp *order_info, XTPRI *error_info, int request_id, bool is_last) {};
///请求查询成交响应
///@param trade_info 查询到的成交回报
///@param error_info 错误信息
///@param request_id 此消息响应函数对应的请求ID
///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应
///@remark 由于支持分时段查询,一个查询请求可能对应多个响应
virtual void OnQueryTrade(XTPQueryTradeRsp *trade_info, XTPRI *error_info, int request_id, bool is_last) {};
///请求查询投资者持仓响应
///@param position 查询到的持仓情况
///@param error_info 错误信息
///@param request_id 此消息响应函数对应的请求ID
///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应
///@remark 由于用户可能持有多个股票,一个查询请求可能对应多个响应
virtual void OnQueryPosition(XTPQueryStkPositionRsp *position, XTPRI *error_info, int request_id, bool is_last) {};
///请求查询资金账户响应
virtual void OnQueryAsset(XTPQueryAssetRsp *asset, XTPRI *error_info, int request_id, bool is_last) {};
};
}
}
/*!
* \class XTP::API::TraderApi
*
* \brief
*
* \author
* \date 2015
*/
namespace XTP {
namespace API {
class TRADER_API_EXPORT TraderApi
{
public:
///创建TraderApi
///@param save_file_path (保留字段)存贮订阅信息文件的目录,默认为当前目录
///@return 创建出的UserApi
static TraderApi *CreateTraderApi(const char *save_file_path = "");
///删除接口对象本身
///@remark 不再使用本接口对象时,调用该函数删除接口对象
virtual void Release() = 0;
///获取当前交易日
///@return 获取到的交易日
///@remark 只有登录成功后,才能得到正确的交易日
virtual const char *GetTradingDay() = 0;
///注册回调接口
///@param spi 派生自回调接口类的实例
virtual void RegisterSpi(TraderSpi *spi) = 0;
///用户登录请求
///@return 登录是否成功“0”表示登录成功“-1”表示连接服务器出错“-2”表示已存在连接不允许重复登录如果需要重连请先logout
///@param ip 服务器地址
///@param port 服务器端口号
///@param user 登录用户名
///@param password 登录密码
///@param sock_type “1”代表TCP“2”代表UDP目前暂时只支持TCP
///@param client_id 保留字段客户端id用于区分同一用户的不同连接
///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作
virtual int Login(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type, int client_id = 0) = 0;
///登出请求
///@return 登出是否成功“0”表示登出成功“-1”表示登出失败
virtual int Logout() = 0;
///报单录入请求
///@return 报单在XTP系统中的ID,如果为0表示报单失败用户需要记录下返回的order_xtp_id
///@param order 报单录入信息
virtual uint64_t InsertOrder(XTPOrderInsertInfo *order) = 0;
///报单操作请求
///@return 撤单单在XTP系统中的ID,如果为0表示撤单失败用户需要记录下返回的order_cancel_xtp_id
///@param order_xtp_id 需要撤销的委托单在XTP系统中的ID
virtual uint64_t CancelOrder(const uint64_t order_xtp_id) = 0;
///根据报单ID请求查询报单
///@return 查询是否成功“0”表示成功非“0”表示出错
///@param order_xtp_id 需要查询的报单在xtp系统中的ID
///@param request_id 用于用户定位查询响应的ID由用户自定义
virtual int QueryOrderByXTPID(const uint64_t order_xtp_id, int request_id) = 0;
///请求查询报单
///@return 查询是否成功“0”表示成功非“0”表示出错
///@param query_param 需要查询的订单相关筛选条件
///@param request_id 用于用户定位查询响应的ID由用户自定义
///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单
virtual int QueryOrders(const XTPQueryOrderReq *query_param, int request_id) = 0;
///根据委托编号请求查询相关成交
///@return 查询是否成功“0”表示成功非“0”表示出错
///@param order_xtp_id 需要查询的委托编号
///@param request_id 用于用户定位查询响应的ID由用户自定义
///@remark 此函数查询出的结果可能对应多个响应
virtual int QueryTradesByXTPID(const uint64_t order_xtp_id, int request_id) = 0;
///请求查询已成交
///@return 查询是否成功“0”表示成功非“0”表示出错
///@param query_param 需要查询的成交回报筛选条件
///@param request_id 用于用户定位查询响应的ID由用户自定义
///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有成交回报,否则查询时间段内所有跟股票代码相关的成交回报
virtual int QueryTrades(XTPQueryTraderReq *query_param, int request_id) = 0;
///请求查询投资者持仓
///@return 查询是否成功“0”表示成功非“0”表示出错
///@param ticker 需要查询的持仓股票,可以为空
///@param request_id 用于用户定位查询响应的ID由用户自定义
///@remark 该方法如果用户提供了股票代码,则会查询此股票的持仓信息,如果股票代码为空,则默认查询所有持仓信息
virtual int QueryPosition(const char *ticker, int request_id) = 0;
///请求查询资产
///@return 查询是否成功“0”表示成功非“0”表示出错
///@param request_id 用于用户定位查询响应的ID由用户自定义
virtual int QueryAsset(int request_id) = 0;
protected:
~TraderApi() {};
};
}
}
#endif

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.