Merge pull request #1763 from vnpy/algo-csv

[Add] start atrading algos from csv file
This commit is contained in:
vn.py 2019-05-30 15:08:49 +08:00 committed by GitHub
commit 61959d5cb6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -2,6 +2,7 @@
Widget for algo trading. Widget for algo trading.
""" """
import csv
from functools import partial from functools import partial
from datetime import datetime from datetime import datetime
@ -68,6 +69,12 @@ class AlgoWidget(QtWidgets.QWidget):
start_algo_button.clicked.connect(self.start_algo) start_algo_button.clicked.connect(self.start_algo)
form.addRow(start_algo_button) form.addRow(start_algo_button)
load_csv_button = QtWidgets.QPushButton("CSV启动")
load_csv_button.clicked.connect(self.load_csv)
form.addRow(load_csv_button)
form.addRow(QtWidgets.QLabel(""))
form.addRow(QtWidgets.QLabel(""))
form.addRow(QtWidgets.QLabel("")) form.addRow(QtWidgets.QLabel(""))
self.setting_name_line = QtWidgets.QLineEdit() self.setting_name_line = QtWidgets.QLineEdit()
@ -77,8 +84,79 @@ class AlgoWidget(QtWidgets.QWidget):
save_setting_button.clicked.connect(self.save_setting) save_setting_button.clicked.connect(self.save_setting)
form.addRow(save_setting_button) form.addRow(save_setting_button)
for button in [
start_algo_button,
load_csv_button,
save_setting_button
]:
button.setFixedHeight(button.sizeHint().height() * 2)
self.setLayout(form) self.setLayout(form)
def load_csv(self):
""""""
# Get csv file path from dialog
path, type_ = QtWidgets.QFileDialog.getOpenFileName(
self,
u"加载算法配置",
"",
"CSV(*.csv)"
)
if not path:
return
# Create csv DictReader
with open(path, "r") as f:
buf = [line for line in f]
reader = csv.DictReader(buf)
# Check whether the csv file has all fields
for field_name in self.widgets.keys():
if field_name not in reader.fieldnames:
QtWidgets.QMessageBox.warning(
self,
"字段缺失",
f"CSV文件缺失算法{self.template_name}所需字段{field_name}"
)
return
# Read setting
settings = []
for d in reader:
# Initialize algo setting with template name
setting = {
"template_name": self.template_name
}
# Read field from each dict of csv line
for field_name, tp in self.widgets.items():
field_type = tp[-1]
field_text = d[field_name]
if field_type == list:
field_value = field_text
else:
try:
field_value = field_type(field_text)
except ValueError:
QtWidgets.QMessageBox.warning(
self,
"参数错误",
f"{field_name}参数类型应为{field_type},请检查!"
)
return
setting[field_name] = field_value
# Add setting into list
settings.append(setting)
# Only start algos if no exception/error occured
for setting in settings:
self.algo_engine.start_algo(setting)
def get_setting(self): def get_setting(self):
""" """
Get setting value from line edits. Get setting value from line edits.