[Add] ConnectDialog supports field value save and load
This commit is contained in:
parent
f3b2f506ed
commit
91cb3d103d
@ -92,11 +92,13 @@ class FutuGateway(BaseGateway):
|
|||||||
""""""
|
""""""
|
||||||
|
|
||||||
default_setting = {
|
default_setting = {
|
||||||
"password": "123123",
|
"password": "",
|
||||||
"market": "HK",
|
|
||||||
"env": "REAL",
|
|
||||||
"host": "127.0.0.1",
|
"host": "127.0.0.1",
|
||||||
"port": 11111
|
"port": 11111,
|
||||||
|
"market": ["HK",
|
||||||
|
"US"],
|
||||||
|
"env": [TrdEnv.REAL,
|
||||||
|
TrdEnv.SIMULATE]
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, event_engine):
|
def __init__(self, event_engine):
|
||||||
@ -257,7 +259,7 @@ class FutuGateway(BaseGateway):
|
|||||||
|
|
||||||
futu_symbol = convert_symbol_vt2futu(req.symbol, req.exchange)
|
futu_symbol = convert_symbol_vt2futu(req.symbol, req.exchange)
|
||||||
code, data = self.trade_ctx.place_order(
|
code, data = self.trade_ctx.place_order(
|
||||||
eq.price,
|
req.price,
|
||||||
req.volume,
|
req.volume,
|
||||||
futu_symbol,
|
futu_symbol,
|
||||||
side,
|
side,
|
||||||
@ -395,7 +397,7 @@ class FutuGateway(BaseGateway):
|
|||||||
tick = TickData(
|
tick = TickData(
|
||||||
symbol=symbol,
|
symbol=symbol,
|
||||||
exchange=exchange,
|
exchange=exchange,
|
||||||
datatime=datetime.now(),
|
datetime=datetime.now(),
|
||||||
gateway_name=self.gateway_name
|
gateway_name=self.gateway_name
|
||||||
)
|
)
|
||||||
self.ticks[code] = tick
|
self.ticks[code] = tick
|
||||||
@ -439,10 +441,10 @@ class FutuGateway(BaseGateway):
|
|||||||
ask_data = data["Ask"][i]
|
ask_data = data["Ask"][i]
|
||||||
n = i + 1
|
n = i + 1
|
||||||
|
|
||||||
d["bid_price%s" % n] = bidData[0]
|
d["bid_price%s" % n] = bid_data[0]
|
||||||
d["bid_volume%s" % n] = bidData[1]
|
d["bid_volume%s" % n] = bid_data[1]
|
||||||
d["ask_price%s" % n] = askData[0]
|
d["ask_price%s" % n] = ask_data[0]
|
||||||
d["ask_volume%s" % n] = askData[1]
|
d["ask_volume%s" % n] = ask_data[1]
|
||||||
|
|
||||||
if tick.datetime:
|
if tick.datetime:
|
||||||
self.on_tick(copy(tick))
|
self.on_tick(copy(tick))
|
||||||
|
@ -18,6 +18,7 @@ from ..engine import MainEngine
|
|||||||
from ..event import (EVENT_TICK, EVENT_ORDER, EVENT_TRADE, EVENT_ACCOUNT,
|
from ..event import (EVENT_TICK, EVENT_ORDER, EVENT_TRADE, EVENT_ACCOUNT,
|
||||||
EVENT_POSITION, EVENT_CONTRACT, EVENT_LOG)
|
EVENT_POSITION, EVENT_CONTRACT, EVENT_LOG)
|
||||||
from ..object import SubscribeRequest, OrderRequest, CancelRequest
|
from ..object import SubscribeRequest, OrderRequest, CancelRequest
|
||||||
|
from ..utility import load_setting, save_setting
|
||||||
|
|
||||||
COLOR_LONG = QtGui.QColor("red")
|
COLOR_LONG = QtGui.QColor("red")
|
||||||
COLOR_SHORT = QtGui.QColor("green")
|
COLOR_SHORT = QtGui.QColor("green")
|
||||||
@ -620,8 +621,9 @@ class ConnectDialog(QtWidgets.QDialog):
|
|||||||
|
|
||||||
self.main_engine = main_engine
|
self.main_engine = main_engine
|
||||||
self.gateway_name = gateway_name
|
self.gateway_name = gateway_name
|
||||||
|
self.file_name = f"Connect{gateway_name}.vt"
|
||||||
|
|
||||||
self.line_edits = {}
|
self.widgets = {}
|
||||||
|
|
||||||
self.init_ui()
|
self.init_ui()
|
||||||
|
|
||||||
@ -629,16 +631,35 @@ class ConnectDialog(QtWidgets.QDialog):
|
|||||||
""""""
|
""""""
|
||||||
self.setWindowTitle(f"连接{self.gateway_name}")
|
self.setWindowTitle(f"连接{self.gateway_name}")
|
||||||
|
|
||||||
form = QtWidgets.QFormLayout()
|
# Default setting provides field name, field data type and field default value.
|
||||||
default_setting = self.main_engine.get_default_setting(self.gateway_name)
|
default_setting = self.main_engine.get_default_setting(self.gateway_name)
|
||||||
|
|
||||||
# Initialize line edits and form layout based on default setting.
|
# Saved setting provides field data used last time.
|
||||||
|
loaded_setting = load_setting(self.file_name)
|
||||||
|
|
||||||
|
# Initialize line edits and form layout based on setting.
|
||||||
|
form = QtWidgets.QFormLayout()
|
||||||
|
|
||||||
for field_name, field_value in default_setting.items():
|
for field_name, field_value in default_setting.items():
|
||||||
field_type = type(field_value)
|
field_type = type(field_value)
|
||||||
line_edit = QtWidgets.QLineEdit(str(field_value))
|
|
||||||
|
|
||||||
form.addRow(f"{field_name} <{field_type.__name__}>", line_edit)
|
if field_type == list:
|
||||||
self.line_edits[field_name] = (line_edit, field_type)
|
widget = QtWidgets.QComboBox()
|
||||||
|
widget.addItems(field_value)
|
||||||
|
|
||||||
|
if field_name in loaded_setting:
|
||||||
|
saved_value = loaded_setting[field_name]
|
||||||
|
ix = widget.findText(saved_value)
|
||||||
|
widget.setCurrentIndex(ix)
|
||||||
|
else:
|
||||||
|
widget = QtWidgets.QLineEdit(str(field_value))
|
||||||
|
|
||||||
|
if field_name in loaded_setting:
|
||||||
|
saved_value = loaded_setting[field_name]
|
||||||
|
widget.setText(str(saved_value))
|
||||||
|
|
||||||
|
form.addRow(f"{field_name} <{field_type.__name__}>", widget)
|
||||||
|
self.widgets[field_name] = (widget, field_type)
|
||||||
|
|
||||||
button = QtWidgets.QPushButton(u"连接")
|
button = QtWidgets.QPushButton(u"连接")
|
||||||
button.clicked.connect(self.connect)
|
button.clicked.connect(self.connect)
|
||||||
@ -651,15 +672,22 @@ class ConnectDialog(QtWidgets.QDialog):
|
|||||||
Get setting value from line edits and connect the gateway.
|
Get setting value from line edits and connect the gateway.
|
||||||
"""
|
"""
|
||||||
setting = {}
|
setting = {}
|
||||||
for field_name, tp in self.line_edits.items():
|
for field_name, tp in self.widgets.items():
|
||||||
line_edit, field_type = tp
|
widget, field_type = tp
|
||||||
field_value = field_type(line_edit.text())
|
if field_type == list:
|
||||||
|
field_value = str(widget.currentText())
|
||||||
|
else:
|
||||||
|
field_value = field_type(widget.text())
|
||||||
setting[field_name] = field_value
|
setting[field_name] = field_value
|
||||||
|
|
||||||
self.main_engine.connect(setting, self.gateway_name)
|
self.main_engine.connect(setting, self.gateway_name)
|
||||||
|
|
||||||
|
save_setting(self.file_name, setting)
|
||||||
|
|
||||||
self.accept()
|
self.accept()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class TradingWidget(QtWidgets.QWidget):
|
class TradingWidget(QtWidgets.QWidget):
|
||||||
"""
|
"""
|
||||||
General manual trading widget.
|
General manual trading widget.
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
General utility functions.
|
General utility functions.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import shelve
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from .constant import (STATUS_NOTTRADED, STATUS_PARTTRADED, STATUS_SUBMITTING)
|
from .constant import (STATUS_NOTTRADED, STATUS_PARTTRADED, STATUS_SUBMITTING)
|
||||||
@ -47,3 +48,25 @@ def get_icon_path(file_path: str, ico_name: str):
|
|||||||
ui_path = Path(file_path).parent
|
ui_path = Path(file_path).parent
|
||||||
icon_path = ui_path.joinpath("ico", ico_name)
|
icon_path = ui_path.joinpath("ico", ico_name)
|
||||||
return str(icon_path)
|
return str(icon_path)
|
||||||
|
|
||||||
|
|
||||||
|
def load_setting(file_name: str):
|
||||||
|
"""
|
||||||
|
Load setting from shelve file in temp path.
|
||||||
|
"""
|
||||||
|
file_path = get_temp_path(file_name)
|
||||||
|
f = shelve.open(str(file_path))
|
||||||
|
setting = dict(f)
|
||||||
|
f.close()
|
||||||
|
return setting
|
||||||
|
|
||||||
|
|
||||||
|
def save_setting(file_name: str, setting: dict):
|
||||||
|
"""
|
||||||
|
Save setting into shelve file in temp path.
|
||||||
|
"""
|
||||||
|
file_path = get_temp_path(file_name)
|
||||||
|
f = shelve.open(str(file_path))
|
||||||
|
for k, v in setting.items():
|
||||||
|
f[k] = v
|
||||||
|
f.close()
|
||||||
|
Loading…
Reference in New Issue
Block a user