311 lines
10 KiB
Python
311 lines
10 KiB
Python
|
# encoding: UTF-8
|
|||
|
|
|||
|
from collections import OrderedDict
|
|||
|
|
|||
|
from PyQt4 import QtGui, QtCore
|
|||
|
|
|||
|
from eventEngine import *
|
|||
|
|
|||
|
|
|||
|
########################################################################
|
|||
|
class BasicMonitor(QtGui.QTableWidget):
|
|||
|
"""基础监控"""
|
|||
|
signal = QtCore.pyqtSignal(type(Event()))
|
|||
|
|
|||
|
#----------------------------------------------------------------------
|
|||
|
def __init__(self, eventEngine, parent=None):
|
|||
|
"""Constructor"""
|
|||
|
super(BasicMonitor, self).__init__(parent)
|
|||
|
|
|||
|
self.eventEngine = eventEngine
|
|||
|
|
|||
|
# 保存表头标签用
|
|||
|
self.headerDict = OrderedDict() # 有序字典,key是英文名,value是对应的中文名
|
|||
|
self.headerList = [] # 对应self.headerDict.keys()
|
|||
|
|
|||
|
# 保存相关数据用
|
|||
|
self.dataDict = {} # 字典,key是字段对应的数据,value是保存相关单元格的字典
|
|||
|
self.dataKey = '' # 字典键对应的数据字段
|
|||
|
|
|||
|
# 监控的事件类型
|
|||
|
self.eventType = ''
|
|||
|
|
|||
|
# 字体
|
|||
|
self.font = None
|
|||
|
|
|||
|
#----------------------------------------------------------------------
|
|||
|
def setHeaderDict(self, headerDict):
|
|||
|
"""设置表头有序字典"""
|
|||
|
self.headerDict = headerDict
|
|||
|
self.headerList = headerDict.keys()
|
|||
|
|
|||
|
#----------------------------------------------------------------------
|
|||
|
def setDataKey(self, dataKey):
|
|||
|
"""设置数据字典的键"""
|
|||
|
self.dataKey = dataKey
|
|||
|
|
|||
|
#----------------------------------------------------------------------
|
|||
|
def setEventType(self, eventType):
|
|||
|
"""设置监控的事件类型"""
|
|||
|
self.eventType = eventType
|
|||
|
|
|||
|
#----------------------------------------------------------------------
|
|||
|
def setFont(self, font):
|
|||
|
"""设置字体"""
|
|||
|
self.font = font
|
|||
|
|
|||
|
#----------------------------------------------------------------------
|
|||
|
def initTable(self):
|
|||
|
"""初始化表格"""
|
|||
|
# 设置表格的列数
|
|||
|
col = len(self.labelDict)
|
|||
|
self.setColumnCount(col)
|
|||
|
|
|||
|
# 设置列表头
|
|||
|
self.setHorizontalHeaderLabels(self.labelDict.values())
|
|||
|
|
|||
|
# 关闭左边的垂直表头
|
|||
|
self.verticalHeader().setVisible(False)
|
|||
|
|
|||
|
# 设为不可编辑
|
|||
|
self.setEditTriggers(self.NoEditTriggers)
|
|||
|
|
|||
|
#----------------------------------------------------------------------
|
|||
|
def registerEvent(self):
|
|||
|
"""注册GUI更新相关的事件监听"""
|
|||
|
self.signal.connect(self.updateData)
|
|||
|
self.eventEngine.register(self.eventType, self.signal.emit)
|
|||
|
|
|||
|
#----------------------------------------------------------------------
|
|||
|
def updateData(self, event):
|
|||
|
"""更新数据"""
|
|||
|
data = event.dict_['data']
|
|||
|
key = data.__getattribute__(self.dataKey)
|
|||
|
|
|||
|
# 如果设置了dataKey,则采用存量更新模式
|
|||
|
if self.dataKey:
|
|||
|
# 如果键在数据字典中不存在,则先插入新的一行,并创建对应单元格
|
|||
|
if key not in self.dataDict:
|
|||
|
self.insertRow(0)
|
|||
|
d = {}
|
|||
|
for n, header in enumerate(self.headerList):
|
|||
|
content = unicode(data.__getattribute__(header))
|
|||
|
cell = QtGui.QTableWidgetItem(content)
|
|||
|
if self.font:
|
|||
|
cell.setFont(font) # 如果设置了特殊字体,则进行单元格设置
|
|||
|
self.setItem(0, n, cell)
|
|||
|
d[header] = cell
|
|||
|
self.dataDict[key] = d
|
|||
|
# 否则如果已经存在,则直接更新相关单元格
|
|||
|
else:
|
|||
|
d = self.dataDict[key]
|
|||
|
for header in self.headerList:
|
|||
|
content = unicode(data.__getattribute__(header))
|
|||
|
cell = d[header]
|
|||
|
cell.setText(content)
|
|||
|
# 否则采用增量更新模式
|
|||
|
else:
|
|||
|
self.insertRow(0)
|
|||
|
for n, header in enumerate(self.headerList):
|
|||
|
content = unicode(data.__getattribute__(header))
|
|||
|
cell = QtGui.QTableWidgetItem(content)
|
|||
|
if self.font:
|
|||
|
cell.setFont(font)
|
|||
|
self.setItem(0, n, cell)
|
|||
|
|
|||
|
# 调整列宽
|
|||
|
self.resizeColumns()
|
|||
|
|
|||
|
#----------------------------------------------------------------------
|
|||
|
def resizeColumns(self):
|
|||
|
"""调整各列的大小"""
|
|||
|
self.horizontalHeader().resizeSections(QtGui.QHeaderView.ResizeToContents)
|
|||
|
|
|||
|
|
|||
|
########################################################################
|
|||
|
class MarketMonitor(BasicMonitor):
|
|||
|
"""市场监控组件"""
|
|||
|
|
|||
|
#----------------------------------------------------------------------
|
|||
|
def __init__(self, eventEngine, parent=None):
|
|||
|
"""Constructor"""
|
|||
|
super(MarketMonitor, self).__init__(eventEngine, parent)
|
|||
|
|
|||
|
# 设置表头有序字典
|
|||
|
d = OrderedDict()
|
|||
|
d['symbol'] = u'合约代码'
|
|||
|
d['vtSymbol'] = u'系统代码'
|
|||
|
d['lastPrice'] = u'最新价'
|
|||
|
d['volume'] = u'成交量'
|
|||
|
d['openInterest'] = u'持仓量'
|
|||
|
d['openPrice'] = u'开盘价'
|
|||
|
d['highPrice'] = u'最高价'
|
|||
|
d['lowPrice'] = u'最低价'
|
|||
|
d['bidPrice1'] = u'买一价'
|
|||
|
d['bidVolume1'] = u'买一量'
|
|||
|
d['askPrice1'] = u'卖一价'
|
|||
|
d['askVolume1'] = u'卖一量'
|
|||
|
d['tickTime'] = u'时间'
|
|||
|
self.setHeaderDict(d)
|
|||
|
|
|||
|
# 设置数据键
|
|||
|
self.setDataKey('vtSymbol')
|
|||
|
|
|||
|
# 设置监控事件类型
|
|||
|
self.setEventType(EVENT_TICK)
|
|||
|
|
|||
|
# 初始化表格
|
|||
|
self.initTable()
|
|||
|
|
|||
|
# 注册事件监听
|
|||
|
self.registerEvent()
|
|||
|
|
|||
|
|
|||
|
########################################################################
|
|||
|
class LogMonitor(BasicMonitor):
|
|||
|
"""日志监控"""
|
|||
|
|
|||
|
#----------------------------------------------------------------------
|
|||
|
def __init__(self, eventEngine, parent=None):
|
|||
|
"""Constructor"""
|
|||
|
super(LogMonitor, self).__init__(eventEngine, parent)
|
|||
|
|
|||
|
d = OrderedDict()
|
|||
|
d['gatewayName'] = u'接口'
|
|||
|
d['logTime'] = u'时间'
|
|||
|
d['logContent'] = u'内容'
|
|||
|
self.setHeaderDict(d)
|
|||
|
|
|||
|
self.setEventType(EVENT_LOG)
|
|||
|
self.initTable()
|
|||
|
self.registerEvent()
|
|||
|
|
|||
|
|
|||
|
########################################################################
|
|||
|
class ErrorMonitor(BasicMonitor):
|
|||
|
"""错误监控"""
|
|||
|
|
|||
|
#----------------------------------------------------------------------
|
|||
|
def __init__(self, eventEngine, parent=None):
|
|||
|
"""Constructor"""
|
|||
|
super(ErrorMonitor, self).__init__(eventEngine, parent)
|
|||
|
|
|||
|
d = OrderedDict()
|
|||
|
d['gatewayName'] = u'接口'
|
|||
|
d['errorID'] = u'错误代码'
|
|||
|
d['errorMsg'] = u'错误信息'
|
|||
|
self.setHeaderDict(d)
|
|||
|
|
|||
|
self.setEventType(EVENT_ERROR)
|
|||
|
self.initTable()
|
|||
|
self.registerEvent()
|
|||
|
|
|||
|
|
|||
|
########################################################################
|
|||
|
class TradeMonitor(BasicMonitor):
|
|||
|
"""成交监控"""
|
|||
|
|
|||
|
#----------------------------------------------------------------------
|
|||
|
def __init__(self, eventEngine, parent=None):
|
|||
|
"""Constructor"""
|
|||
|
super(TradeMonitor, self).__init__(eventEngine, parent)
|
|||
|
|
|||
|
d = OrderedDict()
|
|||
|
d['gatewayName'] = u'接口'
|
|||
|
d['tradeID'] = u'成交编号'
|
|||
|
d['orderID'] = u'委托编号'
|
|||
|
d['symbol'] = u'合约代码'
|
|||
|
d['direction'] = u'方向'
|
|||
|
d['offset'] = u'开平'
|
|||
|
d['price'] = u'价格'
|
|||
|
d['volume'] = u'数量'
|
|||
|
d['tradeTime'] = u'成交时间'
|
|||
|
self.setHeaderDict(d)
|
|||
|
|
|||
|
self.setEventType(EVENT_TRADE)
|
|||
|
self.initTable()
|
|||
|
self.registerEvent()
|
|||
|
|
|||
|
|
|||
|
########################################################################
|
|||
|
class OrderMonitor(BasicMonitor):
|
|||
|
"""委托监控"""
|
|||
|
|
|||
|
#----------------------------------------------------------------------
|
|||
|
def __init__(self, eventEngine, parent=None):
|
|||
|
"""Constructor"""
|
|||
|
super(OrderMonitor, self).__init__(eventEngine, parent)
|
|||
|
|
|||
|
d = OrderedDict()
|
|||
|
d['gatewayName'] = u'接口'
|
|||
|
d['orderID'] = u'委托编号'
|
|||
|
d['symbol'] = u'合约代码'
|
|||
|
d['direction'] = u'方向'
|
|||
|
d['offset'] = u'开平'
|
|||
|
d['price'] = u'价格'
|
|||
|
d['totalVolume'] = u'委托数量'
|
|||
|
d['tradedVolume'] = u'成交数量'
|
|||
|
d['status'] = u'状态'
|
|||
|
d['orderTime'] = u'委托时间'
|
|||
|
d['tradeTime'] = u'撤销时间'
|
|||
|
d['frontID'] = u'前置编号'
|
|||
|
d['sessionID'] = u'会话编号'
|
|||
|
self.setHeaderDict(d)
|
|||
|
|
|||
|
self.setDataKey('vtOrderID')
|
|||
|
self.setEventType(EVENT_ORDER)
|
|||
|
self.initTable()
|
|||
|
self.registerEvent()
|
|||
|
|
|||
|
|
|||
|
########################################################################
|
|||
|
class PositionMonitor(BasicMonitor):
|
|||
|
"""持仓监控"""
|
|||
|
|
|||
|
#----------------------------------------------------------------------
|
|||
|
def __init__(self, eventEngine, parent=None):
|
|||
|
"""Constructor"""
|
|||
|
super(PositionMonitor, self).__init__(eventEngine, parent)
|
|||
|
|
|||
|
d = OrderedDict()
|
|||
|
d['gatewayName'] = u'接口'
|
|||
|
d['symbol'] = u'合约代码'
|
|||
|
d['direction'] = u'方向'
|
|||
|
d['position'] = u'持仓量'
|
|||
|
d['frozen'] = u'冻结量'
|
|||
|
d['price'] = u'价格'
|
|||
|
self.setHeaderDict(d)
|
|||
|
|
|||
|
self.setDataKey('vtPositionName')
|
|||
|
self.setEventType(EVENT_POSITION)
|
|||
|
self.initTable()
|
|||
|
self.registerEvent()
|
|||
|
|
|||
|
|
|||
|
########################################################################
|
|||
|
class AccountMonitor(BasicMonitor):
|
|||
|
"""账户监控"""
|
|||
|
|
|||
|
#----------------------------------------------------------------------
|
|||
|
def __init__(self, eventEngine, parent=None):
|
|||
|
"""Constructor"""
|
|||
|
super(AccountMonitor, self).__init__(eventEngine, parent)
|
|||
|
|
|||
|
d = OrderedDict()
|
|||
|
d['gatewayName'] = u'接口'
|
|||
|
d['accountID'] = u'账户'
|
|||
|
d['preBalance'] = u'昨结'
|
|||
|
d['balance'] = u'净值'
|
|||
|
d['available'] = u'可用'
|
|||
|
d['commission'] = u'手续费'
|
|||
|
d['margin'] = u'保证金'
|
|||
|
d['closeProfit'] = u'平仓盈亏'
|
|||
|
d['positionProfit'] = u'持仓盈亏'
|
|||
|
self.setHeaderDict(d)
|
|||
|
|
|||
|
self.setDataKey('vtAccountID')
|
|||
|
self.setEventType(EVENT_ACCOUNT)
|
|||
|
self.initTable()
|
|||
|
self.registerEvent()
|
|||
|
|
|||
|
|