コード例 #1
0
class ContractManager(QtWidgets.QWidget):
    """合约管理组件"""
    signal = QtCore.Signal(type(Event()))

    # ----------------------------------------------------------------------
    def __init__(self, mainEngine, eventEngine, parent):
        """Constructor"""
        super(ContractManager, self).__init__(parent=parent)

        self.eventEngine = eventEngine
        self.mainEngine = mainEngine
        self.parent = parent
        self.initUi()

    # ----------------------------------------------------------------------
    def initUi(self):
        """初始化界面"""
        self.lineSymbol = QtWidgets.QLineEdit(u'rb1805')
        self.pushButton = QtWidgets.QPushButton(u'订阅合约')

        self.pushButton.clicked.connect(self.symbolTextSelect)
        hbox = QtWidgets.QHBoxLayout()
        hbox.addWidget(self.lineSymbol)
        hbox.addWidget(self.pushButton)
        hbox.addStretch()

        vbox = QtWidgets.QVBoxLayout()
        vbox.addLayout(hbox)

        self.setLayout(vbox)

    def symbolTextSelect(self):
        self.symbolText = self.lineSymbol.text()
        print(self.symbolText)
        if self.symbolText:
            self.parent.loadKlineData(str(self.symbolText))
コード例 #2
0
ファイル: uiCtaWidget.py プロジェクト: gongkai90000/2010test
class CtaStrategyManager(QtWidgets.QGroupBox):
    """策略管理组件"""
    signal = QtCore.Signal(type(Event()))

    #----------------------------------------------------------------------
    def __init__(self, ctaEngine, eventEngine, name, parent=None):
        """Constructor"""
        super(CtaStrategyManager, self).__init__(parent)
        
        self.ctaEngine = ctaEngine
        self.eventEngine = eventEngine
        self.name = name
        
        self.initUi()
        self.updateMonitor()
        self.registerEvent()
        
    #----------------------------------------------------------------------
    def initUi(self):
        """初始化界面"""
        self.setTitle(self.name)
        
        self.paramMonitor = CtaValueMonitor(self)
        self.varMonitor = CtaValueMonitor(self)
        
        height = 65
        self.paramMonitor.setFixedHeight(height)
        self.varMonitor.setFixedHeight(height)
        
        buttonInit = QtWidgets.QPushButton(text.INIT)
        buttonStart = QtWidgets.QPushButton(text.START)
        buttonStop = QtWidgets.QPushButton(text.STOP)
        buttonInit.clicked.connect(self.init)
        buttonStart.clicked.connect(self.start)
        buttonStop.clicked.connect(self.stop)
        
        hbox1 = QtWidgets.QHBoxLayout()     
        hbox1.addWidget(buttonInit)
        hbox1.addWidget(buttonStart)
        hbox1.addWidget(buttonStop)
        hbox1.addStretch()
        
        hbox2 = QtWidgets.QHBoxLayout()
        hbox2.addWidget(self.paramMonitor)
        
        hbox3 = QtWidgets.QHBoxLayout()
        hbox3.addWidget(self.varMonitor)
        
        vbox = QtWidgets.QVBoxLayout()
        vbox.addLayout(hbox1)
        vbox.addLayout(hbox2)
        vbox.addLayout(hbox3)

        self.setLayout(vbox)
        
    #----------------------------------------------------------------------
    def updateMonitor(self):
        """显示策略最新状态"""
        paramDict = self.ctaEngine.getStrategyParam(self.name)
        if paramDict:
            self.paramMonitor.updateData(paramDict)
            
        varDict = self.ctaEngine.getStrategyVar(self.name)
        if varDict:
            self.varMonitor.updateData(varDict)        
    
    #----------------------------------------------------------------------
    def updateVar(self, event):
        """更新策略变量"""
        data = event.dict_['data']
        self.varMonitor.updateData(data)
    
    #----------------------------------------------------------------------
    def registerEvent(self):
        """注册事件监听"""
        self.signal.connect(self.updateVar)
        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)
コード例 #3
0
ファイル: uiCtaWidget.py プロジェクト: gongkai90000/2010test
class CtaEngineManager(QtWidgets.QWidget):
    """CTA引擎管理组件"""
    signal = QtCore.Signal(type(Event()))

    #----------------------------------------------------------------------
    def __init__(self, ctaEngine, eventEngine, parent=None):
        """Constructor"""
        super(CtaEngineManager, self).__init__(parent)
        
        self.ctaEngine = ctaEngine
        self.eventEngine = eventEngine
        
        self.strategyLoaded = False
        
        self.initUi()
        self.registerEvent()
        
        # 记录日志
        self.ctaEngine.writeCtaLog(text.CTA_ENGINE_STARTED)        
        
    #----------------------------------------------------------------------
    def initUi(self):
        """初始化界面"""
        self.setWindowTitle(text.CTA_STRATEGY)
        
        # 按钮
        loadButton = QtWidgets.QPushButton(text.LOAD_STRATEGY)
        initAllButton = QtWidgets.QPushButton(text.INIT_ALL)
        startAllButton = QtWidgets.QPushButton(text.START_ALL)
        stopAllButton = QtWidgets.QPushButton(text.STOP_ALL)
        
        loadButton.clicked.connect(self.load)
        initAllButton.clicked.connect(self.initAll)
        startAllButton.clicked.connect(self.startAll)
        stopAllButton.clicked.connect(self.stopAll)
        
        # 滚动区域,放置所有的CtaStrategyManager
        self.scrollArea = QtWidgets.QScrollArea()
        self.scrollArea.setWidgetResizable(True)
        
        # CTA组件的日志监控
        self.ctaLogMonitor = QtWidgets.QTextEdit()
        self.ctaLogMonitor.setReadOnly(True)
        self.ctaLogMonitor.setMaximumHeight(200)
        
        # 设置布局
        hbox2 = QtWidgets.QHBoxLayout()
        hbox2.addWidget(loadButton)
        hbox2.addWidget(initAllButton)
        hbox2.addWidget(startAllButton)
        hbox2.addWidget(stopAllButton)
        hbox2.addStretch()
        
        vbox = QtWidgets.QVBoxLayout()
        vbox.addLayout(hbox2)
        vbox.addWidget(self.scrollArea)
        vbox.addWidget(self.ctaLogMonitor)
        self.setLayout(vbox)
        
    #----------------------------------------------------------------------
    def initStrategyManager(self):
        """初始化策略管理组件界面"""        
        w = QtWidgets.QWidget()
        vbox = QtWidgets.QVBoxLayout()
        
        l = self.ctaEngine.getStrategyNames()
        for name in l:
            strategyManager = CtaStrategyManager(self.ctaEngine, self.eventEngine, name)
            vbox.addWidget(strategyManager)
        
        vbox.addStretch()
        
        w.setLayout(vbox)
        self.scrollArea.setWidget(w)   
        
    #----------------------------------------------------------------------
    def initAll(self):
        """全部初始化"""
        self.ctaEngine.initAll()    
            
    #----------------------------------------------------------------------
    def startAll(self):
        """全部启动"""
        self.ctaEngine.startAll()
            
    #----------------------------------------------------------------------
    def stopAll(self):
        """全部停止"""
        self.ctaEngine.stopAll()
            
    #----------------------------------------------------------------------
    def load(self):
        """加载策略"""
        if not self.strategyLoaded:
            self.ctaEngine.loadSetting()
            self.initStrategyManager()
            self.strategyLoaded = True
            self.ctaEngine.writeCtaLog(text.STRATEGY_LOADED)
        
    #----------------------------------------------------------------------
    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)
コード例 #4
0
ファイル: uiCmaWidget.py プロジェクト: frikyalong/vnpy
class CmaStrategyManager(QtWidgets.QGroupBox):
    """策略管理组件"""
    signal = QtCore.Signal(type(Event()))

    #----------------------------------------------------------------------
    def __init__(self, cmaEngine, eventEngine, name, parent=None):
        """Constructor"""
        super(CmaStrategyManager, self).__init__(parent)
        
        self.cmaEngine = cmaEngine
        self.eventEngine = eventEngine
        self.name = name
        
        self.initUi()
        self.updateMonitor()
        self.registerEvent()
        
    #----------------------------------------------------------------------
    def initUi(self):
        """初始化界面"""
        self.setTitle(self.name)
        
        self.paramMonitor = CmaValueMonitor(self)           # 参数监控
        self.varMonitor = CmaValueMonitor(self)             # 变量监控
        
        height = 80
        self.paramMonitor.setFixedHeight(height)
        self.varMonitor.setFixedHeight(height)

        buttonInit = QtWidgets.QPushButton(text.INIT)
        buttonStart = QtWidgets.QPushButton(text.START)
        buttonStop = QtWidgets.QPushButton(text.STOP)
        buttonInitForce = QtWidgets.QPushButton(text.FORCEINIT)
        buttonInit.clicked.connect(self.init)
        buttonStart.clicked.connect(self.start)
        buttonStop.clicked.connect(self.stop)
        buttonInitForce.clicked.connect(self.initForce)
        
        hbox1 = QtWidgets.QHBoxLayout()
        hbox1.addWidget(buttonInit)
        hbox1.addWidget(buttonStart)
        hbox1.addWidget(buttonStop)
        hbox1.addWidget(buttonInitForce)

        hbox1.addStretch()
        
        hbox2 = QtWidgets.QHBoxLayout()
        hbox2.addWidget(self.paramMonitor)
        
        hbox3 = QtWidgets.QHBoxLayout()
        hbox3.addWidget(self.varMonitor)
        
        vbox = QtWidgets.QVBoxLayout()
        vbox.addLayout(hbox1)
        vbox.addLayout(hbox2)
        vbox.addLayout(hbox3)

        self.setLayout(vbox)
        
    #----------------------------------------------------------------------
    def updateMonitor(self, event=None):
        """显示策略最新状态"""

        # 获取策略的参数目录
        paramDict = self.cmaEngine.getStrategyParam(self.name)
        if paramDict:
            self.paramMonitor.updateData(paramDict)

        # 获取策略的变量目录
        varDict = self.cmaEngine.getStrategyVar(self.name)
        if varDict:
            self.varMonitor.updateData(varDict)        
            
    #----------------------------------------------------------------------
    def registerEvent(self):
        """注册事件监听"""

        # 绑定事件的更新函数为updateMonitor
        self.signal.connect(self.updateMonitor)

        # 注册事件
        self.eventEngine.register(EVENT_CTA_STRATEGY+self.name, self.signal.emit)
    
    #----------------------------------------------------------------------
    def init(self):
        """初始化策略"""
        self.cmaEngine.initStrategy(self.name)

    def initForce(self):
        """强制初始化策略"""
        self.cmaEngine.initStrategy(self.name, force = True)

    #----------------------------------------------------------------------
    def start(self):
        """启动策略"""
        self.cmaEngine.startStrategy(self.name)
        
    #----------------------------------------------------------------------
    def stop(self):
        """停止策略"""
        self.cmaEngine.stopStrategy(self.name)
コード例 #5
0
ファイル: uiCmaWidget.py プロジェクト: frikyalong/vnpy
class CmaEngineManager(QtWidgets.QWidget):
    """CTA引擎管理组件"""
    signal = QtCore.Signal(type(Event()))

    #----------------------------------------------------------------------
    def __init__(self, cmaEngine, eventEngine, parent=None):
        """Constructor"""
        super(CmaEngineManager, self).__init__(parent)
        
        self.cmaEngine = cmaEngine
        self.eventEngine = eventEngine
        
        self.strategyLoaded = False
        
        self.initUi()
        self.registerEvent()
        
        # 记录日志
        self.cmaEngine.writeCtaLog(text.CMA_ENGINE_STARTED)
        
    #----------------------------------------------------------------------
    def initUi(self):
        """初始化界面"""
        self.setWindowTitle(u'Cross Market Arbitrage')
        
        # 按钮
        loadButton = QtWidgets.QPushButton(text.LOAD_STRATEGY)
        initAllButton = QtWidgets.QPushButton(text.INIT_ALL)
        startAllButton = QtWidgets.QPushButton(text.START_ALL)
        stopAllButton = QtWidgets.QPushButton(text.STOP_ALL)
        savePositionButton = QtWidgets.QPushButton(text.SAVE_POSITION_DATA)
        
        loadButton.clicked.connect(self.load)
        initAllButton.clicked.connect(self.initAll)
        startAllButton.clicked.connect(self.startAll)
        stopAllButton.clicked.connect(self.stopAll)

        # 滚动区域,放置所有的CtaStrategyManager
        self.scrollArea = QtWidgets.QScrollArea()
        self.scrollArea.setWidgetResizable(True)
        
        # CTA组件的日志监控
        self.cmaLogMonitor = QtWidgets.QTextEdit()
        self.cmaLogMonitor.setReadOnly(True)
        self.cmaLogMonitor.setMaximumHeight(200)
        
        # 设置布局
        hbox2 = QtWidgets.QHBoxLayout()
        hbox2.addWidget(loadButton)
        hbox2.addWidget(initAllButton)
        hbox2.addWidget(startAllButton)
        hbox2.addWidget(stopAllButton)
        hbox2.addWidget(savePositionButton)
        hbox2.addStretch()
        
        vbox = QtWidgets.QVBoxLayout()
        vbox.addLayout(hbox2)
        vbox.addWidget(self.scrollArea)
        vbox.addWidget(self.cmaLogMonitor)
        self.setLayout(vbox)
        
    # ----------------------------------------------------------------------
    def initStrategyManager(self):
        """初始化策略管理组件界面"""        
        w = QtWidgets.QWidget()
        vbox = QtWidgets.QVBoxLayout()
        
        for name in self.cmaEngine.strategyDict.keys():
            # 为每一个策略实例,创建对应的管理组件实例
            strategyManager = CmaStrategyManager(self.cmaEngine, self.eventEngine, name)
            vbox.addWidget(strategyManager)
            sleep(0.2)
        
        vbox.addStretch()
        
        w.setLayout(vbox)
        self.scrollArea.setWidget(w)   
        
    # ----------------------------------------------------------------------
    def initAll(self):
        """全部初始化"""
        for name in self.cmaEngine.strategyDict.keys():
            self.cmaEngine.initStrategy(name)
            
    # ----------------------------------------------------------------------
    def startAll(self):
        """全部启动"""
        for name in self.cmaEngine.strategyDict.keys():
            self.cmaEngine.startStrategy(name)
            
    # ----------------------------------------------------------------------
    def stopAll(self):
        """全部停止"""
        for name in self.cmaEngine.strategyDict.keys():
            self.cmaEngine.stopStrategy(name)
            
    # ----------------------------------------------------------------------
    def load(self):
        """加载策略"""
        if not self.strategyLoaded:
            try:
                self.cmaEngine.loadSetting()
                self.initStrategyManager()
                self.strategyLoaded = True
                self.cmaEngine.writeCtaLog(text.STRATEGY_LOADED)
            except Exception as ex:
                self.cmaEngine.writeCtaError(str(ex))
                traceback.print_exc()
        
    # ----------------------------------------------------------------------
    def updateCtaLog(self, event):
        """更新CTA相关日志"""
        log = event.dict_['data']
        content = '\t'.join([log.logTime, log.logContent])
        self.cmaLogMonitor.append(content)
    
    # ----------------------------------------------------------------------
    def registerEvent(self):
        """注册事件监听"""
        self.signal.connect(self.updateCtaLog)
        self.eventEngine.register(EVENT_CTA_LOG, self.signal.emit)
コード例 #6
0
ファイル: uiMultiRpcMonitor.py プロジェクト: zenozxu/vnpy
class RpcServerMonitor(QtWidgets.QWidget):
    #RPC服务端监控容器组件
    #1)连接服务端,gw名称,
    #2)连接状态;操作:停止服务端,停止gw连接,启动gw连接)
    #3)CtaEngineMonitorWidget
    #4)RpcEventLogMonitor Warning\Error\Nofification\Critical Log

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

    # ----------------------------------------------------------------------
    def __init__(self, name, req_addr, sub_addr, sub_topics, parent=None):
        """Constructor"""
        super(RpcServerMonitor, self).__init__(parent)
        self.name = name  # rpc Gateway Name
        self.reqAddress = req_addr  # Request/Response Port
        self.pubAddress = sub_addr  # Subscribe Port
        self.subscribeTopics = sub_topics  # subscribe Topics

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

        self.rpc_client = None
        self.mainEngine = None

        self.server_info_monitor = None

        self.initUi()

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

        # 1) 服务端级别按钮,
        btnConnectRpcServer = QtWidgets.QPushButton(u'Connect {0}'.format(
            self.name))
        btnActivateGateWayConnection = QtWidgets.QPushButton(u'activate CTP')
        btnDeactivateGateway = QtWidgets.QPushButton(u'Deactivate CTP')
        btnQryStatus = QtWidgets.QPushButton(u'Qry Status')

        btnConnectRpcServer.clicked.connect(self.connect_rpc_server)
        btnActivateGateWayConnection.clicked.connect(
            self.activate_gateway_connection)
        btnDeactivateGateway.clicked.connect(
            self.deactivate_gateway_connection)
        btnQryStatus.clicked.connect(self.qryStatus)

        hbox1 = QtWidgets.QHBoxLayout()
        hbox1.addWidget(btnConnectRpcServer)
        hbox1.addWidget(btnActivateGateWayConnection)
        hbox1.addWidget(btnDeactivateGateway)
        hbox1.addWidget(btnQryStatus)

        self.chkCritical = QtWidgets.QCheckBox('Critical')
        self.chkCritical.setChecked(True)
        self.chkError = QtWidgets.QCheckBox('Error')
        self.chkError.setChecked(True)
        self.chkWarning = QtWidgets.QCheckBox('Warning')
        self.chkWarning.setChecked(True)
        self.chkCtaLog = QtWidgets.QCheckBox('CtaLog')
        self.chkCtaLog.setChecked(True)
        self.chkTicks = QtWidgets.QCheckBox('Ticks')
        self.chkTicks.setChecked(False)
        self.chkSignal = QtWidgets.QCheckBox('Signal')
        self.chkSignal.setChecked(True)

        hbox1.addWidget(self.chkCritical)
        hbox1.addWidget(self.chkError)
        hbox1.addWidget(self.chkWarning)
        hbox1.addWidget(self.chkCtaLog)
        hbox1.addWidget(self.chkTicks)
        hbox1.addWidget(self.chkSignal)

        hbox1.addStretch()

        self.server_info_monitor = ServerInfoWidget()

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

        # 2)服务端策略监控widget
        self.ctaMonitor = CtaEngineMonitorWidget(self)  # 参数监控
        self.ctaMonitor.setMinimumHeight(200)
        #self.ctaMonitor.setMinimumWidth(800)

        hbox2 = QtWidgets.QVBoxLayout()
        hbox2.addWidget(self.ctaMonitor)
        self.scrollArea.setLayout(hbox2)

        # 服务端日志监控widget
        self.logMonitor = QtWidgets.QTextEdit()
        self.logMonitor.setReadOnly(True)
        self.logMonitor.setMaximumHeight(200)

        vbox = QtWidgets.QVBoxLayout()
        vbox.addLayout(hbox1)
        vbox.addWidget(self.server_info_monitor)  # 添加服务监控
        vbox.addWidget(self.logMonitor)
        vbox.addWidget(self.scrollArea)

        self.setLayout(vbox)

    def connect_rpc_server(self):
        """连接到远程服务端"""
        if self.rpc_client is not None:
            return

        try:
            self.eventEngine.start(timer=False)
            self.rpc_client = VtClient(self.reqAddress, self.pubAddress,
                                       self.eventEngine)
            # 这里是订阅所有的publish event,也可以指定。
            self.rpc_client.subscribeTopic(self.subscribeTopics)
            self.rpc_client.start()

            # 初始化主引擎和主窗口对象
            self.mainEngine = ClientEngine(self.rpc_client, self.eventEngine)

            self.ctaMonitor.setMainEngine(self.mainEngine)

            # 绑定本地GUI与EventEngine的事件
            self.registerEvent()
        except Exception as ex:
            traceback.print_exc()
            self.logMonitor.append(str(ex))

    def registerEvent(self):
        """注册事件"""
        self.signal.connect(self.processEvent)

        if self.eventEngine:

            self.eventEngine.register(EVENT_CTA_LOG, self.signal.emit)
            self.eventEngine.register(EVENT_STATUS, self.signal.emit)

    def activate_gateway_connection(self):
        """激活服务端连接网关"""
        if self.mainEngine is None:
            return

        try:
            self.mainEngine.connect(self.name)
        except Exception as ex:
            self.logMonitor.append(str(ex))

    def deactivate_gateway_connection(self):
        """服务端网关断开"""
        if self.mainEngine is None:
            return
        try:
            self.mainEngine.disconnect(self.name)
        except:
            pass

    def qryStatus(self):
        if self.mainEngine is None:
            return
        try:
            self.mainEngine.qryStatus()
        except Exception as ex:
            pass

    def processEvent(self, event):
        """"处理事件(入口)"""
        if event.type_ == EVENT_CTA_LOG and self.chkCtaLog.isChecked():
            self.updateCtaLog(event)
            return

        if event.type_ == EVENT_STATUS:
            self.updateStatus(event)
            return

        if event.type_ == EVENT_WARNING and self.chkWarning.isChecked():
            self.updateWarning(event)
            return

        if event.type_ == EVENT_ERROR and self.chkError.isChecked():
            self.updateError(event)
            return

        if event.type_ == EVENT_CRITICAL and self.chkCritical.isChecked():
            self.updateCritical(event)
            return

    def updateStatus(self, event):
        """更新Status"""
        status_dict = event.dict_['data']

        if 'strategies' in status_dict:
            strategies_status_dict = status_dict['strategies']
            self.ctaMonitor.updateStatus(strategies_status_dict)

        if 'ticks' in status_dict and self.chkTicks.isChecked():
            ticks_dict = status_dict['ticks']
            str_dict = json.dumps(ticks_dict, indent=4)
            self.logMonitor.append(str_dict)

        if 'server' in status_dict:
            server_status_dict = status_dict['server']
            self.server_info_monitor.update_status(server_status_dict)

        if 'account' in status_dict:
            account_status = status_dict['account']

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

    # ----------------------------------------------------------------------
    def updateWarning(self, event):
        """更新相关Warning """
        log = event.dict_['data']
        content = '\t'.join([log.logTime, log.logContent])
        self.logMonitor.append(content)
        winsound.PlaySound('err.wav', winsound.SND_ASYNC)

    # ----------------------------------------------------------------------
    def updateError(self, event):
        """更新相关Error """
        log = event.dict_['data']
        content = '\t'.join(
            [log.errorTime, log.errorID, log.errorMsg, log.additionalInfo])
        self.logMonitor.append(content)
        winsound.PlaySound('err.wav', winsound.SND_ASYNC)

    # ----------------------------------------------------------------------
    def updateCritical(self, event):
        """更新相关Critical"""
        log = event.dict_['data']
        content = '\t'.join([log.logTime, log.logContent])
        self.logMonitor.append(content)
        winsound.PlaySound('err.wav', winsound.SND_ASYNC)
コード例 #7
0
class ZzsdEngineManager(QtWidgets.QMainWindow):
    signal = QtCore.Signal(type(Event()))
    signal_tick = QtCore.Signal(type(Event()))

    def __init__(self, zzsdEngine, eventEngine, parent=None):
        """Constructor"""
        super(ZzsdEngineManager, self).__init__(parent)

        self.zzsdEngine = zzsdEngine
        self.eventEngine = eventEngine

        self.name = "zzsd"
        self.stopOrderMonitor = None
        self.klineDay = None
        self.klineOpt = None

        self.dayBarData = {}
        self.hourBarData = {}

        self.initUi()
        self.registerEvent()

        self.currrentSymbol = ""

        # 记录日志
        #self.ctaEngine.writeCtaLog(text.CTA_ENGINE_STARTED)

    #----------------------------------------------------------------------
    def initUi(self):
        """初始化界面"""
        self.setWindowTitle(text.ZZSD_STRATEGY)

        ##log
        logMonitor = LogMonitor(self.zzsdEngine, self.eventEngine)
        widgetLogM, dockLogM = self.createDock(logMonitor, u"log",
                                               QtCore.Qt.LeftDockWidgetArea)
        ##合约
        self.marketMonitor = MarketMonitor(None, self.eventEngine)
        widgetMarketM, dockMarketM = self.createDock(
            self.marketMonitor, vtText.MARKET_DATA,
            QtCore.Qt.LeftDockWidgetArea)

        ##条件单
        self.stopOrderMonitor = StopOrderMonitor(None, self.eventEngine)
        widgetStopOrderM, dockStopOrderM = self.createDock(
            self.stopOrderMonitor, u"条件单", QtCore.Qt.LeftDockWidgetArea)
        self.updateMonitor()  ##更新一下数据

        self.marketMonitor.cellDoubleClicked.connect(self.symbolSelect)
        self.stopOrderMonitor.cellDoubleClicked.connect(self.symbolSelect)

        ##K线跟随

        self.klineOpt = KLineWidget()
        widgetklineOptM, dockklineOptM = self.createDock(
            self.klineOpt, u"操作周期线", QtCore.Qt.RightDockWidgetArea)

        self.klineDay = KLineWidget()
        widgetklineDayM, dockklineDayM = self.createDock(
            self.klineDay, u"周线", QtCore.Qt.RightDockWidgetArea)

    ##显示合约k线
    def symbolSelect(self, row=None, column=None):

        symbol = self.stopOrderMonitor.item(row, 0).text()
        print(symbol)
        if symbol:
            self.loadKlineData(symbol)

    def loadKlineData(self, symbol):

        if self.currrentSymbol == symbol:
            return

        self.currrentSymbol = symbol

        self.loadBar(symbol)

        self.klineDay.clearData()
        self.klineOpt.clearData()

        self.klineOpt.KLtitle.setText(symbol + " opt", size='20pt')
        self.klineOpt.loadDataBarArray(self.hourBarData[symbol].barData)

        self.klineDay.KLtitle.setText(symbol + " day", size='20pt')
        self.klineDay.loadDataBarArray(self.dayBarData[symbol].barData)

    def refreshKline(self, symbol):
        if self.hourBarData.has_key(symbol):
            hourBar = VtBarData()
            hourBar.__dict__ = self.hourBarData[symbol].barData[-1]

            dayBar = VtBarData()
            dayBar.__dict__ = self.dayBarData[symbol].barData[-1]

            #print(hourBar.__dict__)
            #print(dayBar.__dict__)

            self.klineOpt.onBar(hourBar)
            self.klineDay.onBar(dayBar)

    def loadBar(self, symbol):

        if not self.dayBarData.has_key(symbol):
            dbDayList = self.loadAllBarFromDb(DAY_DB_NAME, symbol)

            self.dayBarData[symbol] = BarManager(dbDayList, symbol, isDay=True)

        if not self.hourBarData.has_key(symbol):
            dbHourList = self.loadAllBarFromDb(MINUTE_60_DB_NAME, symbol)
            self.hourBarData[symbol] = BarManager(dbHourList, symbol, 60)

    #----------------------------------------------------------------------
    def loadAllBarFromDb(self, dbName, collectionName):
        """从数据库中读取Bar数据,startDate是datetime对象"""
        d = {}
        if self.zzsdEngine.client:  ##rpc模式
            barData = self.zzsdEngine.client.mainEngine.dbQuery(
                dbName, collectionName, d)
        else:
            barData = self.zzsdEngine.mainEngine.dbQuery(
                dbName, collectionName, d)

        return barData

    def updateMonitor(self):
        ##更新条件单
        varOrders = self.zzsdEngine.getStopOrders()
        self.stopOrderMonitor.updateAllData(varOrders)

    def processTickEvent(self, event):
        """收到事件更新"""
        tick = event.dict_['data']

        if self.dayBarData.has_key(tick.symbol):
            self.dayBarData[tick.symbol].updateTick(tick)

        if self.hourBarData.has_key(tick.symbol):
            self.hourBarData[tick.symbol].updateTick(tick)

        self.refreshKline(tick.symbol)

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

        self.signal_tick.connect(self.processTickEvent)
        self.eventEngine.register(EVENT_TICK, self.signal_tick.emit)

    #----------------------------------------------------------------------
    def createDock(self, widget, widgetName, widgetArea):
        """创建停靠组件"""
        dock = QtWidgets.QDockWidget(widgetName)
        dock.setWidget(widget)
        dock.setObjectName(widgetName)
        dock.setFeatures(dock.DockWidgetFloatable | dock.DockWidgetMovable)
        self.addDockWidget(widgetArea, dock)
        return widget, dock
コード例 #8
0
class DrEngineManager(QtWidgets.QWidget):
    """行情数据记录引擎管理组件"""
    signal = QtCore.Signal(type(Event()))

    #----------------------------------------------------------------------
    def __init__(self, drEngine, eventEngine, parent=None):
        """Constructor"""
        super(DrEngineManager, self).__init__(parent)

        self.drEngine = drEngine
        self.eventEngine = eventEngine

        self.initUi()
        self.updateSetting()
        self.registerEvent()

    #----------------------------------------------------------------------
    def initUi(self):
        """初始化界面"""
        self.setWindowTitle(u'行情数据记录工具')

        # 记录合约配置监控
        tickLabel = QtWidgets.QLabel(u'Tick记录')
        self.tickTable = QtWidgets.QTableWidget()
        self.tickTable.setColumnCount(2)
        self.tickTable.verticalHeader().setVisible(False)
        self.tickTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
        self.tickTable.horizontalHeader().setResizeMode(
            QtWidgets.QHeaderView.Stretch)
        self.tickTable.setAlternatingRowColors(True)
        self.tickTable.setHorizontalHeaderLabels([u'合约代码', u'接口'])

        barLabel = QtWidgets.QLabel(u'Bar记录')
        self.barTable = QtWidgets.QTableWidget()
        self.barTable.setColumnCount(2)
        self.barTable.verticalHeader().setVisible(False)
        self.barTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
        self.barTable.horizontalHeader().setResizeMode(
            QtWidgets.QHeaderView.Stretch)
        self.barTable.setAlternatingRowColors(True)
        self.barTable.setHorizontalHeaderLabels([u'合约代码', u'接口'])

        activeLabel = QtWidgets.QLabel(u'主力合约')
        self.activeTable = QtWidgets.QTableWidget()
        self.activeTable.setColumnCount(2)
        self.activeTable.verticalHeader().setVisible(False)
        self.activeTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
        self.activeTable.horizontalHeader().setResizeMode(
            QtWidgets.QHeaderView.Stretch)
        self.activeTable.setAlternatingRowColors(True)
        self.activeTable.setHorizontalHeaderLabels([u'主力代码', u'合约代码'])

        # 日志监控
        self.logMonitor = QtWidgets.QTextEdit()
        self.logMonitor.setReadOnly(True)
        self.logMonitor.setMinimumHeight(600)

        # 设置布局
        grid = QtWidgets.QGridLayout()

        grid.addWidget(tickLabel, 0, 0)
        grid.addWidget(barLabel, 0, 1)
        grid.addWidget(activeLabel, 0, 2)
        grid.addWidget(self.tickTable, 1, 0)
        grid.addWidget(self.barTable, 1, 1)
        grid.addWidget(self.activeTable, 1, 2)

        vbox = QtWidgets.QVBoxLayout()
        vbox.addLayout(grid)
        vbox.addWidget(self.logMonitor)
        self.setLayout(vbox)

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

    #----------------------------------------------------------------------
    def registerEvent(self):
        """注册事件监听"""
        self.signal.connect(self.updateLog)
        self.eventEngine.register(EVENT_DATARECORDER_LOG, self.signal.emit)

    #----------------------------------------------------------------------
    def updateSetting(self):
        """显示引擎行情记录配置"""
        with open(self.drEngine.settingFileName) as f:
            drSetting = json.load(f)

            if 'tick' in drSetting:
                l = drSetting['tick']

                for setting in l:
                    self.tickTable.insertRow(0)
                    self.tickTable.setItem(0, 0, TableCell(setting[0]))
                    self.tickTable.setItem(0, 1, TableCell(setting[1]))

            if 'bar' in drSetting:
                l = drSetting['bar']

                for setting in l:
                    self.barTable.insertRow(0)
                    self.barTable.setItem(0, 0, TableCell(setting[0]))
                    self.barTable.setItem(0, 1, TableCell(setting[1]))

            if 'active' in drSetting:
                d = drSetting['active']

                for activeSymbol, symbol in d.items():
                    self.activeTable.insertRow(0)
                    self.activeTable.setItem(0, 0, TableCell(activeSymbol))
                    self.activeTable.setItem(0, 1, TableCell(symbol))
コード例 #9
0
class MmEngineManager(QtWidgets.QMainWindow):  #QWidget
    """监控引擎的管理组件"""

    signal = QtCore.Signal(type(Event()))
    signal_tick = QtCore.Signal(type(Event()))
    settingFileName = 'Daily_setting.json'
    settingfilePath = getJsonPath(settingFileName, __file__)

    def __init__(self, MmEngine, eventEngine, parent=None):
        """Constructor"""
        super(MmEngineManager, self).__init__(parent)

        self.MmEngine = MmEngine
        self.eventEngine = eventEngine
        self.isReplay = False  ##监控

        # 监控的事件类型
        self.eventType = EVENT_TICK
        if isinstance(self.MmEngine.mainEngine, MainEngine) == True:
            print("replay")
            self.isReplay = True  ##复盘

        self.name = "zzsd"

        self.stopOrderMonitor = None
        self.traderOrderMonitor = None
        self.klineDay = None
        self.klineOpt = None

        self.symbolText = None
        self.dayBarData = {}
        self.hourBarData = {}
        self.hourSarData = {}
        self.currrentSymbol = None
        self.currrentXmin = None
        self.initUi()

    # ----------------------------------------------------------------------
    def initUi(self):
        """初始化界面"""
        self.setWindowTitle(u"监控界面")
        self.initMenu()

        ##log
        self.logMonitor = LogMonitor(self.MmEngine, self.eventEngine)
        widgetLogM, dockLogM = self.createDock(self.logMonitor, u"log",
                                               QtCore.Qt.LeftDockWidgetArea)
        ##行情
        self.marketMonitor = MarketMonitor(self.MmEngine, self.eventEngine)
        widgetMarketM, dockMarketM = self.createDock(
            self.marketMonitor, vtText.MARKET_DATA,
            QtCore.Qt.LeftDockWidgetArea)
        ##合约
        self.symbolMonitor = ContractManager(self.MmEngine, self.eventEngine,
                                             self)
        widgetSymbolM, dockLogM = self.createDock(self.symbolMonitor, u"订阅合约",
                                                  QtCore.Qt.LeftDockWidgetArea)

        ##成交单
        self.traderOrderMonitor = TraderOrderMonitor(None, self.eventEngine)
        widgetStopOrderM, dockStopOrderM = self.createDock(
            self.traderOrderMonitor, u"成交单", QtCore.Qt.LeftDockWidgetArea)
        self.updateTraderMonitor()  ##更新一下数据
        self.traderOrderMonitor.cellDoubleClicked.connect(self.symbolSelect)
        self.logMonitor.setMaximumWidth(575)
        self.traderOrderMonitor.setMaximumWidth(575)
        ##K线跟随
        self.klineOpt = KLineWidget(name="opt")
        widgetklineOptM, dockklineOptM = self.createDock(
            self.klineOpt, u"操作周期线", QtCore.Qt.RightDockWidgetArea)
        # self.klineDay = KLineWidget(name="day")
        # widgetklineDayM, dockklineDayM = self.createDock(self.klineDay, u"周线", QtCore.Qt.RightDockWidgetArea)

        if self.isReplay == True:
            self.fun_timer(
            )  #每隔5秒执行一次加载交易数据的函数和日志函数updateTraderMonitor(),updateLogMonitor()

            self.refreshTimer = thd.Timer(60, self.fun_timer)
            self.refreshTimer.start()

    def fun_timer(self):
        ##加载交易数据
        self.updateTraderMonitor()
        ##加载log数据
        self.updateLogMonitor()

    def closeEvent(self, event):
        if self.refreshTimer:
            self.refreshTimer.cancel()

    def initMenu(self):
        """初始化菜单"""
        # 创建菜单
        menubar = self.menuBar()
        self.cycle = ["1min", "3min", "5min", "15min", "30min", "1H", "day"]
        n = 0
        for item in self.cycle:
            action = QtWidgets.QAction(item, self)
            menubar.addAction(action)
            try:
                action.triggered[()].connect(
                    lambda item=item: self.cycleAction(item)
                )  #一个空元组用于指定触发的信号。如果没有这样做,触发信号将在默认情况下发送一个布尔值,这将阻塞lambda的项目参数。
            finally:
                pass

    def cycleAction(self, cycle):
        self.loadXKlineData(self.currrentSymbol, cycle)

    def logSelect(self, row=None, column=None):

        content = self.logMonitor.item(row, 1).text()
        print(content)
        if content and content.startswith("subscribe===") == True:
            symbol = content[len("subscribe==="):len(content)]
            self.loadKlineData(symbol)

    ##显示合约k线
    def symbolSelect(self, row=None, column=None):
        symbol = self.traderOrderMonitor.item(row, 1).text()
        print(symbol)
        if symbol:
            self.loadKlineData(symbol)

    ##显示合约k线
    def symbolSelectMarket(self, row=None, column=None):
        symbol = self.marketMonitor.item(row, 0).text()
        if symbol:
            self.loadKlineData(symbol)

    def loadKlineData(self, symbol):

        if self.currrentSymbol == symbol:
            return
        self.subscribeEvent(symbol)  # 订阅合约
        self.currrentSymbol = symbol
        print symbol

        self.loadBar(symbol)

        # self.klineDay.clearData()
        self.klineOpt.clearData()

        self.klineOpt.KLtitle.setText(symbol + " opt", size='20pt')
        self.klineOpt.loadDataBarArray(self.hourBarData[symbol].barData)

    def subscribeEvent(self, symbol):
        # # 重新注册事件监听
        # self.eventEngine.unregister(EVENT_TICK + self.currrentSymbol, self.signal_tick.emit)
        self.signal_tick.connect(self.updateEvent)
        self.eventEngine.register(EVENT_TICK + symbol, self.signal_tick.emit)
        self.signal_tick.connect(self.processTickEvent)
        self.eventEngine.register(EVENT_TICK + symbol, self.signal_tick.emit)
        # 订阅行情

        req = VtSubscribeReq()
        req.symbol = symbol
        # req.exchange ="SHFE"
        self.MmEngine.mainEngine.subscribe(req, "CTP")

    # ----------------------------------------------------------------------
    def updateEvent(self, event):
        """收到事件更新"""
        data = event.dict_['data']
        self.marketMonitor.updateData(data)

    def loadXKlineData(self, symbol, xmin):

        if self.currrentSymbol == symbol and self.currrentXmin == xmin:
            return
        # 订阅合约
        self.subscribeEvent(symbol)
        self.currrentSymbol = symbol
        self.currrentXmin = xmin
        print symbol

        self.loadXBar(symbol, xmin)

        self.klineOpt.clearData()
        self.klineOpt.KLtitle.setText(symbol + " opt=" + xmin, size='20pt')
        if xmin == "day":
            self.klineOpt.loadDataBarArray(self.dayBarData[symbol].barData)
        else:
            self.klineOpt.loadDataBarArray(self.hourBarData[symbol].barData)
        # 初始化sar指标
        self.klineOpt.initIndicator("SAR")

    def refreshKline(self, symbol):
        if self.hourBarData.has_key(symbol):
            hourBar = VtBarData()
            hourBar.__dict__ = self.hourBarData[symbol].barData[-1]

            self.klineOpt.onBar(hourBar)

    def loadBar(self, symbol):
        """读取策略配置"""
        with open(self.settingfilePath) as f:
            l = json.load(f)

        db = MINUTE_5_DB_NAME
        xmin = 5
        self.currrentXmin = 5
        if xmin == "day":
            if not self.dayBarData.has_key(symbol):
                dbDayList = self.loadAllBarFromDb(DAY_DB_NAME, symbol)
                self.dayBarData[symbol] = BarManager(dbDayList,
                                                     symbol,
                                                     isDay=True)
        else:
            # if not self.hourBarData.has_key(symbol):
            dbHourList = self.loadAllBarFromDb(db, symbol)
            self.hourBarData[symbol] = BarManager(dbHourList, symbol, xmin)

    def loadXBar(self, symbol, cycle):

        db = MINUTE_5_DB_NAME
        xmin = 5
        if cycle == 'week':
            db = WEEK_DB_NAME
        elif cycle == 'day':
            db = DAILY_DB_NAME
            xmin = "day"
        elif cycle == '1H':
            xmin = 60
            db = MINUTE_60_DB_NAME
        else:
            xmin = cycle_number[cycle]
            db = cycle_db[cycle]

        self.currrentXmin = xmin
        if xmin == "day":
            if not self.dayBarData.has_key(symbol):
                dbDayList = self.loadAllBarFromDb(DAY_DB_NAME, symbol)

                self.dayBarData[symbol] = BarManager(dbDayList,
                                                     symbol,
                                                     isDay=True)
        else:
            # if  not self.hourBarData.has_key(symbol):
            dbHourList = self.loadAllBarFromDb(db, symbol)
            self.hourBarData[symbol] = BarManager(dbHourList, symbol, xmin)

    # ----------------------------------------------------------------------
    def loadAllBarFromDb(self, dbName, collectionName):
        """从数据库中读取Bar数据,startDate是datetime对象"""
        d = {}
        if hasattr(self.MmEngine, "client"):  ##rpc模式
            barData = self.MmEngine.client.mainEngine.dbQuery(
                dbName, collectionName, d, 'datetime')
        else:
            barData = self.MmEngine.mainEngine.dbQuery(dbName, collectionName,
                                                       d, 'datetime')

        return barData

    def updateLogMonitor(self):
        logList = self.MmEngine.mainEngine.mysqlClient.dbSelect(
            SQL_TABLENAME_LOG, None, "all")
        for log in logList:
            logEntity = VtLogData()
            logEntity.gatewayName = log["gatewayName"]
            logEntity.logContent = log["logContent"]
            logEntity.logLevel = log["logLevel"]
            logEntity.logTime = log["logTime"]
            self.logMonitor.updateData(logEntity)

        ##日志table加入click事件  subscribe===
        self.logMonitor.cellDoubleClicked.connect(self.logSelect)

    def updateTraderMonitor(self):
        ##更新交易单
        varOrders = self.MmEngine.getTraderOrders()
        self.traderOrderMonitor.updateAllData(varOrders)
        # ----------------------------------------------------------------------

    def processTickEvent(self, event):
        """收到事件更新"""
        tick = event.dict_['data']

        if self.dayBarData.has_key(tick.symbol):
            self.dayBarData[tick.symbol].updateTick(tick)

        if self.hourBarData.has_key(tick.symbol):
            self.hourBarData[tick.symbol].updateTick(tick)

        if self.currrentSymbol == tick.symbol:
            self.refreshKline(tick.symbol)

    # ----------------------------------------------------------------------
    def createDock(self, widget, widgetName, widgetArea):
        """创建停靠组件"""
        dock = QtWidgets.QDockWidget(widgetName)
        dock.setWidget(widget)
        dock.setObjectName(widgetName)
        dock.setFeatures(dock.DockWidgetFloatable | dock.DockWidgetMovable)
        self.addDockWidget(widgetArea, dock)
        return widget, dock
コード例 #10
0
class StrategyManager(QtWidgets.QGroupBox):
    """策略管理组件"""
    signal = QtCore.Signal(type(Event()))

    #----------------------------------------------------------------------
    def __init__(self, engine, eventEngine, name, parent=None):
        """Constructor"""
        super(StrategyManager, self).__init__(parent)

        self.engine = engine
        self.eventEngine = eventEngine
        self.name = name

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

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

        self.paramMonitor = ValueMonitor(True, self)
        self.varMonitor = ValueMonitor(False, self)

        height = 65
        self.paramMonitor.setFixedHeight(height)
        self.varMonitor.setFixedHeight(height)

        buttonInit = QtWidgets.QPushButton(u'初始化')
        buttonStart = QtWidgets.QPushButton(u'启动')
        buttonStop = QtWidgets.QPushButton(u'停止')
        buttonInit.clicked.connect(self.init)
        buttonStart.clicked.connect(self.start)
        buttonStop.clicked.connect(self.stop)

        hbox1 = QtWidgets.QHBoxLayout()
        hbox1.addWidget(buttonInit)
        hbox1.addWidget(buttonStart)
        hbox1.addWidget(buttonStop)
        hbox1.addStretch()

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

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

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

        self.setLayout(vbox)

        self.paramMonitor.itemChanged.connect(self.setParam)

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

        varDict = self.engine.getStrategyVar(self.name)
        if varDict:
            self.varMonitor.updateData(varDict)

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

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

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

    #----------------------------------------------------------------------
    def stop(self):
        """停止策略"""
        self.engine.stopStrategy(self.name)

    #----------------------------------------------------------------------
    def setParam(self, cell):
        """更新参数"""
        text = unicode(cell.text())
        key = cell.key

        if text.isdigit():
            if '.' in text:
                value = float(text)
            else:
                value = int(text)
        else:
            value = text

        self.engine.setStrategyParam(self.name, key, value)
コード例 #11
0
class StrategyEngineManager(QtWidgets.QWidget):
    """引擎管理组件"""
    signal = QtCore.Signal(type(Event()))

    #----------------------------------------------------------------------
    def __init__(self, omEngine, parent=None):
        """Constructor"""
        super(StrategyEngineManager, self).__init__(parent)

        self.engine = omEngine.strategyEngine
        self.eventEngine = omEngine.eventEngine

        self.strategyLoaded = False

        self.initUi()
        self.registerEvent()

        # 记录日志
        self.engine.writeLog(u'期权策略引擎启动')

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

        # 按钮
        loadButton = QtWidgets.QPushButton(u'加载策略')
        initAllButton = QtWidgets.QPushButton(u'全部初始化')
        startAllButton = QtWidgets.QPushButton(u'全部启动')
        stopAllButton = QtWidgets.QPushButton(u'全部停止')

        loadButton.clicked.connect(self.load)
        initAllButton.clicked.connect(self.initAll)
        startAllButton.clicked.connect(self.startAll)
        stopAllButton.clicked.connect(self.stopAll)

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

        # 日志监控
        self.ctaLogMonitor = QtWidgets.QTextEdit()
        self.ctaLogMonitor.setReadOnly(True)
        self.ctaLogMonitor.setMaximumHeight(200)

        # 设置布局
        hbox2 = QtWidgets.QHBoxLayout()
        hbox2.addWidget(loadButton)
        hbox2.addWidget(initAllButton)
        hbox2.addWidget(startAllButton)
        hbox2.addWidget(stopAllButton)
        hbox2.addStretch()

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

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

        for name in self.engine.strategyDict.keys():
            strategyManager = StrategyManager(self.engine, self.eventEngine,
                                              name)
            vbox.addWidget(strategyManager)

        vbox.addStretch()

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

    #----------------------------------------------------------------------
    def initAll(self):
        """全部初始化"""
        self.engine.initAll()

    #----------------------------------------------------------------------
    def startAll(self):
        """全部启动"""
        self.engine.startAll()

    #----------------------------------------------------------------------
    def stopAll(self):
        """全部停止"""
        self.engine.stopAll()

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

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

    #----------------------------------------------------------------------
    def registerEvent(self):
        """注册事件监听"""
        self.signal.connect(self.updateLog)
        self.eventEngine.register(EVENT_OM_STRATEGYLOG, self.signal.emit)
コード例 #12
0
class DailyEngineManager(QtWidgets.QMainWindow):
    signal = QtCore.Signal(type(Event()))
    signal_tick = QtCore.Signal(type(Event()))
    settingFileName = 'Daily_setting.json'
    settingfilePath = getJsonPath(settingFileName, __file__)

    def __init__(self, dailyEngine, eventEngine, parent=None):
        """Constructor"""
        super(DailyEngineManager, self).__init__(parent)

        self.dailyEngine = dailyEngine
        self.eventEngine = eventEngine
        self.isReplay = False  ##监控
        if isinstance(self.dailyEngine.mainEngine, MainEngine) == True:
            print("replay")
            self.isReplay = True  ##复盘

        self.name = "zzsd"
        self.stopOrderMonitor = None
        self.klineDay = None
        self.klineOpt = None

        self.dayBarData = {}
        self.hourBarData = {}
        self.hourSarData = {}
        self.initUi()
        self.registerEvent()

        self.currrentSymbol = ""

        # 记录日志
        #self.ctaEngine.writeCtaLog(text.CTA_ENGINE_STARTED)

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

        ##log
        self.logMonitor = LogMonitor(self.dailyEngine, self.eventEngine)
        widgetLogM, dockLogM = self.createDock(self.logMonitor, u"log",
                                               QtCore.Qt.LeftDockWidgetArea)
        ##合约
        self.marketMonitor = MarketMonitor(None, self.eventEngine)
        widgetMarketM, dockMarketM = self.createDock(
            self.marketMonitor, vtText.MARKET_DATA,
            QtCore.Qt.LeftDockWidgetArea)

        ##条件单
        self.stopOrderMonitor = StopOrderMonitor(None, self.eventEngine)
        widgetStopOrderM, dockStopOrderM = self.createDock(
            self.stopOrderMonitor, u"条件单", QtCore.Qt.LeftDockWidgetArea)
        self.updateMonitor()  ##更新一下数据

        self.marketMonitor.cellDoubleClicked.connect(self.symbolSelectMarket)
        self.stopOrderMonitor.cellDoubleClicked.connect(self.symbolSelect)
        self.logMonitor.setMaximumWidth(575)
        self.marketMonitor.setMaximumWidth(575)
        self.stopOrderMonitor.setMaximumWidth(575)

        ##K线跟随

        self.klineOpt = KLineWidget(name="opt")
        widgetklineOptM, dockklineOptM = self.createDock(
            self.klineOpt, u"操作周期线", QtCore.Qt.RightDockWidgetArea)

        #self.klineDay = KLineWidget(name="day")
        #widgetklineDayM, dockklineDayM = self.createDock(self.klineDay, u"周线", QtCore.Qt.RightDockWidgetArea)

        if self.isReplay == True:
            ##加载log数据

            logList = self.dailyEngine.mainEngine.mysqlClient.dbSelect(
                SQL_TABLENAME_LOG, None, "all")
            for log in logList:
                logEntity = VtLogData()
                logEntity.gatewayName = log["gatewayName"]
                logEntity.logContent = log["logContent"]
                logEntity.logLevel = log["logLevel"]
                logEntity.logTime = log["logTime"]
                self.logMonitor.updateData(logEntity)

            ##日志table加入click事件  subscribe===
            self.logMonitor.cellDoubleClicked.connect(self.logSelect)

    def logSelect(self, row=None, column=None):

        content = self.logMonitor.item(row, 1).text()
        print(content)
        if content and content.startswith("subscribe===") == True:
            symbol = content[len("subscribe==="):len(content)]
            self.loadKlineData(symbol)

    ##显示合约k线
    def symbolSelect(self, row=None, column=None):

        symbol = self.stopOrderMonitor.item(row, 0).text()
        print(symbol)
        if symbol:
            self.loadKlineData(symbol)

    ##显示合约k线
    def symbolSelectMarket(self, row=None, column=None):

        symbol = self.marketMonitor.item(row, 0).text()
        print(symbol)
        if symbol:
            self.loadKlineData(symbol)

    def loadKlineData(self, symbol):

        if self.currrentSymbol == symbol:
            return

        self.currrentSymbol = symbol

        self.loadBar(symbol)

        #self.klineDay.clearData()
        self.klineOpt.clearData()

        self.klineOpt.KLtitle.setText(symbol + " opt", size='20pt')
        self.klineOpt.loadDataBarArray(self.hourBarData[symbol].barData)

        if not self.hourSarData.has_key(symbol):
            sar_t = SAR()
            sar_t.OnCalculate(len(self.klineOpt.listHigh), 0,
                              self.klineOpt.listHigh, self.klineOpt.listLow)
            self.hourSarData[symbol] = sar_t

        self.klineOpt.addIndicatorSar(self.hourSarData[symbol].ExtSARBuffer)

        #self.klineDay.KLtitle.setText(symbol+" day",size='20pt')
        #self.klineDay.loadDataBarArray(self.dayBarData[symbol].barData)

    def refreshKline(self, symbol):
        if self.hourBarData.has_key(symbol):
            hourBar = VtBarData()
            hourBar.__dict__ = self.hourBarData[symbol].barData[-1]

            #dayBar =  VtBarData()
            #dayBar.__dict__ = self.dayBarData[symbol].barData[-1]

            #print(hourBar.__dict__)
            #print(dayBar.__dict__)

            self.klineOpt.onBar(hourBar)
            ##sar 只计算最后3个值
            preSARLen = len(self.hourSarData[symbol].ExtSARBuffer)

            self.hourSarData[symbol].OnCalculate(
                len(self.klineOpt.listHigh),
                len(self.klineOpt.listHigh) - 3, self.klineOpt.listHigh,
                self.klineOpt.listLow)

            self.klineOpt.updateIndicatorSar(
                self.hourSarData[symbol].ExtSARBuffer, preSARLen - 1)

    def loadBar(self, symbol):

        #if not self.dayBarData.has_key(symbol):
        #dbDayList = self.loadAllBarFromDb(DAY_DB_NAME,symbol)

        #self.dayBarData[symbol] = BarManager(dbDayList,symbol,isDay=True)

        if not self.hourBarData.has_key(symbol):
            """读取策略配置"""
            with open(self.settingfilePath) as f:
                l = json.load(f)

            db = MINUTE_5_DB_NAME
            xmin = 5

            #if l["strategyCycle"] == "5min":
            #    db = MINUTE_5_DB_NAME
            #    xmin = 5

            #if l["strategyCycle"] == "30min":
            #    db = MINUTE_30_DB_NAME
            #    xmin = 30

            dbHourList = self.loadAllBarFromDb(db, symbol)
            self.hourBarData[symbol] = BarManager(dbHourList, symbol, xmin)

    #----------------------------------------------------------------------
    def loadAllBarFromDb(self, dbName, collectionName):
        """从数据库中读取Bar数据,startDate是datetime对象"""
        d = {}
        if hasattr(self.dailyEngine, "client"):  ##rpc模式
            barData = self.dailyEngine.client.mainEngine.dbQuery(
                dbName, collectionName, d, 'datetime')
        else:
            barData = self.dailyEngine.mainEngine.dbQuery(
                dbName, collectionName, d, 'datetime')

        return barData

    def updateMonitor(self):
        ##更新条件单
        varOrders = self.dailyEngine.getStopOrders()
        self.stopOrderMonitor.updateAllData(varOrders)

    def processTickEvent(self, event):
        """收到事件更新"""
        tick = event.dict_['data']

        #if self.dayBarData.has_key(tick.symbol):
        #    self.dayBarData[tick.symbol].updateTick(tick)

        if self.hourBarData.has_key(tick.symbol):
            self.hourBarData[tick.symbol].updateTick(tick)

        if self.currrentSymbol == tick.symbol:
            self.refreshKline(tick.symbol)

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

        self.signal_tick.connect(self.processTickEvent)
        self.eventEngine.register(EVENT_TICK, self.signal_tick.emit)

    #----------------------------------------------------------------------
    def createDock(self, widget, widgetName, widgetArea):
        """创建停靠组件"""
        dock = QtWidgets.QDockWidget(widgetName)
        dock.setWidget(widget)
        dock.setObjectName(widgetName)
        dock.setFeatures(dock.DockWidgetFloatable | dock.DockWidgetMovable)
        self.addDockWidget(widgetArea, dock)
        return widget, dock