コード例 #1
0
ファイル: uiArbWidget.py プロジェクト: ageofshadows/Skynet
class ArbStrategyManager(QtWidgets.QGroupBox):
    """策略管理组件"""
    signal = QtCore.pyqtSignal(type(Event()))

    #----------------------------------------------------------------------
    def __init__(self, arbEngine, eventEngine, name, parent=None):
        """Constructor"""
        super(ArbStrategyManager, self).__init__(parent)
        
        self.arbEngine = arbEngine
        self.eventEngine = eventEngine
        self.name = name
        
        self.initUi()
        self.updateMonitor()
        self.registerEvent()
        
    #----------------------------------------------------------------------
    def initUi(self):
        """初始化界面"""
	self.setTitle(self.name)

        self.directionList = [u'LONG',
                              u'SHORT',
	                      u'NONE']

        self.offsetList = [u'OPEN',
                           u'CLOSE']

        labelX1 = QtWidgets.QLabel(u'Multiplier 1')
        labelS1 = QtWidgets.QLabel(u'   x')
        labelC1 =  QtWidgets.QLabel(u'Contract 1')
        self.lineX1 = QtWidgets.QLineEdit()
        self.lineS1 = QtWidgets.QLabel(u'   x')
        self.lineC1 = QtWidgets.QLineEdit()

        labelP2 = QtWidgets.QLabel(u'   +')
        labelX2 = QtWidgets.QLabel(u'Multiplier 2')
        labelS2 = QtWidgets.QLabel(u'   x')
        labelC2 =  QtWidgets.QLabel(u'Contract 2')
        self.lineP2 = QtWidgets.QLabel(u'   +')
        self.lineX2 = QtWidgets.QLineEdit()
        self.lineS2 = QtWidgets.QLabel(u'   x')
        self.lineC2 = QtWidgets.QLineEdit()

        labelP3 = QtWidgets.QLabel(u'   +')
        labelX3 = QtWidgets.QLabel(u'Multiplier 3')
        labelS3 = QtWidgets.QLabel(u'   x')
        labelC3 =  QtWidgets.QLabel(u'Contract 3')
        self.lineP3 = QtWidgets.QLabel(u'   +')
        self.lineX3 = QtWidgets.QLineEdit()
        self.lineS3 = QtWidgets.QLabel(u'   x')
        self.lineC3 = QtWidgets.QLineEdit()

        labelP4 = QtWidgets.QLabel(u'   +')
        labelX4 = QtWidgets.QLabel(u'Multiplier 4')
        labelS4 = QtWidgets.QLabel(u'   x')
        labelC4 =  QtWidgets.QLabel(u'Contract 4')
        self.lineP4 = QtWidgets.QLabel(u'   +')
        self.lineX4 = QtWidgets.QLineEdit()
        self.lineS4 = QtWidgets.QLabel(u'   x')
        self.lineC4 = QtWidgets.QLineEdit()

        labelX5 = QtWidgets.QLabel(u'Spread')
        labelC5 =  QtWidgets.QLabel(u'Quantity')
        self.lineX5 = QtWidgets.QLineEdit()
        self.lineC5 = QtWidgets.QLineEdit()

        labelX7 = QtWidgets.QLabel(u'Bought at')
        labelC7 =  QtWidgets.QLabel(u'Sold at')
        self.lineX7 = QtWidgets.QLabel(u'3349')
        self.lineC7 = QtWidgets.QLabel(u'3312')

        labelX6 =  QtWidgets.QLabel(u'Direction')
        self.comboDirection = QtWidgets.QComboBox()
        self.comboDirection.addItems(self.directionList)

        labelC6 =  QtWidgets.QLabel(u'Offset')
        self.comboOffset = QtWidgets.QComboBox()
        self.comboOffset.addItems(self.offsetList)

        # 代码输入框
        gridup = QtWidgets.QGridLayout()
        gridup.addWidget(labelX1, 0, 0)
        gridup.addWidget(labelS1, 0, 1)
        gridup.addWidget(labelC1, 0, 2)
        gridup.addWidget(labelP2, 0, 3)
        gridup.addWidget(labelX2, 0, 4)
        gridup.addWidget(labelS2, 0, 5)
        gridup.addWidget(labelC2, 0, 6)
        gridup.addWidget(labelP3, 0, 7)
        gridup.addWidget(labelX3, 0, 8)
        gridup.addWidget(labelS3, 0, 9)
        gridup.addWidget(labelC3, 0, 10)
        gridup.addWidget(labelP4, 0, 11)
        gridup.addWidget(labelX4, 0, 12)
        gridup.addWidget(labelS4, 0, 13)
        gridup.addWidget(labelC4, 0, 14)
        gridup.addWidget(self.lineX1, 1, 0)
        gridup.addWidget(self.lineS1, 1, 1)
        gridup.addWidget(self.lineC1, 1, 2)
        gridup.addWidget(self.lineP2, 1, 3)
        gridup.addWidget(self.lineX2, 1, 4)
        gridup.addWidget(self.lineS2, 1, 5)
        gridup.addWidget(self.lineC2, 1, 6)
        gridup.addWidget(self.lineP3, 1, 7)
        gridup.addWidget(self.lineX3, 1, 8)
        gridup.addWidget(self.lineS3, 1, 9)
        gridup.addWidget(self.lineC3, 1, 10)
        gridup.addWidget(self.lineP4, 1, 11)
        gridup.addWidget(self.lineX4, 1, 12)
        gridup.addWidget(self.lineS4, 1, 13)
        gridup.addWidget(self.lineC4, 1, 14)
        gridup.setColumnStretch(0, 1)
        gridup.setColumnStretch(1, 1)
        gridup.setColumnStretch(2, 2)
        gridup.setColumnStretch(3, 1)
        gridup.setColumnStretch(4, 1)
        gridup.setColumnStretch(5, 1)
        gridup.setColumnStretch(6, 2)
        gridup.setColumnStretch(7, 1)
        gridup.setColumnStretch(8, 1)
        gridup.setColumnStretch(9, 1)
        gridup.setColumnStretch(10, 2)
        gridup.setColumnStretch(11, 1)
        gridup.setColumnStretch(12, 1)
        gridup.setColumnStretch(13, 1)
        gridup.setColumnStretch(14, 2)
        gridup.setContentsMargins(2,2,600,10)

        griddown = QtWidgets.QGridLayout()
        griddown.addWidget(labelX7, 0, 0)
        griddown.addWidget(labelC7, 0, 1)
        griddown.addWidget(labelX5, 0, 2)
        griddown.addWidget(labelC5, 0, 3)
        griddown.addWidget(labelX6, 0, 4)
        griddown.addWidget(labelC6, 0, 5)
        griddown.addWidget(self.lineX7, 1, 0)
        griddown.addWidget(self.lineC7, 1, 1)
        griddown.addWidget(self.lineX5, 1, 2)
        griddown.addWidget(self.lineC5, 1, 3)
        griddown.addWidget(self.comboDirection, 1, 4)
        griddown.addWidget(self.comboOffset, 1, 5)
        griddown.setContentsMargins(2,2,1300,20)

        
        self.paramMonitor = ArbValueMonitor(self)
        self.varMonitor = ArbValueMonitor(self)
        
        maxHeight = 80
        #self.paramMonitor.setMaximumHeight(maxHeight)
        self.paramMonitor.setMinimumHeight(maxHeight)
        self.paramMonitor.resizeRowsToContents() 
        #self.varMonitor.setMaximumHeight(maxHeight)
        self.varMonitor.setMinimumHeight(maxHeight)
        self.varMonitor.resizeRowsToContents()
        
        buttonUpdate = QtWidgets.QPushButton(u'Update Contracts')
	buttonInit = QtWidgets.QPushButton(u'Initialize')
	buttonSend = QtWidgets.QPushButton(u'Trigger')
	buttonStart = QtWidgets.QPushButton(u'Start')	
        buttonClear = QtWidgets.QPushButton(u'Clear Strategy')
        buttonQrypos = QtWidgets.QPushButton(u'Query Position')
        buttonReport = QtWidgets.QPushButton(u'Report Strategy')
        buttonStop = QtWidgets.QPushButton(u'Stop')
        buttonUpdate.clicked.connect(self.update)
	buttonInit.clicked.connect(self.init)
	buttonSend.clicked.connect(self.send)
	buttonStart.clicked.connect(self.start)	
        buttonClear.clicked.connect(self.clear)
        buttonQrypos.clicked.connect(self.qrypos)
        buttonReport.clicked.connect(self.report)
        buttonStop.clicked.connect(self.stop)
        
        hbox1 = QtWidgets.QHBoxLayout()     
        hbox1.addWidget(buttonUpdate)
	hbox1.addWidget(buttonInit)
	hbox1.addWidget(buttonSend)
	hbox1.addWidget(buttonStart)	
        hbox1.addWidget(buttonClear)
        hbox1.addWidget(buttonQrypos)
        hbox1.addWidget(buttonReport)
        hbox1.addWidget(buttonStop)
        hbox1.addStretch()
        
        hbox2 = QtWidgets.QHBoxLayout()
        hbox2.addWidget(self.paramMonitor)
        
        hbox3 = QtWidgets.QHBoxLayout()
        hbox3.addWidget(self.varMonitor)
        
        vbox = QtWidgets.QVBoxLayout()
        vbox.addLayout(gridup)
        vbox.addLayout(griddown)
        vbox.addLayout(hbox1)
        vbox.addLayout(hbox2)
        vbox.addLayout(hbox3)

        vbox.setContentsMargins(20,50,20,20)

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

        paramDict = self.arbEngine.getStrategyParam(self.name)
        if paramDict:
            self.paramMonitor.updateData(paramDict)
            
        varDict = self.arbEngine.getStrategyVar(self.name)
        if varDict:
            self.varMonitor.updateData(varDict)        
            
    #----------------------------------------------------------------------
    def updatePrice(self, data):
        """更新价格"""
        self.lineX7.setText(str(data['askPrice1']))
        self.lineC7.setText(str(data['bidPrice1']))

    #----------------------------------------------------------------------
    def registerEvent(self):
        """注册事件监听"""
        self.signal.connect(self.updateMonitor)
        self.eventEngine.register(EVENT_CTA_STRATEGY+self.name, self.signal.emit)
    
    #----------------------------------------------------------------------
    def update(self):
        """初始化策略"""
        x1 = str(self.lineX1.text())
        c1 = str(self.lineC1.text())
        x2 = str(self.lineX2.text())
        c2 = str(self.lineC2.text())
        x3 = str(self.lineX3.text())
        c3 = str(self.lineC3.text())
        x4 = str(self.lineX4.text())
        c4 = str(self.lineC4.text())
        data = {'X1':x1, 'C1':c1, 'X2':x2, 'C2':c2, 'X3':x3, 'C3':c3, 'X4':x4, 'C4':c4}
        self.arbEngine.updateStrategy(self.name,data)
    
    #----------------------------------------------------------------------
    def init(self):
	"""初始化策略"""
	self.arbEngine.initStrategy(self.name)
    
    #----------------------------------------------------------------------
    def start(self):
        """启动策略"""
        self.arbEngine.startStrategy(self.name)
        
    #----------------------------------------------------------------------
    def send(self, data):
        """启动策略"""
        data = {'price':self.lineX5.text(), 'volume':self.lineC5.text(),
                'offset':self.comboOffset.currentText(),'direction':self.comboDirection.currentText()}
        self.arbEngine.sendStrategy(self.name, data)
        
    #----------------------------------------------------------------------
    def clear(self):
        """启动策略"""
        self.arbEngine.clearStrategy(self.name)
        
    #----------------------------------------------------------------------
    def cancel(self):
        """启动回测"""
        self.arbEngine.cancelStrategy(self.name)
        
    #----------------------------------------------------------------------
    def qrypos(self):
        """启动回测"""
        self.arbEngine.qryposStrategy(self.name)
        
    #----------------------------------------------------------------------
    def report(self):
        """启动报告"""
        self.arbEngine.reportStrategy(self.name)
        
    #----------------------------------------------------------------------
    def stop(self):
        """停止策略"""
        self.arbEngine.stopStrategy(self.name)
コード例 #2
0
ファイル: uiArbWidget.py プロジェクト: ageofshadows/Skynet
class ArbEngineManager(QtWidgets.QWidget):
    """ARB引擎管理组件"""
    signal = QtCore.pyqtSignal(type(Event()))

    #----------------------------------------------------------------------
    def __init__(self, arbEngine, eventEngine, parent=None):
        """Constructor"""
        super(ArbEngineManager, self).__init__(parent)
        
        self.arbEngine = arbEngine
        self.eventEngine = eventEngine
        
	self.nameList = []
	self.strategyManagers = {}
        self.strategyLoaded = False
        
        self.initUi()
        self.registerEvent()
        
        # 记录日志
        self.arbEngine.writeArbLog(u'Arbitrage engine initialized.')        
        
    #----------------------------------------------------------------------
    def initUi(self):
        """初始化界面"""
        self.setWindowTitle(u'CTA Strategy')
        
        # 按钮
        loadButton = QtWidgets.QPushButton(u'Load Strategy')
        updateMCButton = QtWidgets.QPushButton(u'Update Margin/Commission')
        
        loadButton.clicked.connect(self.load)
        updateMCButton.clicked.connect(self.updateMC)
        
        # 滚动区域,放置所有的ArbStrategyManager
        self.scrollArea = QtWidgets.QScrollArea()
        self.scrollArea.setWidgetResizable(True)
        
        # ARB组件的日志监控
        self.arbLogMonitor = QtWidgets.QTextEdit()
        self.arbLogMonitor.setReadOnly(True)
        self.arbLogMonitor.setMaximumHeight(200)
        
        # 设置布局
        hbox2 = QtWidgets.QHBoxLayout()
        hbox2.addWidget(loadButton)
        hbox2.addWidget(updateMCButton)
        hbox2.addStretch()
        
        vbox = QtWidgets.QVBoxLayout()
        vbox.addLayout(hbox2)
        vbox.addWidget(self.scrollArea)
        vbox.addWidget(self.arbLogMonitor)
        self.setLayout(vbox)
        
    #----------------------------------------------------------------------
    def initStrategyManager(self):
        """初始化策略管理组件界面"""        
        w = QtWidgets.QWidget()
	vbox = QtWidgets.QVBoxLayout()
        
        for name in sorted(self.arbEngine.strategyDict.keys()):
	    if name not in self.nameList:
		strategyManager = ArbStrategyManager(self.arbEngine, self.eventEngine, name)
		self.strategyManagers[name] = strategyManager
	    else:
		strategyManager = self.strategyManagers[name]
	    vbox.addWidget(strategyManager)
	    self.nameList.append(name)
        
        vbox.addStretch()
        
        w.setLayout(vbox)
        self.scrollArea.setWidget(w)   
        
    #----------------------------------------------------------------------
    def load(self):
        """加载策略"""
        if not self.strategyLoaded:
            self.arbEngine.loadSetting()
            self.initStrategyManager()
            self.strategyLoaded = True
            self.arbEngine.writeArbLog(u'Strategy loaded.')
	else:
            self.arbEngine.loadSetting()
            self.initStrategyManager()
            self.strategyLoaded = True
            self.arbEngine.writeArbLog(u'Strategy loaded.')
	    
    #----------------------------------------------------------------------
    def updateMC(self):
        """费率查询"""
        self.arbEngine.updateMC()
        
    #----------------------------------------------------------------------
    def updateArbLog(self, event):
        """更新ARB相关日志"""
        log = event.dict_['data']
        content = '\t'.join([log.logTime, log.logContent])
        self.arbLogMonitor.append(content)
    
    #----------------------------------------------------------------------
    def registerEvent(self):
        """注册事件监听"""
        self.signal.connect(self.updateArbLog)
        self.eventEngine.register(EVENT_CTA_LOG, self.signal.emit)
	
    #----------------------------------------------------------------------
    def closeEvent(self, event):
	"""关闭窗口时的事件"""
	pass
コード例 #3
0
ファイル: uiCtaWidget.py プロジェクト: wycwywfwa/vnpy
class CtaEngineManager(QtGui.QWidget):
    """CTA引擎管理组件"""
    signal = QtCore.pyqtSignal(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):
        """初始化界面"""
        path = os.getcwd().rsplit('\\')[-1]

        self.setWindowTitle(u'{0} CTA策略'.format(path))

        # 按钮
        loadButton = QtGui.QPushButton(text.LOAD_STRATEGY)
        initAllButton = QtGui.QPushButton(text.INIT_ALL)
        startAllButton = QtGui.QPushButton(text.START_ALL)
        stopAllButton = QtGui.QPushButton(text.STOP_ALL)
        savePositionButton = QtGui.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)
        savePositionButton.clicked.connect(self.ctaEngine.savePosition)

        # 滚动区域,放置所有的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(loadButton)
        hbox2.addWidget(initAllButton)
        hbox2.addWidget(startAllButton)
        hbox2.addWidget(stopAllButton)
        hbox2.addWidget(savePositionButton)
        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():
            # 为每一个策略实例,创建对应的管理组件实例
            strategyManager = CtaStrategyManager(self.ctaEngine,
                                                 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.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(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)

    #----------------------------------------------------------------------
    def closeEvent(self, event):
        """关闭窗口时的事件"""
        reply = QtGui.QMessageBox.question(
            self, text.SAVE_POSITION_DATA, text.SAVE_POSITION_QUESTION,
            QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            self.ctaEngine.savePosition()

        event.accept()
コード例 #4
0
ファイル: uiCtaWidget.py プロジェクト: wycwywfwa/vnpy
class CtaStrategyManager(QtGui.QGroupBox):
    """策略管理组件"""
    signal = QtCore.pyqtSignal(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 = QtGui.QPushButton(text.INIT)
        buttonStart = QtGui.QPushButton(text.START)
        buttonStop = QtGui.QPushButton(text.STOP)
        buttonInitForce = QtGui.QPushButton(u'强制初始化')
        buttonInit.clicked.connect(self.init)
        buttonStart.clicked.connect(self.start)
        buttonStop.clicked.connect(self.stop)
        buttonInitForce.clicked.connect(self.initForce)

        hbox1 = QtGui.QHBoxLayout()
        hbox1.addWidget(buttonInit)
        hbox1.addWidget(buttonStart)
        hbox1.addWidget(buttonStop)
        hbox1.addWidget(buttonInitForce)

        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):
        """显示策略最新状态"""

        # 获取策略的参数目录
        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 registerEvent(self):
        """注册事件监听"""

        # 绑定事件的更新函数为updateMonitor
        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 initForce(self):
        """强制初始化策略"""
        self.ctaEngine.initStrategy(self.name, force=True)

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

    #----------------------------------------------------------------------
    def stop(self):
        """停止策略"""
        self.ctaEngine.stopStrategy(self.name)
コード例 #5
0
class DrEngineManager(QtGui.QWidget):
    """行情数据记录引擎管理组件"""
    signal = QtCore.pyqtSignal(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 = QtGui.QLabel(u'Tick记录')
        self.tickTable = QtGui.QTableWidget()
        self.tickTable.setColumnCount(2)
        self.tickTable.verticalHeader().setVisible(False)
        self.tickTable.setEditTriggers(QtGui.QTableWidget.NoEditTriggers)
        self.tickTable.horizontalHeader().setResizeMode(
            QtGui.QHeaderView.Stretch)
        self.tickTable.setAlternatingRowColors(True)
        self.tickTable.setHorizontalHeaderLabels([u'合约代码', u'接口'])

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

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

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

        # 设置布局
        grid = QtGui.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 = QtGui.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))