├── requirements.txt ├── README.md ├── .gitignore ├── LICENSE ├── uqer.py ├── trader.py ├── trader_ui.py └── trader.ui /requirements.txt: -------------------------------------------------------------------------------- 1 | requests 2 | logbook==0.12.5 3 | demjson==2.2.4 4 | anyjson 5 | dill 6 | click 7 | six 8 | flask 9 | tushare 10 | easytrader -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # uqtrader 2 | 3 | * 利用easytrader实现[优矿网](https://uqer.io)策略一键下单功能 4 | * 支持选择"我的交易"中任意策略 5 | 6 | 7 | ## 安装步骤 8 | 9 | > install [anaconda](https://www.continuum.io/downloads) 10 | 11 | > pip install -r requirements.txt 12 | 13 | > 安装tesseract或java(二选一)用于识别验证码 14 | * windows用户直接点击:[tesseract](http://tesseract-ocr.googlecode.com/files/tesseract-ocr-setup-3.02.02.exe) 15 | * linux用户: apt-get install tesseract-ocr 16 | * mac用户: brew install tesseract 17 | 18 | ## 用法 19 | 20 | > python trader.py 启动uqtrader 21 | 22 | > 获取加密后的交易密码的步骤: 23 | 24 | 1. 打开IE浏览器,输入[华泰证券官网](https://service.htsc.com.cn/service/login.jsp),填写客户号密码,此时不登陆; 25 | 2. 点击F12,打开调试器; 26 | 3. 选择`网络`标签; 27 | 4. 点击F5,启动网络流量捕获; 28 | 5. `摘要`标签里,选择第一个请求:https://service.htsc.com.cn/service/loginAction.do?method=login; 29 | 6. 点击`详细信息`标签; 30 | 7. 点击`请求正文`标签,找到:trdpwdEns=f2cdf33b2ba8e98c4b1c71a459d2a649,trdpwdEns对应的就是加密后的交易密码。 31 | 32 | > 在uqtrader客户端依次输入优矿网账号密码,华泰证券账号,加密后的交易密码,和通讯密码。 33 | 34 | > 可以选择保存账号密码,避免下次重新输入。点击登陆按钮,成功登陆将会进入策略操作页面,否则请检查账号密码。 35 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | 27 | # PyInstaller 28 | # Usually these files are written by a python script from a template 29 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 30 | *.manifest 31 | *.spec 32 | 33 | # Installer logs 34 | pip-log.txt 35 | pip-delete-this-directory.txt 36 | 37 | # Unit test / coverage reports 38 | htmlcov/ 39 | .tox/ 40 | .coverage 41 | .coverage.* 42 | .cache 43 | nosetests.xml 44 | coverage.xml 45 | *,cover 46 | .hypothesis/ 47 | 48 | # Translations 49 | *.mo 50 | *.pot 51 | 52 | # Django stuff: 53 | *.log 54 | 55 | # Sphinx documentation 56 | docs/_build/ 57 | 58 | # PyBuilder 59 | target/ 60 | 61 | #Ipython Notebook 62 | .ipynb_checkpoints 63 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 musequant 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /uqer.py: -------------------------------------------------------------------------------- 1 | #coding=utf-8 2 | """ 3 | 封装优矿网的接口。 4 | 5 | """ 6 | 7 | import requests 8 | import json 9 | import datetime as dt 10 | import time 11 | import tushare as ts 12 | 13 | headers = {'Content-Type':'application/json'} 14 | login_url = 'https://gw.wmcloud.com/usermaster/authenticate.json' 15 | order_url = 'https://gw.wmcloud.com/mercury_trade/strategy/%s/order' 16 | strategy_url = 'https://gw.wmcloud.com/mercury_trade/strategy' 17 | 18 | class Uqer(object): 19 | 20 | def __init__(self, user, pwd, percent=0.02, strategy_id=1): 21 | 22 | self.user, self.pwd = user, pwd 23 | self.percent, self.strategy_id = percent, strategy_id 24 | 25 | self._login() 26 | 27 | def _login(self): 28 | """登陆优矿""" 29 | 30 | s = self.session = requests.Session() 31 | user, pwd = self.user, self.pwd 32 | 33 | if '@' in user: 34 | user, tenant = user.split("@") 35 | else: 36 | tenant = '' 37 | 38 | data = dict(username=user, password=pwd, tenant=tenant) 39 | res = s.post(login_url, data) 40 | 41 | if not res.ok or not res.json().get('content', {}).get('accountId', 0): 42 | print res.json() 43 | raise Exception('login error!') 44 | 45 | 46 | def get_order(self, strategy_id, all=True): 47 | """获取订单列表 48 | :param all:True返回当日所有订单,False返回上次下单后新产生的订单。 49 | """ 50 | 51 | s = self.session 52 | orders = s.get(order_url%strategy_id).json() 53 | 54 | percent = self.percent 55 | 56 | if all: 57 | return orders 58 | else: 59 | tmp_orders = [] 60 | for order in orders: 61 | price = float(ts.get_realtime_quotes(order['ticker']).price) 62 | order['price'] = round(price*(order['side']=='BUY' and 1.+percent or 1.-percent), 2) 63 | tmp_orders.append(order) 64 | return tmp_orders 65 | 66 | 67 | def get_strategy_list(self): 68 | """获取订单列表 69 | :param all:True返回当日所有订单,False返回上次下单后新产生的订单。 70 | """ 71 | 72 | s = self.session 73 | strategies = s.get(strategy_url).json() 74 | 75 | return {e['name']: e['id'] for e in strategies} 76 | -------------------------------------------------------------------------------- /trader.py: -------------------------------------------------------------------------------- 1 | #coding=utf-8 2 | 3 | import sys 4 | from PyQt4 import QtGui, QtCore 5 | from PyQt4.QtGui import * 6 | from PyQt4.QtCore import * 7 | 8 | from trader_ui import Ui_MainWindow 9 | import uqer 10 | import easytrader 11 | 12 | import json 13 | 14 | import datetime as dt 15 | import tushare as ts 16 | 17 | 18 | 19 | class uqWindow(QtGui.QMainWindow, Ui_MainWindow): 20 | def __init__(self): 21 | super(uqWindow,self).__init__() 22 | self.setupUi(self) 23 | self.pushButton.clicked.connect(self.login_account) 24 | self.strategy_comboBox.activated.connect(self.strategy_select) 25 | self.place_order_btn.clicked.connect(self.order_place) 26 | 27 | self.uqer_username_lineEdit.textChanged.connect(self.edit_change_uqer) 28 | self.uqer_pwd_lineEdit.textChanged.connect(self.edit_change_uqer) 29 | 30 | self.uqer_username_lineEdit.textChanged.connect(self.edit_change_broker) 31 | self.broker_trade_pwd_lineEdit.textChanged.connect(self.edit_change_broker) 32 | self.broker_c_pwd_lineEdit.textChanged.connect(self.edit_change_broker) 33 | 34 | self.login_frame.show() 35 | self.table_frame.hide() 36 | 37 | self.load_config() 38 | 39 | def edit_change_uqer(self): 40 | self.uqer_verify_label.setText('') 41 | 42 | def edit_change_broker(self): 43 | self.broker_verify_label.setText('') 44 | 45 | def login_account(self): 46 | 47 | uqer_user = str(self.uqer_username_lineEdit.text()) 48 | uqer_pwd = str(self.uqer_pwd_lineEdit.text()) 49 | 50 | broker_account = str(self.broker_account_lineEdit.text()) 51 | broker_trade_pwd = str(self.broker_trade_pwd_lineEdit.text()) 52 | broker_c_pwd = str(self.broker_c_pwd_lineEdit.text()) 53 | 54 | self.percent = 0.01 55 | if not uqer_user or not uqer_pwd: 56 | self.uqer_verify_label.setText(u'字段不能为空!') 57 | self.uqer_verify_label.setStyleSheet('color: red') 58 | 59 | if not broker_account or not broker_trade_pwd or not broker_c_pwd: 60 | self.broker_verify_label.setText(u'字段不能为空!') 61 | self.broker_verify_label.setStyleSheet('color: red') 62 | try: 63 | self.uqer_instance = uqer.Uqer(uqer_user, uqer_pwd, self.percent) 64 | self.uqer_verify_label.setText('') 65 | except Exception,e: 66 | self.uqer_verify_label.setText(u'登陆失败,请检查用户名密码!') 67 | self.uqer_verify_label.setStyleSheet('color: red') 68 | return 69 | 70 | 71 | self.account_instance = easytrader.use('ht') 72 | self.account_instance.account_config = { 73 | "userName": broker_account, 74 | "servicePwd": broker_c_pwd, 75 | "trdpwd": broker_trade_pwd 76 | } 77 | 78 | try: 79 | self.account_instance.autologin() 80 | raw_name = self.account_instance.account_config['userName'] 81 | self.account_instance.fund_account = raw_name[1:] if raw_name.startswith('08') else raw_name 82 | except Exception,e: 83 | print e 84 | self.broker_verify_label.setText(u'登陆失败,请检查用户名密码!') 85 | self.broker_verify_label.setStyleSheet('color: red') 86 | return 87 | 88 | self.init_strategy_cmbobox() 89 | 90 | self.strategy_select() 91 | 92 | if self.checkBox.isChecked(): 93 | self.dump_config() 94 | 95 | self.login_frame.hide() 96 | self.table_frame.show() 97 | 98 | # self. 99 | def load_config(self): 100 | try: 101 | with open('config.json', 'r') as f: 102 | data = json.load(f) 103 | self.uqer_username_lineEdit.setText(data.get('uqer_user')) 104 | self.uqer_pwd_lineEdit.setText(data.get('uqer_pwd')) 105 | self.broker_account_lineEdit.setText(data.get('broker_account')) 106 | self.broker_trade_pwd_lineEdit.setText(data.get('broker_trade_pwd')) 107 | self.broker_c_pwd_lineEdit.setText(data.get('broker_c_pwd')) 108 | 109 | if data: 110 | self.checkBox.setChecked(True) 111 | except Exception,e: 112 | print e 113 | pass 114 | 115 | 116 | def dump_config(self): 117 | data = { 118 | "uqer_user": str(self.uqer_username_lineEdit.text()), 119 | "uqer_pwd": str(self.uqer_pwd_lineEdit.text()), 120 | "broker_account" : str(self.broker_account_lineEdit.text()), 121 | "broker_trade_pwd" : str(self.broker_trade_pwd_lineEdit.text()), 122 | "broker_c_pwd" : str(self.broker_c_pwd_lineEdit.text()) 123 | } 124 | with open('config.json', 'w') as f: 125 | json.dump(data, f) 126 | 127 | @QtCore.pyqtSlot(QtGui.QWidget) 128 | def buy_sell_changed(self, comboBox): 129 | self.tableWidget.setItem(comboBox.row, 2, QTableWidgetItem(comboBox.currentText())) 130 | 131 | def get_order(self): 132 | 133 | orders = self.uqer_instance.get_order(self.active_strategy_id, False) 134 | 135 | self.tableWidget.setRowCount(len(orders)) 136 | 137 | table = self.tableWidget 138 | 139 | for index, order in enumerate(orders): 140 | table.setItem(index, 0, QTableWidgetItem(order.get('ticker'))) 141 | table.setItem(index, 1, QTableWidgetItem(order.get('name'))) 142 | 143 | self.signalMapper = QtCore.QSignalMapper(self) 144 | self.signalMapper.mapped[QtGui.QWidget].connect(self.buy_sell_changed) 145 | 146 | temp_combobox = QtGui.QComboBox() 147 | temp_combobox.addItem(u'卖') 148 | temp_combobox.addItem(u'买') 149 | 150 | temp_combobox.currentIndexChanged.connect(self.signalMapper.map) 151 | temp_combobox.row = index 152 | 153 | table.setItem(index, 2, QTableWidgetItem(order.get('side') == u'BUY' and u'买' or u'卖')) 154 | if order.get('side') == u'BUY': 155 | temp_combobox.setCurrentIndex(1) 156 | else: 157 | temp_combobox.setCurrentIndex(0) 158 | 159 | table.setCellWidget(index, 2, temp_combobox) 160 | self.signalMapper.setMapping(temp_combobox, temp_combobox) 161 | 162 | table.setItem(index, 3, QTableWidgetItem(str(order.get('amount')))) 163 | 164 | place_time = dt.datetime.fromtimestamp(int(order.get('place_time'))/1000) 165 | table.setItem(index, 4, QTableWidgetItem(place_time.strftime('%H:%M:%S'))) 166 | 167 | 168 | def init_strategy_cmbobox(self): 169 | cmbobox = self.strategy_comboBox 170 | self.strategy_dict = self.uqer_instance.get_strategy_list() 171 | for name in self.strategy_dict: 172 | cmbobox.addItem(name) 173 | 174 | 175 | def strategy_select(self): 176 | text = self.strategy_comboBox.currentText() 177 | self.active_strategy_id = self.strategy_dict[unicode(text)] 178 | self.get_order() 179 | 180 | 181 | def order_place(self): 182 | table = self.tableWidget 183 | 184 | count = table.rowCount() 185 | orders = [] 186 | for x in xrange(count): 187 | 188 | ticker = unicode(table.item(x, 0).text()) 189 | side = unicode(table.item(x, 2).text()) 190 | 191 | amount = unicode(table.item(x, 3).text()) 192 | 193 | price = float(ts.get_realtime_quotes(ticker).price) 194 | percent = self.percent 195 | price = round(price*(side==u'买' and 1.+percent or 0.99-percent), 2) 196 | amount = int(round((int(amount)/100)*100, -2)) 197 | 198 | orders.append((side, ticker, str(amount), str(price))) 199 | 200 | message = '\r\n'.join([u'%s %s: %s@%s'%order for order in orders]) 201 | 202 | reply = QtGui.QMessageBox.question(self, u'下单确认', 203 | message, QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) 204 | 205 | if reply != QtGui.QMessageBox.Yes: 206 | return 207 | 208 | for side, ticker, amount, price in orders: 209 | 210 | if side == u'买': 211 | self.account_instance.buy(ticker, price, amount) 212 | else: 213 | self.account_instance.sell(ticker, price, amount) 214 | 215 | 216 | if __name__ == "__main__": 217 | app = QtGui.QApplication(sys.argv) 218 | 219 | ui = uqWindow() 220 | ui.show() 221 | sys.exit(app.exec_()) 222 | -------------------------------------------------------------------------------- /trader_ui.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'trader.ui' 4 | # 5 | # Created by: PyQt4 UI code generator 4.11.4 6 | # 7 | # WARNING! All changes made in this file will be lost! 8 | 9 | from PyQt4 import QtCore, QtGui 10 | 11 | try: 12 | _fromUtf8 = QtCore.QString.fromUtf8 13 | except AttributeError: 14 | def _fromUtf8(s): 15 | return s 16 | 17 | try: 18 | _encoding = QtGui.QApplication.UnicodeUTF8 19 | def _translate(context, text, disambig): 20 | return QtGui.QApplication.translate(context, text, disambig, _encoding) 21 | except AttributeError: 22 | def _translate(context, text, disambig): 23 | return QtGui.QApplication.translate(context, text, disambig) 24 | 25 | class Ui_MainWindow(object): 26 | def setupUi(self, MainWindow): 27 | MainWindow.setObjectName(_fromUtf8("MainWindow")) 28 | MainWindow.resize(741, 580) 29 | self.centralwidget = QtGui.QWidget(MainWindow) 30 | self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 31 | self.login_frame = QtGui.QFrame(self.centralwidget) 32 | self.login_frame.setGeometry(QtCore.QRect(20, 20, 700, 500)) 33 | self.login_frame.setFrameShape(QtGui.QFrame.StyledPanel) 34 | self.login_frame.setFrameShadow(QtGui.QFrame.Raised) 35 | self.login_frame.setObjectName(_fromUtf8("login_frame")) 36 | self.broker_c_pwd_lineEdit = QtGui.QLineEdit(self.login_frame) 37 | self.broker_c_pwd_lineEdit.setGeometry(QtCore.QRect(228, 280, 221, 31)) 38 | self.broker_c_pwd_lineEdit.setEchoMode(QtGui.QLineEdit.Password) 39 | self.broker_c_pwd_lineEdit.setObjectName(_fromUtf8("broker_c_pwd_lineEdit")) 40 | self.label_2 = QtGui.QLabel(self.login_frame) 41 | self.label_2.setGeometry(QtCore.QRect(150, 110, 72, 15)) 42 | self.label_2.setObjectName(_fromUtf8("label_2")) 43 | self.label_5 = QtGui.QLabel(self.login_frame) 44 | self.label_5.setGeometry(QtCore.QRect(150, 290, 72, 15)) 45 | self.label_5.setObjectName(_fromUtf8("label_5")) 46 | self.uqer_pwd_lineEdit = QtGui.QLineEdit(self.login_frame) 47 | self.uqer_pwd_lineEdit.setGeometry(QtCore.QRect(218, 100, 231, 31)) 48 | self.uqer_pwd_lineEdit.setEchoMode(QtGui.QLineEdit.Password) 49 | self.uqer_pwd_lineEdit.setObjectName(_fromUtf8("uqer_pwd_lineEdit")) 50 | self.uqer_username_lineEdit = QtGui.QLineEdit(self.login_frame) 51 | self.uqer_username_lineEdit.setGeometry(QtCore.QRect(220, 60, 231, 31)) 52 | self.uqer_username_lineEdit.setObjectName(_fromUtf8("uqer_username_lineEdit")) 53 | self.label = QtGui.QLabel(self.login_frame) 54 | self.label.setGeometry(QtCore.QRect(150, 70, 72, 15)) 55 | self.label.setObjectName(_fromUtf8("label")) 56 | self.pushButton = QtGui.QPushButton(self.login_frame) 57 | self.pushButton.setGeometry(QtCore.QRect(260, 430, 161, 71)) 58 | self.pushButton.setObjectName(_fromUtf8("pushButton")) 59 | self.label_3 = QtGui.QLabel(self.login_frame) 60 | self.label_3.setGeometry(QtCore.QRect(150, 210, 72, 15)) 61 | self.label_3.setObjectName(_fromUtf8("label_3")) 62 | self.label_4 = QtGui.QLabel(self.login_frame) 63 | self.label_4.setGeometry(QtCore.QRect(150, 250, 72, 15)) 64 | self.label_4.setObjectName(_fromUtf8("label_4")) 65 | self.broker_trade_pwd_lineEdit = QtGui.QLineEdit(self.login_frame) 66 | self.broker_trade_pwd_lineEdit.setGeometry(QtCore.QRect(228, 240, 221, 31)) 67 | self.broker_trade_pwd_lineEdit.setEchoMode(QtGui.QLineEdit.Password) 68 | self.broker_trade_pwd_lineEdit.setObjectName(_fromUtf8("broker_trade_pwd_lineEdit")) 69 | self.broker_account_lineEdit = QtGui.QLineEdit(self.login_frame) 70 | self.broker_account_lineEdit.setGeometry(QtCore.QRect(228, 200, 221, 31)) 71 | self.broker_account_lineEdit.setObjectName(_fromUtf8("broker_account_lineEdit")) 72 | self.label_7 = QtGui.QLabel(self.login_frame) 73 | self.label_7.setGeometry(QtCore.QRect(20, 170, 151, 20)) 74 | font = QtGui.QFont() 75 | font.setPointSize(14) 76 | self.label_7.setFont(font) 77 | self.label_7.setObjectName(_fromUtf8("label_7")) 78 | self.label_6 = QtGui.QLabel(self.login_frame) 79 | self.label_6.setGeometry(QtCore.QRect(20, 20, 171, 31)) 80 | font = QtGui.QFont() 81 | font.setPointSize(14) 82 | self.label_6.setFont(font) 83 | self.label_6.setTextFormat(QtCore.Qt.PlainText) 84 | self.label_6.setObjectName(_fromUtf8("label_6")) 85 | self.uqer_verify_label = QtGui.QLabel(self.login_frame) 86 | self.uqer_verify_label.setGeometry(QtCore.QRect(450, 100, 211, 31)) 87 | self.uqer_verify_label.setText(_fromUtf8("")) 88 | self.uqer_verify_label.setObjectName(_fromUtf8("uqer_verify_label")) 89 | self.broker_verify_label = QtGui.QLabel(self.login_frame) 90 | self.broker_verify_label.setGeometry(QtCore.QRect(450, 280, 221, 31)) 91 | self.broker_verify_label.setText(_fromUtf8("")) 92 | self.broker_verify_label.setObjectName(_fromUtf8("broker_verify_label")) 93 | self.checkBox = QtGui.QCheckBox(self.login_frame) 94 | self.checkBox.setGeometry(QtCore.QRect(110, 340, 121, 31)) 95 | self.checkBox.setObjectName(_fromUtf8("checkBox")) 96 | self.label_2.raise_() 97 | self.label_5.raise_() 98 | self.uqer_pwd_lineEdit.raise_() 99 | self.uqer_username_lineEdit.raise_() 100 | self.label.raise_() 101 | self.pushButton.raise_() 102 | self.label_3.raise_() 103 | self.label_4.raise_() 104 | self.broker_trade_pwd_lineEdit.raise_() 105 | self.broker_account_lineEdit.raise_() 106 | self.label_7.raise_() 107 | self.label_6.raise_() 108 | self.uqer_verify_label.raise_() 109 | self.broker_verify_label.raise_() 110 | self.broker_c_pwd_lineEdit.raise_() 111 | self.checkBox.raise_() 112 | self.table_frame = QtGui.QFrame(self.centralwidget) 113 | self.table_frame.setGeometry(QtCore.QRect(20, 20, 700, 500)) 114 | self.table_frame.setFrameShape(QtGui.QFrame.StyledPanel) 115 | self.table_frame.setFrameShadow(QtGui.QFrame.Raised) 116 | self.table_frame.setObjectName(_fromUtf8("table_frame")) 117 | self.tableWidget = QtGui.QTableWidget(self.table_frame) 118 | self.tableWidget.setGeometry(QtCore.QRect(40, 60, 641, 341)) 119 | self.tableWidget.setColumnCount(5) 120 | self.tableWidget.setObjectName(_fromUtf8("tableWidget")) 121 | self.tableWidget.setRowCount(0) 122 | item = QtGui.QTableWidgetItem() 123 | self.tableWidget.setHorizontalHeaderItem(0, item) 124 | item = QtGui.QTableWidgetItem() 125 | self.tableWidget.setHorizontalHeaderItem(1, item) 126 | item = QtGui.QTableWidgetItem() 127 | self.tableWidget.setHorizontalHeaderItem(2, item) 128 | item = QtGui.QTableWidgetItem() 129 | self.tableWidget.setHorizontalHeaderItem(3, item) 130 | item = QtGui.QTableWidgetItem() 131 | self.tableWidget.setHorizontalHeaderItem(4, item) 132 | self.place_order_btn = QtGui.QPushButton(self.table_frame) 133 | self.place_order_btn.setGeometry(QtCore.QRect(290, 430, 161, 71)) 134 | self.place_order_btn.setObjectName(_fromUtf8("place_order_btn")) 135 | self.strategy_comboBox = QtGui.QComboBox(self.table_frame) 136 | self.strategy_comboBox.setGeometry(QtCore.QRect(70, 10, 261, 41)) 137 | self.strategy_comboBox.setObjectName(_fromUtf8("strategy_comboBox")) 138 | self.label_8 = QtGui.QLabel(self.table_frame) 139 | self.label_8.setGeometry(QtCore.QRect(10, 10, 72, 41)) 140 | font = QtGui.QFont() 141 | font.setPointSize(12) 142 | font.setBold(True) 143 | font.setWeight(75) 144 | self.label_8.setFont(font) 145 | self.label_8.setObjectName(_fromUtf8("label_8")) 146 | self.widget = QtGui.QWidget(self.centralwidget) 147 | self.widget.setGeometry(QtCore.QRect(70, 600, 120, 80)) 148 | self.widget.setObjectName(_fromUtf8("widget")) 149 | MainWindow.setCentralWidget(self.centralwidget) 150 | self.menubar = QtGui.QMenuBar(MainWindow) 151 | self.menubar.setGeometry(QtCore.QRect(0, 0, 741, 26)) 152 | self.menubar.setObjectName(_fromUtf8("menubar")) 153 | MainWindow.setMenuBar(self.menubar) 154 | self.statusbar = QtGui.QStatusBar(MainWindow) 155 | self.statusbar.setObjectName(_fromUtf8("statusbar")) 156 | MainWindow.setStatusBar(self.statusbar) 157 | 158 | self.retranslateUi(MainWindow) 159 | QtCore.QMetaObject.connectSlotsByName(MainWindow) 160 | MainWindow.setTabOrder(self.uqer_username_lineEdit, self.uqer_pwd_lineEdit) 161 | MainWindow.setTabOrder(self.uqer_pwd_lineEdit, self.broker_account_lineEdit) 162 | MainWindow.setTabOrder(self.broker_account_lineEdit, self.broker_trade_pwd_lineEdit) 163 | MainWindow.setTabOrder(self.broker_trade_pwd_lineEdit, self.broker_c_pwd_lineEdit) 164 | MainWindow.setTabOrder(self.broker_c_pwd_lineEdit, self.checkBox) 165 | MainWindow.setTabOrder(self.checkBox, self.pushButton) 166 | MainWindow.setTabOrder(self.pushButton, self.strategy_comboBox) 167 | MainWindow.setTabOrder(self.strategy_comboBox, self.place_order_btn) 168 | MainWindow.setTabOrder(self.place_order_btn, self.tableWidget) 169 | 170 | def retranslateUi(self, MainWindow): 171 | MainWindow.setWindowTitle(_translate("MainWindow", "UqerTrader", None)) 172 | self.label_2.setText(_translate("MainWindow", "密码", None)) 173 | self.label_5.setText(_translate("MainWindow", "通讯密码", None)) 174 | self.label.setText(_translate("MainWindow", "用户名", None)) 175 | self.pushButton.setText(_translate("MainWindow", "确认登陆", None)) 176 | self.label_3.setText(_translate("MainWindow", "资金账号", None)) 177 | self.label_4.setText(_translate("MainWindow", "交易密码", None)) 178 | self.label_7.setText(_translate("MainWindow", "券商账户信息", None)) 179 | self.label_6.setText(_translate("MainWindow", "优矿账户信息", None)) 180 | self.checkBox.setText(_translate("MainWindow", "保存账户密码", None)) 181 | item = self.tableWidget.horizontalHeaderItem(0) 182 | item.setText(_translate("MainWindow", "证券代码", None)) 183 | item = self.tableWidget.horizontalHeaderItem(1) 184 | item.setText(_translate("MainWindow", "证券名称", None)) 185 | item = self.tableWidget.horizontalHeaderItem(2) 186 | item.setText(_translate("MainWindow", "买/卖", None)) 187 | item = self.tableWidget.horizontalHeaderItem(3) 188 | item.setText(_translate("MainWindow", "下单数量(股)", None)) 189 | item = self.tableWidget.horizontalHeaderItem(4) 190 | item.setText(_translate("MainWindow", "信号时间", None)) 191 | self.place_order_btn.setText(_translate("MainWindow", "确认下单", None)) 192 | self.label_8.setText(_translate("MainWindow", "策略:", None)) 193 | 194 | -------------------------------------------------------------------------------- /trader.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 741 10 | 580 11 | 12 | 13 | 14 | UqerTrader 15 | 16 | 17 | 18 | 19 | 20 | 20 21 | 20 22 | 700 23 | 500 24 | 25 | 26 | 27 | QFrame::StyledPanel 28 | 29 | 30 | QFrame::Raised 31 | 32 | 33 | 34 | 35 | 228 36 | 280 37 | 221 38 | 31 39 | 40 | 41 | 42 | QLineEdit::Password 43 | 44 | 45 | 46 | 47 | 48 | 150 49 | 110 50 | 72 51 | 15 52 | 53 | 54 | 55 | 密码 56 | 57 | 58 | 59 | 60 | 61 | 150 62 | 290 63 | 72 64 | 15 65 | 66 | 67 | 68 | 通讯密码 69 | 70 | 71 | 72 | 73 | 74 | 218 75 | 100 76 | 231 77 | 31 78 | 79 | 80 | 81 | QLineEdit::Password 82 | 83 | 84 | 85 | 86 | 87 | 220 88 | 60 89 | 231 90 | 31 91 | 92 | 93 | 94 | 95 | 96 | 97 | 150 98 | 70 99 | 72 100 | 15 101 | 102 | 103 | 104 | 用户名 105 | 106 | 107 | 108 | 109 | 110 | 260 111 | 430 112 | 161 113 | 71 114 | 115 | 116 | 117 | 确认登陆 118 | 119 | 120 | 121 | 122 | 123 | 150 124 | 210 125 | 72 126 | 15 127 | 128 | 129 | 130 | 资金账号 131 | 132 | 133 | 134 | 135 | 136 | 150 137 | 250 138 | 72 139 | 15 140 | 141 | 142 | 143 | 交易密码 144 | 145 | 146 | 147 | 148 | 149 | 228 150 | 240 151 | 221 152 | 31 153 | 154 | 155 | 156 | QLineEdit::Password 157 | 158 | 159 | 160 | 161 | 162 | 228 163 | 200 164 | 221 165 | 31 166 | 167 | 168 | 169 | 170 | 171 | 172 | 20 173 | 170 174 | 151 175 | 20 176 | 177 | 178 | 179 | 180 | 14 181 | 182 | 183 | 184 | 券商账户信息 185 | 186 | 187 | 188 | 189 | 190 | 20 191 | 20 192 | 171 193 | 31 194 | 195 | 196 | 197 | 198 | 14 199 | 200 | 201 | 202 | 优矿账户信息 203 | 204 | 205 | Qt::PlainText 206 | 207 | 208 | 209 | 210 | 211 | 450 212 | 100 213 | 211 214 | 31 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 450 225 | 280 226 | 221 227 | 31 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 110 238 | 340 239 | 121 240 | 31 241 | 242 | 243 | 244 | 保存账户密码 245 | 246 | 247 | label_2 248 | label_5 249 | uqer_pwd_lineEdit 250 | uqer_username_lineEdit 251 | label 252 | pushButton 253 | label_3 254 | label_4 255 | broker_trade_pwd_lineEdit 256 | broker_account_lineEdit 257 | label_7 258 | label_6 259 | uqer_verify_label 260 | broker_verify_label 261 | broker_c_pwd_lineEdit 262 | checkBox 263 | 264 | 265 | 266 | 267 | 20 268 | 20 269 | 700 270 | 500 271 | 272 | 273 | 274 | QFrame::StyledPanel 275 | 276 | 277 | QFrame::Raised 278 | 279 | 280 | 281 | 282 | 40 283 | 60 284 | 641 285 | 341 286 | 287 | 288 | 289 | 5 290 | 291 | 292 | 293 | 证券代码 294 | 295 | 296 | 297 | 298 | 证券名称 299 | 300 | 301 | 302 | 303 | 买/卖 304 | 305 | 306 | 307 | 308 | 下单数量(股) 309 | 310 | 311 | 312 | 313 | 信号时间 314 | 315 | 316 | 317 | 318 | 319 | 320 | 290 321 | 430 322 | 161 323 | 71 324 | 325 | 326 | 327 | 确认下单 328 | 329 | 330 | 331 | 332 | 333 | 70 334 | 10 335 | 261 336 | 41 337 | 338 | 339 | 340 | 341 | 342 | 343 | 10 344 | 10 345 | 72 346 | 41 347 | 348 | 349 | 350 | 351 | 12 352 | 75 353 | true 354 | 355 | 356 | 357 | 策略: 358 | 359 | 360 | 361 | 362 | 363 | 364 | 70 365 | 600 366 | 120 367 | 80 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 0 376 | 0 377 | 741 378 | 26 379 | 380 | 381 | 382 | 383 | 384 | 385 | uqer_username_lineEdit 386 | uqer_pwd_lineEdit 387 | broker_account_lineEdit 388 | broker_trade_pwd_lineEdit 389 | broker_c_pwd_lineEdit 390 | checkBox 391 | pushButton 392 | strategy_comboBox 393 | place_order_btn 394 | tableWidget 395 | 396 | 397 | 398 | 399 | --------------------------------------------------------------------------------