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))  # 将线程的参数传入进度条
Example #5
0
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))
Example #6
0
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])
Example #7
0
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"))
Example #8
0
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")
Example #9
0
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)
Example #10
0
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)
Example #11
0
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