Beispiel #1
0
def no_ui_run():
    ee = EventEngine()
    me = MainEngine(ee)

    me.connect('CTP')
    me.dbConnect()

    ce = CtaEngine(me, ee)
    ce.loadSetting()
    # strategyManager = CtaStrategyManager(self.ctaEngine, self.eventEngine, name)

    ce.initAll()
    ce.startAll()
Beispiel #2
0
def runChildProcess():
    """子进程运行函数"""
    print('-' * 20)

    # 创建日志引擎
    le = LogEngine()
    le.setLogLevel(le.LEVEL_INFO)
    le.addConsoleHandler()
    le.addFileHandler()

    le.info(u'启动CTA策略运行子进程')

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

    me = MainEngine(ee)
    me.addGateway(ctpGateway)
    me.addApp(ctaStrategy)
    le.info(u'主引擎创建成功')

    ee.register(EVENT_LOG, le.processLogEvent)
    ee.register(EVENT_CTA_LOG, le.processLogEvent)
    ee.register(EVENT_ERROR, processErrorEvent)
    le.info(u'注册日志事件监听')

    me.dbConnect()

    me.connect('CTP')
    le.info(u'连接CTP接口')

    sleep(10)  # 等待CTP接口初始化
    me.dataEngine.saveContracts()  # 保存合约信息到文件

    cta = me.getApp(ctaStrategy.appName)

    cta.loadSetting()
    le.info(u'CTA策略载入成功')

    cta.initAll()
    le.info(u'CTA策略初始化成功')

    cta.startAll()
    le.info(u'CTA策略启动成功')

    while True:
        sleep(1)
Beispiel #3
0
def runBacktestingProcess():
    """子进程运行函数"""
    print('-' * 20)

    # 创建日志引擎
    le = LogEngine()
    le.setLogLevel(le.LEVEL_INFO)
    le.addConsoleHandler()
    le.addFileHandler()

    le.info(u'启动CTA策略运行子进程')

    ee = EventEngine2()

    me = MainEngine(ee)

    me.addApp(ctaStrategy)

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

    ee.register(EVENT_LOG, le.processLogEvent)
    ee.register(EVENT_CTA_LOG, le.processLogEvent)
    ee.register(EVENT_ERROR, processErrorEvent)
    le.info(u'注册日志事件监听')

    me.dbConnect()
    le.info("连接数据库")

    cta = me.getApp(ctaStrategy.appName)

    cta.loadSetting()
    le.info(u'CTA策略载入成功')

    cta.setBackTestingMode()
    le.info(u'运行CTA策略回测')

    cta.runBacktesting()

    cta.stopAll()
    ee.stop()

    while True:
        sleep(1)
Beispiel #4
0
class NoUiMain(object):
    def __init__(self):
        # gateway 是否连接
        self.connected = False
        # gateway 的连接名称,在vtEngine.initGateway()里面定义,对应的配置文件是 "连接名称_connect.json",
        self.gateway_name = 'CTP'
        # 启动的策略实例,须在catAlgo/CtaSetting.json 里面定义  [u'S28_RB1001', u'S28_TFT', u'S28_HCRB',u'atr_rsi']
        self.strategies = [u'strategyAtrRsi']

        self.g_count = 0
        self.disconnect_signal = 0

        self.last_dt = datetime.now()

        # 实例化 主引擎
        print u'instance mainengine'
        self.mainEngine = MainEngine()

        self.mainEngine.addGateway(ctpGateway, self.gateway_name)

    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=30, second=0, microsecond=0)
        c = datetime.now().replace(hour=15, minute=30, second=0, microsecond=0)
        d = datetime.now().replace(hour=20, minute=30, 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.mainEngine:
            self.mainEngine.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()
        if dt.hour != self.last_dt.hour:
            self.last_dt = dt
            print u'noUiMain.py checkpoint:{0}'.format(dt)
            self.mainEngine.writeLog(u'noUiMain.py checkpoint:{0}'.format(dt))

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

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

                if self.disconnect_signal >= 5:
                    self.mainEngine.writeLog(u'检查连接{0}异常,重新启动连接'.format(
                        self.gateway_name))
                    self.mainEngine.writeLog(u'断开连接{0}'.format(
                        self.gateway_name))
                    self.disconnect()
                    self.mainEngine.clearData()
                    self.connected = False
            else:
                self.disconnect_signal = 0


#

    def Start(self):
        """启动"""

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

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

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

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

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

        # 所有的日志监控
        self.logM = LogMonitor(self.mainEngine.eventEngine)
        self.errorM = ErrorMonitor(self.mainEngine.eventEngine)
        self.tradeM = TradeMonitor(self.mainEngine.eventEngine)
        self.orderM = OrderMonitor(self.mainEngine.eventEngine,
                                   self.mainEngine)
        self.positionM = PositionMonitor(self.mainEngine.eventEngine)
        self.accountM = AccountMonitor(self.mainEngine.eventEngine)
Beispiel #5
0
def runChildProcess():
    """子进程运行函数"""
    print('-' * 20)

    # 创建日志引擎
    le = LogEngine()
    le.setLogLevel(le.LEVEL_INFO)
    le.addConsoleHandler()
    le.addFileHandler()

    le.info(u'启动CTA策略运行子进程')

    DAY_START = time(19, 00)  # 日盘启动和停止时间
    DAY_END = time(19, 43)

    cta = None  # 子进程句柄

    while True:
        currentTime = datetime.now().time()
        recording = False

        # 判断当前处于的时间段
        if (currentTime >= DAY_START and currentTime <= DAY_END):
            recording = True
        else:
            le.info(u'未在启动时间段')

        # 记录时间则需要启动子进程
        if recording and cta is None:
            ee = EventEngine2()
            #le.info(u'事件引擎创建成功')

            me = MainEngine(ee)

            #连接数据库
            me.dbConnect()
            le.info("连接数据库")

            me.addGateway(tushareGateway)
            me.addApp(dataRecorderCT)
            me.addApp(ctaStrategy)

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

            ee.register(EVENT_LOG, le.processLogEvent)
            ee.register(EVENT_CTA_LOG, le.processLogEvent)
            ee.register(EVENT_ERROR, processErrorEvent)
            le.info(u'注册日志事件监听')

            #连接数据接口
            me.connect(tushareGateway.gatewayName)
            le.info(u'连接TUSHARE接口')

            #sleep(10)    # 等待CTP接口初始化

            cta = me.getApp(ctaStrategy.appName)

            cta.loadSetting()
            le.info(u'CTA策略载入成功')

            cta.initAll()
            le.info(u'CTA策略初始化成功')

            cta.startAll()
            le.info(u'CTA策略启动成功')

        # 非记录时间则退出子进程
        if not recording and cta is not None:

            cta.stopAll()

            ee.stop()

            le.info(u'关闭子进程')

            return

        sleep(5)
Beispiel #6
0
def runChildProcess():
    """子进程运行函数"""
    # print '-'*20

    # 创建日志引擎
    le = LogEngine()
    le.setLogLevel(le.LEVEL_INFO)
    le.addConsoleHandler()
    le.addFileHandler()
    le.info(u'启动行情记录运行子进程')

    # 创建主引擎
    me = MainEngine()

    ee = me.eventEngine
    ee.register(EVENT_LOG, le.processLogEvent)
    ee.register(EVENT_CTA_LOG, le.processLogEvent)
    ee.register(EVENT_ERROR, processErrorEvent)

    try:
        # 添加交易接口
        try:
            me.addGateway(ctpGateway) 
        except:
            pass
        
        # 添加上层应用
        me.addApp(riskManager)
        me.addApp(dataRecorder)
        #fix: 当服务端初始化完毕后再开启rpcService
        #me.addApp(rpcService)
        me.addApp(ctaStrategy)
        me.addApp(spreadTrading)
        me.addApp(algoTrading)
        
        le.info(u'主引擎创建成功')

        # 自动建立MongoDB数据库
        me.dbConnect()
        le.info(u'connect MongoDB')

        # 自动建立CTP链接
        me.connect('CTP')
        le.info(u'连接CTP接口')

        # 取仓位信息
        me.qryPosition("CTP")

        while not me.getAllContracts():
            sleep(5)
            le.info(u'收集合约信息...')

        sleep(3)
        le.info(u'合约信息中数量: %s' % len(me.getAllContracts()))
        # 及时保存数据引擎里的合约数据到硬盘
        me.dataEngine.saveContracts()

        #服务端初始化完成

        #开启RPC
        me.addApp(rpcService)
        le.info(u'开启RPCService')

        '''
        bug-fix: 休息,以便于客户端连接上来收CTP信息
        '''
        sleep(5.)

        #CTP连接完成,发送重启信号
        event = Event(EVENT_CTP_RESTARTED)
        me.eventEngine.put(event)
        le.info(u'通知客户端CTP RESTART')

        while True:
            sleep(1)
    except KeyboardInterrupt:
        le.info(u"Keyboard interrupt in process")
    finally:
        le.info(u"cleaning up")