diff --git a/vn.trader/uiBasicWidget.py b/vn.trader/uiBasicWidget.py index e551f7f1..f97431a1 100644 --- a/vn.trader/uiBasicWidget.py +++ b/vn.trader/uiBasicWidget.py @@ -16,9 +16,9 @@ from vtGateway import * def loadFont(): """载入字体设置""" fileName = 'VT_setting.json' - path = os.path.abspath(os.path.dirname(__file__)) - fileName = os.path.join(path, fileName) - + path = os.path.abspath(os.path.dirname(__file__)) + fileName = os.path.join(path, fileName) + try: f = file(fileName) setting = json.load(f) @@ -43,7 +43,7 @@ class BasicCell(QtGui.QTableWidgetItem): self.data = None if text: self.setContent(text) - + #---------------------------------------------------------------------- def setContent(self, text): """设置内容""" @@ -64,7 +64,7 @@ class NumCell(QtGui.QTableWidgetItem): self.data = None if text: self.setContent(text) - + #---------------------------------------------------------------------- def setContent(self, text): """设置内容""" @@ -76,7 +76,7 @@ class NumCell(QtGui.QTableWidgetItem): self.setData(QtCore.Qt.DisplayRole, num) except ValueError: self.setText(text) - + ######################################################################## class DirectionCell(QtGui.QTableWidgetItem): @@ -89,7 +89,7 @@ class DirectionCell(QtGui.QTableWidgetItem): self.data = None if text: self.setContent(text) - + #---------------------------------------------------------------------- def setContent(self, text): """设置内容""" @@ -108,20 +108,20 @@ class NameCell(QtGui.QTableWidgetItem): def __init__(self, text=None, mainEngine=None): """Constructor""" super(NameCell, self).__init__() - + self.mainEngine = mainEngine self.data = None - + if text: self.setContent(text) - + #---------------------------------------------------------------------- def setContent(self, text): """设置内容""" if self.mainEngine: # 首先尝试正常获取合约对象 contract = self.mainEngine.getContract(text) - + # 如果能读取合约信息 if contract: self.setText(contract.name) @@ -139,10 +139,10 @@ class BidCell(QtGui.QTableWidgetItem): self.setForeground(QtGui.QColor('black')) self.setBackground(QtGui.QColor(255,174,201)) - + if text: self.setContent(text) - + #---------------------------------------------------------------------- def setContent(self, text): """设置内容""" @@ -161,10 +161,10 @@ class AskCell(QtGui.QTableWidgetItem): self.setForeground(QtGui.QColor('black')) self.setBackground(QtGui.QColor(160,255,160)) - + if text: self.setContent(text) - + #---------------------------------------------------------------------- def setContent(self, text): """设置内容""" @@ -175,10 +175,10 @@ class AskCell(QtGui.QTableWidgetItem): class BasicMonitor(QtGui.QTableWidget): """ 基础监控 - + headerDict中的值对应的字典格式如下 {'chinese': u'中文名', 'cellType': BasicCell} - + """ signal = QtCore.pyqtSignal(type(Event())) @@ -186,79 +186,79 @@ class BasicMonitor(QtGui.QTableWidget): def __init__(self, mainEngine=None, eventEngine=None, parent=None): """Constructor""" super(BasicMonitor, self).__init__(parent) - + self.mainEngine = mainEngine self.eventEngine = eventEngine - + # 保存表头标签用 self.headerDict = OrderedDict() # 有序字典,key是英文名,value是对应的配置字典 self.headerList = [] # 对应self.headerDict.keys() - + # 保存相关数据用 self.dataDict = {} # 字典,key是字段对应的数据,value是保存相关单元格的字典 self.dataKey = '' # 字典键对应的数据字段 - + # 监控的事件类型 self.eventType = '' - + # 字体 self.font = None - + # 保存数据对象到单元格 self.saveData = False - + # 默认不允许根据表头进行排序,需要的组件可以开启 self.sorting = False - + # 初始化右键菜单 self.initMenu() - + #---------------------------------------------------------------------- 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 setSaveData(self, saveData): """设置是否要保存数据到单元格""" self.saveData = saveData - + #---------------------------------------------------------------------- def initTable(self): """初始化表格""" # 设置表格的列数 col = len(self.headerDict) self.setColumnCount(col) - + # 设置列表头 labels = [d['chinese'] for d in self.headerDict.values()] self.setHorizontalHeaderLabels(labels) - + # 关闭左边的垂直表头 self.verticalHeader().setVisible(False) - + # 设为不可编辑 self.setEditTriggers(self.NoEditTriggers) - + # 设为行交替颜色 self.setAlternatingRowColors(True) - + # 设置允许排序 self.setSortingEnabled(self.sorting) @@ -267,38 +267,38 @@ class BasicMonitor(QtGui.QTableWidget): """注册GUI更新相关的事件监听""" self.signal.connect(self.updateEvent) self.eventEngine.register(self.eventType, self.signal.emit) - + #---------------------------------------------------------------------- def updateEvent(self, event): """收到事件更新""" data = event.dict_['data'] self.updateData(data) - + #---------------------------------------------------------------------- def updateData(self, data): """将数据更新到表格中""" # 如果允许了排序功能,则插入数据前必须关闭,否则插入新的数据会变乱 if self.sorting: self.setSortingEnabled(False) - + # 如果设置了dataKey,则采用存量更新模式 if self.dataKey: key = data.__getattribute__(self.dataKey) # 如果键在数据字典中不存在,则先插入新的一行,并创建对应单元格 if key not in self.dataDict: - self.insertRow(0) + self.insertRow(0) d = {} - for n, header in enumerate(self.headerList): + for n, header in enumerate(self.headerList): content = safeUnicode(data.__getattribute__(header)) cellType = self.headerDict[header]['cellType'] cell = cellType(content, self.mainEngine) - + if self.font: cell.setFont(self.font) # 如果设置了特殊字体,则进行单元格设置 - + if self.saveData: # 如果设置了保存数据对象,则进行对象保存 cell.data = data - + self.setItem(0, n, cell) d[header] = cell self.dataDict[key] = d @@ -309,48 +309,48 @@ class BasicMonitor(QtGui.QTableWidget): content = safeUnicode(data.__getattribute__(header)) 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'] cell = cellType(content, self.mainEngine) - + if self.font: cell.setFont(self.font) if self.saveData: - cell.data = data + cell.data = data + + self.setItem(0, n, cell) - self.setItem(0, n, cell) - # 调整列宽 self.resizeColumns() - + # 重新打开排序 if self.sorting: self.setSortingEnabled(True) - + #---------------------------------------------------------------------- def resizeColumns(self): """调整各列的大小""" - self.horizontalHeader().resizeSections(QtGui.QHeaderView.ResizeToContents) - + self.horizontalHeader().resizeSections(QtGui.QHeaderView.ResizeToContents) + #---------------------------------------------------------------------- def setSorting(self, sorting): """设置是否允许根据表头排序""" self.sorting = sorting - + #---------------------------------------------------------------------- def saveToCsv(self): """保存表格内容到CSV文件""" # 先隐藏右键菜单 self.menu.close() - + # 获取想要保存的文件名 path = QtGui.QFileDialog.getSaveFileName(self, '保存数据', '', 'CSV(*.csv)') @@ -358,11 +358,11 @@ class BasicMonitor(QtGui.QTableWidget): if not path.isEmpty(): with open(unicode(path), 'wb') as f: writer = csv.writer(f) - + # 保存标签 headers = [header.encode('gbk') for header in self.headerList] writer.writerow(headers) - + # 保存每行内容 for row in range(self.rowCount()): rowdata = [] @@ -373,24 +373,24 @@ class BasicMonitor(QtGui.QTableWidget): unicode(item.text()).encode('gbk')) else: rowdata.append('') - writer.writerow(rowdata) + writer.writerow(rowdata) except IOError: pass #---------------------------------------------------------------------- def initMenu(self): """初始化右键菜单""" - self.menu = QtGui.QMenu(self) - + self.menu = QtGui.QMenu(self) + saveAction = QtGui.QAction(u'保存内容', self) saveAction.triggered.connect(self.saveToCsv) - + self.menu.addAction(saveAction) - + #---------------------------------------------------------------------- def contextMenuEvent(self, event): """右键点击事件""" - self.menu.popup(QtGui.QCursor.pos()) + self.menu.popup(QtGui.QCursor.pos()) ######################################################################## @@ -401,7 +401,7 @@ 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} @@ -420,22 +420,22 @@ class MarketMonitor(BasicMonitor): d['time'] = {'chinese':u'时间', 'cellType':BasicCell} d['gatewayName'] = {'chinese':u'接口', 'cellType':BasicCell} self.setHeaderDict(d) - + # 设置数据键 self.setDataKey('vtSymbol') - + # 设置监控事件类型 self.setEventType(EVENT_TICK) - + # 设置字体 self.setFont(BASIC_FONT) - + # 设置允许排序 self.setSorting(True) - + # 初始化表格 self.initTable() - + # 注册事件监听 self.registerEvent() @@ -448,15 +448,15 @@ class LogMonitor(BasicMonitor): def __init__(self, mainEngine, eventEngine, parent=None): """Constructor""" super(LogMonitor, self).__init__(mainEngine, eventEngine, parent) - - d = OrderedDict() + + d = OrderedDict() d['logTime'] = {'chinese':u'时间', 'cellType':BasicCell} d['logContent'] = {'chinese':u'内容', 'cellType':BasicCell} 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() @@ -469,14 +469,14 @@ class ErrorMonitor(BasicMonitor): def __init__(self, mainEngine, eventEngine, parent=None): """Constructor""" super(ErrorMonitor, self).__init__(mainEngine, eventEngine, parent) - - d = OrderedDict() + + d = OrderedDict() d['errorTime'] = {'chinese':u'错误时间', 'cellType':BasicCell} d['errorID'] = {'chinese':u'错误代码', 'cellType':BasicCell} d['errorMsg'] = {'chinese':u'错误信息', 'cellType':BasicCell} d['gatewayName'] = {'chinese':u'接口', 'cellType':BasicCell} self.setHeaderDict(d) - + self.setEventType(EVENT_ERROR) self.setFont(BASIC_FONT) self.initTable() @@ -491,7 +491,7 @@ 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} @@ -504,11 +504,11 @@ class TradeMonitor(BasicMonitor): d['tradeTime'] = {'chinese':u'成交时间', 'cellType':BasicCell} d['gatewayName'] = {'chinese':u'接口', 'cellType':BasicCell} self.setHeaderDict(d) - + self.setEventType(EVENT_TRADE) self.setFont(BASIC_FONT) self.setSorting(True) - + self.initTable() self.registerEvent() @@ -523,7 +523,7 @@ class OrderMonitor(BasicMonitor): super(OrderMonitor, self).__init__(mainEngine, eventEngine, parent) self.mainEngine = mainEngine - + d = OrderedDict() d['orderID'] = {'chinese':u'委托编号', 'cellType':NumCell} d['symbol'] = {'chinese':u'合约代码', 'cellType':BasicCell} @@ -540,28 +540,28 @@ class OrderMonitor(BasicMonitor): d['sessionID'] = {'chinese':u'会话编号', 'cellType':BasicCell} d['gatewayName'] = {'chinese':u'接口', 'cellType':BasicCell} self.setHeaderDict(d) - + self.setDataKey('vtOrderID') self.setEventType(EVENT_ORDER) self.setFont(BASIC_FONT) self.setSaveData(True) self.setSorting(True) - + self.initTable() self.registerEvent() self.connectSignal() - + #---------------------------------------------------------------------- def connectSignal(self): """连接信号""" # 双击单元格撤单 - self.itemDoubleClicked.connect(self.cancelOrder) - + self.itemDoubleClicked.connect(self.cancelOrder) + #---------------------------------------------------------------------- def cancelOrder(self, cell): """根据单元格的数据撤单""" order = cell.data - + req = VtCancelOrderReq() req.symbol = order.symbol req.exchange = order.exchange @@ -578,7 +578,7 @@ 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} @@ -589,16 +589,16 @@ class PositionMonitor(BasicMonitor): d['price'] = {'chinese':u'价格', 'cellType':BasicCell} d['gatewayName'] = {'chinese':u'接口', 'cellType':BasicCell} self.setHeaderDict(d) - + self.setDataKey('vtPositionName') self.setEventType(EVENT_POSITION) self.setFont(BASIC_FONT) self.setSaveData(True) - + self.initTable() self.registerEvent() - - + + ######################################################################## class AccountMonitor(BasicMonitor): """账户监控""" @@ -607,7 +607,7 @@ 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['preBalance'] = {'chinese':u'昨结', 'cellType':BasicCell} @@ -619,7 +619,7 @@ class AccountMonitor(BasicMonitor): d['positionProfit'] = {'chinese':u'持仓盈亏', 'cellType':BasicCell} d['gatewayName'] = {'chinese':u'接口', 'cellType':BasicCell} self.setHeaderDict(d) - + self.setDataKey('vtAccountID') self.setEventType(EVENT_ACCOUNT) self.setFont(BASIC_FONT) @@ -631,7 +631,7 @@ class AccountMonitor(BasicMonitor): class TradingWidget(QtGui.QFrame): """简单交易组件""" signal = QtCore.pyqtSignal(type(Event())) - + directionList = [DIRECTION_LONG, DIRECTION_SHORT] @@ -639,12 +639,12 @@ class TradingWidget(QtGui.QFrame): OFFSET_CLOSE, OFFSET_CLOSEYESTERDAY, OFFSET_CLOSETODAY] - + priceTypeList = [PRICETYPE_LIMITPRICE, PRICETYPE_MARKETPRICE, PRICETYPE_FAK, PRICETYPE_FOK] - + exchangeList = [EXCHANGE_NONE, EXCHANGE_CFFEX, EXCHANGE_SHFE, @@ -661,18 +661,18 @@ class TradingWidget(QtGui.QFrame): EXCHANGE_NYMEX, EXCHANGE_GLOBEX, EXCHANGE_IDEALPRO] - + currencyList = [CURRENCY_NONE, CURRENCY_CNY, CURRENCY_HKD, CURRENCY_USD] - + productClassList = [PRODUCT_NONE, PRODUCT_EQUITY, PRODUCT_FUTURES, PRODUCT_OPTION, PRODUCT_FOREX] - + gatewayList = [''] #---------------------------------------------------------------------- @@ -681,9 +681,9 @@ class TradingWidget(QtGui.QFrame): super(TradingWidget, self).__init__(parent) self.mainEngine = mainEngine self.eventEngine = eventEngine - + self.symbol = '' - + # 添加交易接口 self.gatewayList.extend(mainEngine.getAllGatewayNames()) @@ -696,7 +696,7 @@ class TradingWidget(QtGui.QFrame): self.setWindowTitle(u'交易') self.setMaximumWidth(400) self.setFrameShape(self.Box) # 设置边框 - self.setLineWidth(1) + self.setLineWidth(1) # 左边部分 labelSymbol = QtGui.QLabel(u'代码') @@ -707,7 +707,7 @@ class TradingWidget(QtGui.QFrame): self.checkFixed = QtGui.QCheckBox(u'') # 价格固定选择框 labelVolume = QtGui.QLabel(u'数量') labelPriceType = QtGui.QLabel(u'价格类型') - labelExchange = QtGui.QLabel(u'交易所') + labelExchange = QtGui.QLabel(u'交易所') labelCurrency = QtGui.QLabel(u'货币') labelProductClass = QtGui.QLabel(u'产品类型') labelGateway = QtGui.QLabel(u'交易接口') @@ -732,18 +732,18 @@ class TradingWidget(QtGui.QFrame): self.comboPriceType = QtGui.QComboBox() self.comboPriceType.addItems(self.priceTypeList) - + self.comboExchange = QtGui.QComboBox() - self.comboExchange.addItems(self.exchangeList) - + self.comboExchange.addItems(self.exchangeList) + self.comboCurrency = QtGui.QComboBox() self.comboCurrency.addItems(self.currencyList) - + self.comboProductClass = QtGui.QComboBox() - self.comboProductClass.addItems(self.productClassList) - + self.comboProductClass.addItems(self.productClassList) + self.comboGateway = QtGui.QComboBox() - self.comboGateway.addItems(self.gatewayList) + self.comboGateway.addItems(self.gatewayList) gridleft = QtGui.QGridLayout() gridleft.addWidget(labelSymbol, 0, 0) @@ -755,9 +755,9 @@ class TradingWidget(QtGui.QFrame): gridleft.addWidget(labelPriceType, 6, 0) gridleft.addWidget(labelExchange, 7, 0) gridleft.addWidget(labelCurrency, 8, 0) - gridleft.addWidget(labelProductClass, 9, 0) + gridleft.addWidget(labelProductClass, 9, 0) gridleft.addWidget(labelGateway, 10, 0) - + gridleft.addWidget(self.lineSymbol, 0, 1, 1, -1) gridleft.addWidget(self.lineName, 1, 1, 1, -1) gridleft.addWidget(self.comboDirection, 2, 1, 1, -1) @@ -793,7 +793,7 @@ class TradingWidget(QtGui.QFrame): self.labelBidVolume2 = QtGui.QLabel() self.labelBidVolume3 = QtGui.QLabel() self.labelBidVolume4 = QtGui.QLabel() - self.labelBidVolume5 = QtGui.QLabel() + self.labelBidVolume5 = QtGui.QLabel() self.labelAskPrice1 = QtGui.QLabel() self.labelAskPrice2 = QtGui.QLabel() @@ -804,7 +804,7 @@ class TradingWidget(QtGui.QFrame): self.labelAskVolume2 = QtGui.QLabel() self.labelAskVolume3 = QtGui.QLabel() self.labelAskVolume4 = QtGui.QLabel() - self.labelAskVolume5 = QtGui.QLabel() + self.labelAskVolume5 = QtGui.QLabel() labelLast = QtGui.QLabel(u'最新') self.labelLastPrice = QtGui.QLabel() @@ -836,7 +836,7 @@ class TradingWidget(QtGui.QFrame): 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) @@ -853,7 +853,7 @@ class TradingWidget(QtGui.QFrame): # 发单按钮 buttonSendOrder = QtGui.QPushButton(u'发单') buttonCancelAll = QtGui.QPushButton(u'全撤') - + size = buttonSendOrder.sizeHint() buttonSendOrder.setMinimumHeight(size.height()*2) # 把按钮高度设为默认两倍 buttonCancelAll.setMinimumHeight(size.height()*2) @@ -883,23 +883,23 @@ class TradingWidget(QtGui.QFrame): symbol = str(self.lineSymbol.text()) exchange = unicode(self.comboExchange.currentText()) currency = unicode(self.comboCurrency.currentText()) - productClass = unicode(self.comboProductClass.currentText()) + productClass = unicode(self.comboProductClass.currentText()) gatewayName = unicode(self.comboGateway.currentText()) - + # 查询合约 if exchange: vtSymbol = '.'.join([symbol, exchange]) contract = self.mainEngine.getContract(vtSymbol) else: vtSymbol = symbol - contract = self.mainEngine.getContract(symbol) - + contract = self.mainEngine.getContract(symbol) + if contract: vtSymbol = contract.vtSymbol gatewayName = contract.gatewayName self.lineName.setText(contract.name) exchange = contract.exchange # 保证有交易所代码 - + # 清空价格数量 self.spinPrice.setValue(0) self.spinVolume.setValue(0) @@ -914,7 +914,7 @@ class TradingWidget(QtGui.QFrame): self.labelBidVolume2.setText('') self.labelBidVolume3.setText('') self.labelBidVolume4.setText('') - self.labelBidVolume5.setText('') + self.labelBidVolume5.setText('') self.labelAskPrice1.setText('') self.labelAskPrice2.setText('') self.labelAskPrice3.setText('') @@ -959,30 +959,30 @@ class TradingWidget(QtGui.QFrame): self.labelAskPrice1.setText(str(tick.askPrice1)) self.labelBidVolume1.setText(str(tick.bidVolume1)) self.labelAskVolume1.setText(str(tick.askVolume1)) - + if tick.bidPrice2: self.labelBidPrice2.setText(str(tick.bidPrice2)) 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)) self.labelBidVolume5.setText(str(tick.bidVolume5)) - + 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 tick.preClosePrice: rt = (tick.lastPrice/tick.preClosePrice)-1 self.labelReturn.setText(('%.2f' %(rt*100))+'%') @@ -1000,8 +1000,8 @@ class TradingWidget(QtGui.QFrame): symbol = str(self.lineSymbol.text()) exchange = unicode(self.comboExchange.currentText()) currency = unicode(self.comboCurrency.currentText()) - productClass = unicode(self.comboProductClass.currentText()) - gatewayName = unicode(self.comboGateway.currentText()) + productClass = unicode(self.comboProductClass.currentText()) + gatewayName = unicode(self.comboGateway.currentText()) # 查询合约 if exchange: @@ -1010,11 +1010,11 @@ class TradingWidget(QtGui.QFrame): else: vtSymbol = symbol contract = self.mainEngine.getContract(symbol) - + if contract: gatewayName = contract.gatewayName exchange = contract.exchange # 保证有交易所代码 - + req = VtOrderReq() req.symbol = symbol req.exchange = exchange @@ -1025,9 +1025,9 @@ class TradingWidget(QtGui.QFrame): req.offset = unicode(self.comboOffset.currentText()) req.currency = currency req.productClass = productClass - + self.mainEngine.sendOrder(req, gatewayName) - + #---------------------------------------------------------------------- def cancelAll(self): """一键撤销所有委托""" @@ -1040,18 +1040,18 @@ class TradingWidget(QtGui.QFrame): req.sessionID = order.sessionID req.orderID = order.orderID self.mainEngine.cancelOrder(req, order.gatewayName) - + #---------------------------------------------------------------------- def closePosition(self, cell): """根据持仓信息自动填写交易组件""" # 读取持仓数据,cell是一个表格中的单元格对象 pos = cell.data symbol = pos.symbol - + # 更新交易组件的显示合约 self.lineSymbol.setText(symbol) self.updateSymbol() - + # 自动填写信息 self.comboPriceType.setCurrentIndex(self.priceTypeList.index(PRICETYPE_LIMITPRICE)) self.comboOffset.setCurrentIndex(self.offsetList.index(OFFSET_CLOSE)) @@ -1073,9 +1073,9 @@ class ContractMonitor(BasicMonitor): def __init__(self, mainEngine, parent=None): """Constructor""" super(ContractMonitor, self).__init__(parent=parent) - + self.mainEngine = mainEngine - + d = OrderedDict() d['symbol'] = {'chinese':u'合约代码', 'cellType':BasicCell} d['exchange'] = {'chinese':u'交易所', 'cellType':BasicCell} @@ -1084,13 +1084,16 @@ class ContractMonitor(BasicMonitor): d['productClass'] = {'chinese':u'合约类型', 'cellType':BasicCell} d['size'] = {'chinese':u'大小', 'cellType':BasicCell} d['priceTick'] = {'chinese':u'最小价格变动', 'cellType':BasicCell} + d['tick'] = {'chinese':u'tick', 'cellType':BasicCell} + d['bar'] = {'chinese':u'bar', 'cellType':BasicCell} + d['main'] = {'chinese':u'主力合约', 'cellType':BasicCell} #d['strikePrice'] = {'chinese':u'期权行权价', 'cellType':BasicCell} #d['underlyingSymbol'] = {'chinese':u'期权标的物', 'cellType':BasicCell} - #d['optionType'] = {'chinese':u'期权类型', 'cellType':BasicCell} + #d['optionType'] = {'chinese':u'期权类型', 'cellType':BasicCell} self.setHeaderDict(d) - + self.initUi() - + #---------------------------------------------------------------------- def initUi(self): """初始化界面""" @@ -1099,7 +1102,7 @@ class ContractMonitor(BasicMonitor): self.setFont(BASIC_FONT) self.initTable() self.addMenuAction() - + #---------------------------------------------------------------------- def showAllContracts(self): """显示所有合约数据""" @@ -1110,22 +1113,24 @@ class ContractMonitor(BasicMonitor): self.setRowCount(len(l2)) row = 0 - + for key in l2: contract = d[key] - + for n, header in enumerate(self.headerList): + if(not hasattr(contract,header)): + break content = safeUnicode(contract.__getattribute__(header)) cellType = self.headerDict[header]['cellType'] cell = cellType(content) - + if self.font: cell.setFont(self.font) # 如果设置了特殊字体,则进行单元格设置 - + self.setItem(row, n, cell) - + row = row + 1 - + #---------------------------------------------------------------------- def refresh(self): """刷新""" @@ -1133,19 +1138,19 @@ class ContractMonitor(BasicMonitor): self.clearContents() self.setRowCount(0) self.showAllContracts() - + #---------------------------------------------------------------------- def addMenuAction(self): """增加右键菜单内容""" refreshAction = QtGui.QAction(u'刷新', self) refreshAction.triggered.connect(self.refresh) - + self.menu.addAction(refreshAction) - + #---------------------------------------------------------------------- def show(self): """显示""" super(ContractMonitor, self).show() self.refresh() - - + +