Exemplo n.º 1
0
    def updateUI(self, stra):
        try:
            # stra 状态没有变化不需要更新UI
            if not stra.isUpdated():
                return

            for plateName in stra.plateDict:
                plateSymbolList = stra.plateDict[plateName]["symbol_list"]
                plateCatchedSymobolList = stra.plateDict[plateName][
                    "catched_symbol"]
                plateMissedSymbolList = stra.plateDict[plateName][
                    "missed_symbol"]

                event1 = Event(type_=EVENT_STRATEGY_CATCH_LIMITUP_STATUS)

                catchLimitUpInfo = VtStrategyCatchLimitUpInfo()
                event1.dict_['data'] = catchLimitUpInfo

                catchLimitUpInfo.plateName = plateName
                catchLimitUpInfo.numOfStocks = len(plateSymbolList)
                catchLimitUpInfo.catchedStocks = len(plateCatchedSymobolList)
                catchLimitUpInfo.missedStocks = len(plateMissedSymbolList)

                self.eventEngine.put(event1)

            stra.resetUpdatedFlag()
        except:
            traceback.print_exc()
Exemplo n.º 2
0
 def onOptionTick(self, optionTick):
     try:
         # 期权价格信息推送
         event1 = Event(type_=EVENT_OPTION_TICK)
         event1.dict_['data'] = optionTick
         self.eventEngine.put(event1)
     except:
         traceback.print_exc()
Exemplo n.º 3
0
 def writeLog(self, content):
     """快速发出日志事件"""
     log = VtLogData()
     log.logContent = content
     log.gatewayName = 'SLIPPERY_GRID_ENGINE'
     event = Event(type_=EVENT_LOG)
     event.dict_['data'] = log
     self.eventEngine.put(event)
Exemplo n.º 4
0
 def writeLog(self, content):
     try:
         log = VtLogData()
         log.logContent = content
         log.gatewayName = 'OPTION_SELECTOR_ENGINE'
         event = Event(type_=EVENT_LOG)
         event.dict_['data'] = log
         self.eventEngine.put(event)
     except:
         traceback.print_exc()
Exemplo n.º 5
0
 def writeLog(self, content):
     try:
         """快速发出日志事件"""
         log = VtLogData()
         log.logContent = content
         log.gatewayName = 'CATCH_LIMITUP_ENGINE'
         event = Event(type_=EVENT_LOG)
         event.dict_['data'] = log
         self.eventEngine.put(event)
     except:
         traceback.print_exc()
Exemplo n.º 6
0
 def writeLog(self, content):
     try:
         """快速发出日志事件"""
         log = VtLogData()
         log.logContent = content
         log.gatewayName = 'STOPORDER_MAIN_WINDOW'
         event = Event(type_=EVENT_LOG)
         event.dict_['data'] = log
         self.eventEngine.put(event)
     except:
         traceback.print_exc()
Exemplo n.º 7
0
    def updateUI(self, stra):
        try:
            event1 = Event(type_=EVENT_STRATEGY_STOP_ORDER_STATUS)

            straStatus = VtStrategyStopOrderStatus()
            event1.dict_['data'] = straStatus

            straStatus.strategyID = stra.strategyID
            straStatus.status = stra.status
            if stra.thresholdPriceEnabled:
                # 已经获取了真实的threshold值,则显示真实数值
                if stra.realThresholdPrice:
                    straStatus.thresholdInfo = stra.startThresholdDirection + str(
                        stra.realThresholdPrice)
                # 否则用用户输入代替显示信息
                else:
                    suffix = ""
                    if stra.thresholdIsPct:
                        suffix = u"百分比"
                    straStatus.thresholdInfo = stra.startThresholdDirection + suffix + str(
                        stra.thresholdPrice)

                # 用V X标识价格是否已经冲破 threshold
                if stra.isThresholdPriceBroken:
                    straStatus.thresholdInfo = "V" + straStatus.thresholdInfo
                else:
                    straStatus.thresholdInfo = "X" + straStatus.thresholdInfo
            else:
                straStatus.thresholdInfo = "无限制"
            straStatus.ownerPrice = stra.getOwnerPrice()
            straStatus.ownerMaxMinPrice = stra.getOwnerMaxMinPrice()
            straStatus.triggerPrice = stra.getTriggerPrice()
            straStatus.crossDirection = stra.crossDirection
            straStatus.tradeDirection = stra.tradeDirection
            straStatus.volume = stra.volume
            straStatus.orderVolume = stra.volume

            self.eventEngine.put(event1)
        except:
            traceback.print_exc()
Exemplo n.º 8
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")
Exemplo n.º 9
0
class CtaStrategyManager(QtGui.QGroupBox):
    """策略管理组件"""
    signal = QtCore.pyqtSignal(type(Event()))

    # ----------------------------------------------------------------------
    def __init__(self, cta_engine, event_engine, name, parent=None):
        """Constructor"""
        super(CtaStrategyManager, self).__init__(parent)

        self.ctaEngine = cta_engine
        self.eventEngine = event_engine
        self.name = name

        self.initUi()
        self.updateMonitor()
        self.registerEvent()

    # ----------------------------------------------------------------------
    def initUi(self):
        """初始化界面"""
        self.setTitle(self.name)

        self.paramMonitor = CtaValueMonitor(self)
        self.varMonitor = CtaValueMonitor(self)

        max_height = 60
        self.paramMonitor.setMaximumHeight(max_height)
        self.varMonitor.setMaximumHeight(max_height)

        button_init = QtGui.QPushButton(u'初始化')
        button_start = QtGui.QPushButton(u'启动')
        button_stop = QtGui.QPushButton(u'停止')
        button_init.clicked.connect(self.init)
        button_start.clicked.connect(self.start)
        button_stop.clicked.connect(self.stop)

        hbox1 = QtGui.QHBoxLayout()
        hbox1.addWidget(button_init)
        hbox1.addWidget(button_start)
        hbox1.addWidget(button_stop)
        hbox1.addStretch()

        hbox2 = QtGui.QHBoxLayout()
        hbox2.addWidget(self.paramMonitor)

        hbox3 = QtGui.QHBoxLayout()
        hbox3.addWidget(self.varMonitor)

        vbox = QtGui.QVBoxLayout()
        vbox.addLayout(hbox1)
        vbox.addLayout(hbox2)
        vbox.addLayout(hbox3)

        self.setLayout(vbox)

    # ----------------------------------------------------------------------
    def updateMonitor(self, event=None):
        """显示策略最新状态"""
        param_dict = self.ctaEngine.getStrategyParam(self.name)
        if param_dict:
            self.paramMonitor.updateData(param_dict)

        var_dict = self.ctaEngine.getStrategyVar(self.name)
        if var_dict:
            self.varMonitor.updateData(var_dict)

    # ----------------------------------------------------------------------
    def registerEvent(self):
        """注册事件监听"""
        self.signal.connect(self.updateMonitor)
        self.eventEngine.register(EVENT_CTA_STRATEGY + self.name,
                                  self.signal.emit)

    # ----------------------------------------------------------------------
    def init(self):
        """初始化策略"""
        self.ctaEngine.initStrategy(self.name)

    # ----------------------------------------------------------------------
    def start(self):
        """启动策略"""
        self.ctaEngine.startStrategy(self.name)

    # ----------------------------------------------------------------------
    def stop(self):
        """停止策略"""
        self.ctaEngine.stopStrategy(self.name)
Exemplo n.º 10
0
class CtaEngineManager(QtGui.QWidget):
    """CTA引擎管理组件"""
    signal = QtCore.pyqtSignal(type(Event()))

    # ----------------------------------------------------------------------
    def __init__(self, cta_engine, event_engine, parent=None):
        """Constructor"""
        super(CtaEngineManager, self).__init__(parent)

        self.ctaEngine = cta_engine
        self.eventEngine = event_engine

        self.strategyLoaded = False

        self.initUi()
        self.registerEvent()

        # 记录日志
        self.ctaEngine.writeCtaLog(u'CTA引擎启动成功')

    # ----------------------------------------------------------------------
    def initUi(self):
        """初始化界面"""
        self.setWindowTitle(u'CTA策略')

        # 按钮
        load_button = QtGui.QPushButton(u'加载策略')
        init_all_button = QtGui.QPushButton(u'全部初始化')
        start_all_button = QtGui.QPushButton(u'全部启动')
        stop_all_button = QtGui.QPushButton(u'全部停止')

        load_button.clicked.connect(self.load)
        init_all_button.clicked.connect(self.initAll)
        start_all_button.clicked.connect(self.startAll)
        stop_all_button.clicked.connect(self.stopAll)

        # 滚动区域,放置所有的CtaStrategyManager
        self.scrollArea = QtGui.QScrollArea()
        self.scrollArea.setWidgetResizable(True)

        # CTA组件的日志监控
        self.ctaLogMonitor = QtGui.QTextEdit()
        self.ctaLogMonitor.setReadOnly(True)
        self.ctaLogMonitor.setMaximumHeight(200)

        # 设置布局
        hbox2 = QtGui.QHBoxLayout()
        hbox2.addWidget(load_button)
        hbox2.addWidget(init_all_button)
        hbox2.addWidget(start_all_button)
        hbox2.addWidget(stop_all_button)
        hbox2.addStretch()

        vbox = QtGui.QVBoxLayout()
        vbox.addLayout(hbox2)
        vbox.addWidget(self.scrollArea)
        vbox.addWidget(self.ctaLogMonitor)
        self.setLayout(vbox)

    # ----------------------------------------------------------------------
    def initStrategyManager(self):
        """初始化策略管理组件界面"""
        w = QtGui.QWidget()
        vbox = QtGui.QVBoxLayout()

        for name in self.ctaEngine.strategyDict.keys():
            strategy_manager = CtaStrategyManager(self.ctaEngine,
                                                  self.eventEngine, name)
            vbox.addWidget(strategy_manager)

        vbox.addStretch()

        w.setLayout(vbox)
        self.scrollArea.setWidget(w)

    # ----------------------------------------------------------------------
    def initAll(self):
        """全部初始化"""
        for name in self.ctaEngine.strategyDict.keys():
            self.ctaEngine.initStrategy(name)

    # ----------------------------------------------------------------------
    def startAll(self):
        """全部启动"""
        for name in self.ctaEngine.strategyDict.keys():
            self.ctaEngine.startStrategy(name)

    # ----------------------------------------------------------------------
    def stopAll(self):
        """全部停止"""
        for name in self.ctaEngine.strategyDict.keys():
            self.ctaEngine.stopStrategy(name)

    # ----------------------------------------------------------------------
    def load(self):
        """加载策略"""
        if not self.strategyLoaded:
            self.ctaEngine.loadSetting()
            self.initStrategyManager()
            self.strategyLoaded = True
            self.ctaEngine.writeCtaLog(u'策略加载成功')

    # ----------------------------------------------------------------------
    def updateCtaLog(self, event):
        """更新CTA相关日志"""
        log = event.dict_['data']
        content = '\t'.join([log.logTime, log.logContent])
        self.ctaLogMonitor.append(content)

    # ----------------------------------------------------------------------
    def registerEvent(self):
        """注册事件监听"""
        self.signal.connect(self.updateCtaLog)
        self.eventEngine.register(EVENT_CTA_LOG, self.signal.emit)
Exemplo n.º 11
0
class SlipperyGridMainWindow(QtWidgets.QWidget):

    signalParam = QtCore.Signal(type(Event()))

    def __init__(self, strategyEngine, eventEngine, parent=None):
        super(SlipperyGridMainWindow, self).__init__(parent)

        self.strategyEngine = strategyEngine
        self.eventEngine = eventEngine

        self.sigFunParam = self.signalParam.emit

        self.strategyEngine.start()

        self.initUi()
        self.registerEvent()

    def initUi(self):
        self.setWindowTitle(u"滑头网格策略")

        labelStockOwner = QLabel(u"正股代码")
        labelStockP = QLabel(u"正向标的代码")
        labelStockN = QLabel(u"负向标的代码")
        labelOnlyOwner = QLabel(u"只正股")
        labelBiDirection = QLabel(u"双向")
        self.lineStockOwner = QLineEdit()
        self.lineStockP = QLineEdit()
        self.lineStockN = QLineEdit()
        self.checkBoxOnlyOwner = QCheckBox()
        self.checkBoxDiDirection = QCheckBox()

        gridTop = QGridLayout()
        gridTop.addWidget(labelStockOwner, 0, 0)
        gridTop.addWidget(self.lineStockOwner, 0, 1)
        gridTop.addWidget(labelStockP, 0, 2)
        gridTop.addWidget(self.lineStockP, 0, 3)
        gridTop.addWidget(labelStockN, 1, 2)
        gridTop.addWidget(self.lineStockN, 1, 3)
        gridTop.addWidget(labelOnlyOwner, 2, 0)
        gridTop.addWidget(self.checkBoxOnlyOwner, 2, 1)
        gridTop.addWidget(labelBiDirection, 3, 0)
        gridTop.addWidget(self.checkBoxDiDirection, 3, 1)

        self.setLayout(gridTop)

        # 关联UI事件
        self.lineStockOwner.returnPressed.connect(self.qryStockRelationship)

    def qryStockRelationship(self):
        stockOwnerCode = self.lineStockOwner.text()
        if stockOwnerCode in self.strategyEngine.stockOwnership:
            stockPCode = self.strategyEngine.stockOwnership[stockOwnerCode][
                'positive']
            stockNCode = self.strategyEngine.stockOwnership[stockOwnerCode][
                'negative']
            self.lineStockP.setText(stockPCode)
            self.lineStockN.setText(stockNCode)

        #注册UI事件处理
        stockList = [stockOwnerCode, stockPCode, stockNCode]
        self.strategyEngine.subscribe(stockList)

    def registerEvent(self):
        pass