Example #1
0
class VtServer(RpcServer):
    """vn.trader服务器"""

    #----------------------------------------------------------------------
    def __init__(self, repAddress, pubAddress):
        """Constructor"""
        super(VtServer, self).__init__(repAddress, pubAddress)
        self.usePickle()

        # 创建主引擎对象
        self.engine = MainEngine()

        for gw_name in init_gateway_names['CTP']:
            print('add {0}'.format(gw_name))
            self.engine.addGateway(ctpGateway, gw_name)

        # 注册主引擎的方法到服务器的RPC函数
        self.register(self.engine.connect)
        self.register(self.engine.disconnect)
        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.checkGatewayStatus)  # 检测gateway的连接状态
        self.register(self.engine.qryStatus)  # 检测ctaEngine的状态
        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.saveData)

        # 注册事件引擎发送的事件处理监听
        self.engine.eventEngine.registerGeneralHandler(self.eventHandler)

    #----------------------------------------------------------------------
    def eventHandler(self, event):
        """事件处理"""
        self.publish(event.type_, event)

    #----------------------------------------------------------------------
    def stopServer(self):
        """停止服务器"""
        # 关闭引擎
        self.engine.exit()

        # 停止服务器线程
        self.stop()
Example #2
0
class VtServer(RpcServer):
    """vn.trader服务器"""

    #----------------------------------------------------------------------
    def __init__(self, repAddress, pubAddress):
        """Constructor"""
        super(VtServer, self).__init__(repAddress, pubAddress)
        self.usePickle()
        
        # 创建主引擎对象
        self.engine = MainEngine()

        for gw_name in init_gateway_names['CTP']:
            print( 'add {0}'.format(gw_name))
            self.engine.addGateway(ctpGateway, gw_name)

        # 注册主引擎的方法到服务器的RPC函数
        self.register(self.engine.connect)
        self.register(self.engine.disconnect)
        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.checkGatewayStatus)               # 检测gateway的连接状态
        self.register(self.engine.qryStatus)                        # 检测ctaEngine的状态
        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.saveData)
        
        # 注册事件引擎发送的事件处理监听
        self.engine.eventEngine.registerGeneralHandler(self.eventHandler)
        
    #----------------------------------------------------------------------
    def eventHandler(self, event):
        """事件处理"""
        self.publish(event.type_, event)
        
    #----------------------------------------------------------------------
    def stopServer(self):
        """停止服务器"""
        # 关闭引擎
        self.engine.exit()
        
        # 停止服务器线程
        self.stop()
Example #3
0
class VtServer(RpcServer):
    """vn.trader服务器"""

    #----------------------------------------------------------------------
    def __init__(self, repAddress, pubAddress):
        """Constructor"""
        super(VtServer, self).__init__(repAddress, pubAddress)
        self.usePickle()

        # 创建事件引擎
        self.ee = EventEngine2()

        # 创建主引擎对象
        self.engine = MainEngine(self.ee)

        # 注册主引擎的方法到服务器的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.getAllGatewayDetails)

        # 注册事件引擎发送的事件处理监听
        self.engine.eventEngine.registerGeneralHandler(self.eventHandler)

    #----------------------------------------------------------------------
    def eventHandler(self, event):
        """事件处理"""
        self.publish(event.type_, event)

    #----------------------------------------------------------------------
    def stopServer(self):
        """停止服务器"""
        # 关闭引擎
        self.engine.exit()

        # 停止服务器线程
        self.stop()
Example #4
0
class VtServer(RpcServer):
    """vn.trader服务器"""

    #----------------------------------------------------------------------
    def __init__(self, repAddress, pubAddress):
        """Constructor"""
        super(VtServer, self).__init__(repAddress, pubAddress)
        self.usePickle()
        
        # 创建事件引擎
        self.ee = EventEngine2()
        
        # 创建主引擎对象
        self.engine = MainEngine(self.ee)
        
        # 注册主引擎的方法到服务器的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.getAllGatewayDetails)
        
        # 注册事件引擎发送的事件处理监听
        self.engine.eventEngine.registerGeneralHandler(self.eventHandler)
        
    #----------------------------------------------------------------------
    def eventHandler(self, event):
        """事件处理"""
        self.publish(event.type_, event)
        
    #----------------------------------------------------------------------
    def stopServer(self):
        """停止服务器"""
        # 关闭引擎
        self.engine.exit()
        
        # 停止服务器线程
        self.stop()
Example #5
0
def main():
    """主程序入口"""

    print("main start")
    # 创建事件引擎
    ee = EventEngine()

    # 创建主引擎
    me = MainEngine(ee)

    # 添加交易接口, 包括行情数据接口和交易接口两部分
    print("添加gateway接口, addGatewayClass")
    me.addGatewayClass(eastMoneyGateway)

    # 添加上层应用, 应用管理
    #me.addApp(strategyManager)

    print("添加上层应用, addRiskCtrlClass")
    me.addRiskCtrlClass(riskCtrl1)

    print("添加上层应用, addStrategyClass")
    me.addStrategyClass(strategyDualThrust)
    me.addStrategyClass(strategyAtrRsi)
    me.addStrategyClass(strategyMacdShake)

    me.addApp(dataRecorder)
    print("添加上层应用, dataRecorder")

    # 创建主窗口
    mw = MainWindow(me, ee)
    mw.showMaximized()

    # 在主线程中启动Qt事件循环
    qApp.exec_()

    try:
        me.exit()
        sys.exit(0)
    except:
        print('GoodBye!')
        pass
Example #6
0
class VtServer(RpcServer):
    """
        ---vn.trader服务器:
        注册主引擎方法
        注册通用事件处理函数
        运行服务器
    """

    # ----------------------------------------------------------------------
    def __init__(self, repAddress, pubAddress):
        """构造器"""
        super(VtServer, self).__init__(repAddress, pubAddress)
        # 使用cPickle作为数据的序列化工具
        self.usePickle()

        # 创建主引擎对象
        self.engine = MainEngine()

        for gw_name in init_gateway_names['CTP']:
            print('add {0}'.format(gw_name))
            # ?
            self.engine.addGateway(ctpGateway, gw_name)

        # 注册vtEngine的MainEngine的方法到Rpc服务器的功能函数字典__functions
        self.register(self.engine.connect)  # 连接特定名称的接口
        self.register(self.engine.disconnect)  # 断开底层gateway的连接
        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.checkGatewayStatus)  # 检测gateway的连接状态
        self.register(self.engine.qryStatus)  # 检测ctaEngine的状态
        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.saveData)  # 保存策略的数据

        #  将通用事件处理函数注册到__generalHandlers中
        # __generalHandlers:用来保存通用回调函数(所有事件均调用)
        self.engine.eventEngine.registerGeneralHandler(self.eventHandler)

    # ----------------------------------------------------------------------
    def eventHandler(self, event):
        """事件处理"""
        # 打包数据,广播发送
        self.publish(event.type_, event)

    # ----------------------------------------------------------------------
    def stopServer(self):
        """停止服务器"""
        # 关闭主引擎
        self.engine.exit()

        # 停止服务器线程
        self.stop()
Example #7
0
class MarketService(TradeService):
    def __init__(self, name):
        TradeService.__init__(self, name)

        self.active = False  # 工作状态
        self.queue = Queue()  # 队列
        self.thread = Thread(target=self.threadDataFanout)  # 线程
        self.ee = None
        self.mainEngine = None
        self.logger = instance.getLogger()
        self.symbols = {}  # 已经订阅的合约
        self.contracts = OrderedDict()
        self.ticks_counter = 0
        self.ticks_samples = []
        self.tick_filters = []

        self.market_ticks = {}  # 相同的coin存在多市场的即时报价
        # 'BTC':{
        #   'BINANCE': {'open':11,'close':12,'gateway':'BINANCE','ask',..'bid'},
        #   'OKEX': {'open': 11, 'close': 12, 'gateway': 'OKEX', 'ask',..'bid'},
        # }

    def init(self, cfgs, **kwargs):
        self.service_id = cfgs.get('id')
        self.service_type = ServiceType.MarketAdapter
        super(MarketService, self).init(cfgs)
        self.initFilters()

    def syncDownServiceConfig(self):
        TradeService.syncDownServiceConfig(self)

    def setupFanoutAndLogHandler(self):
        from mantis.trade.log import TradeServiceLogHandler
        self.initFanoutSwitchers(self.cfgs.get('fanout'))

        handler = TradeServiceLogHandler(self)
        self.logger.addHandler(handler)

    def start(self, block=True):
        self.setupFanoutAndLogHandler()

        # 创建日志引擎
        super(MarketService, self).start()
        self.active = True
        self.thread.start()

        le = self.logger
        # le = LogEngine()
        # le.setLogLevel(le.LEVEL_INFO)
        # le.addConsoleHandler()
        le.info(u'启动行情记录运行子进程')

        self.ee = EventEngine()
        le.info(u'事件引擎创建成功')

        self.mainEngine = MainEngine(self.ee)  # 忽略掉 默认的 DataEngine

        self.registerEvent()
        le.info(u'主引擎创建成功')

        for gw in self.cfgs.get('gateways'):
            gateway = None
            if gw.get('name').upper() == binanceGateway.gatewayName:
                gateway = binanceGateway
            if gateway:
                self.mainEngine.addGateway(gateway)
                self.mainEngine.connect(gateway.gatewayName, gw)

        le.info(u'注册日志事件监听')
        le.info(u'连接CTP接口')

    def processLogEvent(self, event):
        print event

    def processErrorEvent(self, event):
        """
        处理错误事件
        错误信息在每次登陆后,会将当日所有已产生的均推送一遍,所以不适合写入日志
        """
        error = event.dict_['data']
        print u'错误代码:%s,错误信息:%s' % (error.errorID, error.errorMsg)

    def stop(self):
        super(MarketService, self).stop()
        self.mainEngine.exit()
        if self.active:
            self.active = False
            # self.thread.join()

    def join(self):
        self.thread.join()

    # def subscribe(self,*symbols):
    #     for symbol in symbols:
    #         if not self.symbols.has_key(symbol):
    #             req = VtSubscribeReq()
    #             req.symbol = symbol
    #             self.mainEngine.subscribe(req, xtpGateway.gatewayName) # XTP
    #             self.symbols[symbol] = symbol
    #
    #     if not symbols :
    #         self.mainEngine.subscribe(None,xtpGateway.gatewayName) # 订阅全市场所有股票
    #
    # def unsubscribe(self,*symbols):
    #     for s in symbols:
    #         if s in self.symbols.keys():
    #            del  self.symbols[s]

    def getSymbols(self):
        return list(self.contracts.keys())

    def procecssTickEvent(self, event):
        """处理行情事件"""
        tick = event.dict_['data']
        # tick = self.filterTicks(tick)
        # print 'Tick:',tick
        if tick:
            # 生成datetime对象
            if not tick.datetime:
                # tick.datetime = datetime.strptime(' '.join([tick.date, tick.time]), '%Y%m%d %H:%M:%S.%f')
                tick.service = self.getServiceType() + '.' + self.getServiceId(
                )
            self.queue.put(tick)

    def initFilters(self):
        from mantis.fundamental.utils.importutils import import_class
        for clsname in self.cfgs.get('xtp_tick_filters', []):
            cls = import_class(clsname)
            filter = cls()
            self.tick_filters.append(filter)

    def filterTicks(self, tick):
        """必须同时满足所有filter数据检查条件"""
        for f in self.tick_filters:
            tick = f.validate(tick)
            if not tick:
                break
        return tick

    def registerEvent(self):
        """注册事件监听"""
        self.ee.register(EVENT_TICK, self.procecssTickEvent)
        self.ee.register(EVENT_LOG, self.processLogEvent)
        self.ee.register(EVENT_ERROR, self.processErrorEvent)
        self.ee.register(EVENT_CONTRACT, self.processContractEvent)

    # def subscribeAllContracts(self):
    #     for symbol in self.contracts.keys():
    #         req = VtSubscribeReq()
    #         req.symbol = symbol
    #         req.exchange = EXCHANGE_SSE
    #         # self.mainEngine.subscribe( req, xtpGateway.gatewayName)  # CTP
    #     self.mainEngine.subscribe( None, xtpGateway.gatewayName)  # CTP

    def processContractEvent(self, event):
        """处理合约事件
           连接交易系统之后,会通过此接口接收到CTP所有当前合约
        """
        # contract = event.dict_['data']
        # self.contracts[ contract.vtSymbol] = contract
        # if contract.last:
        #     # start contract subscribe
        #     self.subscribeAllContracts()
        pass

    def threadDataFanout(self):
        """运行插入线程"""
        while self.active:
            try:
                # print 'current tick queue size:', self.queue.qsize()
                # dbName, collectionName, d = self.queue.get(block=True, timeout=1)
                tick = self.queue.get(block=True, timeout=1)
                symbol = tick.vtSymbol

                dt = datetime.datetime.strptime(
                    ' '.join([tick.date, tick.time]), '%Y%m%d %H:%M:%S.%f')
                tick.ts = datetime_to_timestamp(dt)  # 合约生成时间
                tick.ts_host = int(time.time())  # 主机系统时间

                jsondata = json.dumps(tick.__dict__)
                self.dataFanout('switch0', jsondata, symbol=symbol)

                # 多交易所的价格聚合
                content = self.market_ticks.get(symbol)
                if not content:
                    content = {}
                    self.market_ticks[tick.symbol] = content
                content[tick.exchange] = tick.__dict__
                jsondata = json.dumps(content)
                self.dataFanout('switch1', jsondata, symbol=symbol)

                # -- cache current tick into redis ---
                key_name = CoinMarketSymbolTickFormat.format(
                    symbol=tick.vtSymbol)
                redis = instance.datasourceManager.get('redis').conn
                # redis.hmset(key_name, tick.__dict__)
                redis.set(key_name, jsondata)

                # self.ticks_counter += 1
                # if len(self.ticks_samples) > 5:
                #     del self.ticks_samples[0]
                # self.ticks_samples.append(tick.__dict__)

            except Exception as e:
                # self.logger.error( str(e) )
                pass
Example #8
0
class VtServer(RpcServer):
    """vn.trader 无界面服务器"""

    # ----------------------------------------------------------------------
    def __init__(self, repAddress, pubAddress):
        """Constructor"""
        super(VtServer, self).__init__(repAddress, pubAddress)
        #self.usePickle()

        # gateway 是否连接
        self.connected = False
        # gateway 的连接名称,在vtEngine.initGateway()里面定义,对应的配置文件是 "连接名称_connect.json",
        self.gateway_name = AUTO_CONNCET_GW
        # 启动的策略实例,须在catStrategy/CtaSetting.json 里面定义  [u'S28_RB1001', u'S28_TFT', u'S28_HCRB',u'atr_rsi']
        self.strategies = [u'S30_RB0510', u'S30_HCRB05']
        self.g_count = 0
        self.disconnect_signal = 0
        self.last_dt = datetime.now()

        # 创建事件引擎
        ee = EventEngine2()

        # 创建主引擎对象
        print(u'instance mainengine')
        self.engine = MainEngine(ee)

        # 添加CTP Gateway,配置文件为 CTP_Post
        self.engine.addGateway(ctpGateway, self.gateway_name)

        # 添加应用
        self.engine.addApp(ctaStrategy)
        self.engine.addApp(riskManager)

        # 注册主引擎的方法到服务器的RPC函数
        self.register(self.engine.connect)
        self.register(self.engine.disconnect)
        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.checkGatewayStatus)  # 检测gateway的连接状态
        self.register(self.engine.qryStatus)  # 检测ctaEngine的状态
        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.saveData)
        self.register(self.engine.initStrategy)
        self.register(self.engine.startStrategy)
        self.register(self.engine.stopStrategy)

        # 注册事件引擎发送的事件处理监听
        self.engine.eventEngine.registerGeneralHandler(self.eventHandler)

    def trade_off(self):
        """检查现在是否为非交易时间"""
        now = datetime.now()
        a = datetime.now().replace(hour=2, minute=35, second=0, microsecond=0)
        b = datetime.now().replace(hour=8, minute=55, second=0, microsecond=0)
        c = datetime.now().replace(hour=15, minute=30, second=0, microsecond=0)
        d = datetime.now().replace(hour=20, minute=55, second=0, microsecond=0)
        weekend = (now.isoweekday() == 6 and now >= a) or (now.isoweekday()
                                                           == 7)
        off = (a <= now <= b) or (c <= now <= d) or weekend
        return off

    def disconnect(self):
        """"断开底层gateway的连接"""
        if self.engine:
            self.engine.disconnect(self.gateway_name)
            self.connected = False

    def onTimer(self, event):
        """定时器执行逻辑,每十秒执行一次"""

        # 十秒才执行一次检查
        self.g_count += 1
        if self.g_count <= 30:
            return
        self.g_count = 0
        dt = datetime.now()
        self.engine.qryStatus()
        if dt.hour != self.last_dt.hour:
            self.last_dt = dt
            print(u'noUiMain.py checkpoint:{0}'.format(dt))
            self.engine.writeLog(u'noUiMain.py checkpoint:{0}'.format(dt))

        # 定时断开
        if self.trade_off():
            """非交易时间"""
            if self.connected:
                self.engine.writeLog(u'断开连接{0}'.format(self.gateway_name))
                self.disconnect()
                self.engine.writeLog(u'清空数据引擎')
                self.engine.clearData()
                self.connected = False
                self.engine.writeNotification(u'非交易时间{0},断开连接{1}'.format(
                    dt, self.gateway_name))
            return

        # 交易时间内,定时重连和检查
        if not self.connected:
            self.engine.writeLog(u'启动连接{0}'.format(self.gateway_name))
            self.engine.writeLog(u'清空数据引擎')
            self.engine.clearData()
            self.engine.writeLog(u'重新连接{0}'.format(self.gateway_name))
            self.engine.connect(self.gateway_name)
            self.connected = True
            self.disconnect_signal = 0
            self.engine.writeNotification(u'{0},重新连接{1}'.format(
                dt, self.gateway_name))
            return
        else:
            if not self.engine.checkGatewayStatus(self.gateway_name):
                self.disconnect_signal += 1

                if self.disconnect_signal >= 5:
                    self.engine.writeWarning(u'检查连接{0}异常,超过{1}次'.format(
                        self.gateway_name, self.disconnect_signal))
                    sys.exit(0)
            else:
                self.disconnect_signal = 0

    def start(self):
        """启动"""
        super(VtServer, self).start()

        # 若需要连接数据库,则启动
        # self.mainEngine.dbConnect()

        # 加载cta的配置
        print(u'load cta setting')
        self.engine.ctaEngine.loadSetting()

        print(u'initialize all strategies')
        # 初始化策略,如果多个,则需要逐一初始化多个
        for s in self.strategies:
            print('init trategy {0}'.format(s))
            self.engine.ctaEngine.initStrategy(s)
            # 逐一启动策略
            print('start strategy {0}'.format(s))
            self.engine.ctaEngine.startStrategy(s)

        # 指定的连接配置
        if not self.trade_off():
            print(u'connect gateway:{0}'.format(self.gateway_name))
            self.engine.connect(self.gateway_name)
            self.connected = True

        # 注册定时器,用于判断重连
        self.engine.eventEngine.register(EVENT_TIMER, self.onTimer)

        # 所有的日志监控
        self.logM = LogMonitor(self.engine.eventEngine)
        self.errorM = ErrorMonitor(self.engine.eventEngine)
        self.tradeM = TradeMonitor(self.engine.eventEngine)
        self.orderM = OrderMonitor(self.engine.eventEngine, self.engine)
        self.positionM = PositionMonitor(self.engine.eventEngine)
        self.accountM = AccountMonitor(self.engine.eventEngine)

        self.engine.writeNotification(u'{0},服务启动{1}'.format(
            datetime.now(), self.gateway_name))

    # ----------------------------------------------------------------------
    def eventHandler(self, event):
        """事件处理"""
        try:
            # 调用RpcServer.publish()
            if isinstance(event.type_, str):
                self.publish(event.type_, event)
            else:
                self.publish(event.type_.encode('utf-8'), event)

        except Exception as ex:
            print(u'event Handler exception:{0}'.format(str(ex)))

    # ----------------------------------------------------------------------
    def stopServer(self):
        """停止服务器"""
        print('stopServer')
        # 关闭引擎
        self.engine.exit()
        # 停止服务器线程
        self.stop()
Example #9
0
class VtServer(RpcServer):
    """vn.trader 无界面服务器"""

    # ----------------------------------------------------------------------
    def __init__(self, repAddress, pubAddress):
        """Constructor"""
        super(VtServer, self).__init__(repAddress, pubAddress)
        #self.usePickle()

        # gateway 是否连接
        self.connected = False
        # gateway 的连接名称,在vtEngine.initGateway()里面定义,对应的配置文件是 "连接名称_connect.json",
        self.gateway_name = AUTO_CONNCET_GW
        # 启动的策略实例,须在catStrategy/CtaSetting.json 里面定义  [u'S28_RB1001', u'S28_TFT', u'S28_HCRB',u'atr_rsi']
        self.strategies = []
        self.g_count = 0
        self.disconnect_signal = 0
        self.last_dt = datetime.now()

        # 创建事件引擎
        ee = EventEngine2()

        # 创建主引擎对象
        print(u'instance mainengine')
        self.engine = MainEngine(ee)

        # 添加Gateway,
        for gw_name in init_gateway_names.keys():
            for gw_conf in init_gateway_names[gw_name]:
                print('add {}'.format(gw_conf))
                self.engine.addGateway(gateway_model_dict[gw_name], gw_conf)

        # 添加应用
        self.engine.addApp(cmaStrategy)

        # 注册主引擎的方法到服务器的RPC函数
        self.register(self.engine.connect)
        self.register(self.engine.disconnect)
        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.checkGatewayStatus)  # 检测gateway的连接状态
        self.register(self.engine.qryStatus)  # 检测ctaEngine的状态
        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.saveData)
        self.register(self.engine.initStrategy)
        self.register(self.engine.startStrategy)
        self.register(self.engine.stopStrategy)

        # 注册事件引擎发送的事件处理监听
        self.engine.eventEngine.registerGeneralHandler(self.eventHandler)

    def disconnect(self):
        """"断开底层gateway的连接"""
        if self.engine:
            self.engine.disconnect(self.gateway_name)
            self.connected = False

    def onTimer(self, event):
        """定时器执行逻辑,每十秒执行一次"""

        # 十秒才执行一次检查
        self.g_count += 1
        if self.g_count <= 30:
            return
        self.g_count = 0
        dt = datetime.now()
        self.engine.qryStatus()
        if dt.hour != self.last_dt.hour:
            self.last_dt = dt
            print(u'noUiMain.py checkpoint:{0}'.format(dt))
            self.engine.writeLog(u'noUiMain.py checkpoint:{0}'.format(dt))

        # 交易时间内,定时重连和检查
        if not self.connected:
            self.engine.writeLog(u'启动连接{0}'.format(self.gateway_name))
            self.engine.writeLog(u'清空数据引擎')
            self.engine.clearData()
            for gw_name in self.gateway_name:
                self.engine.writeLog(u'重新连接{0}'.format(gw_name))
                self.engine.connect(gw_name)
            self.connected = True
            self.disconnect_signal = 0
            self.engine.writeNotification(u'{0},重新连接{1}'.format(
                dt, self.gateway_name))
            return

    def start(self):
        """启动"""
        super(VtServer, self).start()

        # 若需要连接数据库,则启动
        # self.mainEngine.dbConnect()

        # 加载cta的配置
        print(u'load cma setting')
        self.engine.cmaEngine.loadSetting()

        print(u'initialize all strategies')
        # 初始化策略,如果多个,则需要逐一初始化多个
        for s in self.strategies:
            print('init trategy {0}'.format(s))
            self.engine.cmaEngine.initStrategy(s)
            # 逐一启动策略
            print('start strategy {0}'.format(s))
            self.engine.cmaEngine.startStrategy(s)

        for gw_name in self.gateway_name:
            self.engine.writeLog(u'connect gateway:{0}'.format(gw_name))
            self.engine.connect(gw_name)

        self.connected = True

        # 注册定时器,用于判断重连
        self.engine.eventEngine.register(EVENT_TIMER, self.onTimer)

        # 所有的日志监控
        self.logM = LogMonitor(self.engine.eventEngine)
        self.errorM = ErrorMonitor(self.engine.eventEngine)
        self.tradeM = TradeMonitor(self.engine.eventEngine)
        self.orderM = OrderMonitor(self.engine.eventEngine, self.engine)
        self.positionM = PositionMonitor(self.engine.eventEngine)
        self.accountM = AccountMonitor(self.engine.eventEngine)

        self.engine.writeNotification(u'{0},服务启动{1}'.format(
            datetime.now(), self.gateway_name))

    # ----------------------------------------------------------------------
    def eventHandler(self, event):
        """事件处理"""
        try:
            # 调用RpcServer.publish()
            if isinstance(event.type_, str):
                self.publish(event.type_, event)
            else:
                self.publish(event.type_.encode('utf-8'), event)

        except Exception as ex:
            print(u'event Handler exception:{0}'.format(str(ex)))

    # ----------------------------------------------------------------------
    def stopServer(self):
        """停止服务器"""
        print('stopServer')
        # 关闭引擎
        self.engine.exit()
        # 停止服务器线程
        self.stop()
Example #10
0
class VtServer(RpcServer):
    """vn.trader 无界面服务器"""

    # ----------------------------------------------------------------------
    def __init__(self, repAddress, pubAddress):
        """Constructor"""
        super(VtServer, self).__init__(repAddress, pubAddress)
        #self.usePickle()

        # gateway 是否连接
        self.connected = False
        # gateway 的连接名称,在vtEngine.initGateway()里面定义,对应的配置文件是 "连接名称_connect.json",
        self.gateway_name = AUTO_CONNCET_GW
        # 启动的策略实例,须在catStrategy/CtaSetting.json 里面定义  [u'S28_RB1001', u'S28_TFT', u'S28_HCRB',u'atr_rsi']
        self.strategies = [u'S30_RB0510', u'S30_HCRB05']
        self.g_count = 0
        self.disconnect_signal = 0
        self.last_dt = datetime.now()

        # 创建事件引擎
        ee = EventEngine2()

        # 创建主引擎对象
        print( u'instance mainengine')
        self.engine = MainEngine(ee)

        # 添加CTP Gateway,配置文件为 CTP_Post
        self.engine.addGateway(ctpGateway, self.gateway_name)

        # 添加应用
        self.engine.addApp(ctaStrategy)
        self.engine.addApp(riskManager)


        # 注册主引擎的方法到服务器的RPC函数
        self.register(self.engine.connect)
        self.register(self.engine.disconnect)
        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.checkGatewayStatus)  # 检测gateway的连接状态
        self.register(self.engine.qryStatus)  # 检测ctaEngine的状态
        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.saveData)
        self.register(self.engine.initStrategy)
        self.register(self.engine.startStrategy)
        self.register(self.engine.stopStrategy)

        # 注册事件引擎发送的事件处理监听
        self.engine.eventEngine.registerGeneralHandler(self.eventHandler)


    def trade_off(self):
        """检查现在是否为非交易时间"""
        now = datetime.now()
        a = datetime.now().replace(hour=2, minute=35, second=0, microsecond=0)
        b = datetime.now().replace(hour=8, minute=55, second=0, microsecond=0)
        c = datetime.now().replace(hour=15, minute=30, second=0, microsecond=0)
        d = datetime.now().replace(hour=20, minute=55, second=0, microsecond=0)
        weekend = (now.isoweekday() == 6 and now >= a) or (now.isoweekday() == 7) or (now.isoweekday() == 1 and now <=b)
        off = (a <= now <= b) or (c <= now <= d) or weekend
        return off

    def disconnect(self):
        """"断开底层gateway的连接"""
        if self.engine:
            self.engine.disconnect(self.gateway_name)
            self.connected = False

    def onTimer(self, event):
        """定时器执行逻辑,每十秒执行一次"""

        # 十秒才执行一次检查
        self.g_count += 1
        if self.g_count <= 30:
            return
        self.g_count = 0
        dt = datetime.now()
        self.engine.qryStatus()
        if dt.hour != self.last_dt.hour:
            self.last_dt = dt
            print(u'noUiMain.py checkpoint:{0}'.format(dt))
            self.engine.writeLog( u'noUiMain.py checkpoint:{0}'.format(dt))

        # 定时断开
        if self.trade_off():
            """非交易时间"""
            if self.connected:
                self.engine.writeLog(u'断开连接{0}'.format(self.gateway_name))
                self.disconnect()
                self.engine.writeLog(u'清空数据引擎')
                self.engine.clearData()
                self.connected = False
                self.engine.writeNotification(u'非交易时间{0},断开连接{1}'.format(dt, self.gateway_name))
            return

        # 交易时间内,定时重连和检查
        if not self.connected:
            self.engine.writeLog(u'启动连接{0}'.format(self.gateway_name))
            self.engine.writeLog(u'清空数据引擎')
            self.engine.clearData()
            self.engine.writeLog(u'重新连接{0}'.format(self.gateway_name))
            self.engine.connect(self.gateway_name)
            self.connected = True
            self.disconnect_signal = 0
            self.engine.writeNotification(u'{0},重新连接{1}'.format(dt, self.gateway_name))
            return
        else:
            if not self.engine.checkGatewayStatus(self.gateway_name):
                self.disconnect_signal += 1

                if self.disconnect_signal >= 5:
                    self.engine.writeWarning(u'检查连接{0}异常,超过{1}次'.format(self.gateway_name,self.disconnect_signal))
                    sys.exit(0)
            else:
                self.disconnect_signal = 0

    def start(self):
        """启动"""
        super(VtServer, self).start()

        # 若需要连接数据库,则启动
        # self.mainEngine.dbConnect()

        # 加载cta的配置
        print( u'load cta setting')
        self.engine.ctaEngine.loadSetting()

        print(u'initialize all strategies')
        # 初始化策略,如果多个,则需要逐一初始化多个
        for s in self.strategies:
            print( 'init trategy {0}'.format(s))
            self.engine.ctaEngine.initStrategy(s)
            # 逐一启动策略
            print( 'start strategy {0}'.format(s))
            self.engine.ctaEngine.startStrategy(s)

        # 指定的连接配置
        if not self.trade_off():
            print( u'connect gateway:{0}'.format(self.gateway_name))
            self.engine.connect(self.gateway_name)
            self.connected = True

        # 注册定时器,用于判断重连
        self.engine.eventEngine.register(EVENT_TIMER, self.onTimer)

        # 所有的日志监控
        self.logM = LogMonitor(self.engine.eventEngine)
        self.errorM = ErrorMonitor(self.engine.eventEngine)
        self.tradeM = TradeMonitor(self.engine.eventEngine)
        self.orderM = OrderMonitor(self.engine.eventEngine, self.engine)
        self.positionM = PositionMonitor(self.engine.eventEngine)
        self.accountM = AccountMonitor(self.engine.eventEngine)

        self.engine.writeNotification(u'{0},服务启动{1}'.format(datetime.now(),self. gateway_name))

    # ----------------------------------------------------------------------
    def eventHandler(self, event):
        """事件处理"""
        try:
            # 调用RpcServer.publish()
            if isinstance(event.type_, str):
                self.publish(event.type_, event)
            else:
                self.publish(event.type_.encode('utf-8'), event)

        except Exception as ex:
            print( u'event Handler exception:{0}'.format(str(ex)))

    # ----------------------------------------------------------------------
    def stopServer(self):
        """停止服务器"""
        print( 'stopServer')
        # 关闭引擎
        self.engine.exit()
        # 停止服务器线程
        self.stop()