class ButtonOption(QWidget): def __init__(self, parent: QObject, controller: TouchManagerController, model: TouchManagerModel): super(QWidget, self).__init__() self.parent = parent self.model = model self.controller = controller self.lay = QHBoxLayout() self.lblX = QLabel() # self.lblY = QLabel() self.selectedRadioBtn = QRadioButton() # self.setStyleSheet("background-color: rgb(255,255,255)") # TODO: add button or check btn to unlock change self.initUI() def initUI(self): self.selectedRadioBtn.setText("") self.selectedRadioBtn.setFixedWidth(20) self.selectedRadioBtn.setChecked(True) # self.setMinimumSize(10, 10) self.lay.addWidget(self.lblX) # self.lay.addWidget(self.lblY) self.lay.addWidget(self.selectedRadioBtn) self.setLayout(self.lay) # self.changeData([[0, 0]]) def changeData(self, new_data): d = new_data[0] x, y = d[0] * self.controller.current_image_size[0], d[1] * self.controller.current_image_size[1] self.lblX.setText("Location: %4d, %4d" % (x, y))
def initUI(self, newData: dict): if 'around' in newData: self._setAroundSafe(newData['around']) coords_num = len(newData['coordinates']) l = len(newData['currentScreenColors']) w, h = self.controller.current_image_size for i in range(coords_num): lay_row = QHBoxLayout() coord = newData['coordinates'][i] x, y = int((coord[0] * w)), int((coord[1] * h)) lbl_point = QLabel("%15s" % ("C%d: %4d , %4d" % (i, x, y))) lbl_point.setFixedWidth(80) lay_row.addWidget(lbl_point) # lay_row.addWidget(QLabel("X: %4d" % (coord[0] * w))) # lay_row.addWidget(QLabel("Y: %4d" % (coord[1] * h))) colors = newData['values'][i] lblColor = QLabel("") lblColor.setStyleSheet("background-color: rgb({},{},{});".format( colors[0], colors[1], colors[2])) lblColor.mousePressEvent = (partial(self.onManualChoose, i)) lblColor.setToolTip("Target value RGB=(%d, %d, %d)" % (colors[0], colors[1], colors[2])) lblColor.setMaximumWidth(40) self.lblsColors.append(lblColor) btnSet = QPushButton("set->") btnSet.setMaximumWidth(45) btnSet.clicked.connect( partial( self.controller.requestSetCurrentColorToFrameCheckColor, i)) lblimgColor = QLabel("") lblimgColor.setMaximumWidth(20) color_ = newData['currentScreenColors'][i] lblimgColor.setStyleSheet( "background-color: rgb({},{},{});".format( color_[0], color_[1], color_[2])) lblimgColor.setToolTip("Current screenshot RGB=(%d, %d, %d)" % (color_[0], color_[1], color_[2])) lblimgColor.setToolTipDuration(20 * 1000) self.lblImageColors.append(lblimgColor) lay_row.addWidget(lblimgColor) lay_row.addWidget(btnSet) lay_row.addWidget(lblColor) rbtn = QRadioButton() self.rBtns.append(rbtn) rbtn.setText("") rbtn.setFixedWidth(20) rbtn.toggled.connect( partial(self.controller.onCoordinateSelected, i)) lay_row.addWidget(rbtn) self.lay.addLayout(lay_row) if len(self.rBtns) > 0: self.rBtns[self.controller.selectedCoordinateIndex].blockSignals( True) self.rBtns[self.controller.selectedCoordinateIndex].setChecked( True) self.rBtns[self.controller.selectedCoordinateIndex].blockSignals( False)
class MovementOption(QWidget): def __init__(self, parent: QObject, controller: TouchManagerController, model: TouchManagerModel): super(QWidget, self).__init__() self.parent = parent self.model = model self.controller = controller self.lay = QVBoxLayout() self.lay_h1 = QHBoxLayout() self.lblXsrc = QLabel() self.lblYsrc = QLabel() self.lay_h2 = QHBoxLayout() self.lblXdst = QLabel() self.lblYdst = QLabel() self.rBtnChangeableSrc = QRadioButton() self.rBtnChangeableDst = QRadioButton() # self.setStyleSheet("background-color: rgb(255,255,255)") # TODO: add button or check btn to unlock change self.initUI() self.initConnectors() def initUI(self): self.rBtnChangeableSrc.setText("") self.rBtnChangeableSrc.setFixedWidth(20) self.rBtnChangeableDst.setText("") self.rBtnChangeableDst.setFixedWidth(20) if self.controller.selectedCoordinateIndex == 0: self.rBtnChangeableSrc.setChecked(True) else: self.rBtnChangeableDst.setChecked(True) #self.lay_h1.addWidget(QLabel("Start: ")) self.lay_h1.addWidget(self.lblXsrc) #self.lay_h1.addWidget(self.lblYsrc) self.lay_h1.addWidget(self.rBtnChangeableSrc) #self.lay_h2.addWidget(QLabel("End : ")) self.lay_h2.addWidget(self.lblXdst) #self.lay_h2.addWidget(self.lblYdst) self.lay_h2.addWidget(self.rBtnChangeableDst) self.lay.addLayout(self.lay_h1) #self.lay.addWidget(QLabel("to")) self.lay.addLayout(self.lay_h2) self.setLayout(self.lay) self.changeData([[0, 0], [0, 0]]) def initConnectors(self): self.rBtnChangeableSrc.toggled.connect( partial(self.controller.onCoordinateSelected, 0)) self.rBtnChangeableDst.toggled.connect( partial(self.controller.onCoordinateSelected, 1)) def changeData(self, new_data): w, h = self.controller.current_image_size x1, y1 = (new_data[0][0] * w), (new_data[0][1] * h) x2, y2 = (new_data[1][0] * w), (new_data[1][1] * h) self.lblXsrc.setText("Start: %4d , %4d" % (x1, y1)) self.lblXdst.setText("Stop: %4d, %4d" % (x2, y2))
class ImgOutPortWidget(QDialog): def __init__(self, fWind): super().__init__(fWind) self.fWindow = fWind self.thread = None self.tick = 0 self.initUI() def initUI(self): self.setStyleSheet(MAIN_STYLE + IOS_RADIOBTN_STYLE) self.setWindowTitle('图片识别结果导出') self.setFixedSize(300, 200) """------------------layout_setting-------------------""" layout_setting = QVBoxLayout() layout_setting.setContentsMargins(0, 0, 0, 0) layout_setting.setSpacing(0) layout_setting.setAlignment(Qt.AlignCenter) self.settingLabel = QLabel("设置识别操作执行策略") self.settingLabel.setAlignment(Qt.AlignCenter) self.settingLabel.setFixedHeight(20) self.radioButton1 = QRadioButton('全部重新识别') self.radioButton1.setChecked(True) self.radioButton2 = QRadioButton('已有识别结果的直接保存') self.radioButton2.setFixedWidth(200) layout_radio = QHBoxLayout() layout_radio.setContentsMargins(10, 0, 0, 0) layout_radio.setSpacing(10) layout_radio.addWidget(self.radioButton1) layout_radio.addWidget(self.radioButton2) self.startBtn = QPushButton('开始') self.startBtn.setFixedSize(300, 30) self.startBtn.clicked.connect(self.on_startBtn_clicked) layout_setting.addStretch(2) layout_setting.addWidget(self.settingLabel) layout_setting.addStretch(2) layout_setting.addLayout(layout_radio) layout_setting.addStretch(3) layout_setting.addWidget(self.startBtn) """------------------layout_process-------------------""" layout_process = QVBoxLayout() layout_process.setContentsMargins(0, 0, 0, 0) layout_process.setSpacing(0) self.processLabel = QLabel("导出:") self.progressBar = QProgressBar() self.progressBar.setFixedSize(260, 30) self.progressBar.setValue(0) layout_progress = QVBoxLayout() layout_progress.setContentsMargins(20, 0, 0, 0) layout_progress.setSpacing(5) layout_progress.addWidget(self.processLabel) layout_progress.addWidget(self.progressBar) self.cancellBtn = QPushButton("取消") self.cancellBtn.setFixedSize(300, 30) self.cancellBtn.clicked.connect(self.on_cancellBtn_clicked) layout_process.addStretch(3) layout_process.addLayout(layout_progress) layout_process.addStretch(3) layout_process.addWidget(self.cancellBtn) """------------------layout_end-------------------""" layout_end = QVBoxLayout() layout_end.setContentsMargins(0, 0, 0, 0) layout_end.setSpacing(0) self.endLabel = QLabel("导出结束") self.endLabel.setAlignment(Qt.AlignCenter) self.endBtn = QPushButton("完成") self.endBtn.setFixedSize(300, 30) self.endBtn.clicked.connect(self.on_endBtn_clicked) layout_end.addWidget(self.endLabel) layout_end.addWidget(self.endBtn) self.settingWidget = QWidget(self) self.settingWidget.setFixedSize(300, 200) self.settingWidget.setHidden(False) self.settingWidget.setLayout(layout_setting) self.processWidget = QWidget(self) self.processWidget.setFixedSize(300, 200) self.processWidget.setHidden(True) self.processWidget.setLayout(layout_process) self.endWidget = QWidget(self) self.endWidget.setFixedSize(300, 200) self.endWidget.setHidden(True) self.endWidget.setLayout(layout_end) self.exec() def on_startBtn_clicked(self): self.tick = time.time() self.settingWidget.setHidden(True) self.processWidget.setHidden(False) pattern = 0 if self.radioButton2.isChecked(): pattern = 1 # 创建线程 self.thread = OutportImgThread(self.fWindow, pattern) # 连接信号 self.thread._signal.connect(self.call_backlog) # 进程连接回传到GUI的事件 # 开始线程 self.thread.start() def on_cancellBtn_clicked(self): self.thread.cancell = True self.close() def on_endBtn_clicked(self): self.close() def call_backlog(self, msg): if msg == 'end': del self.thread cost_time = time.time() - self.tick self.endLabel.setText("导出结束\n用时:" + TickTimeProcess(cost_time)) self.processWidget.setHidden(True) self.endWidget.setHidden(False) return checked_index = int(msg) checked_length = len(self.fWindow.checkedlist) file_index = self.fWindow.checkedlist[checked_index] file_name = self.fWindow.filelist[file_index].file_name self.processLabel.setText("导出:" + file_name) self.progressBar.setValue( int((checked_index + 1) / checked_length * 100)) # 将线程的参数传入进度条
class SimulateTrader(QDialog): def __init__(self, **kwargs): super(SimulateTrader, self).__init__() self.host = kwargs.get("host", "0.0.0.0") self.port = kwargs.get("port", 0) self.user = kwargs.get("user", "user") self.passwd = kwargs.get("passwd", "123456") self.db_clearx = "clearx" self.db_financial = "financial" self.charset = "utf8" self.tb_security_info = "security_info" self.tb_pre_quote_stk = "pre_quote_stk" self.tb_account_trade = "account_trade" self.security = {} self.quote_data = {} self.stock_list = [] self.trans_id = 0 self.account_id = "test_account" self.dbm_clearx = dbm_mysql.DBM_MySQL( host=self.host, port=self.port, user=self.user, passwd=self.passwd, db=self.db_clearx, charset=self.charset) # db_clearx self.dbm_financial = dbm_mysql.DBM_MySQL( host=self.host, port=self.port, user=self.user, passwd=self.passwd, db=self.db_financial, charset=self.charset) # db_financial if self.dbm_clearx.Connect() == True and self.dbm_financial.Connect( ) == True: print("数据库连接成功。") self.GetSecurityInfo() else: print("数据库连接失败!") self.InitUserInterface() self.MakeSimulateTrade() # def __del__(self): pass def InitUserInterface(self): self.color_red = QPalette() self.color_red.setColor(QPalette.WindowText, Qt.red) self.color_green = QPalette() self.color_green.setColor(QPalette.WindowText, QColor(0, 128, 0)) self.color_black = QPalette() self.color_black.setColor(QPalette.WindowText, Qt.black) self.list_exchange = [ define.DEF_EXCHANGE_STOCK_SH, define.DEF_EXCHANGE_STOCK_SZ ] self.list_entr_type = [ define.DEF_PRICE_TYPE_STOCK_LIMIT, define.DEF_PRICE_TYPE_STOCK_MARKET ] self.setWindowTitle("模拟交易面板") self.resize(244, 201) self.setFont(QFont("SimSun", 9)) self.label_exchange = QLabel("交易市场") self.label_exchange.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_symbol = QLabel("证券代码") self.label_symbol.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_name = QLabel("证券名称") self.label_name.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_entr_type = QLabel("委托方式") self.label_entr_type.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_price = QLabel("委托价格") self.label_price.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_volume = QLabel("委托数量") self.label_volume.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_price_unit = QLabel("元") self.label_price_unit.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_volume_unit = QLabel("股") self.label_volume_unit.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.combo_box_exchange = QComboBox() self.combo_box_exchange.addItems(self.list_exchange) self.line_edit_symbol = QLineEdit("") self.line_edit_symbol.setStyleSheet("color:red") # 初始红色 self.line_edit_symbol.setFont(QFont("SimSun", 9)) self.line_edit_name = QLineEdit("") self.line_edit_name.setReadOnly(True) self.line_edit_name.setFont(QFont("SimSun", 9)) self.line_edit_name.setStyleSheet( "background-color:rgb(240,240,240);color:red") # 初始红色 self.line_edit_name.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.combo_box_entr_type = QComboBox() self.combo_box_entr_type.addItems(self.list_entr_type) self.spin_box_price = QDoubleSpinBox() self.spin_box_price.setDecimals(4) self.spin_box_price.setMinimum(0) self.spin_box_price.setMaximum(100000) self.spin_box_price.setStyleSheet("color:red") # 初始红色 self.spin_box_price.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.spin_box_volume = QSpinBox() self.spin_box_volume.setMinimum(0) self.spin_box_volume.setMaximum(1000000) self.spin_box_volume.setSingleStep(100) self.spin_box_volume.setStyleSheet("color:red") # 初始红色 self.spin_box_volume.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.grid_layout_essential = QGridLayout() self.grid_layout_essential.setContentsMargins(-1, -1, -1, -1) self.grid_layout_essential.addWidget(self.label_exchange, 0, 0, 1, 1) self.grid_layout_essential.addWidget(self.label_symbol, 1, 0, 1, 1) self.grid_layout_essential.addWidget(self.label_name, 2, 0, 1, 1) self.grid_layout_essential.addWidget(self.label_entr_type, 3, 0, 1, 1) self.grid_layout_essential.addWidget(self.label_price, 4, 0, 1, 1) self.grid_layout_essential.addWidget(self.label_volume, 5, 0, 1, 1) self.grid_layout_essential.addWidget(self.combo_box_exchange, 0, 1, 1, 1) self.grid_layout_essential.addWidget(self.line_edit_symbol, 1, 1, 1, 1) self.grid_layout_essential.addWidget(self.line_edit_name, 2, 1, 1, 1) self.grid_layout_essential.addWidget(self.combo_box_entr_type, 3, 1, 1, 1) self.grid_layout_essential.addWidget(self.spin_box_price, 4, 1, 1, 1) self.grid_layout_essential.addWidget(self.spin_box_volume, 5, 1, 1, 1) self.grid_layout_essential.addWidget(self.label_price_unit, 4, 2, 1, 1) self.grid_layout_essential.addWidget(self.label_volume_unit, 5, 2, 1, 1) self.radio_button_buy = QRadioButton("买 入") self.radio_button_buy.setStyleSheet("color:red") self.radio_button_buy.setFont(QFont("SimSun", 9)) self.radio_button_buy.setChecked(True) self.radio_button_buy.setFixedWidth(70) self.radio_button_sell = QRadioButton("卖 出") self.radio_button_sell.setStyleSheet("color:green") self.radio_button_sell.setFont(QFont("SimSun", 9)) self.radio_button_sell.setFixedWidth(70) self.button_place_order = QPushButton("下 单") self.button_place_order.setFont(QFont("SimSun", 9)) self.button_place_order.setStyleSheet("font:bold;color:red") # 初始红色 self.button_place_order.setFixedWidth(70) self.h_box_layout_order_buttons = QHBoxLayout() self.h_box_layout_order_buttons.setContentsMargins(-1, -1, -1, -1) self.h_box_layout_order_buttons.addStretch(1) self.h_box_layout_order_buttons.addWidget(self.radio_button_buy) self.h_box_layout_order_buttons.addStretch(1) self.h_box_layout_order_buttons.addWidget(self.radio_button_sell) self.h_box_layout_order_buttons.addStretch(1) self.h_box_layout_order_buttons.addWidget(self.button_place_order) self.h_box_layout_order_buttons.addStretch(1) self.v_box_layout_order = QVBoxLayout() self.v_box_layout_order.setContentsMargins(-1, -1, -1, -1) self.v_box_layout_order.addLayout(self.grid_layout_essential) self.v_box_layout_order.addLayout(self.h_box_layout_order_buttons) self.setLayout(self.v_box_layout_order) self.button_place_order.clicked.connect(self.OnButtonPlaceOrder) def MakeSimulateTrade(self): stock_count = len(self.stock_list) if stock_count > 0: min_index = 0 max_index = len(self.stock_list) random.seed() stock_index = random.randint(min_index, max_index) stock = self.stock_list[stock_index] print(stock.ToString()) self.line_edit_symbol.setText(stock.code) self.line_edit_name.setText(stock.name) if stock.market == "SH": self.combo_box_exchange.setCurrentIndex(0) elif stock.market == "SZ": self.combo_box_exchange.setCurrentIndex(1) self.spin_box_price.setValue(stock.close) volume = random.randint(1, 99) * 100 self.spin_box_volume.setValue(volume) self.combo_box_entr_type.setCurrentIndex(0) exch_side = random.randint(1, 2) if exch_side == 1: self.radio_button_buy.setChecked(True) self.radio_button_sell.setChecked(False) elif exch_side == 2: self.radio_button_buy.setChecked(False) self.radio_button_sell.setChecked(True) self.OnChangeBuySell(exch_side) else: print("证券列表为空!") def OnChangeBuySell(self, exch_side): if exch_side == 1: # buy self.line_edit_symbol.setStyleSheet("color:red") self.line_edit_name.setStyleSheet( "background-color:rgb(240,240,240);color:red") self.spin_box_price.setStyleSheet("color:red") self.spin_box_volume.setStyleSheet("color:red") self.button_place_order.setStyleSheet("font:bold;color:red") if exch_side == 2: # sell self.line_edit_symbol.setStyleSheet("color:green") self.line_edit_name.setStyleSheet( "background-color:rgb(240,240,240);color:green") self.spin_box_price.setStyleSheet("color:green") self.spin_box_volume.setStyleSheet("color:green") self.button_place_order.setStyleSheet("font:bold;color:green") def OnButtonPlaceOrder(self): code = self.line_edit_symbol.text() if code != "": market = "SH" if self.combo_box_exchange.currentIndex() == 1: market = "SZ" name = self.line_edit_name.text() exch_side = 1 if self.radio_button_sell.isChecked(): exch_side = 2 volume = self.spin_box_volume.value() close = self.spin_box_price.value() print("委托:", market, code, name, exch_side, volume, close) if self.dbm_clearx.Connect() == True: self.trans_id += 1 dbm = self.dbm_clearx sql = "INSERT INTO %s (trade_time, account_id, trans_id, market, symbol, name, direction, amount, price) VALUES ('%s', '%s', '%d', '%s', '%s', '%s', %d, %d, %f)" \ % (self.tb_account_trade, datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f"), self.account_id, self.trans_id, market, code, name, exch_side, volume, close) if dbm.ExecuteSql(sql) == True: print("增加交易记录成功。") else: print("增加交易记录失败!") else: print("数据库尚未连接!") else: print("模拟交易信息为空!") self.MakeSimulateTrade() # def GetSecurityInfo(self): self.security = {} self.quote_data = {} self.stock_list = [] dbm = self.dbm_financial sql = "SELECT inners, company, market, code, name, category, sector, is_st, list_state, list_date " + \ "FROM %s WHERE category > 0 AND category < 5 AND list_state = 1 ORDER BY market ASC, code ASC" % self.tb_security_info result = dbm.QueryAllSql(sql) if result != None: rows = list(result) if len(rows) > 0: for (inners, company, market, code, name, category, sector, is_st, list_state, list_date) in rows: self.security[market + code] = Security( inners=inners, company=company, market=market, code=code, name=name, category=category, sector=sector, is_st=is_st, list_state=list_state, list_date=list_date) #for key, value in self.security.items(): # print(key, value.ToString()) else: print("证券信息数据为空!") else: print("获取证券信息数据失败!") sql = "SELECT inners, market, code, name, category, open, high, low, close, pre_close, volume, turnover, trade_count, quote_date, quote_time " + \ "FROM %s ORDER BY market ASC, code ASC" % self.tb_pre_quote_stk result = dbm.QueryAllSql(sql) if result != None: rows = list(result) if len(rows) > 0: for (inners, market, code, name, category, open, high, low, close, pre_close, volume, turnover, trade_count, quote_date, quote_time) in rows: self.quote_data[market + code] = QuoteData( inners=inners, market=market, code=code, name=name, category=category, open=open, high=high, low=low, close=close, pre_close=pre_close, volume=volume, turnover=turnover, trade_count=trade_count, quote_date=quote_date, quote_time=quote_time) #for key, value in self.quote_data.items(): # print(key, value.ToString()) else: print("昨日行情数据为空!") else: print("获取昨日行情数据失败!") for key, value in self.security.items(): if key in self.quote_data.keys(): quote = self.quote_data[key] self.stock_list.append( StockInfo(market=value.market, code=value.code, name=value.name, close=quote.close))
class NewShardDialog(QDialog): # 自定义信号 serverSignal = pyqtSignal(list) def __init__(self, parent=None): super(NewShardDialog, self).__init__(parent) self.setFixedSize(250, 150) frame = QFrame(self) frame_layout = QVBoxLayout() name_layout = QHBoxLayout() name_label = QLabel() name_label.setText("世界别名:") name_label.setFixedWidth(70) self.name_lineEdit = QLineEdit() name_layout.addWidget(name_label) name_layout.addWidget(self.name_lineEdit) ip_layout = QHBoxLayout() ip_label = QLabel() ip_label.setText("服务器:") ip_label.setFixedWidth(70) self.server = QComboBox() self.server.setStyleSheet( "QComboBox QAbstractItemView::item { min-height: 25px; min-width: 100px; }" ) self.server.setItemDelegate(QStyledItemDelegate()) ip_layout.addWidget(ip_label) ip_layout.addWidget(self.server) serverlaber1layout = QHBoxLayout() serverlaber1 = QLabel() serverlaber1.setText("世界属性:") serverlaber1.setFixedWidth(70) ismasterGroup = QButtonGroup() self.ismasterR = QRadioButton() self.notmasterR = QRadioButton() self.ismasterR.setText("主世界") self.ismasterR.setFixedWidth(80) self.notmasterR.setText("附从世界") self.notmasterR.setChecked(True) ismasterGroup.addButton(self.ismasterR) ismasterGroup.addButton(self.notmasterR) serverlaber1layout.addWidget(serverlaber1) serverlaber1layout.addWidget(self.ismasterR) serverlaber1layout.addWidget(self.notmasterR) type_layout = QHBoxLayout() type_label = QLabel() type_label.setText("世界类型:") type_label.setFixedWidth(70) self.type = QComboBox() self.type.setStyleSheet( "QComboBox QAbstractItemView::item { min-height: 25px; min-width: 100px; }" ) self.type.setItemDelegate(QStyledItemDelegate()) self.type.addItems(["地面", "洞穴", "挂机", "熔炉", "暴食"]) type_layout.addWidget(type_label) type_layout.addWidget(self.type) btn_layout = QHBoxLayout() self.cancel_btn = QPushButton() self.cancel_btn.setText("取消") self.save_btn = QPushButton() self.save_btn.setText("确定") btn_layout.addWidget(self.cancel_btn) btn_layout.addWidget(self.save_btn) frame_layout.addLayout(name_layout) frame_layout.addLayout(ip_layout) frame_layout.addLayout(serverlaber1layout) frame_layout.addLayout(type_layout) frame_layout.addLayout(btn_layout) frame.setLayout(frame_layout) self.cancel_btn.clicked.connect(self.hide) self.save_btn.clicked.connect(self.save) def initServerList(self, slist): self.serverlist = slist for sl in slist: if sl[0] != "": self.server.addItem(sl[0] + "@" + sl[1]) else: self.server.addItem(sl[1]) # 保存 def save(self): name = self.name_lineEdit.text() + self.type.currentText() ipindex = self.server.currentIndex() if len(self.serverlist) > 1: ip = self.serverlist[ipindex][1] else: ip = "127.0.0.1" if self.ismasterR.isChecked(): ismaster = True else: ismaster = False typevalue = ["forest", "caves", "aog", "lavaarena", "quagmire"] wtype = typevalue[self.type.currentIndex()] self.serverSignal.emit([name, ip, ismaster, wtype])
class ClusterWidget(QWidget): def __init__(self, parent=None): super(ClusterWidget, self).__init__(parent) layout = QVBoxLayout() layout1 = QHBoxLayout() layout2 = QHBoxLayout() self.cluster_name = QLineEdit() name_label = QLabel() name_label.setText('房间名称:') description_label = QLabel() description_label.setText('房间简介:') self.cluster_description = QLineEdit() self.cluster_name.setText("南风颂的饥荒世界") self.cluster_description.setText("由饥荒联机版服务器管理工具开设!") layout1.addWidget(name_label) layout1.addWidget(self.cluster_name) layout2.addWidget(description_label) layout2.addWidget(self.cluster_description) layout3 = QHBoxLayout() layout4 = QHBoxLayout() layout5 = QHBoxLayout() self.cluster_intention = QComboBox() self.cluster_intention.setItemDelegate(QStyledItemDelegate()) self.cluster_intention.setStyleSheet( "QComboBox QAbstractItemView::item { min-height: 30px; min-width: 60px; }" ) self.cluster_intention_cn = ['休闲', '合作', '竞赛', '疯狂'] self.cluster_intention_value = [ 'social', 'cooperative', 'competitive', 'madness' ] self.cluster_intention.addItems(self.cluster_intention_cn) self.game_mode = QComboBox() self.game_mode.setStyleSheet( "QComboBox QAbstractItemView::item { min-height: 30px; min-width: 60px; }" ) self.game_mode.setItemDelegate(QStyledItemDelegate()) self.game_mode_cn = ['无尽', '生存', '荒野', '熔炉', '暴食'] self.game_mode_value = [ 'endless', 'survival', 'wilderness', 'lavaarena', 'quagmire' ] self.game_mode.addItems(self.game_mode_cn) label3 = QLabel() label3.setText('游戏风格:') label3.setFixedWidth(70) label4 = QLabel() label4.setFixedWidth(70) label4.setText('游戏模式:') layout3.addWidget(label3) layout3.addWidget(self.cluster_intention) layout4.addWidget(label4) layout4.addWidget(self.game_mode) layout6 = QHBoxLayout() label5 = QLabel() label5.setText("游戏语言:") label5.setFixedWidth(70) self.game_language = QButtonGroup() self.en_rbtn = QRadioButton('英语') self.en_rbtn.setFixedWidth(70) self.zh_rbtn = QRadioButton('简体中文') self.game_language.addButton(self.en_rbtn, 1) self.game_language.addButton(self.zh_rbtn, 2) self.zh_rbtn.setChecked(True) layout6.addWidget(label5) layout6.addWidget(self.en_rbtn) layout6.addWidget(self.zh_rbtn) layout7 = QHBoxLayout() label6 = QLabel() label6.setText("Steam群组ID:") self.steam_group_id = QLineEdit() self.steam_group_admin = QCheckBox('群组官员设为管理员') self.steam_group_only = QCheckBox('仅群组成员可进') layout7.addWidget(label6) layout7.addWidget(self.steam_group_id) layout7.addWidget(self.steam_group_admin) layout7.addWidget(self.steam_group_only) layout8 = QHBoxLayout() self.pvp = QCheckBox("开启PVP竞技") self.pause_when_empty = QCheckBox("开启无人暂停") self.pause_when_empty.setChecked(True) self.vote = QCheckBox('开启玩家投票') self.vote.setChecked(True) layout8.addWidget(self.pvp) layout8.addWidget(self.pause_when_empty) layout8.addWidget(self.vote) layout9 = QHBoxLayout() label7 = QLabel() label7.setText('最大玩家人数:') self.max_players = QLineEdit() self.max_players.setText("0") label8 = QLabel() label8.setText('房间预留位置个数:') self.white_players = QLineEdit() self.white_players.setText("0") layout9.addWidget(label7) layout9.addWidget(self.max_players) layout9.addWidget(label8) layout9.addWidget(self.white_players) layout10 = QHBoxLayout() label9 = QLabel() label9.setText("房间密码:") self.password = QLineEdit() layout10.addWidget(label9) layout10.addWidget(self.password) layout11 = QHBoxLayout() label10 = QLabel() label10.setText("主世界服务器:") label10.setFixedWidth(100) self.masterip = QComboBox() self.masterip.setStyleSheet( "QComboBox QAbstractItemView::item { min-height: 25px; min-width: 100px; }" ) self.masterip.setItemDelegate(QStyledItemDelegate()) layout11.addWidget(label10) layout11.addWidget(self.masterip) layout12 = QHBoxLayout() self.load_default_cluster_settings = QPushButton() self.load_default_cluster_settings.setText("载入默认设置") self.set_default_cluster_settings = QPushButton() self.set_default_cluster_settings.setText("保存为默认设置") self.save_cluster_setttings = QPushButton() self.save_cluster_setttings.setText("保存房间设置") layout12.addWidget(self.load_default_cluster_settings) layout12.addWidget(self.set_default_cluster_settings) layout12.addWidget(self.save_cluster_setttings) layout.addLayout(layout1) layout.addLayout(layout2) layout5.addLayout(layout3) layout5.addLayout(layout4) layout.addLayout(layout5) layout.addLayout(layout6) layout.addLayout(layout7) layout.addLayout(layout8) layout.addLayout(layout9) layout.addLayout(layout10) layout.addLayout(layout11) layout.addLayout(layout12) self.setLayout(layout) self.load_default_cluster_settings.clicked.connect( self.read_default_cluster_data) self.set_default_cluster_settings.clicked.connect( self.write_to_default_cluster_data) self.save_cluster_setttings.clicked.connect( self.write_curret_cluster_data) self.setServerIP(self.masterip, ip="127.0.0.1") def setServerIP(self, combox, ip): if ip == "": oldvalue = self.getServerIP() else: oldvalue = ip combox.clear() self.serverlist = SettingsWidget().get_server_list() oldindex = 0 index = 0 for slist in self.serverlist: if slist[0] != "": combox.addItem(slist[0] + "@" + slist[1]) else: combox.addItem(slist[1]) if slist[1] == oldvalue: oldindex = index index += 1 combox.setCurrentIndex(oldindex) def getServerIP(self): iparr = self.masterip.currentText().split('@') if len(iparr) > 1: ip = iparr[1] else: ip = iparr[0] if ip == "": ip = "127.0.0.1" return ip def read_default_cluster_data(self): file = os.path.join(CONFIG_DIR, "cluster.ini") self.read_cluster_data(file) def write_to_default_cluster_data(self): file = os.path.join(CONFIG_DIR, "cluster.ini") self.write_cluster_data(file) def write_curret_cluster_data(self): self.write_cluster_data(self.current_cluster_file) def write_cluster_data(self, file): self.cluster_config.set("STEAM", "steam_group_id", self.steam_group_id.text()) self.cluster_config.setboolean("STEAM", "steam_group_only", self.steam_group_only.isChecked()) self.cluster_config.setboolean("STEAM", "steam_group_admins", self.steam_group_admin.isChecked()) self.cluster_config.setboolean("GAMEPLAY", "pvp", self.pvp.isChecked()) self.cluster_config.set( "GAMEPLAY", "game_mode", self.game_mode_value[self.game_mode.currentIndex()]) self.cluster_config.setboolean("GAMEPLAY", "pause_when_empty", self.pause_when_empty.isChecked()) self.cluster_config.setboolean("GAMEPLAY", "vote_enabled", self.vote.isChecked()) self.cluster_config.set("GAMEPLAY", "max_players", self.max_players.text()) self.cluster_config.set("NETWORK", "cluster_name", self.cluster_name.text()) self.cluster_config.set("NETWORK", "cluster_description", self.cluster_description.text()) self.cluster_config.set( "NETWORK", "cluster_intention", self.cluster_intention_value[ self.cluster_intention.currentIndex()]) if self.zh_rbtn.isChecked(): lang = "zh" else: lang = "en" self.cluster_config.set("NETWORK", "cluster_language", lang) self.cluster_config.set("NETWORK", "whitelist_slots", self.white_players.text()) self.cluster_config.set("NETWORK", "cluster_password", self.password.text()) self.cluster_config.set("SHARD", "master_ip", self.getServerIP()) self.cluster_config.save(file) def read_current_cluster_data(self): self.read_cluster_data(self.current_cluster_file) def read_cluster_data(self, file): if not os.path.exists(file): file = os.path.join(CONFIG_DIR, "cluster.ini") self.cluster_config = GlobalConfig(file) self.steam_group_id.setText( self.cluster_config.get("STEAM", "steam_group_id")) self.steam_group_only.setChecked( self.cluster_config.getboolean("STEAM", "steam_group_only")) self.steam_group_admin.setChecked( self.cluster_config.getboolean("STEAM", "steam_group_admins")) self.pvp.setChecked(self.cluster_config.getboolean("GAMEPLAY", "pvp")) self.game_mode.setCurrentIndex( self.game_mode_value.index( self.cluster_config.get("GAMEPLAY", "game_mode"))) self.pause_when_empty.setChecked( self.cluster_config.getboolean("GAMEPLAY", "pause_when_empty")) self.vote.setChecked( self.cluster_config.getboolean("GAMEPLAY", "vote_enabled")) self.max_players.setText( self.cluster_config.get("GAMEPLAY", "max_players")) self.cluster_name.setText( self.cluster_config.get("NETWORK", "cluster_name")) self.cluster_description.setText( self.cluster_config.get("NETWORK", "cluster_description")) self.cluster_intention.setCurrentIndex( self.cluster_intention_value.index( self.cluster_config.get("NETWORK", "cluster_intention"))) if self.cluster_config.get("NETWORK", "cluster_language") == "zh": self.zh_rbtn.setChecked(True) else: self.en_rbtn.setChecked(True) self.white_players.setText( self.cluster_config.get("NETWORK", "whitelist_slots")) self.password.setText( self.cluster_config.get("NETWORK", "cluster_password")) self.setServerIP(self.masterip, self.cluster_config.get("SHARD", "master_ip"))
class Panel(QDialog): def __init__(self, **kwargs): super(Panel, self).__init__() self.strategy = kwargs.get("strategy", "") self.version_info = "V0.1.0-Beta Build 20180422" self.log_text = "" self.log_cate = "Panel_Trader_STK_APE" self.logger = logger.Logger() self.InitUserInterface() self.symbol = "" self.exchange = "" # SH、SZ 或 SSE、SZE # 目前只订阅个股行情,不考虑沪深个股和指数代码重合问题 self.trader = None # 策略中赋值 self.subscribe = False # 行情订阅标志 self.center = center.Center() self.quote_data = None self.price_round_stock = 2 # 小数位数 self.price_round_index = 2 # 小数位数 def OnWorking(self): # 供具体策略继承调用,在 运行 前执行一些操作 if self.subscribe == False: self.center.RegQuoteSub(self.strategy, self.OnQuoteStock, "stock_ltp") # 目前只订阅个股 self.subscribe = True self.trader = trader.Trader().GetTrader("hbzq") if self.trader == None: self.logger.SendMessage("E", 4, self.log_cate, "获取标识为 hbzq 的交易服务失败!", "M") def OnSuspend(self): # 供具体策略继承调用,在 暂停 前执行一些操作 pass def OnContinue(self): # 供具体策略继承调用,在 继续 前执行一些操作 pass def OnTerminal(self): # 供具体策略继承调用,在 停止 前执行一些操作 if self.subscribe == True: self.center.DelQuoteSub(self.strategy, "stock_ltp") self.subscribe = False def event(self, event): if event.type() == define.DEF_EVENT_TRADER_STK_APE_UPDATE_QUOTE: if self.quote_data != None: self.OnUpdateQuote(self.quote_data, self.price_round_stock) return QDialog.event(self, event) def OnTraderEvent(self, trader, ret_func, task_item): # 交易模块事件通知,供具体策略继承调用 if ret_func == define.trade_placeorder_s_func: self.log_text = "%s:%s %d:%d" % (self.strategy, trader, ret_func, task_item.order.order_id) self.logger.SendMessage("H", 2, self.log_cate, self.log_text, "T") def OnQuoteStock(self, msg): # 行情触发 try: str_code = msg.data[0].decode() if str_code == self.symbol: if "60" == str_code[0:2] or "000" == str_code[ 0:3] or "001" == str_code[0:3] or "002" == str_code[ 0:3] or "300" == str_code[0:3]: self.quote_data = msg.data QApplication.postEvent( self, QEvent(define.DEF_EVENT_TRADER_STK_APE_UPDATE_QUOTE )) # postEvent异步,sendEvent同步 except Exception as e: self.log_text = "%s:函数 OnQuoteStock 异常!%s" % (self.strategy, e) self.logger.SendMessage("E", 4, self.log_cate, self.log_text, "M") def InitUserInterface(self): self.color_red = QPalette() self.color_red.setColor(QPalette.WindowText, Qt.red) self.color_green = QPalette() self.color_green.setColor(QPalette.WindowText, QColor(0, 128, 0)) self.color_black = QPalette() self.color_black.setColor(QPalette.WindowText, Qt.black) self.list_exchange = [ define.DEF_EXCHANGE_STOCK_SH, define.DEF_EXCHANGE_STOCK_SZ ] self.list_entr_type = [ define.DEF_PRICE_TYPE_STOCK_LIMIT, define.DEF_PRICE_TYPE_STOCK_MARKET ] self.setWindowTitle("手动交易-股票-APE %s" % self.version_info) self.resize(380, 300) self.setFont(QFont("SimSun", 9)) self.label_exchange = QLabel("交易市场") self.label_exchange.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_symbol = QLabel("证券代码") self.label_symbol.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_name = QLabel("证券名称") self.label_name.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_entr_type = QLabel("委托方式") self.label_entr_type.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_can_use = QLabel("可用金额") self.label_can_use.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_can_sell = QLabel("可用数量") self.label_can_sell.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_price = QLabel("委托价格") self.label_price.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_volume = QLabel("委托数量") self.label_volume.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_can_use_unit = QLabel("元") self.label_can_use_unit.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_can_sell_unit = QLabel("股") self.label_can_sell_unit.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_price_unit = QLabel("元") self.label_price_unit.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_volume_unit = QLabel("股") self.label_volume_unit.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.combo_exchange = QComboBox() self.combo_exchange.addItems(self.list_exchange) self.line_edit_symbol = QLineEdit("") self.line_edit_symbol.setStyleSheet("color:red") # 初始红色 self.line_edit_symbol.setFont(QFont("SimSun", 9)) self.line_edit_name = QLineEdit("") self.line_edit_name.setReadOnly(True) self.line_edit_name.setFont(QFont("SimSun", 9)) self.line_edit_name.setStyleSheet( "background-color:rgb(240,240,240);color:red") # 初始红色 self.line_edit_name.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.combo_entr_type = QComboBox() self.combo_entr_type.addItems(self.list_entr_type) self.line_edit_can_use = QLineEdit("0.00") self.line_edit_can_use.setReadOnly(True) self.line_edit_can_use.setStyleSheet( "background-color:rgb(240,240,240)") self.line_edit_can_use.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.line_edit_can_sell = QLineEdit("0") self.line_edit_can_sell.setReadOnly(True) self.line_edit_can_sell.setStyleSheet( "background-color:rgb(240,240,240)") self.line_edit_can_sell.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.spin_price = QDoubleSpinBox() self.spin_price.setDecimals(4) self.spin_price.setMinimum(0) self.spin_price.setMaximum(100000) self.spin_price.setStyleSheet("color:red") # 初始红色 self.spin_price.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.spin_volume = QSpinBox() self.spin_volume.setMinimum(0) self.spin_volume.setMaximum(1000000) self.spin_volume.setSingleStep(100) self.spin_volume.setStyleSheet("color:red") # 初始红色 self.spin_volume.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.grid_layout_essential = QGridLayout() self.grid_layout_essential.setContentsMargins(-1, -1, -1, -1) self.grid_layout_essential.addWidget(self.label_exchange, 0, 0, 1, 1) self.grid_layout_essential.addWidget(self.label_symbol, 1, 0, 1, 1) self.grid_layout_essential.addWidget(self.label_name, 2, 0, 1, 1) self.grid_layout_essential.addWidget(self.label_entr_type, 3, 0, 1, 1) self.grid_layout_essential.addWidget(self.label_can_use, 4, 0, 1, 1) self.grid_layout_essential.addWidget(self.label_can_sell, 5, 0, 1, 1) self.grid_layout_essential.addWidget(self.label_price, 6, 0, 1, 1) self.grid_layout_essential.addWidget(self.label_volume, 7, 0, 1, 1) self.grid_layout_essential.addWidget(self.combo_exchange, 0, 1, 1, 1) self.grid_layout_essential.addWidget(self.line_edit_symbol, 1, 1, 1, 1) self.grid_layout_essential.addWidget(self.line_edit_name, 2, 1, 1, 1) self.grid_layout_essential.addWidget(self.combo_entr_type, 3, 1, 1, 1) self.grid_layout_essential.addWidget(self.line_edit_can_use, 4, 1, 1, 1) self.grid_layout_essential.addWidget(self.line_edit_can_sell, 5, 1, 1, 1) self.grid_layout_essential.addWidget(self.spin_price, 6, 1, 1, 1) self.grid_layout_essential.addWidget(self.spin_volume, 7, 1, 1, 1) self.grid_layout_essential.addWidget(self.label_can_use_unit, 4, 2, 1, 1) self.grid_layout_essential.addWidget(self.label_can_sell_unit, 5, 2, 1, 1) self.grid_layout_essential.addWidget(self.label_price_unit, 6, 2, 1, 1) self.grid_layout_essential.addWidget(self.label_volume_unit, 7, 2, 1, 1) self.radio_button_buy = QRadioButton("买 入") self.radio_button_buy.setStyleSheet("color:red") self.radio_button_buy.setFont(QFont("SimSun", 9)) self.radio_button_buy.setChecked(True) self.radio_button_buy.setFixedWidth(70) self.radio_button_sell = QRadioButton("卖 出") self.radio_button_sell.setStyleSheet("color:green") self.radio_button_sell.setFont(QFont("SimSun", 9)) self.radio_button_sell.setFixedWidth(70) self.button_place_order = QPushButton("下 单") self.button_place_order.setFont(QFont("SimSun", 9)) self.button_place_order.setStyleSheet("font:bold;color:red") # 初始红色 self.button_place_order.setFixedWidth(70) self.label_order_id = QLabel("撤单委托编号") self.label_order_id.setFixedWidth(70) self.label_order_id.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.line_edit_order_id = QLineEdit("") self.line_edit_order_id.setFixedWidth(70) self.line_edit_order_id.setStyleSheet("color:blue") self.line_edit_order_id.setFont(QFont("SimSun", 9)) self.button_cancel_order = QPushButton("撤 单") self.button_cancel_order.setFont(QFont("SimSun", 9)) self.button_cancel_order.setStyleSheet("font:bold;color:blue") self.button_cancel_order.setFixedWidth(70) self.h_box_layout_order_buttons = QHBoxLayout() self.h_box_layout_order_buttons.setContentsMargins(-1, -1, -1, -1) self.h_box_layout_order_buttons.addStretch(1) self.h_box_layout_order_buttons.addWidget(self.radio_button_buy) self.h_box_layout_order_buttons.addStretch(1) self.h_box_layout_order_buttons.addWidget(self.radio_button_sell) self.h_box_layout_order_buttons.addStretch(1) self.h_box_layout_order_buttons.addWidget(self.button_place_order) self.h_box_layout_order_buttons.addStretch(1) self.h_box_layout_cancel_order = QHBoxLayout() self.h_box_layout_cancel_order.setContentsMargins(-1, -1, -1, -1) # self.h_box_layout_cancel_order.addStretch(1) self.h_box_layout_cancel_order.addWidget(self.label_order_id) self.h_box_layout_cancel_order.addStretch(1) self.h_box_layout_cancel_order.addWidget(self.line_edit_order_id) self.h_box_layout_cancel_order.addStretch(1) self.h_box_layout_cancel_order.addWidget(self.button_cancel_order) self.h_box_layout_cancel_order.addStretch(1) self.v_box_layout_order = QVBoxLayout() self.v_box_layout_order.setContentsMargins(-1, -1, -1, -1) self.v_box_layout_order.addLayout(self.grid_layout_essential) self.v_box_layout_order.addLayout(self.h_box_layout_order_buttons) self.v_box_layout_order.addLayout(self.h_box_layout_cancel_order) self.label_high_limit = QLabel("涨停") self.label_ask_5 = QLabel("卖五") self.label_ask_4 = QLabel("卖四") self.label_ask_3 = QLabel("卖三") self.label_ask_2 = QLabel("卖二") self.label_ask_1 = QLabel("卖一") self.label_last = QLabel("最新") self.label_last.setMinimumWidth(35) self.label_bid_1 = QLabel("买一") self.label_bid_2 = QLabel("买二") self.label_bid_3 = QLabel("买三") self.label_bid_4 = QLabel("买四") self.label_bid_5 = QLabel("买五") self.label_low_limit = QLabel("跌停") self.label_high_limit.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_5.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_4.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_3.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_2.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_1.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_last.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_1.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_2.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_3.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_4.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_5.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_low_limit.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_high_limit_price = QLabel("0.00") self.label_high_limit_price.setMinimumWidth(60) self.label_ask_price_5 = QLabel("0.00") self.label_ask_price_4 = QLabel("0.00") self.label_ask_price_3 = QLabel("0.00") self.label_ask_price_2 = QLabel("0.00") self.label_ask_price_1 = QLabel("0.00") self.label_ask_volume_5 = QLabel("0") self.label_ask_volume_4 = QLabel("0") self.label_ask_volume_3 = QLabel("0") self.label_ask_volume_2 = QLabel("0") self.label_ask_volume_1 = QLabel("0") self.label_last_price = QLabel("0.00") self.label_last_price.setMinimumWidth(60) self.label_last_up_down = QLabel("0.00%") self.label_last_up_down.setMinimumWidth(60) self.label_bid_price_1 = QLabel("0.00") self.label_bid_price_2 = QLabel("0.00") self.label_bid_price_3 = QLabel("0.00") self.label_bid_price_4 = QLabel("0.00") self.label_bid_price_5 = QLabel("0.00") self.label_bid_volume_1 = QLabel("0") self.label_bid_volume_2 = QLabel("0") self.label_bid_volume_3 = QLabel("0") self.label_bid_volume_4 = QLabel("0") self.label_bid_volume_5 = QLabel("0") self.label_low_limit_price = QLabel("0.00") self.label_low_limit_price.setMinimumWidth(60) self.label_high_limit_price.setPalette(self.color_red) self.label_ask_price_5.setPalette(self.color_green) self.label_ask_price_4.setPalette(self.color_green) self.label_ask_price_3.setPalette(self.color_green) self.label_ask_price_2.setPalette(self.color_green) self.label_ask_price_1.setPalette(self.color_green) self.label_ask_volume_5.setPalette(self.color_green) self.label_ask_volume_4.setPalette(self.color_green) self.label_ask_volume_3.setPalette(self.color_green) self.label_ask_volume_2.setPalette(self.color_green) self.label_ask_volume_1.setPalette(self.color_green) self.label_last_price.setPalette(self.color_black) self.label_last_up_down.setPalette(self.color_black) self.label_bid_price_1.setPalette(self.color_red) self.label_bid_price_2.setPalette(self.color_red) self.label_bid_price_3.setPalette(self.color_red) self.label_bid_price_4.setPalette(self.color_red) self.label_bid_price_5.setPalette(self.color_red) self.label_bid_volume_1.setPalette(self.color_red) self.label_bid_volume_2.setPalette(self.color_red) self.label_bid_volume_3.setPalette(self.color_red) self.label_bid_volume_4.setPalette(self.color_red) self.label_bid_volume_5.setPalette(self.color_red) self.label_low_limit_price.setPalette(self.color_green) self.label_high_limit_price.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_price_5.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_price_4.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_price_3.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_price_2.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_price_1.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_volume_5.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_volume_4.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_volume_3.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_volume_2.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_volume_1.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_last_price.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_last_up_down.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_price_1.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_price_2.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_price_3.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_price_4.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_price_5.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_volume_1.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_volume_2.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_volume_3.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_volume_4.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_volume_5.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_low_limit_price.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.grid_layout_quote = QGridLayout() self.grid_layout_quote.addWidget(self.label_high_limit, 0, 0) # self.grid_layout_quote.addWidget(self.label_ask_5, 1, 0) self.grid_layout_quote.addWidget(self.label_ask_4, 2, 0) self.grid_layout_quote.addWidget(self.label_ask_3, 3, 0) self.grid_layout_quote.addWidget(self.label_ask_2, 4, 0) self.grid_layout_quote.addWidget(self.label_ask_1, 5, 0) self.grid_layout_quote.addWidget(self.label_last, 6, 0) # self.grid_layout_quote.addWidget(self.label_bid_1, 7, 0) self.grid_layout_quote.addWidget(self.label_bid_2, 8, 0) self.grid_layout_quote.addWidget(self.label_bid_3, 9, 0) self.grid_layout_quote.addWidget(self.label_bid_4, 10, 0) self.grid_layout_quote.addWidget(self.label_bid_5, 11, 0) self.grid_layout_quote.addWidget(self.label_low_limit, 12, 0) # self.grid_layout_quote.addWidget(self.label_high_limit_price, 0, 1) # self.grid_layout_quote.addWidget(self.label_ask_price_5, 1, 1) self.grid_layout_quote.addWidget(self.label_ask_price_4, 2, 1) self.grid_layout_quote.addWidget(self.label_ask_price_3, 3, 1) self.grid_layout_quote.addWidget(self.label_ask_price_2, 4, 1) self.grid_layout_quote.addWidget(self.label_ask_price_1, 5, 1) self.grid_layout_quote.addWidget(self.label_last_price, 6, 1) # self.grid_layout_quote.addWidget(self.label_bid_price_1, 7, 1) self.grid_layout_quote.addWidget(self.label_bid_price_2, 8, 1) self.grid_layout_quote.addWidget(self.label_bid_price_3, 9, 1) self.grid_layout_quote.addWidget(self.label_bid_price_4, 10, 1) self.grid_layout_quote.addWidget(self.label_bid_price_5, 11, 1) self.grid_layout_quote.addWidget(self.label_low_limit_price, 12, 1) # self.grid_layout_quote.addWidget(self.label_ask_volume_5, 1, 2) self.grid_layout_quote.addWidget(self.label_ask_volume_4, 2, 2) self.grid_layout_quote.addWidget(self.label_ask_volume_3, 3, 2) self.grid_layout_quote.addWidget(self.label_ask_volume_2, 4, 2) self.grid_layout_quote.addWidget(self.label_ask_volume_1, 5, 2) self.grid_layout_quote.addWidget(self.label_last_up_down, 6, 2) # self.grid_layout_quote.addWidget(self.label_bid_volume_1, 7, 2) self.grid_layout_quote.addWidget(self.label_bid_volume_2, 8, 2) self.grid_layout_quote.addWidget(self.label_bid_volume_3, 9, 2) self.grid_layout_quote.addWidget(self.label_bid_volume_4, 10, 2) self.grid_layout_quote.addWidget(self.label_bid_volume_5, 11, 2) self.main_text_edit_bottom = QTextEdit(self) self.main_text_edit_bottom.setText("") self.main_text_edit_bottom.setFont(QFont("SimSun", 9)) self.h_box_layout_1 = QHBoxLayout() self.h_box_layout_1.addLayout(self.v_box_layout_order) self.h_box_layout_1.addLayout(self.grid_layout_quote) self.h_box_layout_2 = QHBoxLayout() self.h_box_layout_2.setContentsMargins(-1, -1, -1, -1) self.h_box_layout_2.addWidget(self.main_text_edit_bottom) self.v_box_layout_mian = QVBoxLayout() self.v_box_layout_mian.setContentsMargins(-1, -1, -1, -1) self.v_box_layout_mian.addLayout(self.h_box_layout_1) self.v_box_layout_mian.addLayout(self.h_box_layout_2) self.setLayout(self.v_box_layout_mian) self.combo_exchange.activated[str].connect(self.OnChangeExchange) self.line_edit_symbol.editingFinished.connect(self.OnChangeSymbol) self.radio_button_buy.clicked.connect(self.OnChangeBuySell) self.radio_button_sell.clicked.connect(self.OnChangeBuySell) self.button_place_order.clicked.connect(self.OnButtonPlaceOrder) self.button_cancel_order.clicked.connect(self.OnButtonCancelOrder) def OnChangeExchange(self, str_exchange): self.symbol = "" self.exchange = "" self.line_edit_symbol.setText("") self.line_edit_name.setText("") self.OnChangeSymbol() def OnChangeSymbol(self): self.exchange = "" self.symbol = self.line_edit_symbol.text( ) #str(unicode(self.line_edit_symbol.text(), "gb2312")) self.spin_price.setValue(0) self.spin_volume.setValue(0) self.label_high_limit_price.setText("0.00") self.label_ask_price_5.setText("0.00") self.label_ask_price_4.setText("0.00") self.label_ask_price_3.setText("0.00") self.label_ask_price_2.setText("0.00") self.label_ask_price_1.setText("0.00") self.label_ask_volume_5.setText("0") self.label_ask_volume_4.setText("0") self.label_ask_volume_3.setText("0") self.label_ask_volume_2.setText("0") self.label_ask_volume_1.setText("0") self.label_last_price.setText("0.00") self.label_last_up_down.setText("0.00%") self.label_bid_price_1.setText("0.00") self.label_bid_price_2.setText("0.00") self.label_bid_price_3.setText("0.00") self.label_bid_price_4.setText("0.00") self.label_bid_price_5.setText("0.00") self.label_bid_volume_1.setText("0") self.label_bid_volume_2.setText("0") self.label_bid_volume_3.setText("0") self.label_bid_volume_4.setText("0") self.label_bid_volume_5.setText("0") self.label_low_limit_price.setText("0.00") def OnChangeBuySell(self): if self.radio_button_buy.isChecked(): self.line_edit_symbol.setStyleSheet("color:red") self.line_edit_name.setStyleSheet( "background-color:rgb(240,240,240);color:red") self.spin_price.setStyleSheet("color:red") self.spin_volume.setStyleSheet("color:red") self.button_place_order.setStyleSheet("font:bold;color:red") if self.radio_button_sell.isChecked(): self.line_edit_symbol.setStyleSheet("color:green") self.line_edit_name.setStyleSheet( "background-color:rgb(240,240,240);color:green") self.spin_price.setStyleSheet("color:green") self.spin_volume.setStyleSheet("color:green") self.button_place_order.setStyleSheet("font:bold;color:green") def OnUpdateQuote(self, data, price_round): try: self.exchange = data[3].decode() # 证券市场 self.line_edit_name.setText( str(data[1].decode("gbk")) ) # 证券名称 #QString.fromLocal8Bit(data[1].decode("gbk")) # 含中文 self.label_ask_price_5.setText(str(round(data[13][4], price_round))) self.label_ask_price_4.setText(str(round(data[13][3], price_round))) self.label_ask_price_3.setText(str(round(data[13][2], price_round))) self.label_ask_price_2.setText(str(round(data[13][1], price_round))) self.label_ask_price_1.setText(str(round(data[13][0], price_round))) self.label_ask_volume_5.setText(str(data[14][4])) self.label_ask_volume_4.setText(str(data[14][3])) self.label_ask_volume_3.setText(str(data[14][2])) self.label_ask_volume_2.setText(str(data[14][1])) self.label_ask_volume_1.setText(str(data[14][0])) self.label_bid_price_1.setText(str(round(data[15][0], price_round))) self.label_bid_price_2.setText(str(round(data[15][1], price_round))) self.label_bid_price_3.setText(str(round(data[15][2], price_round))) self.label_bid_price_4.setText(str(round(data[15][3], price_round))) self.label_bid_price_5.setText(str(round(data[15][4], price_round))) self.label_bid_volume_1.setText(str(data[16][0])) self.label_bid_volume_2.setText(str(data[16][1])) self.label_bid_volume_3.setText(str(data[16][2])) self.label_bid_volume_4.setText(str(data[16][3])) self.label_bid_volume_5.setText(str(data[16][4])) self.label_high_limit_price.setText( str(round(data[17], price_round))) # 涨停价 self.label_low_limit_price.setText( str(round(data[18], price_round))) # 跌停价 self.label_last_price.setText(str(round(data[5], price_round))) # 最新价 if data[10] > 0.0: # 昨收价 f_last_up_down = (data[5] / data[10]) - 1.0 self.label_last_up_down.setText( ("%.2f%%" % (f_last_up_down * 100.0))) if f_last_up_down > 0.0: self.label_last_up_down.setPalette(self.color_red) elif f_last_up_down < 0.0: self.label_last_up_down.setPalette(self.color_green) else: self.label_last_up_down.setPalette(self.color_black) else: self.label_last_up_down.setText("0.00%") except Exception as e: self.log_text = "%s:函数 OnUpdateQuote 异常!%s" % (self.strategy, e) self.logger.SendMessage("E", 4, self.log_cate, self.log_text, "M") def OnButtonPlaceOrder(self): if self.trader != None: if self.trader.IsTraderReady() == False: self.logger.SendMessage("E", 4, self.log_cate, "交易服务尚未开启!", "M") else: if self.line_edit_symbol.text() == "": QMessageBox.warning(self, "提示", "证券代码为空!", QMessageBox.Ok) return str_symbol = self.line_edit_symbol.text( ) #str(unicode(self.line_edit_symbol.text(), "gb2312")) str_exchange = "" if self.combo_exchange.currentText( ) == define.DEF_EXCHANGE_STOCK_SH: str_exchange = "SH" elif self.combo_exchange.currentText( ) == define.DEF_EXCHANGE_STOCK_SZ: str_exchange = "SZ" f_price = self.spin_price.value() n_amount = self.spin_volume.value() n_entr_type = 0 if self.combo_entr_type.currentText( ) == define.DEF_PRICE_TYPE_STOCK_LIMIT: n_entr_type = 1 elif self.combo_entr_type.currentText( ) == define.DEF_PRICE_TYPE_STOCK_MARKET: n_entr_type = 2 n_exch_side = 0 if self.radio_button_buy.isChecked(): n_exch_side = 1 elif self.radio_button_sell.isChecked(): n_exch_side = 2 order = self.trader.Order(symbol=str_symbol, exchange=str_exchange, price=f_price, amount=n_amount, entr_type=n_entr_type, exch_side=n_exch_side) task_place = self.trader.PlaceOrder(order, self.strategy) QMessageBox.information(self, "提示", "委托下单提交完成。", QMessageBox.Ok) else: self.logger.SendMessage("E", 4, self.log_cate, "交易服务尚未获取!", "M") def OnButtonCancelOrder(self): if self.trader != None: if self.trader.IsTraderReady() == False: self.logger.SendMessage("E", 4, self.log_cate, "交易服务尚未开启!", "M") else: if self.line_edit_order_id.text() == "": QMessageBox.warning(self, "提示", "撤单委托编号为空!", QMessageBox.Ok) return order = self.trader.Order() order.order_id = int(self.line_edit_order_id.text()) # int task_cancel = self.trader.CancelOrder(order, self.strategy) QMessageBox.information(self, "提示", "委托撤单提交完成。", QMessageBox.Ok) else: self.logger.SendMessage("E", 4, self.log_cate, "交易服务尚未获取!", "M")
class ShardWidget(QWidget): def __init__(self, parent=None): super(ShardWidget, self).__init__(parent) self.layout = QVBoxLayout() self.layout.setContentsMargins(0, 0, 0, 0) self.add_shard_btn = QPushButton() self.add_shard_btn.setText("添加世界") self.add_shard_btn.setFixedWidth(100) self.del_shard_btn = QPushButton() self.del_shard_btn.setText("删除世界") self.del_shard_btn.setFixedWidth(100) self.save_shard_btn = QPushButton() self.save_shard_btn.setText("保存世界设置(修改完一定要保存)") self.save_as_btn = QPushButton() self.save_as_btn.setText("另存为预设") self.save_as_btn.setFixedWidth(100) self.load_default_btn = QPushButton() self.load_default_btn.setText("载入预设") self.load_default_btn.setFixedWidth(100) btn_layout = QHBoxLayout() btn_layout.addWidget(self.add_shard_btn) btn_layout.addWidget(self.del_shard_btn) btn_layout.addWidget(self.load_default_btn) btn_layout.addWidget(self.save_as_btn) btn_layout.addWidget(self.save_shard_btn) self.layout.addLayout(btn_layout) self.topFiller = QWidget() self.topFiller.setMinimumSize(835, 995) self.scroll = QScrollArea() self.scroll.setWidget(self.topFiller) # self.scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.shardtab = QTabWidget(self.topFiller) self.shardtab.setFixedSize(835, 995) # self.shardtab.setTabPosition(QTabWidget.West) self.layout.addWidget(self.scroll) self.setLayout(self.layout) self.initShardTab() self.save_shard_btn.clicked.connect(self.saveShardLevelData) self.del_shard_btn.clicked.connect(self.deleteShard) self.add_shard_btn.clicked.connect(self.addNewShard) def getServerList(self): s = SettingsWidget() return s.get_server_list() def addNewShard(self): slist = self.getServerList() self.newShardDialog = NewShardDialog(self) self.newShardDialog.setWindowTitle("添加服务器") self.newShardDialog.initServerList(slist) self.newShardDialog.serverSignal.connect(self.add_shard) self.newShardDialog.exec() # 初始化世界配置从文件加载世界配置并写入UI def loadServerIni(self, wtype, wid): file = os.path.join(CLUSTER_DIR, "Cluster_" + self.getCurrentCluster(), wtype + "_" + str(wid), "server.ini") if not os.path.exists(file): file = os.path.join(CONFIG_DIR, "server.ini") self.serverconfig[wid] = GlobalConfig(file) self.serverconfig[wid].server_port = self.serverconfig[wid].get( "NETWORK", "server_port") self.serverconfig[wid].is_master = self.serverconfig[wid].getboolean( "SHARD", "is_master") self.serverconfig[wid].name = self.serverconfig[wid].get( "SHARD", "name") self.serverconfig[wid].id = self.serverconfig[wid].get("SHARD", "id") self.serverconfig[wid].master_server_port = self.serverconfig[wid].get( "STEAM", "master_server_port") self.serverconfig[wid].authentication_port = self.serverconfig[ wid].get("STEAM", "authentication_port") if self.serverconfig[wid].has_section("SERVER"): self.serverconfig[wid].ip = self.serverconfig[wid].get( "SERVER", "ip") self.serverconfig[wid].alias = self.serverconfig[wid].get( "SERVER", "alias") else: self.serverconfig[wid].add_section("SERVER") self.serverconfig[wid].set("SERVER", "ip", "127.0.0.1") self.serverconfig[wid].set("SERVER", "alias", wtype + "_" + str(wid)) if self.serverconfig[wid].server_port == "": self.serverconfig[wid].set("NETWORK", "server_port", str(10998 + random.randint(1, 100))) if self.serverconfig[wid].name == "": self.serverconfig[wid].set("SHARD", "name", wtype + str(wid)) if self.serverconfig[wid].id == "": self.serverconfig[wid].set("SHARD", "id", str(wid)) if self.serverconfig[wid].master_server_port == "": self.serverconfig[wid].set("STEAM", "master_server_port", str(27016 + random.randint(1, 100))) if self.serverconfig[wid].authentication_port == "": self.serverconfig[wid].set("STEAM", "authentication_port", str(8766 + random.randint(1, 100))) if self.serverconfig[wid].alias == "": self.serverconfig[wid].set("SERVER", "alias", wtype + "_" + str(wid)) def setServerIni(self, wid): self.serverconfig[wid].set("SERVER", "ip", self.getShardIP()) if self.ismasterR.isChecked(): ismaster = True else: ismaster = False self.serverconfig[wid].setboolean("SHARD", "is_master", ismaster) def savaServerIni(self, wtype, wid): inidir = os.path.join(CLUSTER_DIR, "Cluster_" + self.getCurrentCluster(), wtype + "_" + str(wid)) file = os.path.join(inidir, "server.ini") if not os.path.exists(inidir): os.mkdir(inidir) self.serverconfig[wid].save(file) def setShardIP(self, combox, ip): if ip == "": ip = "127.0.0.1" ClusterWidget().setServerIP(combox, ip) def getShardIP(self): iparr = self.serverCombox.currentText().split('@') if len(iparr) > 1: ip = iparr[1] else: ip = iparr[0] if ip == "": ip = "127.0.0.1" return ip def add_shard(self, shard): self.newShardDialog.hide() self.addShardTab(shard[3], 0, shard) def getCurrentCluster(self): if os.path.exists(TEMP_FILE): tc = GlobalConfig(TEMP_FILE) return tc.get("TEMP", "cluster_index") else: return "1" def loadShardValue(self, w, combos): levelfname = os.path.join(CLUSTER_DIR, "Cluster_" + self.getCurrentCluster(), w.type + "_" + str(w.id), "leveldataoverride.lua") saveFlag = False if not os.path.exists(levelfname): levelfname = os.path.join(CONFIG_DIR, w.type + ".lua") saveFlag = True f = open(levelfname, 'r', encoding='utf-8') data = f.read() f.close() data = data.replace("return", "") p1 = LuaTableParser() p1.load(data) w.shardValueDict = p1.dumpDict() if w.type == "forest" or w.type == "caves": for comk, comv in combos.items(): value = w.shardValueDict["overrides"][comk] comindex = 0 for v in comv.valuearr: if v == value: break else: comindex += 1 comv.setCurrentIndex(comindex) if saveFlag: self.saveShardLevelData() def initShardTab(self): self.shardtabs = [] self.shardlayouts = [] self.optionsCombobox = {} self.serverconfig = {} self.shardtab.clear() cdir = os.path.join(CLUSTER_DIR, "Cluster_" + self.getCurrentCluster()) if os.path.exists(cdir): shard_type = ["forest", "caves", "aog", "lavaarena", "quagmire"] exist_shards = os.listdir(cdir) cindex = 0 for file in exist_shards: arr = file.split("_") if len(arr) > 1 and arr[ 0] in shard_type and file != "cluster_token.txt": self.addShardTab(arr[0], int(arr[1]), shard=[]) cindex += 1 def addShardTab(self, world, wid, shard): sindex = len(self.shardtabs) self.shardtabs.append(QWidget()) self.shardtabs[sindex].type = world self.shardtabs[sindex].id = wid == 0 and str(random.randint( 100, 999)) or wid self.loadServerIni(self.shardtabs[sindex].type, self.shardtabs[sindex].id) wid = self.shardtabs[sindex].id if len(shard) > 0: self.serverconfig[wid].set("SERVER", "ip", shard[1]) self.serverconfig[wid].set("SERVER", "alias", shard[0]) self.serverconfig[wid].setboolean("SHARD", "is_master", shard[2]) self.savaServerIni(self.shardtabs[sindex].type, self.shardtabs[sindex].id) self.shardtab.addTab( self.shardtabs[sindex], self.serverconfig[wid].get("SERVER", "alias") + " " + str(sindex + 1)) shardlayout = QVBoxLayout() comboboxObject = {} # shard ip, ismaster shardserverlayout = QHBoxLayout() serverlaber = QLabel() serverlaber.setText("服务器:") serverlaber.setFixedWidth(60) self.serverCombox = QComboBox() self.serverCombox.setStyleSheet( "QComboBox QAbstractItemView::item { min-height: 25px; min-width: 100px; }" ) self.serverCombox.setItemDelegate(QStyledItemDelegate()) shardserverlayout.addWidget(serverlaber) shardserverlayout.addWidget(self.serverCombox) serverlaber1 = QLabel() serverlaber1.setText("世界属性:") serverlaber1.setFixedWidth(70) ismasterGroup = QButtonGroup() self.ismasterR = QRadioButton() self.notmasterR = QRadioButton() self.ismasterR.setText("主世界") self.ismasterR.setFixedWidth(80) self.notmasterR.setText("附从世界") ismasterGroup.addButton(self.ismasterR) ismasterGroup.addButton(self.notmasterR) shardserverlayout.addWidget(serverlaber1) shardserverlayout.addWidget(self.ismasterR) shardserverlayout.addWidget(self.notmasterR) shardlayout.addLayout(shardserverlayout) if self.serverconfig[self.shardtabs[sindex].id].getboolean( "SHARD", "is_master"): self.ismasterR.setChecked(True) else: self.notmasterR.setChecked(True) self.setShardIP( self.serverCombox, self.serverconfig[self.shardtabs[sindex].id].get("SERVER", "ip")) if world == "forest" or world == "caves": optionsDict = self.readShardOptions(world) typedict = { "environment": "世界环境", "source": "资源", "food": "食物", "animal": "动物", "monster": "怪物" } for tk, tv in typedict.items(): tlabel = QPushButton() tlabel.setText(tv) shardlayout.addWidget(tlabel) oindex, ooindex = 0, 0 for olist in optionsDict[tk]: if oindex + 4 < 5: ollayout = QHBoxLayout() shardlayout.addLayout(ollayout) ollayout.setAlignment ollabel = QLabel() ollabel.setText(olist["name"]) ollabel.setFixedWidth(60) comboboxObject[olist["key"]] = QComboBox() comboboxObject[olist["key"]].setFixedWidth(120) comboboxObject[olist["key"]].setStyleSheet( "QComboBox QAbstractItemView::item { min-height: 25px; min-width: 80px; }" ) comboboxObject[olist["key"]].setItemDelegate( QStyledItemDelegate()) comboboxObject[olist["key"]].addItems( olist["options"]["label"]) comboboxObject[ olist["key"]].valuearr = olist["options"]["value"] ollayout.addWidget(ollabel, stretch=0) ollayout.addWidget(comboboxObject[olist["key"]], stretch=0) ollayout.addStretch() if oindex < 3: oindex += 1 else: oindex = 0 ooindex += 1 else: tip = QLabel() tip.setText("当前世界类型不支持修改设置!") tip.setAlignment(Qt.AlignHCenter) shardlayout.addWidget(tip) self.shardtabs[sindex].setLayout(shardlayout) self.optionsCombobox[self.shardtabs[sindex].id] = comboboxObject self.loadShardValue(self.shardtabs[sindex], self.optionsCombobox[self.shardtabs[sindex].id]) def readShardOptions(self, filename): file = os.path.join(CONFIG_DIR, filename + ".json") if os.path.exists(file): with open(file, 'r', encoding="utf-8") as f: data = json.load(f) else: data = {} return data def saveShardLevelData(self): for w in self.shardtabs: # w = self.shardtab.currentWidget() sdir = os.path.join(CLUSTER_DIR, "Cluster_" + self.getCurrentCluster(), w.type + "_" + str(w.id)) levelfname = os.path.join(sdir, "leveldataoverride.lua") # print(w.shardValueDict) if w.type == "forest" or w.type == "caves": for comk, comv in self.optionsCombobox[w.id].items(): comindex = comv.currentIndex() w.shardValueDict['overrides'][comk] = comv.valuearr[ comindex] p1 = LuaTableParser() p1.loadDict(w.shardValueDict) data = "return" + p1.dump() if not os.path.exists(sdir): os.mkdir(sdir) with open(levelfname, 'w', encoding='utf-8') as f: f.write(data) f.close() self.setServerIni(w.id) self.savaServerIni(w.type, w.id) def deleteShard(self): if len(self.shardtabs) > 0: w = self.shardtab.currentWidget() sdir = os.path.join(CLUSTER_DIR, "Cluster_" + self.getCurrentCluster(), w.type + "_" + str(w.id)) if os.path.exists(sdir): shutil.rmtree(sdir) ci = self.shardtab.currentIndex() self.shardtab.removeTab(ci) self.shardtabs.remove(w)
class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) # 在初始化之前设置pg,因为初始化会写死配置,无法在更改 # pg.setConfigOption('foreground', 'd') # 使曲线看起来光滑 pg.setConfigOptions(antialias=True) # 设置文字的字体 font = QFont() font.setFamily("Microsoft Yahei") font.setPointSize(11) self.setMinimumHeight(750) self.setMinimumWidth(1000) # self.setFixedSize(1000, 750) # 统一设置按钮的字体 btn_list = [] # 设置题目和状态栏 self.setWindowTitle("心电平台检测") # 设置状态栏 self.status = self.statusBar() self.status.showMessage("检测~") # 整体布局 pagelayout = QVBoxLayout() # 顶层按钮布局 top = QFrame(self) top.setFrameShape(QFrame.StyledPanel) btn_layout = QHBoxLayout(top) self.data_com = QComboBox() delegate = QStyledItemDelegate() self.data_com.setItemDelegate(delegate) self.data_com.addItem("选择心电数据") self.data_com.setFixedSize(200, 40) self.data_com.setFont(font) set_btn = QPushButton("设置") help_btn = QPushButton("帮助") save_btn = QPushButton("存储") back_btn = QPushButton("回放") fig_btn = QPushButton("截图") patient_table_btn = QPushButton("病例表") self.stop_btn = QPushButton("暂停") btn_list.append(set_btn) btn_list.append(help_btn) btn_list.append(save_btn) btn_list.append(back_btn) btn_list.append(self.stop_btn) btn_list.append(fig_btn) btn_list.append(patient_table_btn) btn_layout.addWidget(self.data_com) btn_layout.addWidget(set_btn) btn_layout.addWidget(help_btn) btn_layout.addWidget(save_btn) btn_layout.addWidget(self.stop_btn) btn_layout.addWidget(back_btn) btn_layout.addWidget(fig_btn) btn_layout.addWidget(patient_table_btn) for btn in btn_list: btn.setFont(font) btn.setFixedSize(100, 40) # 以此统计病人数量 self.patient = 0 for i in range(0, 10): self.patient += 1 self.data_com.addItem(str(100 + i)) # 底层布局 bottom = QFrame(self) bottom.setFrameShape(QFrame.StyledPanel) self.bottom_layout = QStackedLayout(bottom) # 1. 绘图区域 plot_widget = QWidget(bottom) plot_layout = QHBoxLayout() win = pg.GraphicsLayoutWidget() self.p = win.addPlot() self.p.getAxis("bottom").tickFont = font self.p.getAxis("left").tickFont = font # 背景透明 win.setBackground(background=None) plot_layout.addWidget(win) plot_widget.setLayout(plot_layout) self.bottom_layout.addWidget(plot_widget) # 2. 帮助文档 help_widget = QWidget(bottom) help_layout = QHBoxLayout() self.help_text = QTextEdit() self.help_text.setReadOnly(True) help_layout.addWidget(self.help_text) help_widget.setLayout(help_layout) self.bottom_layout.addWidget(help_widget) help_btn.clicked.connect(self.show_help) # 3. 设置 set_widget = QWidget(bottom) set_layout = QVBoxLayout() theme_layout = QHBoxLayout() self.theme_white_radio = QRadioButton("白色主题") self.theme_white_radio.setFixedWidth(120) self.theme_black_radio = QRadioButton("黑色主题") theme_label = QLabel("主题颜色选择") theme_label.setFixedWidth(120) theme_layout.addWidget(theme_label) theme_layout.addWidget(self.theme_white_radio) theme_layout.addWidget(self.theme_black_radio) line_width_layout = QHBoxLayout() line_width = QLabel("设置线宽(范围1-4)") line_width.setFixedWidth(150) line_width_layout.addWidget(line_width) self.line_width_spin = QSpinBox() self.line_width_spin.setMinimum(1) self.line_width_spin.setMaximum(4) line_width_layout.addWidget(self.line_width_spin) set_layout.addLayout(theme_layout) set_layout.addLayout(line_width_layout) set_widget.setLayout(set_layout) self.bottom_layout.addWidget(set_widget) self.theme_white_radio.toggled.connect(self.change_status) self.theme_black_radio.toggled.connect(self.change_status) set_btn.clicked.connect(self.set_) # 暂停与启动的切换 self.stop_btn.clicked.connect(self.stop_) # 截图功能 fig_btn.clicked.connect(self.save_fig) # 回放功能 back_btn.clicked.connect(self.back_show) # 保存数据功能 save_widget = QWidget(bottom) save_layout = QHBoxLayout() save_label = QLabel("请选择保存数据的区间") save_label.setFixedHeight(40) self.left_interval = QLineEdit() self.left_interval.setFixedHeight(40) self.left_interval.setPlaceholderText("起始点,左区间") self.right_interval = QLineEdit() self.right_interval.setFixedHeight(40) self.right_interval.setPlaceholderText("终止点,右区间") save_confirm_btn = QPushButton("确认") save_confirm_btn.setFixedHeight(40) save_layout.addWidget(save_label) save_layout.addWidget(self.left_interval) save_layout.addWidget(self.right_interval) save_layout.addWidget(save_confirm_btn) save_widget.setLayout(save_layout) save_btn.clicked.connect(self.save_widget_) save_confirm_btn.clicked.connect(self.save_data) self.bottom_layout.addWidget(save_widget) # 病例表的填写 table_widget = QWidget(bottom) table_layout = QHBoxLayout() self.patient_table = QTableWidget() self.patient_table.setColumnCount(9) self.patient_table.setRowCount(self.patient) self.patient_table.setHorizontalHeaderLabels([ '标号', '年龄', '性别', '用药', '房性早博', '室性早博', '心室融合心博', '右束支传导阻塞心博', '左束支传导阻塞心博' ]) # self.patient_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) self.patient_table.resizeColumnsToContents() self.patient_table.verticalHeader().setVisible(False) table_layout.addWidget(self.patient_table) table_widget.setLayout(table_layout) self.bottom_layout.addWidget(table_widget) patient_table_btn.clicked.connect(self.show_table) # 设置最终的窗口布局与控件------------------------------------- splitter = QSplitter(Qt.Vertical) splitter.addWidget(top) splitter.addWidget(bottom) widget = QWidget() pagelayout.addWidget(splitter) widget.setLayout(pagelayout) self.setCentralWidget(widget) # 计时器 当时间到了就出发绘图函数 self.timer = QTimer() self.timer.timeout.connect(self.update) # 记录当前用户 self.people = "" # 当用户改变时出发函数 重新绘图 self.data_com.currentIndexChanged.connect(self.show_ecg1) self.data_com.view().pressed.connect(self.show_ecg) # 读取数据的标志 self.flag = 0 # 帮助文档的标志 self.help = 0 # 暂停的标志 self.stop = 0 def show_table(self): # 这么多行 self.timer.stop() self.bottom_layout.setCurrentIndex(4) rows = self.patient for row in range(0, rows): item = QTableWidgetItem(str(100 + row)) self.patient_table.setItem(row, 0, item) head = wfdb.rdheader('MIT-BIH/mit-bih-database/' + str(100 + row)) age, gender, _, _, _ = head.comments[0].split(" ") item = QTableWidgetItem(str(age)) self.patient_table.setItem(row, 1, item) item = QTableWidgetItem(str(gender)) self.patient_table.setItem(row, 2, item) drugs = head.comments[1] item = QTableWidgetItem(str(drugs)) self.patient_table.setItem(row, 3, item) record = wfdb.rdann('MIT-BIH/mit-bih-database/' + str(100 + row), "atr", sampfrom=0, sampto=650000) A, V, F, R, L = 0, 0, 0, 0, 0 for index in record.symbol: if index == 'A': A += 1 if index == "V": V += 1 if index == "F": F += 1 if index == "R": R += 1 if index == "L": L += 1 item = QTableWidgetItem(str(A)) self.patient_table.setItem(row, 4, item) item = QTableWidgetItem(str(V)) self.patient_table.setItem(row, 5, item) item = QTableWidgetItem(str(F)) self.patient_table.setItem(row, 6, item) item = QTableWidgetItem(str(R)) self.patient_table.setItem(row, 7, item) item = QTableWidgetItem(str(L)) self.patient_table.setItem(row, 8, item) self.patient_table.resizeColumnsToContents() # 选择区间断和数据,保存即可 def save_data(self): left = int(self.left_interval.text()) right = int(self.right_interval.text()) print(self.people) record = wfdb.rdrecord('MIT-BIH/mit-bih-database/' + self.people, physical=False, sampto=100000) data = record.d_signal data = data[left:right] channels = data.shape[1] # print(data) columns = ["channel_" + str(i) for i in range(channels)] df = pd.DataFrame(data, columns=columns, index=range(left, right)) filename, _ = QFileDialog.getSaveFileName(self, "文件保存", os.getcwd(), "Text Files (*.csv)") if filename == "": return df.to_csv(filename) # 只是打开保存的页面 def save_widget_(self): self.timer.stop() self.bottom_layout.setCurrentIndex(3) def timer_(self): self.timer.start(20) def back_show(self): self.p.clear() self.flag = 0 self.stop = 0 self.stop_btn.setText("暂停") self.timer_() def save_fig(self): exporter = pg.exporters.ImageExporter(self.p) exporter.parameters()['width'] = 1080 file_name = str(datetime.datetime.now()) file_name = file_name.replace(" ", "-") file_name = file_name.replace(".", "-") file_name = file_name.replace(":", "-") file_name = file_name + ".png" exporter.export(file_name) QMessageBox.information(None, ("友情提示"), ("保存完毕"), QMessageBox.Cancel) # 停止时关闭计时器 def stop_(self): if self.stop == 0: self.stop = 1 self.stop_btn.setText("启动") self.timer.stop() else: self.stop = 0 self.timer.start() self.stop_btn.setText("暂停") # 设置时停止计时器 def set_(self): self.timer.stop() self.bottom_layout.setCurrentIndex(2) def change_status(self): self.timer.stop() if self.theme_white_radio.isChecked(): self.setStyleSheet("") else: self.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5()) def show_help(self): self.timer.stop() self.bottom_layout.setCurrentIndex(1) if (self.help == 0): self.help += 1 with open("help.txt", "r") as f: text = f.readlines() for line in text: self.help_text.append(line) def show_ecg1(self): string = self.data_com.currentText() self.people = string self.p.clear() # 重置为 0 方可读取数据 self.flag = 0 self.timer_() def show_ecg(self): # 捕获当前用户 self.bottom_layout.setCurrentIndex(0) def update(self): if self.people == "": pass else: # 第一次只读取 10000 数据 if self.flag == 0: self.data = wfdb.rdrecord('MIT-BIH/mit-bih-database/' + self.people, sampfrom=0, sampto=10000, physical=False, channels=[ 0, ]) # 先取这么多数据 self.count = 250 data = self.data.d_signal[:self.count].reshape(self.count) self.curve = self.p.plot( data, pen=pg.mkPen(width=self.line_width_spin.value())) self.flag += 1 # 第二次开始绘制,每次只绘制一个数据点 else: if self.stop != 1: self.count += 1 # 每次多取一个数据 data = self.data.d_signal[:self.count].reshape(self.count) # 删除第一个数据 新加一个数据 data[:-1] = data[1:] data[-1] = self.data.d_signal[self.count] self.curve.setData(data)
class Panel(QDialog): def __init__(self, **kwargs): super(Panel, self).__init__() self.strategy = kwargs.get("strategy", "") self.version_info = "V0.1.0-Beta Build 20180422" self.log_text = "" self.log_cate = "Panel_Trader_FUE_CTP" self.logger = logger.Logger() self.InitUserInterface() self.contract = "" self.exchange = "" self.trader = None # 策略中赋值 self.subscribe = False # 行情订阅标志 self.center = center.Center() self.quote_data = None self.price_round_future = 2 # 小数位数 def OnWorking(self): # 供具体策略继承调用,在 运行 前执行一些操作 if self.subscribe == False: self.center.RegQuoteSub(self.strategy, self.OnQuoteFuture, "future_np") self.subscribe = True self.trader = trader.Trader().GetTrader("sqqh") if self.trader == None: self.logger.SendMessage("E", 4, self.log_cate, "获取标识为 sqqh 的交易服务失败!", "M") def OnSuspend(self): # 供具体策略继承调用,在 暂停 前执行一些操作 pass def OnContinue(self): # 供具体策略继承调用,在 继续 前执行一些操作 pass def OnTerminal(self): # 供具体策略继承调用,在 停止 前执行一些操作 if self.subscribe == True: self.center.DelQuoteSub(self.strategy, "future_np") self.subscribe = False def event(self, event): if event.type() == define.DEF_EVENT_TRADER_FUE_CTP_UPDATE_QUOTE: if self.quote_data != None: self.OnUpdateQuote(self.quote_data, self.price_round_future) return QDialog.event(self, event) def OnTraderEvent(self, trader, ret_func, task_item): # 交易模块事件通知,供具体策略继承调用 if ret_func == define.trade_placeorder_f_func: self.log_text = "%s:%s %d:%s" % (self.strategy, trader, ret_func, task_item.order.order_id) self.logger.SendMessage("H", 2, self.log_cate, self.log_text, "T") def OnQuoteFuture(self, msg): # 行情触发 try: str_code = msg.data[0].decode() if str_code == self.contract: self.quote_data = msg.data QApplication.postEvent(self, QEvent(define.DEF_EVENT_TRADER_FUE_CTP_UPDATE_QUOTE)) # postEvent异步,sendEvent同步 except Exception as e: self.log_text = "%s:函数 OnQuoteFuture 异常!%s" % (self.strategy, e) self.logger.SendMessage("E", 4, self.log_cate, self.log_text, "M") def InitUserInterface(self): self.color_red = QPalette() self.color_red.setColor(QPalette.WindowText, Qt.red) self.color_green = QPalette() self.color_green.setColor(QPalette.WindowText, QColor(0, 128, 0)) self.color_black = QPalette() self.color_black.setColor(QPalette.WindowText, Qt.black) self.list_exchange = [define.DEF_EXCHANGE_FUTURE_CFFE, define.DEF_EXCHANGE_FUTURE_SHFE, define.DEF_EXCHANGE_FUTURE_CZCE, define.DEF_EXCHANGE_FUTURE_DLCE] self.list_entr_type = [define.DEF_PRICE_TYPE_FUTURE_LIMIT, define.DEF_PRICE_TYPE_FUTURE_MARKET] self.setWindowTitle("手动交易-期货-CTP %s" % self.version_info) self.resize(380, 300) self.setFont(QFont("SimSun", 9)) self.label_exchange = QLabel("交易市场") self.label_exchange.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_contract = QLabel("合约代码") self.label_contract.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_entr_type = QLabel("委托方式") self.label_entr_type.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_can_use = QLabel("可用金额") self.label_can_use.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_can_trade = QLabel("可用数量") self.label_can_trade.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_price = QLabel("委托价格") self.label_price.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_volume = QLabel("委托数量") self.label_volume.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_can_use_unit = QLabel("元") self.label_can_use_unit.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_can_sell_unit_l = QLabel("手") self.label_can_sell_unit_l.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_can_sell_unit_s = QLabel("手") self.label_can_sell_unit_s.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_price_unit = QLabel("元") self.label_price_unit.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.label_volume_unit = QLabel("手") self.label_volume_unit.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.combo_exchange = QComboBox() self.combo_exchange.addItems(self.list_exchange) self.line_edit_contract = QLineEdit("") self.line_edit_contract.setStyleSheet("color:red") # 初始红色 self.line_edit_contract.setFont(QFont("SimSun", 9)) self.combo_entr_type = QComboBox() self.combo_entr_type.addItems(self.list_entr_type) self.line_edit_can_use = QLineEdit("0.00") self.line_edit_can_use.setReadOnly(True) self.line_edit_can_use.setStyleSheet("background-color:rgb(240,240,240)") self.line_edit_can_use.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.line_edit_can_trade_l = QLineEdit("0") self.line_edit_can_trade_l.setReadOnly(True) self.line_edit_can_trade_l.setStyleSheet("background-color:rgb(240,240,240);color:red") self.line_edit_can_trade_l.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.line_edit_can_trade_s = QLineEdit("0") self.line_edit_can_trade_s.setReadOnly(True) self.line_edit_can_trade_s.setStyleSheet("background-color:rgb(240,240,240);color:green") self.line_edit_can_trade_s.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.spin_price = QDoubleSpinBox() self.spin_price.setDecimals(3) self.spin_price.setMinimum(0) self.spin_price.setMaximum(500000) self.spin_price.setStyleSheet("color:red") # 初始红色 self.spin_price.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.spin_volume = QSpinBox() self.spin_volume.setMinimum(0) self.spin_volume.setMaximum(10000) self.spin_volume.setSingleStep(1) self.spin_volume.setStyleSheet("color:red") # 初始红色 self.spin_volume.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.grid_layout_essential = QGridLayout() self.grid_layout_essential.setContentsMargins(-1, -1, -1, -1) self.grid_layout_essential.addWidget(self.label_exchange, 0, 0, 1, 1) self.grid_layout_essential.addWidget(self.label_contract, 1, 0, 1, 1) self.grid_layout_essential.addWidget(self.label_entr_type, 2, 0, 1, 1) self.grid_layout_essential.addWidget(self.label_can_use, 3, 0, 1, 1) self.grid_layout_essential.addWidget(self.label_can_trade, 4, 0, 1, 1) self.grid_layout_essential.addWidget(self.label_price, 5, 0, 1, 1) self.grid_layout_essential.addWidget(self.label_volume, 6, 0, 1, 1) self.grid_layout_essential.addWidget(self.combo_exchange, 0, 1, 1, 3) self.grid_layout_essential.addWidget(self.line_edit_contract, 1, 1, 1, 3) self.grid_layout_essential.addWidget(self.combo_entr_type, 2, 1, 1, 3) self.grid_layout_essential.addWidget(self.line_edit_can_use, 3, 1, 1, 3) self.grid_layout_essential.addWidget(self.line_edit_can_trade_l, 4, 1, 1, 1) self.grid_layout_essential.addWidget(self.spin_price, 5, 1, 1, 3) self.grid_layout_essential.addWidget(self.spin_volume, 6, 1, 1, 3) self.grid_layout_essential.addWidget(self.label_can_sell_unit_l, 4, 2, 1, 1) self.grid_layout_essential.addWidget(self.line_edit_can_trade_s, 4, 3, 1, 1) self.grid_layout_essential.addWidget(self.label_can_use_unit, 3, 4, 1, 1) self.grid_layout_essential.addWidget(self.label_can_sell_unit_s, 4, 4, 1, 1) self.grid_layout_essential.addWidget(self.label_price_unit, 5, 4, 1, 1) self.grid_layout_essential.addWidget(self.label_volume_unit, 6, 4, 1, 1) self.radio_button_buy_open = QRadioButton("买入开仓") self.radio_button_buy_open.setFixedWidth(70) self.radio_button_buy_open.setStyleSheet("color:red") self.radio_button_buy_open.setFont(QFont("SimSun", 9)) self.radio_button_buy_open.setChecked(True) self.radio_button_sell_open = QRadioButton("卖出开仓") self.radio_button_sell_open.setFixedWidth(70) self.radio_button_sell_open.setStyleSheet("color:purple") self.radio_button_sell_open.setFont(QFont("SimSun", 9)) self.radio_button_buy_close = QRadioButton("买入平仓") self.radio_button_buy_close.setFixedWidth(70) self.radio_button_buy_close.setStyleSheet("color:blue") self.radio_button_buy_close.setFont(QFont("SimSun", 9)) self.radio_button_sell_close = QRadioButton("卖出平仓") self.radio_button_sell_close.setFixedWidth(70) self.radio_button_sell_close.setStyleSheet("color:green") self.radio_button_sell_close.setFont(QFont("SimSun", 9)) self.check_box_close_today = QCheckBox("平今") self.check_box_close_today.setFont(QFont("SimSun", 9)) self.check_box_close_today.setChecked(False) self.check_box_close_today.setEnabled(False) self.check_box_close_today.setFixedWidth(70) self.button_place_order = QPushButton("下 单") self.button_place_order.setFont(QFont("SimSun", 9)) self.button_place_order.setStyleSheet("font:bold;color:red") # 初始红色 self.button_place_order.setFixedWidth(70) self.radio_button_tou_ji = QRadioButton("投机") self.radio_button_tou_ji.setFont(QFont("SimSun", 9)) self.radio_button_tou_ji.setChecked(True) self.radio_button_tou_ji.setFixedWidth(70) self.radio_button_tao_bao = QRadioButton("套保") self.radio_button_tao_bao.setFont(QFont("SimSun", 9)) self.radio_button_tao_bao.setChecked(False) self.radio_button_tao_bao.setEnabled(False) self.radio_button_tao_bao.setFixedWidth(70) self.radio_button_tao_li = QRadioButton("套利") self.radio_button_tao_li.setFont(QFont("SimSun", 9)) self.radio_button_tao_li.setChecked(False) self.radio_button_tao_li.setEnabled(False) self.radio_button_tao_li.setFixedWidth(70) self.label_order_id = QLabel("撤单委托编号") self.label_order_id.setFixedWidth(70) self.label_order_id.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.line_edit_order_id = QLineEdit("") self.line_edit_order_id.setFixedWidth(70) self.line_edit_order_id.setStyleSheet("color:blue") self.line_edit_order_id.setFont(QFont("SimSun", 9)) self.button_cancel_order = QPushButton("撤 单") self.button_cancel_order.setFont(QFont("SimSun", 9)) self.button_cancel_order.setStyleSheet("font:bold;color:blue") self.button_cancel_order.setFixedWidth(70) self.h_box_layout_trade_buttons_1 = QHBoxLayout() self.h_box_layout_trade_buttons_1.setContentsMargins(-1, -1, -1, -1) self.h_box_layout_trade_buttons_1.addStretch(1) self.h_box_layout_trade_buttons_1.addWidget(self.radio_button_buy_open) self.h_box_layout_trade_buttons_1.addStretch(1) self.h_box_layout_trade_buttons_1.addWidget(self.radio_button_sell_open) self.h_box_layout_trade_buttons_1.addStretch(1) self.h_box_layout_trade_buttons_1.addWidget(self.check_box_close_today) self.h_box_layout_trade_buttons_1.addStretch(1) self.h_box_layout_trade_buttons_2 = QHBoxLayout() self.h_box_layout_trade_buttons_2.setContentsMargins(-1, -1, -1, -1) self.h_box_layout_trade_buttons_2.addStretch(1) self.h_box_layout_trade_buttons_2.addWidget(self.radio_button_buy_close) self.h_box_layout_trade_buttons_2.addStretch(1) self.h_box_layout_trade_buttons_2.addWidget(self.radio_button_sell_close) self.h_box_layout_trade_buttons_2.addStretch(1) self.h_box_layout_trade_buttons_2.addWidget(self.button_place_order) self.h_box_layout_trade_buttons_2.addStretch(1) self.v_box_layout_trade_buttons = QVBoxLayout() self.v_box_layout_trade_buttons.setContentsMargins(0, 2, 0, 2) # self.v_box_layout_trade_buttons.addLayout(self.h_box_layout_trade_buttons_1) self.v_box_layout_trade_buttons.addLayout(self.h_box_layout_trade_buttons_2) self.h_box_layout_trade_buttons_3 = QHBoxLayout() self.h_box_layout_trade_buttons_3.setContentsMargins(0, 0, 0, 0) # self.h_box_layout_trade_buttons_3.addStretch(1) self.h_box_layout_trade_buttons_3.addWidget(self.radio_button_tou_ji) self.h_box_layout_trade_buttons_3.addStretch(1) self.h_box_layout_trade_buttons_3.addWidget(self.radio_button_tao_bao) self.h_box_layout_trade_buttons_3.addStretch(1) self.h_box_layout_trade_buttons_3.addWidget(self.radio_button_tao_li) self.h_box_layout_trade_buttons_3.addStretch(1) self.group_box_trade_buttons_1 = QGroupBox() self.group_box_trade_buttons_1.setContentsMargins(-1, -1, -1, -1) self.group_box_trade_buttons_1.setStyleSheet("QGroupBox{border:none}") self.group_box_trade_buttons_1.setLayout(self.v_box_layout_trade_buttons) self.group_box_trade_buttons_2 = QGroupBox() self.group_box_trade_buttons_2.setContentsMargins(-1, -1, -1, -1) self.group_box_trade_buttons_2.setStyleSheet("QGroupBox{border:none}") self.group_box_trade_buttons_2.setLayout(self.h_box_layout_trade_buttons_3) self.h_box_layout_cancel_order = QHBoxLayout() self.h_box_layout_cancel_order.setContentsMargins(-1, -1, -1, -1) # self.h_box_layout_cancel_order.addStretch(1) self.h_box_layout_cancel_order.addWidget(self.label_order_id) self.h_box_layout_cancel_order.addStretch(1) self.h_box_layout_cancel_order.addWidget(self.line_edit_order_id) self.h_box_layout_cancel_order.addStretch(1) self.h_box_layout_cancel_order.addWidget(self.button_cancel_order) self.h_box_layout_cancel_order.addStretch(1) self.v_box_layout_order = QVBoxLayout() self.v_box_layout_order.setContentsMargins(-1, -1, -1, -1) self.v_box_layout_order.addLayout(self.grid_layout_essential) self.v_box_layout_order.addWidget(self.group_box_trade_buttons_1) #self.v_box_layout_order.addWidget(self.group_box_trade_buttons_2) # 目前写死投机 self.v_box_layout_order.addLayout(self.h_box_layout_cancel_order) self.label_high_limit = QLabel("涨停") self.label_ask_5 = QLabel("卖五") self.label_ask_4 = QLabel("卖四") self.label_ask_3 = QLabel("卖三") self.label_ask_2 = QLabel("卖二") self.label_ask_1 = QLabel("卖一") self.label_last = QLabel("最新") self.label_last.setMinimumWidth(35) self.label_bid_1 = QLabel("买一") self.label_bid_2 = QLabel("买二") self.label_bid_3 = QLabel("买三") self.label_bid_4 = QLabel("买四") self.label_bid_5 = QLabel("买五") self.label_low_limit = QLabel("跌停") self.label_high_limit.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_5.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_4.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_3.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_2.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_1.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_last.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_1.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_2.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_3.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_4.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_5.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_low_limit.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_high_limit_price = QLabel("0.00") self.label_high_limit_price.setMinimumWidth(60) self.label_ask_price_5 = QLabel("0.00") self.label_ask_price_4 = QLabel("0.00") self.label_ask_price_3 = QLabel("0.00") self.label_ask_price_2 = QLabel("0.00") self.label_ask_price_1 = QLabel("0.00") self.label_ask_volume_5 = QLabel("0") self.label_ask_volume_4 = QLabel("0") self.label_ask_volume_3 = QLabel("0") self.label_ask_volume_2 = QLabel("0") self.label_ask_volume_1 = QLabel("0") self.label_last_price = QLabel("0.00") self.label_last_price.setMinimumWidth(60) self.label_last_up_down = QLabel("0.00%") self.label_last_up_down.setMinimumWidth(60) self.label_bid_price_1 = QLabel("0.00") self.label_bid_price_2 = QLabel("0.00") self.label_bid_price_3 = QLabel("0.00") self.label_bid_price_4 = QLabel("0.00") self.label_bid_price_5 = QLabel("0.00") self.label_bid_volume_1 = QLabel("0") self.label_bid_volume_2 = QLabel("0") self.label_bid_volume_3 = QLabel("0") self.label_bid_volume_4 = QLabel("0") self.label_bid_volume_5 = QLabel("0") self.label_low_limit_price = QLabel("0.00") self.label_low_limit_price.setMinimumWidth(60) self.label_high_limit_price.setPalette(self.color_red) self.label_ask_price_5.setPalette(self.color_green) self.label_ask_price_4.setPalette(self.color_green) self.label_ask_price_3.setPalette(self.color_green) self.label_ask_price_2.setPalette(self.color_green) self.label_ask_price_1.setPalette(self.color_green) self.label_ask_volume_5.setPalette(self.color_green) self.label_ask_volume_4.setPalette(self.color_green) self.label_ask_volume_3.setPalette(self.color_green) self.label_ask_volume_2.setPalette(self.color_green) self.label_ask_volume_1.setPalette(self.color_green) self.label_last_price.setPalette(self.color_black) self.label_last_up_down.setPalette(self.color_black) self.label_bid_price_1.setPalette(self.color_red) self.label_bid_price_2.setPalette(self.color_red) self.label_bid_price_3.setPalette(self.color_red) self.label_bid_price_4.setPalette(self.color_red) self.label_bid_price_5.setPalette(self.color_red) self.label_bid_volume_1.setPalette(self.color_red) self.label_bid_volume_2.setPalette(self.color_red) self.label_bid_volume_3.setPalette(self.color_red) self.label_bid_volume_4.setPalette(self.color_red) self.label_bid_volume_5.setPalette(self.color_red) self.label_low_limit_price.setPalette(self.color_green) self.label_high_limit_price.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_price_5.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_price_4.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_price_3.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_price_2.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_price_1.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_volume_5.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_volume_4.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_volume_3.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_volume_2.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_ask_volume_1.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_last_price.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_last_up_down.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_price_1.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_price_2.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_price_3.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_price_4.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_price_5.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_volume_1.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_volume_2.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_volume_3.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_volume_4.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_bid_volume_5.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.label_low_limit_price.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.grid_layout_quote = QGridLayout() self.grid_layout_quote.addWidget(self.label_high_limit, 0, 0) # self.grid_layout_quote.addWidget(self.label_ask_5, 1, 0) self.grid_layout_quote.addWidget(self.label_ask_4, 2, 0) self.grid_layout_quote.addWidget(self.label_ask_3, 3, 0) self.grid_layout_quote.addWidget(self.label_ask_2, 4, 0) self.grid_layout_quote.addWidget(self.label_ask_1, 5, 0) self.grid_layout_quote.addWidget(self.label_last, 6, 0) # self.grid_layout_quote.addWidget(self.label_bid_1, 7, 0) self.grid_layout_quote.addWidget(self.label_bid_2, 8, 0) self.grid_layout_quote.addWidget(self.label_bid_3, 9, 0) self.grid_layout_quote.addWidget(self.label_bid_4, 10, 0) self.grid_layout_quote.addWidget(self.label_bid_5, 11, 0) self.grid_layout_quote.addWidget(self.label_low_limit, 12, 0) # self.grid_layout_quote.addWidget(self.label_high_limit_price, 0, 1) # self.grid_layout_quote.addWidget(self.label_ask_price_5, 1, 1) self.grid_layout_quote.addWidget(self.label_ask_price_4, 2, 1) self.grid_layout_quote.addWidget(self.label_ask_price_3, 3, 1) self.grid_layout_quote.addWidget(self.label_ask_price_2, 4, 1) self.grid_layout_quote.addWidget(self.label_ask_price_1, 5, 1) self.grid_layout_quote.addWidget(self.label_last_price, 6, 1) # self.grid_layout_quote.addWidget(self.label_bid_price_1, 7, 1) self.grid_layout_quote.addWidget(self.label_bid_price_2, 8, 1) self.grid_layout_quote.addWidget(self.label_bid_price_3, 9, 1) self.grid_layout_quote.addWidget(self.label_bid_price_4, 10, 1) self.grid_layout_quote.addWidget(self.label_bid_price_5, 11, 1) self.grid_layout_quote.addWidget(self.label_low_limit_price, 12, 1) # self.grid_layout_quote.addWidget(self.label_ask_volume_5, 1, 2) self.grid_layout_quote.addWidget(self.label_ask_volume_4, 2, 2) self.grid_layout_quote.addWidget(self.label_ask_volume_3, 3, 2) self.grid_layout_quote.addWidget(self.label_ask_volume_2, 4, 2) self.grid_layout_quote.addWidget(self.label_ask_volume_1, 5, 2) self.grid_layout_quote.addWidget(self.label_last_up_down, 6, 2) # self.grid_layout_quote.addWidget(self.label_bid_volume_1, 7, 2) self.grid_layout_quote.addWidget(self.label_bid_volume_2, 8, 2) self.grid_layout_quote.addWidget(self.label_bid_volume_3, 9, 2) self.grid_layout_quote.addWidget(self.label_bid_volume_4, 10, 2) self.grid_layout_quote.addWidget(self.label_bid_volume_5, 11, 2) self.main_text_edit_bottom = QTextEdit(self) self.main_text_edit_bottom.setText("") self.main_text_edit_bottom.setFont(QFont("SimSun", 9)) self.h_box_layout_1 = QHBoxLayout() self.h_box_layout_1.addLayout(self.v_box_layout_order) self.h_box_layout_1.addLayout(self.grid_layout_quote) self.h_box_layout_3 = QHBoxLayout() self.h_box_layout_3.setContentsMargins(-1, -1, -1, -1) self.h_box_layout_3.addWidget(self.main_text_edit_bottom) self.v_box_layout_mian = QVBoxLayout() self.v_box_layout_mian.setContentsMargins(-1, -1, -1, -1) self.v_box_layout_mian.addLayout(self.h_box_layout_1) self.v_box_layout_mian.addLayout(self.h_box_layout_3) self.setLayout(self.v_box_layout_mian) self.combo_exchange.activated[str].connect(self.OnChangeExchange) self.line_edit_contract.editingFinished.connect(self.OnChangeSymbol) self.radio_button_buy_open.clicked.connect(self.OnChangeTradeType) self.radio_button_sell_open.clicked.connect(self.OnChangeTradeType) self.radio_button_buy_close.clicked.connect(self.OnChangeTradeType) self.radio_button_sell_close.clicked.connect(self.OnChangeTradeType) self.button_place_order.clicked.connect(self.OnButtonPlaceOrder) self.button_cancel_order.clicked.connect(self.OnButtonCancelOrder) def OnChangeExchange(self, str_exchange): self.contract = "" self.exchange = "" self.line_edit_contract.setText("") self.OnChangeSymbol() def OnChangeSymbol(self): self.exchange = "" self.contract = self.line_edit_contract.text() #str(unicode(self.line_edit_contract.text(), "gb2312")) self.spin_price.setValue(0) self.spin_volume.setValue(0) self.label_high_limit_price.setText("0.00") self.label_ask_price_5.setText("0.00") self.label_ask_price_4.setText("0.00") self.label_ask_price_3.setText("0.00") self.label_ask_price_2.setText("0.00") self.label_ask_price_1.setText("0.00") self.label_ask_volume_5.setText("0") self.label_ask_volume_4.setText("0") self.label_ask_volume_3.setText("0") self.label_ask_volume_2.setText("0") self.label_ask_volume_1.setText("0") self.label_last_price.setText("0.00") self.label_last_up_down.setText("0.00%") self.label_bid_price_1.setText("0.00") self.label_bid_price_2.setText("0.00") self.label_bid_price_3.setText("0.00") self.label_bid_price_4.setText("0.00") self.label_bid_price_5.setText("0.00") self.label_bid_volume_1.setText("0") self.label_bid_volume_2.setText("0") self.label_bid_volume_3.setText("0") self.label_bid_volume_4.setText("0") self.label_bid_volume_5.setText("0") self.label_low_limit_price.setText("0.00") def OnChangeTradeType(self): if self.radio_button_buy_open.isChecked(): self.line_edit_contract.setStyleSheet("color:red") self.spin_price.setStyleSheet("color:red") self.spin_volume.setStyleSheet("color:red") self.button_place_order.setStyleSheet("font:bold;color:red") self.check_box_close_today.setEnabled(False) if self.radio_button_sell_open.isChecked(): self.line_edit_contract.setStyleSheet("color:purple") self.spin_price.setStyleSheet("color:purple") self.spin_volume.setStyleSheet("color:purple") self.button_place_order.setStyleSheet("font:bold;color:purple") self.check_box_close_today.setEnabled(False) if self.radio_button_buy_close.isChecked(): self.line_edit_contract.setStyleSheet("color:blue") self.spin_price.setStyleSheet("color:blue") self.spin_volume.setStyleSheet("color:blue") self.button_place_order.setStyleSheet("font:bold;color:blue") self.check_box_close_today.setEnabled(True) if self.radio_button_sell_close.isChecked(): self.line_edit_contract.setStyleSheet("color:green") self.spin_price.setStyleSheet("color:green") self.spin_volume.setStyleSheet("color:green") self.button_place_order.setStyleSheet("font:bold;color:green") self.check_box_close_today.setEnabled(True) def OnUpdateQuote(self, data, price_round): self.exchange = data[3].decode() # 证券市场 self.label_ask_price_5.setText(str(round(data[13][4], price_round))) self.label_ask_price_4.setText(str(round(data[13][3], price_round))) self.label_ask_price_3.setText(str(round(data[13][2], price_round))) self.label_ask_price_2.setText(str(round(data[13][1], price_round))) self.label_ask_price_1.setText(str(round(data[13][0], price_round))) self.label_ask_volume_5.setText(str(data[14][4])) self.label_ask_volume_4.setText(str(data[14][3])) self.label_ask_volume_3.setText(str(data[14][2])) self.label_ask_volume_2.setText(str(data[14][1])) self.label_ask_volume_1.setText(str(data[14][0])) self.label_bid_price_1.setText(str(round(data[15][0], price_round))) self.label_bid_price_2.setText(str(round(data[15][1], price_round))) self.label_bid_price_3.setText(str(round(data[15][2], price_round))) self.label_bid_price_4.setText(str(round(data[15][3], price_round))) self.label_bid_price_5.setText(str(round(data[15][4], price_round))) self.label_bid_volume_1.setText(str(data[16][0])) self.label_bid_volume_2.setText(str(data[16][1])) self.label_bid_volume_3.setText(str(data[16][2])) self.label_bid_volume_4.setText(str(data[16][3])) self.label_bid_volume_5.setText(str(data[16][4])) self.label_high_limit_price.setText(str(round(data[17], price_round))) # 涨停价 self.label_low_limit_price.setText(str(round(data[18], price_round))) # 跌停价 self.label_last_price.setText(str(round(data[5], price_round))) # 最新价 if data[20] > 0.0: # 昨日结算价 f_last_up_down = (data[5] / data[20]) - 1.0 self.label_last_up_down.setText(("%.2f%%" % (f_last_up_down * 100.0))) if f_last_up_down > 0.0: self.label_last_up_down.setPalette(self.color_red) elif f_last_up_down < 0.0: self.label_last_up_down.setPalette(self.color_green) else: self.label_last_up_down.setPalette(self.color_black) else: self.label_last_up_down.setText("0.00%") def OnButtonPlaceOrder(self): if self.trader != None: if self.trader.IsTraderReady() == False: self.logger.SendMessage("E", 4, self.log_cate, "交易服务尚未开启!", "M") return else: if self.line_edit_contract.text() == "": QMessageBox.warning(self, "提示", "合约代码为空!", QMessageBox.Ok) return str_contract = self.line_edit_contract.text() #str(unicode(self.line_edit_contract.text(), "gb2312")) str_exchange = "" if self.comboExchange.currentText() == define.DEF_EXCHANGE_FUTURE_CFFE: str_exchange = "CFFE" elif self.comboExchange.currentText() == define.DEF_EXCHANGE_FUTURE_SHFE: str_exchange = "SHFE" elif self.comboExchange.currentText() == define.DEF_EXCHANGE_FUTURE_CZCE: str_exchange = "CZCE" elif self.comboExchange.currentText() == define.DEF_EXCHANGE_FUTURE_DLCE: str_exchange = "DLCE" f_price = self.spin_price.value() n_amount = self.spin_volume.value() n_entr_type = 0 if self.combo_entr_type.currentText() == define.DEF_PRICE_TYPE_FUTURE_LIMIT: n_entr_type = 1 elif self.combo_entr_type.currentText() == define.DEF_PRICE_TYPE_FUTURE_MARKET: n_entr_type = 2 n_exch_side = 0 n_offset = 0 if self.radio_button_buy_open.isChecked(): n_exch_side = 1 n_offset = 1 elif self.radio_button_sell_open.isChecked(): n_exch_side = 2 n_offset = 1 elif self.radio_button_buy_close.isChecked(): n_exch_side = 1 n_offset = 2 if self.check_box_close_today.isChecked(): n_offset = 4 elif self.radio_button_sell_close.isChecked(): n_exch_side = 2 n_offset = 2 if self.check_box_close_today.isChecked(): n_offset = 4 n_hedge = 1 # 写死 order = self.trader.Order(instrument = str_contract, exchange = str_exchange, price = f_price, amount = n_amount, entr_type = n_entr_type, exch_side = n_exch_side, offset = n_offset, hedge = n_hedge) task_place = self.trader.PlaceOrder(order, self.strategy) QMessageBox.information(self, "提示", "委托下单提交完成。", QMessageBox.Ok) return else: self.logger.SendMessage("E", 4, self.log_cate, "交易服务尚未获取!", "M") return def OnButtonCancelOrder(self): if self.trader != None: if self.trader.IsTraderReady() == False: self.logger.SendMessage("E", 4, self.log_cate, "交易服务尚未开启!", "M") return else: if self.line_edit_order_id.text() == "": QMessageBox.warning(self, "提示", "撤单委托编号为空!", QMessageBox.Ok) return order = self.trader.Order() order.order_id = self.line_edit_order_id.text() #str(unicode(self.line_edit_order_id.text(), "gb2312")) # string task_cancel = self.trader.CancelOrder(order, self.strategy) QMessageBox.information(self, "提示", "委托撤单提交完成。", QMessageBox.Ok) return else: self.logger.SendMessage("E", 4, self.log_cate, "交易服务尚未获取!", "M") return