From 5be430dd2a2dbdac5e7fefaa0389e9b75e36dbc5 Mon Sep 17 00:00:00 2001 From: brillliantz Date: Fri, 8 Dec 2017 18:55:05 +0800 Subject: [PATCH] red for positive, green for negative --- vnTrader/uiBasicWidget.py | 644 ++++++++++++++++++++------------------ vnTrader/vtGateway.py | 1 - 2 files changed, 348 insertions(+), 297 deletions(-) diff --git a/vnTrader/uiBasicWidget.py b/vnTrader/uiBasicWidget.py index 44a7b55..425a53a 100644 --- a/vnTrader/uiBasicWidget.py +++ b/vnTrader/uiBasicWidget.py @@ -2,25 +2,30 @@ # import json from __future__ import division -from builtins import str -from builtins import range -from past.utils import old_div + import csv +from builtins import range +from builtins import str from collections import OrderedDict +from past.utils import old_div + # PyQt 4/5 compatibility try: - from PyQt4.QtGui import QTableWidgetItem, QTableWidget, QFrame, QLabel, QLineEdit, QComboBox, QDoubleSpinBox, QSpinBox, QCheckBox, QGridLayout, QHBoxLayout, QVBoxLayout, QPushButton,QMenu,QAction,QHeaderView + from PyQt4.QtGui import QTableWidgetItem, QTableWidget, QFrame, QLabel, QLineEdit, QComboBox, QDoubleSpinBox, \ + QSpinBox, QCheckBox, QGridLayout, QHBoxLayout, QVBoxLayout, QPushButton, QMenu, QAction, QHeaderView from PyQt4 import QtGui, QtCore except ImportError: from PyQt5 import QtGui, QtCore - from PyQt5.QtWidgets import QTableWidgetItem, QTableWidget, QFrame, QLabel, QLineEdit, QComboBox, QDoubleSpinBox, QSpinBox, QCheckBox, QGridLayout, QHBoxLayout, QVBoxLayout, QPushButton,QMenu,QAction,QHeaderView + from PyQt5.QtWidgets import QTableWidgetItem, QTableWidget, QFrame, QLabel, QLineEdit, QComboBox, QDoubleSpinBox, \ + QSpinBox, QCheckBox, QGridLayout, QHBoxLayout, QVBoxLayout, QPushButton, QMenu, QAction, QHeaderView from eventEngine import * from vtFunction import * from vtGateway import * -#---------------------------------------------------------------------- + +# ---------------------------------------------------------------------- def loadFont(): """载入字体设置""" try: @@ -33,14 +38,15 @@ def loadFont(): font = QtGui.QFont(u'微软雅黑', 12) return font + BASIC_FONT = loadFont() ######################################################################## class BasicCell(QTableWidgetItem): """基础的单元格""" - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def __init__(self, text=None, mainEngine=None): """Constructor""" super(BasicCell, self).__init__() @@ -48,19 +54,20 @@ def __init__(self, text=None, mainEngine=None): if text: self.setContent(text) - #---------------------------------------------------------------------- + # ---------------------------------------------------------------------- def setContent(self, text): """设置内容""" - text = str(text) + #text = str(text) if text == '0' or text == '0.0': self.setText('') else: self.setText(text) + class ErrorCell(QTableWidgetItem): """基础的单元格""" - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def __init__(self, text=None, mainEngine=None): """Constructor""" super(ErrorCell, self).__init__() @@ -68,7 +75,7 @@ def __init__(self, text=None, mainEngine=None): if text: self.setContent(text) - #---------------------------------------------------------------------- + # ---------------------------------------------------------------------- def setContent(self, text): """设置内容""" if text == '0' or text == '0.0': @@ -79,20 +86,53 @@ def setContent(self, text): self.setTextColor(QtGui.QColor('red')) self.setToolTip(text) + ######################################################################## -class NumCell2(QTableWidgetItem): +class NumCellColored(QTableWidgetItem): """用来显示数字的单元格""" - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def __init__(self, text=None, mainEngine=None): """Constructor""" - super(NumCell2, self).__init__() + super(NumCellColored, self).__init__() self.data = None if text: self.setContent(text) + + # ---------------------------------------------------------------------- + def setContent(self, text): + """设置内容""" + # 考虑到NumCell主要用来显示OrderID和TradeID之类的整数字段, + # 这里的数据转化方式使用int类型。但是由于部分交易接口的委托 + # 号和成交号可能不是纯数字的形式,因此补充了一个try...except + try: + num = int(float(text)) + if num == 0: + self.setText('') + else: + if num < 0: + self.setForeground(QtGui.QColor('green')) + else: + self.setForeground(QtGui.QColor('red')) + self.setData(QtCore.Qt.DisplayRole, num) + except ValueError: + self.setText(text) + + +class PositionCell(QTableWidgetItem): + """用来显示数字的单元格""" + + # ---------------------------------------------------------------------- + def __init__(self, text=None, mainEngine=None): + """Constructor""" + super(PositionCell, self).__init__() + self.data = None - #---------------------------------------------------------------------- + if text: + self.setContent(text) + + # ---------------------------------------------------------------------- def setContent(self, text): """设置内容""" # 考虑到NumCell主要用来显示OrderID和TradeID之类的整数字段, @@ -111,11 +151,12 @@ def setContent(self, text): except ValueError: self.setText(text) + ######################################################################## class NumCell(QTableWidgetItem): """用来显示数字的单元格""" - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def __init__(self, text=None, mainEngine=None): """Constructor""" super(NumCell, self).__init__() @@ -123,8 +164,8 @@ def __init__(self, text=None, mainEngine=None): if text: self.setContent(text) - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def setContent(self, text): """设置内容""" # 考虑到NumCell主要用来显示OrderID和TradeID之类的整数字段, @@ -138,20 +179,21 @@ def setContent(self, text): self.setData(QtCore.Qt.DisplayRole, num) except ValueError: self.setText(text) - + + ######################################################################## class DirectionCell(QTableWidgetItem): """用来显示买卖方向的单元格""" - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def __init__(self, text=None, mainEngine=None): """Constructor""" super(DirectionCell, self).__init__() self.data = None if text: self.setContent(text) - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def setContent(self, text): """设置内容""" if text == DIRECTION_LONG or text == DIRECTION_NET: @@ -164,8 +206,8 @@ def setContent(self, text): ######################################################################## class NameCell(QTableWidgetItem): """用来显示合约中文的单元格""" - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def __init__(self, text=None, mainEngine=None): """Constructor""" super(NameCell, self).__init__() @@ -175,8 +217,8 @@ def __init__(self, text=None, mainEngine=None): if text: self.setContent(text) - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def setContent(self, text): """设置内容""" if self.mainEngine: @@ -191,20 +233,20 @@ def setContent(self, text): ######################################################################## class BidCell(QTableWidgetItem): """买价单元格""" - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def __init__(self, text=None, mainEngine=None): """Constructor""" super(BidCell, self).__init__() self.data = None - + self.setForeground(QtGui.QColor('black')) self.setBackground(QtGui.QColor(255, 174, 201)) if text: self.setContent(text) - #---------------------------------------------------------------------- + # ---------------------------------------------------------------------- def setContent(self, text): """设置内容""" self.setText(text) @@ -213,24 +255,25 @@ def setContent(self, text): ######################################################################## class AskCell(QTableWidgetItem): """买价单元格""" - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def __init__(self, text=None, mainEngine=None): """Constructor""" super(AskCell, self).__init__() self.data = None - + self.setForeground(QtGui.QColor('black')) self.setBackground(QtGui.QColor(160, 255, 160)) if text: self.setContent(text) - #---------------------------------------------------------------------- + # ---------------------------------------------------------------------- def setContent(self, text): """设置内容""" self.setText(text) + ######################################################################## class BasicMonitor(QTableWidget): """ @@ -242,8 +285,8 @@ class BasicMonitor(QTableWidget): """ signal = QtCore.pyqtSignal(type(Event())) signal_clear = QtCore.pyqtSignal(type(Event())) - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def __init__(self, mainEngine=None, eventEngine=None, parent=None): """Constructor""" super(BasicMonitor, self).__init__(parent) @@ -276,35 +319,35 @@ def __init__(self, mainEngine=None, eventEngine=None, parent=None): # 初始化右键菜单 self.initMenu() - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def setHeaderDict(self, headerDict): """设置表头有序字典""" self.headerDict = headerDict self.headerList = list(headerDict.keys()) - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def setDataKey(self, dataKey): """设置数据字典的键""" self.dataKey = dataKey - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def setEventType(self, eventType1, eventType2=''): """设置监控的事件类型""" self.eventType = eventType1 self.eventTypeClear = eventType2 - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def setFont(self, font): """设置字体""" self.font = font - #---------------------------------------------------------------------- + # ---------------------------------------------------------------------- def setSaveData(self, saveData): """设置是否要保存数据到单元格""" self.saveData = saveData - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def initTable(self): """初始化表格""" # 设置表格的列数 @@ -329,8 +372,8 @@ def initTable(self): # set stretch # self.horizontalHeader().setResizeMode(QHeaderView.Stretch) - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def registerEvent(self): """注册GUI更新相关的事件监听""" self.signal.connect(self.updateEvent) @@ -345,7 +388,8 @@ def unRegister(self): self.eventEngine.unregister(self.eventType, self.signalemit) if len(self.eventTypeClear) > 0: self.eventEngine.unregister(self.eventTypeClear, self.signalclearemit) - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def updateEvent(self, event): """收到事件更新""" data = event.dict_['data'] @@ -355,8 +399,8 @@ def clearEvent(self, event): """收到事件更新""" self.dataDict.clear() self.setRowCount(0) - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def updateData(self, data): """将数据更新到表格中""" # 如果允许了排序功能,则插入数据前必须关闭,否则插入新的数据会变乱 @@ -365,13 +409,15 @@ def updateData(self, data): # 如果设置了dataKey,则采用存量更新模式 if self.dataKey: - key = data.__getattribute__(self.dataKey) + #key = data.__getattribute__(self.dataKey) + key = getattr(data, self.dataKey, None) # 如果键在数据字典中不存在,则先插入新的一行,并创建对应单元格 if key not in self.dataDict: - self.insertRow(0) + self.insertRow(0) d = {} for n, header in enumerate(self.headerList): - content = safeUnicode(data.__getattribute__(header)) + # content = safeUnicode(data.__getattribute__(header)) + content = safeUnicode(getattr(data, header, None)) cellType = self.headerDict[header]['cellType'] cell = cellType(content, self.mainEngine) @@ -380,7 +426,7 @@ def updateData(self, data): if self.saveData: # 如果设置了保存数据对象,则进行对象保存 cell.data = data - + self.setItem(0, n, cell) d[header] = cell self.dataDict[key] = d @@ -388,15 +434,15 @@ def updateData(self, data): else: d = self.dataDict[key] for header in self.headerList: - content = safeUnicode(data.__getattribute__(header)) + content = safeUnicode(getattr(data, header, None)) cell = d[header] cell.setContent(content) if self.saveData: # 如果设置了保存数据对象,则进行对象保存 - cell.data = data - # 否则采用增量更新模式 + cell.data = data + # 否则采用增量更新模式 else: - self.insertRow(0) + self.insertRow(0) for n, header in enumerate(self.headerList): content = safeUnicode(data.__getattribute__(header)) cellType = self.headerDict[header]['cellType'] @@ -404,30 +450,30 @@ def updateData(self, data): if self.font: cell.setFont(self.font) - - if self.saveData: - cell.data = data - - self.setItem(0, n, cell) - # 调整列宽 + if self.saveData: + cell.data = data + + self.setItem(0, n, cell) + + # 调整列宽 self.resizeColumns() # 重新打开排序 if self.sorting: self.setSortingEnabled(True) - #---------------------------------------------------------------------- + # ---------------------------------------------------------------------- def resizeColumns(self): """调整各列的大小""" self.horizontalHeader().resizeSections(QHeaderView.ResizeToContents) - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def setSorting(self, sorting): """设置是否允许根据表头排序""" self.sorting = sorting - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def saveToCsv(self): """保存表格内容到CSV文件""" # 先隐藏右键菜单 @@ -435,7 +481,7 @@ def saveToCsv(self): # 获取想要保存的文件名 path = QtGui.QFileDialog.getSaveFileName(self, '保存数据', '', 'CSV(*.csv)') - + try: if not path.isEmpty(): with open(safeUnicode(path), 'wb') as f: @@ -452,14 +498,14 @@ def saveToCsv(self): item = self.item(row, column) if item is not None: rowdata.append( - safeUnicode(item.text()).encode('gbk')) + safeUnicode(item.text()).encode('gbk')) else: rowdata.append('') - writer.writerow(rowdata) + writer.writerow(rowdata) except IOError: pass - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def initMenu(self): """初始化右键菜单""" self.menu = QMenu(self) @@ -472,40 +518,41 @@ def initMenu(self): self.menu.addAction(resizeAction) self.menu.addAction(saveAction) - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def contextMenuEvent(self, event): """右键点击事件""" - self.menu.popup(QtGui.QCursor.pos()) + self.menu.popup(QtGui.QCursor.pos()) + + ######################################################################## -######################################################################## class MarketMonitor(BasicMonitor): """市场监控组件""" - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def __init__(self, mainEngine, eventEngine, parent=None): """Constructor""" super(MarketMonitor, self).__init__(mainEngine, eventEngine, parent) # 设置表头有序字典 d = OrderedDict() - d['symbol'] = {'chinese':u'合约代码', 'cellType':BasicCell} - d['vtSymbol'] = {'chinese':u'名称', 'cellType':NameCell} - d['lastPrice'] = {'chinese':u'最新价', 'cellType':BasicCell} - d['preClosePrice'] = {'chinese':u'昨收盘价', 'cellType':BasicCell} - d['volume'] = {'chinese':u'成交量', 'cellType':NumCell} - d['openInterest'] = {'chinese':u'持仓量', 'cellType':NumCell} - d['openPrice'] = {'chinese':u'开盘价', 'cellType':BasicCell} - d['highPrice'] = {'chinese':u'最高价', 'cellType':BasicCell} - d['lowPrice'] = {'chinese':u'最低价', 'cellType':BasicCell} - d['bidPrice1'] = {'chinese':u'买一价', 'cellType':BidCell} - d['bidVolume1'] = {'chinese':u'买一量', 'cellType':NumCell} - d['askPrice1'] = {'chinese':u'卖一价', 'cellType':AskCell} - d['askVolume1'] = {'chinese':u'卖一量', 'cellType':NumCell} - d['time'] = {'chinese':u'时间', 'cellType':BasicCell} - d['volchg'] = {'chinese':u'成交量变', 'cellType':NumCell} - d['turnover'] = {'chinese':u'成交额', 'cellType':BasicCell} + d['symbol'] = {'chinese': u'合约代码', 'cellType': BasicCell} + d['vtSymbol'] = {'chinese': u'名称', 'cellType': NameCell} + d['lastPrice'] = {'chinese': u'最新价', 'cellType': BasicCell} + d['preClosePrice'] = {'chinese': u'昨收盘价', 'cellType': BasicCell} + d['volume'] = {'chinese': u'成交量', 'cellType': NumCell} + d['openInterest'] = {'chinese': u'持仓量', 'cellType': NumCell} + d['openPrice'] = {'chinese': u'开盘价', 'cellType': BasicCell} + d['highPrice'] = {'chinese': u'最高价', 'cellType': BasicCell} + d['lowPrice'] = {'chinese': u'最低价', 'cellType': BasicCell} + d['bidPrice1'] = {'chinese': u'买一价', 'cellType': BidCell} + d['bidVolume1'] = {'chinese': u'买一量', 'cellType': NumCell} + d['askPrice1'] = {'chinese': u'卖一价', 'cellType': AskCell} + d['askVolume1'] = {'chinese': u'卖一量', 'cellType': NumCell} + d['time'] = {'chinese': u'时间', 'cellType': BasicCell} + d['volchg'] = {'chinese': u'成交量变', 'cellType': NumCell} + d['turnover'] = {'chinese': u'成交额', 'cellType': BasicCell} # d['gatewayName'] = {'chinese':u'接口', 'cellType':BasicCell} self.setHeaderDict(d) @@ -527,36 +574,35 @@ def __init__(self, mainEngine, eventEngine, parent=None): # 注册事件监听 self.registerEvent() - + def updateEvent(self, event): - new_tick = event.dict_['data'] if new_tick.vtSymbol in self.dataDict: old_tick = self.dataDict[new_tick.vtSymbol]['symbol'].data new_tick.volchg = new_tick.volume - old_tick.volume if new_tick.volume > old_tick.volume else old_tick.volchg - - BasicMonitor.updateEvent(self, event) + BasicMonitor.updateEvent(self, event) + ######################################################################## class LogMonitor(BasicMonitor): """日志监控""" - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def __init__(self, mainEngine, eventEngine, parent=None): """Constructor""" super(LogMonitor, self).__init__(mainEngine, eventEngine, parent) - d = OrderedDict() - d['logTime'] = {'chinese':u'时间', 'cellType':BasicCell} - d['logContent'] = {'chinese':u'内容', 'cellType':ErrorCell} - d['gatewayName'] = {'chinese':u'接口', 'cellType':BasicCell} + d = OrderedDict() + d['logTime'] = {'chinese': u'时间', 'cellType': BasicCell} + d['logContent'] = {'chinese': u'内容', 'cellType': ErrorCell} + d['gatewayName'] = {'chinese': u'接口', 'cellType': BasicCell} self.setHeaderDict(d) self.setEventType(EVENT_LOG) - self.setFont(BASIC_FONT) + self.setFont(BASIC_FONT) self.initTable() self.registerEvent() @@ -564,18 +610,18 @@ def __init__(self, mainEngine, eventEngine, parent=None): ######################################################################## class ErrorMonitor(BasicMonitor): """错误监控""" - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def __init__(self, mainEngine, eventEngine, parent=None): """Constructor""" super(ErrorMonitor, self).__init__(mainEngine, eventEngine, parent) - d = OrderedDict() - d['errorTime'] = {'chinese':u'错误时间', 'cellType':BasicCell} - d['errorID'] = {'chinese':u'错误代码', 'cellType':BasicCell} - d['errorMsg'] = {'chinese':u'错误信息', 'cellType':BasicCell} - d['additionalInfo'] = {'chinese':u'补充信息', 'cellType':BasicCell} - d['gatewayName'] = {'chinese':u'接口', 'cellType':BasicCell} + d = OrderedDict() + d['errorTime'] = {'chinese': u'错误时间', 'cellType': BasicCell} + d['errorID'] = {'chinese': u'错误代码', 'cellType': BasicCell} + d['errorMsg'] = {'chinese': u'错误信息', 'cellType': BasicCell} + d['additionalInfo'] = {'chinese': u'补充信息', 'cellType': BasicCell} + d['gatewayName'] = {'chinese': u'接口', 'cellType': BasicCell} self.setHeaderDict(d) self.setEventType(EVENT_ERROR) @@ -587,22 +633,22 @@ def __init__(self, mainEngine, eventEngine, parent=None): ######################################################################## class TradeMonitor(BasicMonitor): """成交监控""" - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def __init__(self, mainEngine, eventEngine, parent=None): """Constructor""" super(TradeMonitor, self).__init__(mainEngine, eventEngine, parent) d = OrderedDict() - d['tradeID'] = {'chinese':u'成交编号', 'cellType':NumCell} - d['orderID'] = {'chinese':u'委托编号', 'cellType':NumCell} - d['symbol'] = {'chinese':u'合约代码', 'cellType':BasicCell} - d['vtSymbol'] = {'chinese':u'名称', 'cellType':NameCell} - d['direction'] = {'chinese':u'方向', 'cellType':DirectionCell} - d['offset'] = {'chinese':u'开平', 'cellType':BasicCell} - d['price'] = {'chinese':u'价格', 'cellType':BasicCell} - d['volume'] = {'chinese':u'数量', 'cellType':NumCell} - d['tradeTime'] = {'chinese':u'成交时间', 'cellType':BasicCell} + d['tradeID'] = {'chinese': u'成交编号', 'cellType': NumCell} + d['orderID'] = {'chinese': u'委托编号', 'cellType': NumCell} + d['symbol'] = {'chinese': u'合约代码', 'cellType': BasicCell} + d['vtSymbol'] = {'chinese': u'名称', 'cellType': NameCell} + d['direction'] = {'chinese': u'方向', 'cellType': DirectionCell} + d['offset'] = {'chinese': u'开平', 'cellType': BasicCell} + d['price'] = {'chinese': u'价格', 'cellType': BasicCell} + d['volume'] = {'chinese': u'数量', 'cellType': NumCell} + d['tradeTime'] = {'chinese': u'成交时间', 'cellType': BasicCell} # d['gatewayName'] = {'chinese':u'接口', 'cellType':BasicCell} self.setHeaderDict(d) @@ -614,31 +660,33 @@ def __init__(self, mainEngine, eventEngine, parent=None): self.initTable() self.registerEvent() + ######################################################################## class OrderMonitor(BasicMonitor): """委托监控""" signal_trade = QtCore.pyqtSignal(type(Event())) - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def __init__(self, mainEngine, eventEngine, parent=None): """Constructor""" super(OrderMonitor, self).__init__(mainEngine, eventEngine, parent) - + self.mainEngine = mainEngine d = OrderedDict() - d['orderID'] = {'chinese':u'委托编号', 'cellType':NumCell} - d['symbol'] = {'chinese':u'合约代码', 'cellType':BasicCell} - d['vtSymbol'] = {'chinese':u'名称', 'cellType':NameCell} - d['priceType'] = {'chinese':u'算法', 'cellType':BasicCell} - d['direction'] = {'chinese':u'方向', 'cellType':DirectionCell} - d['offset'] = {'chinese':u'开平', 'cellType':BasicCell} - d['price'] = {'chinese':u'价格', 'cellType':BasicCell} - d['totalVolume'] = {'chinese':u'委托数量', 'cellType':NumCell} - d['tradePrice'] = {'chinese':u'成交价格', 'cellType':BasicCell} - d['tradedVolume'] = {'chinese':u'成交数量', 'cellType':NumCell} - d['status'] = {'chinese':u'状态', 'cellType':BasicCell} - d['orderTime'] = {'chinese':u'委托时间', 'cellType':BasicCell} - d['taskID'] = {'chinese':u'任务编号', 'cellType':NumCell} + d['orderID'] = {'chinese': u'委托编号', 'cellType': NumCell} + d['symbol'] = {'chinese': u'合约代码', 'cellType': BasicCell} + d['vtSymbol'] = {'chinese': u'名称', 'cellType': NameCell} + d['priceType'] = {'chinese': u'算法', 'cellType': BasicCell} + d['direction'] = {'chinese': u'方向', 'cellType': DirectionCell} + d['offset'] = {'chinese': u'开平', 'cellType': BasicCell} + d['price'] = {'chinese': u'价格', 'cellType': BasicCell} + d['totalVolume'] = {'chinese': u'委托数量', 'cellType': NumCell} + d['tradePrice'] = {'chinese': u'成交价格', 'cellType': BasicCell} + d['tradedVolume'] = {'chinese': u'成交数量', 'cellType': NumCell} + d['status'] = {'chinese': u'状态', 'cellType': BasicCell} + d['orderTime'] = {'chinese': u'委托时间', 'cellType': BasicCell} + d['taskID'] = {'chinese': u'任务编号', 'cellType': NumCell} # d['cancelTime'] = {'chinese':u'撤销时间', 'cellType':BasicCell} # d['frontID'] = {'chinese':u'前置编号', 'cellType':BasicCell} # d['sessionID'] = {'chinese':u'会话编号', 'cellType':BasicCell} @@ -659,14 +707,15 @@ def __init__(self, mainEngine, eventEngine, parent=None): def registerTradeEvent(self): self.signal_trade.connect(self.updateTrade) self.eventEngine.register(EVENT_TRADE, self.signal_trade.emit) - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def connectSignal(self): """连接信号""" # 双击单元格撤单 - self.itemDoubleClicked.connect(self.cancelOrder) + self.itemDoubleClicked.connect(self.cancelOrder) + + # ---------------------------------------------------------------------- - #---------------------------------------------------------------------- def cancelOrder(self, cell): """根据单元格的数据撤单""" order = cell.data @@ -686,36 +735,39 @@ def updateTrade(self, event): if trade.vtOrderID in self.dataDict: order = self.dataDict[trade.vtOrderID]['orderID'].data if order.status not in (STATUS_ALLTRADED, STATUS_CANCELLED, STATUS_REJECTED): - order.tradePrice = old_div((trade.volume * trade.price + order.tradePrice * order.tradedVolume), (order.tradedVolume + trade.volume)) + order.tradePrice = old_div((trade.volume * trade.price + order.tradePrice * order.tradedVolume), + (order.tradedVolume + trade.volume)) order.tradedVolume += trade.volume self.updateData(order) - + + ######################################################################## class PositionMonitor(BasicMonitor): """持仓监控""" - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def __init__(self, mainEngine, eventEngine, parent=None): """Constructor""" super(PositionMonitor, self).__init__(mainEngine, eventEngine, parent) d = OrderedDict() - d['symbol'] = {'chinese':u'代码', 'cellType':BasicCell} - d['vtSymbol'] = {'chinese':u'名称', 'cellType':NameCell} - d['direction'] = {'chinese':u'方向', 'cellType':DirectionCell} - d['initPosition'] = {'chinese':u'初持仓', 'cellType':NumCell} - d['position'] = {'chinese':u'总持仓', 'cellType':NumCell} - d['price'] = {'chinese':u'成本价', 'cellType':BasicCell} - d['ydPosition'] = {'chinese':u'昨持仓', 'cellType':NumCell} - d['tdPosition'] = {'chinese':u'今持仓', 'cellType':NumCell} - d['frozen'] = {'chinese':u'冻结量', 'cellType':NumCell} - d['enable'] = {'chinese':u'可用量', 'cellType':NumCell} - d['want'] = {'chinese':u'开仓在途', 'cellType':NumCell} - d['trading'] = {'chinese':u'交易赢亏', 'cellType':NumCell2} - d['holding'] = {'chinese':u'持仓赢亏', 'cellType':NumCell2} - d['commission'] = {'chinese':u'手续费', 'cellType':BasicCell} - - d['last'] = {'chinese':u'市场价', 'cellType':BasicCell} - d['mktval'] = {'chinese':u'市值', 'cellType':NumCell} + d['symbol'] = {'chinese': u'代码', 'cellType': BasicCell} + d['vtSymbol'] = {'chinese': u'名称', 'cellType': NameCell} + d['direction'] = {'chinese': u'方向', 'cellType': DirectionCell} + d['initPosition'] = {'chinese': u'初持仓', 'cellType': PositionCell} + d['position'] = {'chinese': u'总持仓', 'cellType': PositionCell} + d['price'] = {'chinese': u'成本价', 'cellType': BasicCell} + d['ydPosition'] = {'chinese': u'昨持仓', 'cellType': PositionCell} + d['tdPosition'] = {'chinese': u'今持仓', 'cellType': PositionCell} + d['frozen'] = {'chinese': u'冻结量', 'cellType': NumCell} + d['enable'] = {'chinese': u'可用量', 'cellType': NumCell} + d['want'] = {'chinese': u'开仓在途', 'cellType': NumCell} + d['trading'] = {'chinese': u'交易赢亏', 'cellType': NumCellColored} + d['holding'] = {'chinese': u'持仓赢亏', 'cellType': NumCellColored} + d['commission'] = {'chinese': u'手续费', 'cellType': BasicCell} + + d['last'] = {'chinese': u'市场价', 'cellType': BasicCell} + d['mktval'] = {'chinese': u'市值', 'cellType': NumCell} self.setHeaderDict(d) @@ -727,29 +779,30 @@ def __init__(self, mainEngine, eventEngine, parent=None): self.initTable() self.registerEvent() - + + ######################################################################## class AccountMonitor(BasicMonitor): """账户监控""" - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def __init__(self, mainEngine, eventEngine, parent=None): """Constructor""" super(AccountMonitor, self).__init__(mainEngine, eventEngine, parent) d = OrderedDict() - d['accountID'] = {'chinese':u'账号', 'cellType':BasicCell} - d['type'] = {'chinese':u'类型', 'cellType':BasicCell} - d['init_balance'] = {'chinese':u'期初', 'cellType':NumCell} - d['enable_balance'] = {'chinese':u'可用', 'cellType':NumCell} - d['frozen_balance'] = {'chinese':u'冻结', 'cellType':NumCell} - d['margin'] = {'chinese':u'保证金', 'cellType':NumCell} - d['holding_pnl'] = {'chinese':u'持仓盈亏', 'cellType':NumCell2} - d['trading_pnl'] = {'chinese':u'交易盈亏', 'cellType':NumCell2} - d['commission'] = {'chinese':u'手续费', 'cellType':BasicCell} - d['float_pnl'] = {'chinese':u'浮动盈亏', 'cellType':NumCell2} - d['close_pnl'] = {'chinese':u'平仓盈亏', 'cellType':NumCell2} - d['deposit_balance'] = {'chinese':u'差额', 'cellType':NumCell} + d['accountID'] = {'chinese': u'账号', 'cellType': BasicCell} + d['type'] = {'chinese': u'类型', 'cellType': BasicCell} + d['init_balance'] = {'chinese': u'期初', 'cellType': NumCell} + d['enable_balance'] = {'chinese': u'可用', 'cellType': NumCell} + d['frozen_balance'] = {'chinese': u'冻结', 'cellType': NumCell} + d['margin'] = {'chinese': u'保证金', 'cellType': NumCell} + d['holding_pnl'] = {'chinese': u'持仓盈亏', 'cellType': NumCellColored} + d['trading_pnl'] = {'chinese': u'交易盈亏', 'cellType': NumCellColored} + d['commission'] = {'chinese': u'手续费', 'cellType': BasicCell} + d['float_pnl'] = {'chinese': u'浮动盈亏', 'cellType': NumCellColored} + d['close_pnl'] = {'chinese': u'平仓盈亏', 'cellType': NumCellColored} + d['deposit_balance'] = {'chinese': u'差额', 'cellType': NumCell} self.setHeaderDict(d) self.setDataKey('vtAccountID') @@ -758,6 +811,7 @@ def __init__(self, mainEngine, eventEngine, parent=None): self.initTable() self.registerEvent() + ######################################################################## class TradingWidget(QFrame): """简单交易组件""" @@ -765,7 +819,7 @@ class TradingWidget(QFrame): directionList = [DIRECTION_LONG, DIRECTION_SHORT] - + offsetList = [OFFSET_OPEN, OFFSET_CLOSE, OFFSET_CLOSEYESTERDAY, @@ -801,8 +855,8 @@ class TradingWidget(QFrame): PRODUCT_OPTION, PRODUCT_BOND, PRODUCT_FOREX] - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def __init__(self, mainEngine, eventEngine, parent=None): """Constructor""" super(TradingWidget, self).__init__(parent) @@ -811,18 +865,18 @@ def __init__(self, mainEngine, eventEngine, parent=None): self.symbol = '' self.signalemit = None - + self.initUi() self.connectSignal() - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def initUi(self): """初始化界面""" self.setWindowTitle(u'交易') self.setMaximumWidth(500) self.setFrameShape(self.Box) # 设置边框 - self.setLineWidth(1) - + self.setLineWidth(1) + # 左边部分 labelSymbol = QLabel(u'代码') labelName = QLabel(u'名称') @@ -835,40 +889,40 @@ def initUi(self): labelCurrency = QLabel(u'货币') labelProductClass = QLabel(u'产品类型') labelUrgency = QLabel(u'紧急度') - + self.lineSymbol = QLineEdit() self.lineName = QLineEdit() - + self.comboDirection = QComboBox() self.comboDirection.addItems(self.directionList) - + self.comboOffset = QComboBox() self.comboOffset.addItem('') self.comboOffset.addItems(self.offsetList) self.comboOffset.setEnabled(False) self.tickOffset = QCheckBox(u'指定') - + self.spinPrice = QDoubleSpinBox() self.spinPrice.setDecimals(4) self.spinPrice.setMinimum(0) self.spinPrice.setMaximum(100000) - + self.spinVolume = QSpinBox() self.spinVolume.setMinimum(0) self.spinVolume.setMaximum(1000000) - + self.comboPriceType = QComboBox() self.comboPriceType.addItems(self.priceTypeList) self.comboExchange = QComboBox() self.comboExchange.addItems(self.exchangeList) - self.comboExchange.setEnabled(False) + self.comboExchange.setEnabled(False) self.comboCurrency = QComboBox() self.comboCurrency.addItems(self.currencyList) - self.comboCurrency.setEnabled(False) - + self.comboCurrency.setEnabled(False) + self.comboProductClass = QComboBox() self.comboProductClass.addItems(self.productClassList) self.comboProductClass.setEnabled(False) @@ -878,7 +932,7 @@ def initUi(self): self.spinUrgency.setMaximum(9) self.spinUrgency.setSingleStep(1) self.spinUrgency.setValue(5) - + gridleft = QGridLayout() gridleft.addWidget(labelSymbol, 0, 0) gridleft.addWidget(labelName, 1, 0) @@ -896,7 +950,6 @@ def initUi(self): gridleft.addWidget(self.lineName, 1, 1) gridleft.addWidget(self.comboDirection, 2, 1) - hbox1 = QHBoxLayout() hbox1.addWidget(self.comboOffset) lable1 = QLabel() @@ -913,21 +966,21 @@ def initUi(self): gridleft.addWidget(self.spinUrgency, 7, 1) gridleft.addWidget(self.comboExchange, 8, 1) gridleft.addWidget(self.comboProductClass, 9, 1) - gridleft.addWidget(self.comboCurrency, 10, 1) - + gridleft.addWidget(self.comboCurrency, 10, 1) + # 右边部分 labelBid1 = QLabel(u'买一') labelBid2 = QLabel(u'买二') labelBid3 = QLabel(u'买三') labelBid4 = QLabel(u'买四') labelBid5 = QLabel(u'买五') - + labelAsk1 = QLabel(u'卖一') labelAsk2 = QLabel(u'卖二') labelAsk3 = QLabel(u'卖三') labelAsk4 = QLabel(u'卖四') labelAsk5 = QLabel(u'卖五') - + self.labelBidPrice1 = QLabel() self.labelBidPrice2 = QLabel() self.labelBidPrice3 = QLabel() @@ -938,7 +991,7 @@ def initUi(self): self.labelBidVolume3 = QLabel() self.labelBidVolume4 = QLabel() self.labelBidVolume5 = QLabel() - + self.labelAskPrice1 = QLabel() self.labelAskPrice2 = QLabel() self.labelAskPrice3 = QLabel() @@ -949,14 +1002,14 @@ def initUi(self): self.labelAskVolume3 = QLabel() self.labelAskVolume4 = QLabel() self.labelAskVolume5 = QLabel() - + labelLast = QLabel(u'最新') self.labelLastPrice = QLabel() self.labelReturn = QLabel() - + self.labelLastPrice.setMinimumWidth(60) self.labelReturn.setMinimumWidth(60) - + gridRight = QGridLayout() gridRight.addWidget(labelAsk5, 0, 0) gridRight.addWidget(labelAsk4, 1, 0) @@ -969,7 +1022,7 @@ def initUi(self): gridRight.addWidget(labelBid3, 8, 0) gridRight.addWidget(labelBid4, 9, 0) gridRight.addWidget(labelBid5, 10, 0) - + gridRight.addWidget(self.labelAskPrice5, 0, 1) gridRight.addWidget(self.labelAskPrice4, 1, 1) gridRight.addWidget(self.labelAskPrice3, 2, 1) @@ -980,8 +1033,8 @@ def initUi(self): gridRight.addWidget(self.labelBidPrice2, 7, 1) gridRight.addWidget(self.labelBidPrice3, 8, 1) gridRight.addWidget(self.labelBidPrice4, 9, 1) - gridRight.addWidget(self.labelBidPrice5, 10, 1) - + gridRight.addWidget(self.labelBidPrice5, 10, 1) + gridRight.addWidget(self.labelAskVolume5, 0, 2) gridRight.addWidget(self.labelAskVolume4, 1, 2) gridRight.addWidget(self.labelAskVolume3, 2, 2) @@ -993,7 +1046,7 @@ def initUi(self): gridRight.addWidget(self.labelBidVolume3, 8, 2) gridRight.addWidget(self.labelBidVolume4, 9, 2) gridRight.addWidget(self.labelBidVolume5, 10, 2) - + # 发单按钮 buttonSendOrder = QPushButton(u'发单') buttonCancelAll = QPushButton(u'全撤') @@ -1001,20 +1054,20 @@ def initUi(self): size = buttonSendOrder.sizeHint() buttonSendOrder.setMinimumHeight(size.height() * 2) # 把按钮高度设为默认两倍 buttonCancelAll.setMinimumHeight(size.height() * 2) - + # 整合布局 hbox = QHBoxLayout() hbox.addLayout(gridleft) hbox.addLayout(gridRight) - + vbox = QVBoxLayout() vbox.addLayout(hbox) vbox.addWidget(buttonSendOrder) vbox.addWidget(buttonCancelAll) vbox.addStretch() - + self.setLayout(vbox) - + # 关联更新 buttonSendOrder.clicked.connect(self.sendOrder) buttonCancelAll.clicked.connect(self.cancelAll) @@ -1029,46 +1082,46 @@ def initUi(self): self.labelAskPrice5.mouseDoubleClickEvent = self.ask5clicked self.labelBidPrice1.mouseDoubleClickEvent = self.bid1clicked - self.labelBidPrice2.mouseDoubleClickEvent = self.bid2clicked + self.labelBidPrice2.mouseDoubleClickEvent = self.bid2clicked self.labelBidPrice3.mouseDoubleClickEvent = self.bid3clicked self.labelBidPrice4.mouseDoubleClickEvent = self.bid4clicked self.labelBidPrice5.mouseDoubleClickEvent = self.bid5clicked self.labelLastPrice.mouseDoubleClickEvent = self.lastclicked - + def ask1clicked(self, a): self.askclicked(self.labelAskPrice1.text()) - + def ask2clicked(self, a): self.askclicked(self.labelAskPrice2.text()) - + def ask3clicked(self, a): self.askclicked(self.labelAskPrice3.text()) - + def ask4clicked(self, a): self.askclicked(self.labelAskPrice4.text()) - + def ask5clicked(self, a): self.askclicked(self.labelAskPrice5.text()) - + def bid1clicked(self, a): self.bidclicked(self.labelBidPrice1.text()) - + def bid2clicked(self, a): self.bidclicked(self.labelBidPrice2.text()) - + def bid3clicked(self, a): self.bidclicked(self.labelBidPrice3.text()) - + def bid4clicked(self, a): self.bidclicked(self.labelBidPrice4.text()) - + def bid5clicked(self, a): - self.bidclicked(self.labelBidPrice5.text()) - + self.bidclicked(self.labelBidPrice5.text()) + def lastclicked(self, a): - self.setPrice(self.labelLastPrice.text()) - + self.setPrice(self.labelLastPrice.text()) + def setPrice(self, text): result = False if text is not None and len(text) > 0: @@ -1077,17 +1130,17 @@ def setPrice(self, text): self.spinPrice.setValue(price) result = True return result - + def askclicked(self, text): if self.setPrice(text): self.comboDirection.setCurrentIndex(self.directionList.index(DIRECTION_LONG)) self.updateOffset() - + def bidclicked(self, text): if self.setPrice(text): self.comboDirection.setCurrentIndex(self.directionList.index(DIRECTION_SHORT)) self.updateOffset() - + def updateOffset(self): if self.tickOffset.checkState(): self.comboOffset.setEnabled(True) @@ -1102,20 +1155,20 @@ def updateOffset(self): else: self.comboOffset.setEnabled(False) self.comboOffset.setCurrentIndex(0) - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def updateSymbol(self): """合约变化""" # 读取组件数据 symbol = str(self.lineSymbol.text()) self.comboCurrency.setCurrentIndex(1) - - currency = safeUnicode(self.comboCurrency.currentText()) + + currency = safeUnicode(self.comboCurrency.currentText()) gatewayName = safeUnicode('quantos') - + # 查询合约 vtSymbol = symbol - contract = self.mainEngine.getContract(symbol) + contract = self.mainEngine.getContract(symbol) # 清空价格数量 self.spinPrice.setValue(0) @@ -1136,17 +1189,17 @@ def updateSymbol(self): self.spinVolume.setSingleStep(contract.lotsize) self.updateOffset() - + else: self.comboExchange.setCurrentIndex(0) self.comboProductClass.setCurrentIndex(0) - productClass = safeUnicode(self.comboProductClass.currentText()) + productClass = safeUnicode(self.comboProductClass.currentText()) exchange = safeUnicode(self.comboExchange.currentText()) self.lineName.setText(u'不存在') p = self.lineName.palette() p.setColor(self.lineName.foregroundRole(), QtGui.QColor('red')) self.lineName.setPalette(p) - + # 清空行情显示 self.labelBidPrice1.setText('') self.labelBidPrice2.setText('') @@ -1157,7 +1210,7 @@ def updateSymbol(self): self.labelBidVolume2.setText('') self.labelBidVolume3.setText('') self.labelBidVolume4.setText('') - self.labelBidVolume5.setText('') + self.labelBidVolume5.setText('') self.labelAskPrice1.setText('') self.labelAskPrice2.setText('') self.labelAskPrice3.setText('') @@ -1170,25 +1223,25 @@ def updateSymbol(self): self.labelAskVolume5.setText('') self.labelLastPrice.setText('') self.labelReturn.setText('') - + # 重新注册事件监听 if self.signalemit != None: self.eventEngine.unregister(EVENT_TICK + self.symbol, self.signalemit) self.signalemit = self.signal.emit self.eventEngine.register(EVENT_TICK + vtSymbol, self.signalemit) - + # 订阅合约 self.mainEngine.subscribe(contract.vtSymbol, gatewayName) - + # 更新组件当前交易的合约 self.symbol = vtSymbol - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def updateTick(self, event): """更新行情""" tick = event.dict_['data'] - + if tick.vtSymbol == self.symbol: self.labelBidPrice1.setText(str(tick.bidPrice1)) self.labelAskPrice1.setText(str(tick.askPrice1)) @@ -1200,12 +1253,12 @@ def updateTick(self, event): self.labelBidPrice3.setText(str(tick.bidPrice3)) self.labelBidPrice4.setText(str(tick.bidPrice4)) self.labelBidPrice5.setText(str(tick.bidPrice5)) - + self.labelAskPrice2.setText(str(tick.askPrice2)) self.labelAskPrice3.setText(str(tick.askPrice3)) self.labelAskPrice4.setText(str(tick.askPrice4)) self.labelAskPrice5.setText(str(tick.askPrice5)) - + self.labelBidVolume2.setText(str(tick.bidVolume2)) self.labelBidVolume3.setText(str(tick.bidVolume3)) self.labelBidVolume4.setText(str(tick.bidVolume4)) @@ -1214,8 +1267,8 @@ def updateTick(self, event): self.labelAskVolume2.setText(str(tick.askVolume2)) self.labelAskVolume3.setText(str(tick.askVolume3)) self.labelAskVolume4.setText(str(tick.askVolume4)) - self.labelAskVolume5.setText(str(tick.askVolume5)) - + self.labelAskVolume5.setText(str(tick.askVolume5)) + self.labelLastPrice.setText(str(tick.lastPrice)) if self.spinPrice.value() < 0.000001 and tick.lastPrice > 0.000001: self.spinPrice.setValue(tick.lastPrice) @@ -1225,15 +1278,15 @@ def updateTick(self, event): self.labelReturn.setText(('%.2f' % (rt * 100)) + '%') else: self.labelReturn.setText('') - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def connectSignal(self): """连接Signal""" self.signal.connect(self.updateTick) - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def sendOrder(self): - """发单""" + """发单""" symbol = str(self.lineSymbol.text()).strip() exchange = safeUnicode(self.comboExchange.currentText()) price = self.spinPrice.value() @@ -1242,7 +1295,7 @@ def sendOrder(self): if len(symbol) <= 0 or len(exchange) <= 0 or price <= 0 or volume <= 0: return - + # 查询合约 if exchange: vtSymbol = '.'.join([symbol, exchange]) @@ -1254,7 +1307,7 @@ def sendOrder(self): if contract: gatewayName = contract.gatewayName exchange = contract.exchange # 保证有交易所代码 - + req = VtOrderReq() req.symbol = symbol req.exchange = exchange @@ -1267,8 +1320,8 @@ def sendOrder(self): req.productClass = safeUnicode(self.comboProductClass.currentText()) self.mainEngine.sendOrder(req, gatewayName) - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def cancelAll(self): """一键撤销所有委托""" l = self.mainEngine.getAllWorkingOrders() @@ -1280,8 +1333,8 @@ def cancelAll(self): req.sessionID = order.sessionID req.orderID = order.taskID self.mainEngine.cancelOrder(req, order.gatewayName) - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def closePosition(self, cell): """根据持仓信息自动填写交易组件""" # 读取持仓数据,cell是一个表格中的单元格对象 @@ -1305,14 +1358,14 @@ def closePosition(self, cell): self.comboOffset.setCurrentIndex(self.offsetList.index(OFFSET_CLOSE) + 1) elif self.tickOffset.checkState(): self.comboOffset.setCurrentIndex(self.offsetList.index(OFFSET_CLOSE) + 1) - - # 价格留待更新后由用户输入,防止有误操作 - + + # 价格留待更新后由用户输入,防止有误操作 + def fillSymbol(self, cell): tick = cell.data self.lineSymbol.setText(tick.symbol) - + self.updateSymbol() if type(cell) in (BidCell, AskCell): @@ -1324,49 +1377,48 @@ def fillSymbol(self, cell): direction = DIRECTION_LONG if type(cell) is AskCell else DIRECTION_SHORT self.comboDirection.setCurrentIndex(self.directionList.index(direction)) self.updateOffset() - + + ######################################################################## class ContractMonitor(BasicMonitor): """合约查询""" - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def __init__(self, mainEngine, eventEngine, parent=None): """Constructor""" super(ContractMonitor, self).__init__(parent=parent) self.mainEngine = mainEngine self.eventEngine = eventEngine - + d = OrderedDict() - d['symbol'] = {'chinese':u'合约代码', 'cellType':BasicCell} - d['exchange'] = {'chinese':u'交易所', 'cellType':BasicCell} - d['vtSymbol'] = {'chinese':u'vt系统代码', 'cellType':BasicCell} - d['name'] = {'chinese':u'名称', 'cellType':BasicCell} - d['productClass'] = {'chinese':u'合约类型', 'cellType':BasicCell} - d['size'] = {'chinese':u'合约乘数', 'cellType':BasicCell} - d['lotsize'] = {'chinese':u'最小交易单位', 'cellType':BasicCell} - d['priceTick'] = {'chinese':u'最小价格变动', 'cellType':BasicCell} + d['symbol'] = {'chinese': u'合约代码', 'cellType': BasicCell} + d['exchange'] = {'chinese': u'交易所', 'cellType': BasicCell} + d['vtSymbol'] = {'chinese': u'vt系统代码', 'cellType': BasicCell} + d['name'] = {'chinese': u'名称', 'cellType': BasicCell} + d['productClass'] = {'chinese': u'合约类型', 'cellType': BasicCell} + d['size'] = {'chinese': u'合约乘数', 'cellType': BasicCell} + d['lotsize'] = {'chinese': u'最小交易单位', 'cellType': BasicCell} + d['priceTick'] = {'chinese': u'最小价格变动', 'cellType': BasicCell} self.setHeaderDict(d) self.initUi() - - #---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- def initUi(self): """初始化界面""" self.setWindowTitle(u'合约') - self.setLineWidth(1) + self.setLineWidth(1) self.setFont(BASIC_FONT) self.initTable() - + # 设置数据键 self.setDataKey('vtSymbol') - + self.setSorting(True) - + # 设置监控事件类型 self.setEventType(EVENT_CONTRACT, EVENT_CONTRACT_CLEAR) - + self.initTable() self.registerEvent() - - diff --git a/vnTrader/vtGateway.py b/vnTrader/vtGateway.py index d09199b..5fafdcd 100644 --- a/vnTrader/vtGateway.py +++ b/vnTrader/vtGateway.py @@ -6,7 +6,6 @@ import time from eventEngine import * - from vtConstant import *