from PyQt5 import QtCore, QtGui
from PyQt5.QtCore import Qt, QPoint
from PyQt5.QtGui import QPalette, QIcon
from PyQt5.QtWidgets import QTabWidget, QApplication, QTreeWidget, QTreeWidgetItem, QHBoxLayout, QLabel, QSpinBox, \
QCheckBox, QTableWidget, QFrame, QAbstractItemView, QStyledItemDelegate, QGridLayout, QVBoxLayout, QPushButton, \
QComboBox, QLineEdit, QWidget, QDialog, QHeaderView
from Resources import Variable
class RiskSet(QDialog):
def __init__(self):
super(RiskSet, self).__init__()
self.desktop = QApplication.desktop()
self.screenRect = self.desktop.screenGeometry()
self.height = self.screenRect.height()
self.width = self.screenRect.width()
if self.width <= 1366 and self.height <= 760:
self.setFixedSize(900, 500)
elif self.width <= 1280 and self.height <= 960:
self.setFixedSize(900, 500)
else:
self.setFixedSize(1200, 800)
# self.Recvmsg = "RiskSet"
# setCB(self.Recvmsg, self.recvmsgSign) # 设置回调
self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint | Qt.Tool)
self.setModal(True) # 设置窗口置顶
self.currentPos = None
self.btn2 = QPushButton()
self.btn2.setStyleSheet('QPushButton{width:50px;height:30px;border:0px solid red;}'
'QPushButton::hover{background:red;color:#fff;}')
lab = QLabel(" 期货账号管理")
self.fram = QFrame()
self.fram.setObjectName('fram')
self.fram.setStyleSheet(
"#fram{border:0px solid #d6d8d7;background-color:#d4e1f8;border-bottom:0px;}")
self.frame = QFrame()
if os.path.isdir("../Resources"):
self.btn2.setStyleSheet(
'QPushButton{width:50px;height:30px;background-image:url(../Resources/Images/close2.png);background-repeat: no-repeat;border:0px;border-top-right-radius:5px;}'
'QPushButton::hover{background-image:url(../Resources/Images/close.png);background-repeat: no-repeat;background-position:centen centen;border-top-right-radius:5px;}')
self.setStyleSheet(
"QComboBox{background:#fff;border:0px solid #4d4d4d;height:28px;border-radius:0px;color:black;}"
"QComboBox QAbstractItemView{border: 1px solid #161b2e;color:#000;}"
"QComboBox:editable{color:#000}"
"QComboBox::down-arrow{image:url(../Resources/Images/com.png)}"
"QComboBox::drop-down{border:0px solid;}"
else:
self.btn2.setStyleSheet(
'QPushButton{width:50px;height:30px;background-image:url(./Resources/Images/close2.png);background-repeat: no-repeat;border:0px;border-top-right-radius:5px;}'
'QPushButton::hover{background-image:url(./Resources/Images/close.png);background-repeat: no-repeat;background-position:centen centen;border-top-right-radius:5px;}')
self.setStyleSheet(
"QComboBox{background:#fff;border:0px solid #4d4d4d;height:28px;border-radius:0px;color:black;}"
"QComboBox QAbstractItemView{border: 1px solid #161b2e;color:#000;}"
"QComboBox:editable{color:#000}"
"QComboBox::down-arrow{image:url(./Resources/Images/com.png)}"
"QComboBox::drop-down{border:0px solid;}"
hbox2 = QHBoxLayout()
hbox2.addWidget(lab)
hbox2.addStretch(1)
hbox2.addWidget(self.btn2)
hbox2.setContentsMargins(0, 0, 0, 0)
self.fram.setLayout(hbox2)
hbox3 = QHBoxLayout()
hbox3.addWidget(self.fram)
hbox3.setContentsMargins(0, 0, 0, 0)
hbox3.setSpacing(0)
self.tree_menu = QTreeWidget()
self.tree_menu.header().hide() # 隐藏表头
self.tree_menu.setRootIsDecorated(False)
self.tree_menu.setStyleSheet("QTreeWidget::item{height:50px;font:15px '微软雅黑'}")
self.tree_menu.clicked.connect(self.clicked_tree_menu)
self.tree1 = QTreeWidget()
self.tree1.header().hide() # 隐藏表头
self.tree1.setStyleSheet("QTreeWidget::item{height:50px}")
self.tree1.clicked.connect(self.clicked_tree1)
self.tree_menu.clicked.connect(self.getriskmsg)
self.tree1.clicked.connect(self.getriskmsg)
# self.tree1.setRootIsDecorated(False)
self.root_1 = QTreeWidgetItem(self.tree_menu)
self.root_1.setText(0, '采购条件单')
self.root_1.setExpanded(1)
self.root_2 = QTreeWidgetItem(self.tree_menu)
self.root_2.setText(0, '销售条件单')
self.root_2.setExpanded(1)
self.hbox_1 = QHBoxLayout()
self.hbox_1.addWidget(self.tree_menu, 1)
self.hbox_1.setContentsMargins(0, 0, 0, 0)
self.categoryList = ['有色金属', '黑色金属', '轻工', '煤炭', '原油', '化工', '谷物', '油脂油料', '软商品', '农副']
for m in range(len(self.categoryList)):
root1 = QTreeWidgetItem(self.tree1)
root1.setText(0, self.categoryList[m])
for n in [Variable.ReturnCodeName(m)[key] for key in Variable.ReturnCodeName(m)]:
child1 = QTreeWidgetItem(root1)
child1.setText(0, n)
self.hbox_2 = QHBoxLayout()
self.hbox_2.addWidget(self.tree1, 1)
self.hbox_2.setContentsMargins(0, 0, 0, 0)
self.HedgingLabel = QLabel("套保比例")
self.HedgingLabel.setStyleSheet("min-width:90px;max-width:90px;")
self.Hedgingsp = QSpinBox()
self.Hedgingsp.setRange(0, 100)
self.Hedgingsp.setValue(100)
self.symbolLabel = QLabel("%")
self.conditioncheck = QCheckBox("条件:")
self.label1 = QLabel("单笔交易数量超过")
self.sp1 = QSpinBox()
self.sp1.setRange(0, 99999999999)
self.label2 = QLabel("启动自动套保")
if os.path.isdir("../Resources"):
self.Hedgingsp.setStyleSheet("QSpinBox::up-button{image:url(../Resources/Images/up.png)}"
"QSpinBox::down-button{image:url(../Resources/Images/down.png)}"
"QSpinBox{min-height:30px;min-width:120px;max-width:120px;}")
self.sp1.setStyleSheet("QSpinBox::up-button{image:url(../Resources/Images/up.png)}"
"QSpinBox::down-button{image:url(../Resources/Images/down.png)}"
"QSpinBox{min-height:30px;min-width:120px;max-width:120px;}")
else:
self.Hedgingsp.setStyleSheet("QSpinBox::up-button{image:url(./Resources/Images/up.png)}"
"QSpinBox::down-button{image:url(./Resources/Images/down.png)}"
"QSpinBox{min-height:30px;min-width:120px;max-width:120px;}")
self.sp1.setStyleSheet("QSpinBox::up-button{image:url(./Resources/Images/up.png)}"
"QSpinBox::down-button{image:url(./Resources/Images/down.png)}"
"QSpinBox{min-height:30px;min-width:120px;max-width:120px;}")
self.accounttext = QLabel()
self.equityLabel = QLabel("权益:")
self.equitytext = QLabel("")
self.usableLabel = QLabel("可用:")
self.usabletext = QLabel("")
self.modificationbut = QPushButton("修改")
self.table = QTableWidget(self) # 行情表格
self.table.setStyleSheet("QTableWidget{background:#fff;color:yellow;border:1px solid #828790;}"
"QTableCornerButton::section{background-color:#fff;}"
"QTableWidget::item:selected{background:transparent;border:0px solid yellow;border-left:0px solid yellow;border-right:0px solid yellow;}"
"QTableWidget::item:first:selected{border-left:0px solid yellow;}"
"QTableWidget::item:last:selected{border-right:0px solid yellow;}"
) # 设置样式
# self.table.setStyleSheet(QStringLiteral("selection-background-color: rgb(85, 255, 0);"))
self.table.horizontalHeader().setDefaultAlignment(Qt.AlignLeft | Qt.AlignVCenter) # 设置表头字体位置局左
self.table.horizontalHeader().setStyleSheet(
"QHeaderView::section{background:#f0f0f0;color:#000;border:1px solid #828790;border-top:0px;border-left:0px;font: '宋体';}"
"QHeaderView::section:last{text-align: left;border-right:0px solid #8faac9;}")
self.table.verticalHeader().setStyleSheet("QHeaderView::section{background:#003153;color:white}")
self.table.horizontalHeader().setMinimumHeight(30)
self.table.setFrameShape(QFrame.NoFrame) # 无边框
self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) # 禁止对表格编辑
self.table.setSelectionBehavior(QAbstractItemView.SelectRows) # 整行选择
self.table.setSelectionMode(QAbstractItemView.SingleSelection) # 单选
self.table.setItemDelegate(BackgroundDelegate(self.table))
self.table.setMouseTracking(True)
self.table.setShowGrid(1) # 去表格线
self.table.setFocusPolicy(Qt.NoFocus) # 去除选中虚线
self.table.horizontalHeader().setHighlightSections(0)
self.table.verticalHeader().setVisible(0) # 隐藏表头
# self.table.horizontalHeader().setStretchLastSection(True)
self.table.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel)
self.table.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel)
self.table.verticalScrollBar().value()
self.table.setColumnCount(8) # 设置列数
row_name = [
"期货账户",
"合约",
# "比例%",
"买卖",
"开平",
"价格类型",
"价格",
"套保",
"操作",
self.table.setHorizontalHeaderLabels(row_name) # 设置行名称
self.table.horizontalHeaderItem(6).setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
self.table.horizontalHeaderItem(7).setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
self.table.setColumnWidth(6, 58)
# self.table.horizontalHeader().setStretchLastSection(True)
self.table.horizontalHeader().setDefaultSectionSize(45)
self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.table.horizontalHeader().setSectionResizeMode(6, QHeaderView.Interactive)
gridLayout1 = QGridLayout()
gridLayout1.addWidget(self.HedgingLabel, 0, 0, 1, 1)
gridLayout1.addWidget(self.Hedgingsp, 0, 1, 1, 1)
gridLayout1.addWidget(self.symbolLabel, 0, 2, 1, 1)
gridLayout1.addWidget(self.conditioncheck, 1, 0, 1, 1)
gridLayout1.addWidget(self.label1, 1, 1, 1, 1)
gridLayout1.addWidget(self.sp1, 1, 2, 1, 1)
gridLayout1.addWidget(self.label2, 1, 3, 1, 1)
hbox8 = QHBoxLayout()
hbox8.addWidget(self.accounttext)
hbox8.addWidget(self.equityLabel)
hbox8.addWidget(self.equitytext)
hbox8.addWidget(self.usableLabel)
hbox8.addWidget(self.usabletext)
gridLayout1.addItem(hbox8, 2, 0, 1, 4)
# gridLayout1.addWidget(self.equityLabel, 2, 1, 1, 1)
# gridLayout1.addWidget(self.equitytext, 2, 2, 1, 1)
# gridLayout1.addWidget(self.usableLabel, 2, 3, 1, 1)
# gridLayout1.addWidget(self.usabletext, 2, 4, 1, 1)
self.hbox_4 = QHBoxLayout()
self.hbox_4.addLayout(gridLayout1, 1)
self.hbox_4.setContentsMargins(0, 0, 0, 0)
self.hbox_5 = QHBoxLayout()
self.hbox_5.addWidget(self.table, 1)
self.hbox_5.setContentsMargins(0, 0, 0, 0)
self.hbox_8 = QHBoxLayout()
self.hbox_8.addStretch(7)
self.hbox_8.addWidget(self.modificationbut, 1)
self.hbox_8.setContentsMargins(0, 0, 0, 0)
self.hbox_6 = QVBoxLayout()
self.hbox_6.addLayout(self.hbox_4)
self.hbox_6.addLayout(self.hbox_5, 2)
self.hbox_6.addLayout(self.hbox_8, 1)
self.hbox_6.setContentsMargins(0, 0, 0, 0)
self.hbox_3 = QHBoxLayout()
if self.width >= 1920 and self.height >= 1080:
self.setFixedSize(1200, 800)
self.hbox_3.addLayout(self.hbox_1, 1)
self.hbox_3.addLayout(self.hbox_2, 2)
self.hbox_3.addLayout(self.hbox_6, 5)
self.hbox_3.setContentsMargins(0, 0, 0, 0)
elif self.width >= 1360 and self.height >= 768:
self.setFixedSize(1000, 500)
self.hbox_3.addLayout(self.hbox_1, 1)
self.hbox_3.addLayout(self.hbox_2, 2)
self.hbox_3.addLayout(self.hbox_6, 8)
self.hbox_3.setContentsMargins(0, 0, 0, 0)
elif self.width >= 1280 and self.height >= 800:
self.setFixedSize(1000, 500)
self.hbox_3.addLayout(self.hbox_1, 1)
self.hbox_3.addLayout(self.hbox_2, 2)
self.hbox_3.addLayout(self.hbox_6, 5)
self.hbox_3.setContentsMargins(0, 0, 0, 0)
self.frame1 = QFrame()
self.frame1.setObjectName("frame1")
self.frame1.setStyleSheet("#frame1{border:0px solid red;}")
self.frame1.setLayout(self.hbox_3)
hbox10 = QVBoxLayout()
hbox10.addLayout(hbox3)
hbox10.addWidget(self.frame1, 1)
hbox10.setContentsMargins(0, 0, 0, 0)
hbox10.setSpacing(0)
'''创建边框区域'''
self.widget = QWidget()
self.widget.setObjectName("widget")
self.widget.setStyleSheet("#widget{border-radius:6px;background-color:#fff;}")
self.widget.setLayout(hbox10)
hbox9 = QHBoxLayout()
hbox9.addWidget(self.widget)
hbox9.setContentsMargins(0, 0, 0, 0)
self.frame_all = QFrame()
self.frame_all.setObjectName("frame_all")
self.frame_all.setStyleSheet("#frame_all{border:4px solid #d4e1f8;}")
self.frame_all.setLayout(hbox9)
hbox4 = QHBoxLayout()
hbox4.addWidget(self.frame_all)
hbox4.setContentsMargins(0, 0, 0, 0)
'''创建边框区域'''
self.setLayout(hbox4)
self.futureaccount1 = QComboBox()
self.futureaccount2 = QComboBox()
self.code1 = QComboBox()
self.code2 = QComboBox()
self.ratio1 = QSpinBox()
self.ratio1.setRange(0, 100)
self.ratio2 = QSpinBox()
self.direction1 = QComboBox()
self.direction2 = QComboBox()
self.kaiping1 = QComboBox()
self.kaiping2 = QComboBox()
self.price1 = QComboBox()
self.price1spin = QSpinBox()
self.price1spin.setHidden(1)
self.price1spin.setRange(0, 9999999)
self.price1edit = QLineEdit()
self.price1edit.setStyleSheet("height:30px;border:0px;")
self.price1edit.setEnabled(0)
if os.path.isdir("../Resources"):
self.price1spin.setStyleSheet("QSpinBox::up-button{image:url(../Resources/Images/up.png)}"
"QSpinBox::down-button{image:url(../Resources/Images/down.png)}"
"QSpinBox{min-height:30px;min-width:99px;max-width:99px;border:0px;}")
else:
self.price1spin.setStyleSheet("QSpinBox::up-button{image:url(./Resources/Images/up.png)}"
"QSpinBox::down-button{image:url(./Resources/Images/down.png)}"
"QSpinBox{min-height:30px;min-width:99px;max-width:99px;border:0px;}")
self.widget_pric = QWidget()
hbox = QHBoxLayout()
hbox.addWidget(self.price1edit)
hbox.addWidget(self.price1spin)
hbox.setContentsMargins(0, 0, 0, 0)
hbox.setSpacing(0)
self.widget_pric.setLayout(hbox)
self.price2 = QComboBox()
self.hedging1 = QCheckBox()
self.widget_hedging1 = QWidget()
hbox7 = QHBoxLayout()
hbox7.addStretch(1)
hbox7.addWidget(self.hedging1)
hbox7.addStretch(1)
hbox7.setContentsMargins(0, 0, 0, 0)
self.widget_hedging1.setLayout(hbox7)
self.hedging2 = QCheckBox()
self.suspendbut = QPushButton("暂停")
self.addwidget()
list1 = ["买", "卖"]
self.direction1.addItems(list1)
self.direction2.addItems(list1)
self.price1.addItems(["市价", "限价"])
self.price1.currentIndexChanged.connect(self.getprice)
self.modificationbut.clicked.connect(self.submmit)
self.suspendbut.clicked.connect(self.changestatus)
self.btn2.clicked.connect(self.closewindow)
self.futureaccount1.currentIndexChanged.connect(self.getmoney)
self.Allcodenamerelation = {value: key for key, value in Variable.namedict.items()}
self.Allcode = [Variable.AllCodename[key] for key in Variable.AllCodename]
self.Allcodename = []
for i in self.Allcode:
self.Allcodename.extend(i)
self.treemenutext = None
self.direction = {"买": "buy", "卖": "sell"}
self.riskstatus = {"启动": "disable", "暂停": "enable"}
def addwidget(self):
self.table.setRowCount(1)
self.table.setCellWidget(0, 0, self.futureaccount1)
# self.table.setCellWidget(1, 0, self.futureaccount2)
self.table.setCellWidget(0, 1, self.code1)
# self.table.setCellWidget(1, 1, self.code2)
# self.table.setCellWidget(0, 2, self.ratio1)
# self.table.setCellWidget(1, 2, self.ratio2)
self.table.setCellWidget(0, 2, self.direction1)
# self.table.setCellWidget(1, 3, self.direction2)
self.table.setCellWidget(0, 3, self.kaiping1)
# self.table.setCellWidget(1, 4, self.kaiping2)
self.table.setCellWidget(0, 4, self.price1)
self.table.setCellWidget(0, 5, self.widget_pric)
# self.table.setCellWidget(1, 5, self.price2)
self.table.setCellWidget(0, 6, self.widget_hedging1)
# self.table.setCellWidget(1, 6, self.hedging2)
self.table.setCellWidget(0, 7, self.suspendbut)
# self.table.setCellWidget(1, 7, self.startbut)
self.kaiping1.addItems([i for i in Variable.positiontype])
self.price1edit.setText("市价")
def submmit(self):
将修改完得风控信息提交
:return:
if self.hedging1.isChecked():
hedge = "hedge"
else:
hedge = "speculation"
if self.Hedgingsp.value() == 0:
UiPublic.LoadMsgBox("套保比例不能为0").Load()
return
else:
if self.treemenutext == "采购条件单":
risktype = "buy"
else:
risktype = "sell"
if self.futureaccount1.currentText() == "":
UiPublic.LoadMsgBox("请选择期货账号").Load()
return
if self.code1.currentText() == "":
UiPublic.LoadMsgBox("请选择合约").Load()
return
if self.price1.currentText() == "市价":
price = 0
elif self.price1.currentText() == "限价":
price = self.price1spin.value()
if self.conditioncheck.isChecked():
conditionenable = "enable"
condition = self.sp1.value()
dict = {"head": {"cmd": "setfutureriskparam", "seq": 1, "recvhandle": self.Recvmsg}, "body": [
{"userid": Variable.Variable.user_id, "risktype": risktype,
"variety": Variable.ReturnVarietyID(self.codename),
"instrument": self.code1.currentText(),
"coverratio": self.Hedgingsp.value(), "conditionenable": conditionenable,
"condition": condition,
"accountid": [i["accountid"] for i in self.futureAccountList if
i["accountname"] == self.futureaccount1.currentText()][0],
# "proportion": self.ratio1.value(),
"side": self.direction[self.direction1.currentText()],
"direction": Variable.positiontype[self.kaiping1.currentText()],
"pricetype": Variable.pricetype[self.price1.currentText()],
"price": price,
"hedge": hedge,
"status": self.riskstatus[self.suspendbut.text()]}]}
else:
conditionenable = "disable"
dict = {"head": {"cmd": "setfutureriskparam", "seq": 1, "recvhandle": self.Recvmsg}, "body": [
{"userid": Variable.Variable.user_id, "risktype": risktype,
"variety": Variable.ReturnVarietyID(self.codename),
"instrument": self.code1.currentText(),
"coverratio": self.Hedgingsp.value(), "conditionenable": conditionenable,
"accountid": [i["accountid"] for i in self.futureAccountList if
i["accountname"] == self.futureaccount1.currentText()][0],
# "proportion": self.ratio1.value(),
"side": self.direction[self.direction1.currentText()],
"direction": Variable.positiontype[self.kaiping1.currentText()],
"pricetype": Variable.pricetype[self.price1.currentText()],
"price": price,
"hedge": hedge,
"status": self.riskstatus[self.suspendbut.text()]}]}
SendCmd('{}'.format(json.dumps(dict)))
def changestatus(self):
改变启动暂停的状态
:return:
if self.suspendbut.text() == "启动":
self.suspendbut.setText("暂停")
else:
self.suspendbut.setText("启动")
def getprice(self):
:return:
if self.price1.currentText() == "市价":
self.price1edit.setHidden(0)
self.price1edit.setText("市价")
self.price1spin.setHidden(1)
self.price1val = "市价"
else:
self.price1edit.setHidden(1)
self.price1spin.setHidden(0)
# self.price1val = self.price1spin.value()
except Exception as e:
print(e)
def refresh(self):
查询所有的期货账户信息
:return:
self.futureAccounts = {
"head": {"cmd": "queryaccountmsg", "seq": 1, "recvhandle": self.Recvmsg, "dis": "queryfuture"},
"body": [{"querymsg": 'queryfuturetradeaccount'}]}
self.futureAccounts = json.dumps(self.futureAccounts)
SendCmd('{}'.format(self.futureAccounts))
def handleMSG(self, code, msg):
if msg == "":
else:
dict = eval(msg)
if dict['head']['cmd'] == 'queryaccountmsg': # 查询期货账号
self.futureaccount1.clear()
self.futureAccountList = dict['body']
self.futureaccount1.addItems([i["accountname"] for i in self.futureAccountList])
self.getriskmsg() # 获取风控账号相关设置信息
if dict["head"]["cmd"] == "setfutureriskparam":
UiPublic.LoadMsgBox(dict["body"][0]["message"]).Load()
if dict["head"]["cmd"] == "listFutureRiskParam":
self.settextvalue(dict)
if dict["head"]["cmd"] == "querycapital":
self.equitytext.setText("")
self.usabletext.setText("")
if "available" in dict["body"][0]:
self.equitytext.setText(str(dict["body"][0]['balance']))
self.usabletext.setText(str(dict["body"][0]['available']))
def clicked_tree_menu(self):
item = self.tree_menu.currentItem()
self.treemenutext = item.text(0)
def clicked_tree1(self):
if self.treemenutext == None:
item1 = self.tree_menu.topLevelItem(0)
self.tree_menu.setCurrentItem(item1)
self.treemenutext = item1.text(0)
self.code1.clear()
item = self.tree1.currentItem()
self.codename = self.retutncodename(item.text(0))
if self.codename in self.Allcodenamerelation:
self.code1.addItems([i for i in self.Allcodename if self.Allcodenamerelation[self.codename] ==
''.join([x for x in i if x.isalpha()])])
def retutncodename(self, text):
if text == "铜":
return "沪铜"
elif text == "铝":
return "沪铝"
elif text == "锌":
return "沪锌"
elif text == "铅":
return "沪铅"
elif text == "镍":
return "沪镍"
elif text == "锡":
return "沪锡"
else:
return text
def getriskmsg(self):
获取风控信息
:return:
if self.treemenutext != None and self.code1.currentText() != "":
if self.treemenutext == "采购条件单":
risktype = "buy"
else:
risktype = "sell"
SendCmd('{}'.format(json.dumps({
"head": {"cmd": "listFutureRiskParam", "seq": 1, "recvhandle": self.Recvmsg},
"body": [{"risktype": risktype, "variety": Variable.ReturnVarietyID(self.codename)}]})))
def settextvalue(self, dict):
将风控信息显示
:return:
if dict["body"][0]["mainorderlist"] == []:
self.code1.setCurrentIndex(0)
self.cleartextvalue()
self.futureaccount1.setCurrentIndex(0)
self.conditioncheck.setChecked(0)
self.direction1.setCurrentText("买")
self.kaiping1.setCurrentText("开仓")
self.price1.setCurrentText("市价")
self.getprice()
self.hedging1.setChecked(0)
self.suspendbut.setText("启动")
return
self.code1.setCurrentText(dict["body"][0]["mainorderlist"][0]["instrument"])
self.futureaccount1.setCurrentText(dict["body"][0]["mainorderlist"][0]["accountname"])
self.Hedgingsp.setValue(float(dict["body"][0]["mainorderlist"][0]["coverratio"]))
if dict["body"][0]["mainorderlist"][0]["conditionenable"] == 'enable':
self.conditioncheck.setChecked(1)
self.sp1.setValue(float(dict["body"][0]["mainorderlist"][0]["condition"]))
else:
self.conditioncheck.setChecked(0)
# self.ratio1.setValue(float(dict["body"][0]["mainorderlist"][0]["proportion"]))
self.direction1.setCurrentText(
{value: key for key, value in self.direction.items()}[dict["body"][0]["mainorderlist"][0]["side"]])
self.kaiping1.setCurrentText(
{value: key for key, value in Variable.positiontype.items()}[
dict["body"][0]["mainorderlist"][0]["direction"]])
self.price1.setCurrentText(
{value: key for key, value in Variable.pricetype.items()}[
dict["body"][0]["mainorderlist"][0]["pricetype"]])
if self.price1.currentText() == "市价":
self.price1edit.setText("市价")
elif self.price1.currentText() == "限价":
self.price1spin.setValue(float(dict["body"][0]["mainorderlist"][0]["price"]))
if dict["body"][0]["mainorderlist"][0]["hedge"] == "hedge":
self.hedging1.setChecked(1)
else:
self.hedging1.setChecked(0)
if dict["body"][0]["mainorderlist"][0]["status"] == "enable":
self.suspendbut.setText("暂停")
else:
self.suspendbut.setText("启动")
except Exception as e:
print(e)
def cleartextvalue(self):
self.Hedgingsp.setValue(100)
self.sp1.setValue(0)
# self.ratio1.setValue(0)
self.price1spin.setValue(0)
def getmoney(self):
设置权益和可用
:return:
self.accounttext.setText(self.futureaccount1.currentText())
for i in self.futureAccountList:
if i["accountname"] == self.futureaccount1.currentText():
self.getcapital(i["accountid"], i["brokerid"], i["accountname"])
def getcapital(self, accountid, brokerid, accountname):
SendCmd('{}'.format(json.dumps({
"head": {"cmd": "querycapital", "seq": 1, "recvhandle": self.Recvmsg},
"body": [{"accountid": accountid, "brokerid": brokerid, "accountname": accountname,
"password": 123}]})))
def closewindow(self):
self.close()
def mousePressEvent(self, event):
self.currentPos = event.pos()
def mouseMoveEvent(self, event):
self.move(QPoint(self.pos() + event.pos() - self.currentPos))
except Exception as e:
class BackgroundDelegate(QStyledItemDelegate):
def __init__(self, tb, *args, **kwargs):
super().__init__(*args, **kwargs)
self.tb = tb
def paint(self, painter, styleOptionViewItem, modelIndex):
new_option = styleOptionViewItem
row = modelIndex.row()
column = modelIndex.column()
item = self.tb.item(row, column)
if item:
color = item.foreground().color()
new_option.palette.setColor(QPalette.HighlightedText, color)
super().paint(painter, styleOptionViewItem, modelIndex)
if __name__ == '__main__':
# 创建应用程序和对象
app = QApplication(sys.argv)
ex = RiskSet()
ex.show()
sys.exit(app.exec_())
新建variable.py文件
import json
from Main.WebsocketClient.setting import SendCmd
b1 = b'tcp://180.168.146.187:10000'
b2 = b'tcp://180.168.146.187:10010'
codedict = {'cu': '沪铜', 'al': '沪铝', 'zn': '沪锌', 'pb': '沪铅', 'ni': '沪镍', 'sn': '沪锡'}
namedict = {}
autohedgedict = {1: '已套保', 2: '未套保'}
ordertypedict = {1: '市价', 2: '总价', 3: '一口价', 4: '期货价'}
invoicetypedict = {1: '当月发票', 2: '次月发票'}
paymenttypedict = {1: '现货现款', 2: '定金尾款'}
deliverytypedict = {1: '买家自提', 2: '提单过户', 3: '卖家送货'}
senddeliverytypedict = {'买家自提': 1, '提单过户': 2, '卖家送货':3 }
discounttypedict = {1: '固定升贴水', 2: '浮动升贴水', 3: '一口价'}
volumetypedict = {1: '定向', 2: '库存',3:'自由'}
quotestatusdict = {1: '销售中', 2: '已暂停', 3: '已售罄', 4: '已撤单', 5: '默认销售中'}
pcontractstatus = {1: '待上传', 2: '已上传'}
ppaymentstats = {1: '待发送', 2: '待付款', 3: '待确认收款', 4: '待付定金', 5: '待确认定金', 6: '待付尾款', 7: '待确认尾款', 8: '已付款'}
pdeliverystatus = {1: '待处理', 2: '待传提货信息', 3: '可提货', 4: '出库'}
scontractstatus = {1: '待上传', 2: '以上传'}
spaymentstats = {1: '未发送', 2: '待付款', 3: '待确认收款', 4: '待付定金', 5: '待确认定金', 6: '待付尾款', 7: '待确认尾款', 8: '已付款'}
sdeliverystatus = {1: '待传信息', 2: '待处理', 3: '可提货', 4: '入库'}
contracttype = {1: '甲方合同', 2: '乙方合同'}
searchtype = {1: '升贴水', 2: '一口价'}
hedgestatusdict = {-1: '未发送', 0: '委托中', 1: '全部撤单', 2: '部分成交', 3: '全部成交', 4: '废单', 5: '过期', 6: '部分撤单'}
orderstatusdict = {1: '请求挂单', 2: '同意挂单', 3: '拒绝挂单', 4: '已撤单', 5: '已成交', 6: '交易中', 7: '部分撤单', 8: '过期'}
Buyingselling = {1: '多', 2: '空'}
Kaiping = {1: '开仓', 2: '平仓', 3: '平今',4:'平昨',5:'自动平仓',6:'自动开平'}
RoleDict = {"管理员":1,"部门经理":2, "业务员":4, "仓储员":8, "档案员":16,"风控员":32,"交易员":64}
errors = {-106:'连接超时',-102:'仓位不足', 1: '交易所返回废单', 2: '会话信息不一致', 3: '不合法的登录',4: '用户不活跃', 5: '重复的登录', 6: '还没有登录', 7: '还没有初始',8: '前置不活跃', 9: '无此权限', 10: '修改别人的口令', 11: '找不到该用户', 12: '找不到该经纪公司', 13: '找不到投资者', 14: '原口令不匹配', 15: '报单字段有误', 16: '找不到合约', 17: '合约不能交易', 18: '经纪公司不是交易所的会员', 19: '投资者不活跃', 20: '投资者未在交易所开户', 21: '该交易席位未连接到交易所', 22: '报单错误:不允许重复报单',
23: '错误的报单操作字段', 24: '撤单已报送,不允许重复撤单', 25: '撤单找不到相应报单', 26: '报单已全成交或已撤销,不能再撤', 27: '不支持的功能', 28: '没有报单交易权限', 29: '只能平仓', 30: '平仓量超过持仓量', 31: '资金不足', 32: '主键重复', 33: '找不到主键', 34: '设置经纪公司不活跃状态失败', 35: '经纪公司正在同步', 36: '经纪公司已同步', 37: '现货交易不能卖空', 38: '不合法的结算引用', 39: '交易所网络连接失败', 40: '交易所未处理请求超过许可数', 41: '交易所每秒发送请求数超过许可数', 42: '结算结果未确认', 43: '没有对应的入金记录',
44: '交易所已经进入连续交易状态', 45: '找不到预埋(撤单)单', 46: '预埋(撤单)单已经发送', 47: '预埋(撤单)单已经删除', 48: '无效的投资者或者密码', 49: '不合法的登录IP地址', 50: '平今仓位不足', 51: '平昨仓位不足', 52: '经纪公司没有足够可用的条件单数量', 53: '投资者没有足够可用的条件单数量', 54: '经纪公司不支持条件单', 55: '重发未知单经济公司/投资者不匹配', 56: '同步动态令牌失败', 57: '动态令牌校验错误', 58: '找不到动态令牌配置信息', 59: '不支持的动态令牌类型', 60: '用户在线会话超出上限', 61: '该交易所不支持套利/做市商类型报单', 62: '没有条件单交易权限', 63: '客户端认证失败', 64: '客户端未认证',
65: '该合约不支持互换类型报单', 66: '该期权合约只支持投机类型报单', 67: '执行宣告错误,不允许重复执行', 68: '重发未知执行宣告经纪公司/投资者不匹配', 69: '只有期权合约可执行', 70: '该期权合约不支持执行', 71: '执行宣告字段有误', 72: '执行宣告撤单已报送,不允许重复撤单', 73: '执行宣告撤单找不到相应执行宣告', 74: '执行仓位不足', 75: '连续登录失败次数超限,登录被禁止', 76: '非法银期代理关系', 77: '无此功能', 78: '发送报单失败', 79: '发送报单操作失败', 80: '交易所不支持的价格类型', 81: '错误的执行类型', 82: '无效的组合合约', 83: '无效的组合合约', 84: '重发未知报价经纪公司/投资者不匹配', 85: '该合约不支持报价',
86: '报价撤单找不到相应报价', 87: '该期权合约不支持放弃执行', 88: '该组合期权合约只支持IOC', 89: '打开文件失败', 90: '查询未就绪,请稍后重试', 91: '交易所返回的错误', 92: '报价衍生单要等待交易所返回才能撤单', 93: '找不到组合合约映射', 94: '', 95: '', 96: '', 97: '', 98: '', 99: '', 100: '', 101: '用户在本系统没有报单权限', 102: '系统缺少灾备标示号', 103: '该交易所不支持批量撤单', 104: '', 105: '',
106: '投资者限仓', 113: '当前时间禁止询价', 114: '当前价差禁止询价',116: '下单频率限制', 131: '您当前密码为弱密码,请修改成强密码后重新登录',139: '当前时间禁止行权', 140: '首次登录必须修改密码,请修改密码后重新登录', 141: '您当前密码已过期,请修改后登录', 142: '修改密码失败。新密码不允许与旧密码相同', 143: '您登录失败次数过多,IP被禁止登入CTP', 144: '您当前IP在黑名单中,被禁止登入CTP'}
positiontype = {"开仓":"open","平仓":"close","平今": "closetoday","自动":"autoopenclose"}
pricetype = {"限价":"limit","市价":"market"}
nonferrousmetals = {"cu":"铜","al":"铝","zn":"锌","pb":"铅","ni":"镍","sn":"锡"}
ferrousmetal = {"rb":"螺纹","i":"铁矿","hc":"热卷","wr":"线材","SF":"硅铁","SM":"锰硅"}
lightindustry = {"FG":"玻璃","sp":"纸浆","fb":"纤板","bb":"胶板"}
coal = {"jm":"焦煤","j":"焦炭","ZC":"动煤"}
rawpetroleum = {"fu":"燃油","sc":"原油"}
Chemical = {"bu":"沥青","ru":"橡胶","l":"塑料","TA":"PTA","v":"PVC","eg":"乙二醇","MA":"甲醇","pp":"聚丙烯"}
cereal = {"c":"玉米","cs":"淀粉","WH":"强麦","PM":"普麦","RI":"早稻","JR":"粳稻","LR":"晚稻"}
Greaseoil = {"a":"豆一","b":"豆二","m":"豆粕","y":"豆油","RS":"菜籽","RM":"菜粕","OI":"菜油","p":"棕榈"}
Softcommodities = {"CF":"棉花","SR":"白糖","CY":"棉纱"}
agricultural = {"jd":"鸡蛋","AP":"苹果"}
AllCodename ={}
listvarietyclassification = {}
varietydict = {"上期所SHFE": ["沪铜", "沪铝", "沪锌", "沪铅", "沪镍", "沪锡", "螺纹", "线材", "热卷", "燃油", "沥青", "橡胶", "纸浆"],
"大商所DCE": ["豆粕", "豆油", "豆一", "豆二", "棕榈", "玉米", "淀粉", "鸡蛋", "胶板", "纤板", "塑料",
"PVC", "乙二醇", "聚丙烯", "焦炭", "焦煤", "铁矿"],
"郑商所CZCE": ["白糖", "棉花", "玻璃", "PTA", "强麦", "普麦", "早稻", "晚稻", "粳稻", "菜籽", "菜油", "菜粕", "硅铁", "锰硅", "苹果"],
"上期能源INE": ["原油"]
accounttype = {"期货": 1, "外盘": 2, "现货": 3, }
class Variable:
currentorderpage = 0 # 点价小标签页
currentModuleTab = 0 # 模块 页码
currentCategoryTab = 0 # 点价 金属种类 页码
currentStockDepartIndex = 0
authkey = 0
accesskey = 0
password = 0
loginname = 0
user_id = 0
nickname = 0
company_id = 0
permission = 0
roleid = 0
deptid = 0
department = 0
userid = 0
userpw = 0
logined = False # 表示是否已经登录
logincount=0 # 记录登录次数,超过3次就放弃
primarymenu = []
additionalmenu = [] # 判断有没有品类品牌导入导出权限
stockdeptid = 0 # 仅供仓库模块使用得部门id
# 记住密码
cb = 1
def ReturnName(varietyname):
if varietyname == "铜":
varietyname = "沪铜"
elif varietyname == "铝":
varietyname = "沪铝"
elif varietyname == "锌":
varietyname = "沪锌"
elif varietyname == "铅":
varietyname = "沪铅"
elif varietyname == "镍":
varietyname = "沪镍"
elif varietyname == "锡":
varietyname = "沪锡"
elif varietyname == "沪铜":
varietyname = "铜"
elif varietyname == "沪铝":
varietyname = "铝"
elif varietyname == "沪锌":
varietyname = "锌"
elif varietyname == "沪铅":
varietyname = "铅"
elif varietyname == "沪镍":
varietyname = "镍"
elif varietyname == "沪锡":
varietyname = "锡"
return varietyname
def ReturnVarietyID(varietyname):
:param varietyname: 小品种对应的英文名或者中文名
:return: 小品种对应的代号varietyid
codename = {"铜":"沪铜","铝":"沪铝","锌":"沪锌","铅":"沪铅","镍":"沪镍","锡":"沪锡","郑棉":"棉花","郑煤":"动煤","EG":"乙二醇"
,"郑醇":"甲醇","PP":"聚丙烯","郑麦":"强麦","郑油":"菜油"}
if varietyname in codename:
varietyname = codename[varietyname]
for i in listvarietyclassification:
if varietyname == i["varietyname"] or varietyname == i["varietyshortname"]:
return str(i["varietyid"])
def ReturnVarietyName(varietyid):
:param varietyid: 小品种对应的id
:return: 小品种对应的name
varietyid = int(varietyid)
for i in listvarietyclassification:
if varietyid == i["varietyid"]:
if i["varietyname"] == "沪铜":
varietyname = "铜"
elif i["varietyname"] == "沪铝":
varietyname = "铝"
elif i["varietyname"] == "沪锌":
varietyname = "锌"
elif i["varietyname"] == "沪铅":
varietyname = "铅"
elif i["varietyname"] == "沪镍":
varietyname = "镍"
elif i["varietyname"] == "沪锡":
varietyname = "锡"
else:
varietyname = i["varietyname"]
return varietyname
def GetUserInfo(recvhandle):
# 查询报价抬头
SendClientCmd({"head": {"cmd": "updatespotuserifno", "seq": 1, "recvhandle":recvhandle, "dis": "query"},
"body": [{"op": "query"}]})
def GetCategBrand(recvhandle,rights):
SendClientCmd({"head": {"cmd": "querytcategbrand", "seq": 1, "recvhandle": recvhandle},
"body": [{"rights":rights,"deptid":Variable.deptid}]})
def GetCustomer(recvhandle):
# 查询好友列表
SendClientCmd({"head": {"cmd": "sendcustomermsg", "seq": 1, "recvhandle":recvhandle},
"body": [{"loginname": Variable.loginname}]})
def SendClientCmd(cmd):
cmd["body"][0]["speciesid"] = Variable.currentCategoryTab+1
SendCmd("{}".format(json.dumps(cmd)))
def ReturnCodeName(id):
if id == 0:
return nonferrousmetals
elif id ==1:
return ferrousmetal
elif id ==2:
return lightindustry
elif id ==3:
return coal
elif id ==4:
return rawpetroleum
elif id ==5:
return Chemical
elif id ==6:
return cereal
elif id ==7:
return Greaseoil
elif id ==8:
return Softcommodities
elif id ==9:
return agricultural
def returnexchid(codename):
:param codename:
:return: exchid
for i in listvarietyclassification:
if i["varietyshortname"] == codename:
return i["exchid"]
def returntradeunit(codename):
:param codename:
:return: tradeunit
for i in listvarietyclassification:
if i["varietyshortname"] == codename:
return i["tradeunit"]
Java的组成:
• Java 由四方面组成:Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(API)
• 其中Java程序语言、Java虚拟机、JavaAPI类库这三个部分统称为JDK,JDK是用于支持Java程序开发的最小环境。
• 把Java API类库中额Java SE API 子集和Java虚拟机这两部分统称为JRE,JRE是支持Java程序运行的标准环境。