147 lines
4.2 KiB
Python
147 lines
4.2 KiB
Python
# encoding: utf-8
|
||
|
||
import sys
|
||
try:
|
||
# python2 需要设置编码
|
||
reload(sys)
|
||
sys.setdefaultencoding('utf-8')
|
||
except:
|
||
# python3 不需要
|
||
pass
|
||
import vtGlobal
|
||
import json
|
||
import os
|
||
from argparse import ArgumentParser
|
||
|
||
from datetime import datetime
|
||
|
||
from vtFunction import autoshutdown
|
||
from vnrpc import RpcServer
|
||
from vtEngine import MainEngine
|
||
|
||
|
||
########################################################################
|
||
class VtServer(RpcServer):
|
||
"""vn.trader服务器"""
|
||
|
||
#----------------------------------------------------------------------
|
||
def __init__(self, repAddress, pubAddress):
|
||
"""Constructor"""
|
||
super(VtServer, self).__init__(repAddress, pubAddress)
|
||
self.usePickle()
|
||
|
||
# 创建主引擎对象
|
||
self.engine = MainEngine()
|
||
|
||
# 注册主引擎的方法到服务器的RPC函数
|
||
self.register(self.engine.connect)
|
||
self.register(self.engine.subscribe)
|
||
self.register(self.engine.sendOrder)
|
||
self.register(self.engine.cancelOrder)
|
||
self.register(self.engine.qryAccount)
|
||
self.register(self.engine.qryPosition)
|
||
self.register(self.engine.exit)
|
||
self.register(self.engine.writeLog)
|
||
self.register(self.engine.dbConnect)
|
||
self.register(self.engine.dbInsert)
|
||
self.register(self.engine.dbQuery)
|
||
self.register(self.engine.dbUpdate)
|
||
self.register(self.engine.getContract)
|
||
self.register(self.engine.getAllContracts)
|
||
self.register(self.engine.getOrder)
|
||
self.register(self.engine.getAllWorkingOrders)
|
||
self.register(self.engine.getAllGatewayNames)
|
||
self.register(self.engine.getGateway4sysMenu)
|
||
|
||
# 注册事件引擎发送的事件处理监听
|
||
self.engine.eventEngine.registerGeneralHandler(self.eventHandler)
|
||
|
||
#----------------------------------------------------------------------
|
||
def eventHandler(self, event):
|
||
"""事件处理"""
|
||
self.publish(event.type_, event)
|
||
|
||
#----------------------------------------------------------------------
|
||
def stopServer(self):
|
||
"""停止服务器"""
|
||
# 关闭引擎
|
||
self.engine.exit()
|
||
|
||
# 停止服务器线程
|
||
self.stop()
|
||
|
||
|
||
#----------------------------------------------------------------------
|
||
def printLog(content):
|
||
"""打印日志"""
|
||
print("%s\t%s" % (datetime.now().strftime("%H:%M:%S"), content))
|
||
|
||
|
||
#----------------------------------------------------------------------
|
||
def runServer():
|
||
"""运行服务器"""
|
||
VT_setting = vtGlobal.VT_setting
|
||
|
||
repAddress = 'tcp://*:2014'
|
||
pubAddress = 'tcp://*:0602'
|
||
|
||
# 创建并启动服务器
|
||
server = VtServer(repAddress, pubAddress)
|
||
server.start()
|
||
|
||
printLog('-'*50)
|
||
printLog(u'vn.trader服务器已启动')
|
||
|
||
if VT_setting.get('automongodb'):
|
||
# 自动建立MongoDB数据库
|
||
printLog(u'MongoDB connect... ')
|
||
server.engine.dbConnect()
|
||
|
||
if VT_setting.get('autoctp'):
|
||
# 自动建立CTP链接
|
||
printLog(u"CTP connect... ")
|
||
server.engine.connect("CTP")
|
||
|
||
if VT_setting.get('autoshutdown'):
|
||
# 自动关闭 线程阻塞
|
||
wait2shutdown = autoshutdown()
|
||
printLog(u"time to shutdown %s" % wait2shutdown.closeTime)
|
||
wait2shutdown.join()
|
||
else:
|
||
# 进入主循环
|
||
while True:
|
||
printLog(u'input "exit" to exit')
|
||
if raw_input() != 'exit':
|
||
continue
|
||
|
||
printLog(u'confirm?yes|no')
|
||
if raw_input() == 'yes':
|
||
break
|
||
|
||
server.stopServer()
|
||
|
||
|
||
if __name__ == '__main__':
|
||
opt = ArgumentParser(
|
||
prog="vnpy",
|
||
description="Args of vnpy.",
|
||
)
|
||
|
||
# VT_setting.json 文件路径
|
||
opt.add_argument("--VT_setting", default=None, help="重新指定VT_setting.json的绝对路径")
|
||
|
||
# 生成参数实例
|
||
cmdArgs = opt.parse_args()
|
||
|
||
if cmdArgs.VT_setting is None:
|
||
fileName = 'VT_setting.json'
|
||
path = os.path.abspath(os.path.dirname(__file__))
|
||
fileName = os.path.join(path, fileName)
|
||
else:
|
||
fileName = cmdArgs.VT_setting
|
||
|
||
with open(fileName) as f:
|
||
vtGlobal.VT_setting = json.load(f)
|
||
|
||
runServer()
|