[Add] Added some comments
[Mod] rename files
This commit is contained in:
parent
5ee4672c29
commit
969c59a08a
@ -1,89 +0,0 @@
|
|||||||
import subprocess
|
|
||||||
from argparse import ArgumentParser
|
|
||||||
|
|
||||||
import os
|
|
||||||
import logging
|
|
||||||
|
|
||||||
|
|
||||||
def is_ui_file(path):
|
|
||||||
return os.path.splitext(path)[1] == '.ui'
|
|
||||||
|
|
||||||
|
|
||||||
def is_py_file(path):
|
|
||||||
return os.path.splitext(path)[1] == '.py'
|
|
||||||
|
|
||||||
|
|
||||||
def seek_files(root, comp): # type(str)->list[str]
|
|
||||||
results = []
|
|
||||||
for root, dirs, files in os.walk(root, followlinks=True):
|
|
||||||
for filename in files:
|
|
||||||
try:
|
|
||||||
path = os.path.join(root, filename)
|
|
||||||
if comp(path):
|
|
||||||
results.append(path)
|
|
||||||
except: # noqa
|
|
||||||
pass
|
|
||||||
return results
|
|
||||||
|
|
||||||
|
|
||||||
class UICompiler(object):
|
|
||||||
|
|
||||||
def __init__(self, root, uic_bin_path, lupdate_bin_path, ts_output,
|
|
||||||
strip_ui_prefix,
|
|
||||||
): # type: (str, str, str, str, bool)->UICompiler
|
|
||||||
self.root = root
|
|
||||||
self.lupdate_bin_path = lupdate_bin_path
|
|
||||||
self.uic_bin_path = uic_bin_path
|
|
||||||
self.ts_output = ts_output
|
|
||||||
self.strip_ui_prefix = strip_ui_prefix
|
|
||||||
|
|
||||||
self.ui_files = []
|
|
||||||
|
|
||||||
def collect_ui(self, path): # type(str)->None
|
|
||||||
self.ui_files.append(path)
|
|
||||||
|
|
||||||
def compile_ui(self, path, out_path): # type: (str, any)->int
|
|
||||||
if out_path is None:
|
|
||||||
dir, filename = os.path.split(path)
|
|
||||||
basename, ext = os.path.splitext(filename)
|
|
||||||
out_path = [os.path.join(dir, 'uic/uic_{}.py'.format(basename))]
|
|
||||||
if self.strip_ui_prefix and basename.startswith('ui'):
|
|
||||||
out_path[0] = os.path.join(dir, 'uic/uic_{}.py'.format(basename[2:]))
|
|
||||||
out_path = out_path[0]
|
|
||||||
uic_dir = os.path.dirname(out_path)
|
|
||||||
if not os.path.exists(uic_dir):
|
|
||||||
os.mkdir(uic_dir)
|
|
||||||
res = subprocess.check_call('{} {} -o {} -x'.format(self.uic_bin_path, path, out_path))
|
|
||||||
|
|
||||||
logging.info('ui compiled : {}', path)
|
|
||||||
return res
|
|
||||||
|
|
||||||
def lupdate(self, py_files, ts_output): # type: (list[str], str)->int
|
|
||||||
uis = " ".join(py_files)
|
|
||||||
return subprocess.check_call('{} {} -ts {}'.format(self.lupdate_bin_path, uis, ts_output))
|
|
||||||
|
|
||||||
def compile_all_ui(self):
|
|
||||||
for ui_file in self.ui_files:
|
|
||||||
self.compile_ui(ui_file, None)
|
|
||||||
|
|
||||||
def exec_(self):
|
|
||||||
self.ui_files = seek_files(self.root, comp=is_ui_file)
|
|
||||||
self.compile_all_ui()
|
|
||||||
|
|
||||||
# translation is not needed currently
|
|
||||||
# py_files = seek_files(self.root, comp=is_py_file)
|
|
||||||
# self.lupdate(py_files=py_files, ts_output=self.ts_output)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
parser = ArgumentParser()
|
|
||||||
parser.add_argument('--root', default='.')
|
|
||||||
parser.add_argument('--strip-ui-prefix', type=bool, default=True)
|
|
||||||
parser.add_argument('--uic', default='pyuic5.exe')
|
|
||||||
parser.add_argument('--lupdate', default='pylupdate5.exe')
|
|
||||||
parser.add_argument('--ts-output', default='CryptoTrader/translate.ts')
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
|
||||||
compiler = UICompiler(root=args.root, uic_bin_path=args.uic, lupdate_bin_path=args.lupdate, ts_output=args.ts_output,
|
|
||||||
strip_ui_prefix=args.strip_ui_prefix)
|
|
||||||
compiler.exec_()
|
|
@ -1,8 +1,7 @@
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from vnpy.trader.app import BaseApp
|
from vnpy.trader.app import BaseApp
|
||||||
from .CsvLoader import CsvLoader
|
from .csv_loader import APP_NAME, CsvLoader
|
||||||
from .base import APP_NAME
|
|
||||||
|
|
||||||
|
|
||||||
class CsvLoaderApp(BaseApp):
|
class CsvLoaderApp(BaseApp):
|
||||||
|
@ -1,2 +0,0 @@
|
|||||||
APP_NAME = "CsvLoader"
|
|
||||||
STOPORDER_PREFIX = "STOP"
|
|
@ -1,3 +1,25 @@
|
|||||||
|
"""
|
||||||
|
Author: nanoric
|
||||||
|
|
||||||
|
Load data from a csv file.
|
||||||
|
|
||||||
|
Differences to 1.9.2:
|
||||||
|
* combine Date column and Time column into one DateTime column
|
||||||
|
|
||||||
|
Sample csv file:
|
||||||
|
|
||||||
|
```csv
|
||||||
|
"DateTime","Open","High","Low","Close","Volume"
|
||||||
|
2010-04-16T09:16:00.000000,3450.0,3488.0,3450.0,3468.0,489
|
||||||
|
2010-04-16T09:17:00.000000,3468.0,3473.8,3467.0,3467.0,302
|
||||||
|
2010-04-16T09:18:00.000000,3467.0,3471.0,3466.0,3467.0,203
|
||||||
|
2010-04-16T09:19:00.000000,3467.0,3468.2,3448.0,3448.0,280
|
||||||
|
2010-04-16T09:20:00.000000,3448.0,3459.0,3448.0,3454.0,250
|
||||||
|
2010-04-16T09:21:00.000000,3454.0,3456.8,3454.0,3456.8,109
|
||||||
|
```
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
import csv
|
import csv
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
@ -7,7 +29,7 @@ from vnpy.trader.database import DbBarData
|
|||||||
from vnpy.trader.engine import BaseEngine, MainEngine
|
from vnpy.trader.engine import BaseEngine, MainEngine
|
||||||
from vnpy.trader.object import BarData
|
from vnpy.trader.object import BarData
|
||||||
|
|
||||||
from .base import APP_NAME
|
APP_NAME = "CsvLoader"
|
||||||
|
|
||||||
|
|
||||||
class CsvLoader(BaseEngine):
|
class CsvLoader(BaseEngine):
|
||||||
@ -29,6 +51,7 @@ class CsvLoader(BaseEngine):
|
|||||||
self.volume_head: str = ''
|
self.volume_head: str = ''
|
||||||
|
|
||||||
def load(self):
|
def load(self):
|
||||||
|
""""""
|
||||||
symbol = self.symbol
|
symbol = self.symbol
|
||||||
exchange = self.exchange
|
exchange = self.exchange
|
||||||
interval = self.interval
|
interval = self.interval
|
@ -1 +1 @@
|
|||||||
from .widget import CsvLoaderWidget
|
from .csv_loader_widget import CsvLoaderWidget
|
||||||
|
@ -1,17 +1,27 @@
|
|||||||
|
"""
|
||||||
|
Author: nanoric
|
||||||
|
|
||||||
|
UI is designed by Qt Designer. source at csv_loader.ui
|
||||||
|
compile:
|
||||||
|
```
|
||||||
|
pyuic5 csv_loader.ui -o uic/uic_csv_loader.py
|
||||||
|
```
|
||||||
|
"""
|
||||||
from PyQt5.QtWidgets import QFileDialog
|
from PyQt5.QtWidgets import QFileDialog
|
||||||
from vnpy.event import EventEngine
|
from vnpy.event import EventEngine
|
||||||
from vnpy.trader.constant import Interval, Exchange
|
from vnpy.trader.constant import Interval, Exchange
|
||||||
from vnpy.trader.engine import MainEngine
|
from vnpy.trader.engine import MainEngine
|
||||||
from vnpy.trader.ui import QtWidgets
|
from vnpy.trader.ui import QtWidgets
|
||||||
|
|
||||||
from .uic.uic_CsvLoader import Ui_CsvLoader
|
from .uic.uic_csv_loader import Ui_CsvLoader
|
||||||
from ..CsvLoader import CsvLoader
|
from ..csv_loader import CsvLoader
|
||||||
|
|
||||||
|
|
||||||
class CsvLoaderWidget(QtWidgets.QWidget):
|
class CsvLoaderWidget(QtWidgets.QWidget):
|
||||||
""""""
|
""""""
|
||||||
|
|
||||||
def __init__(self, main_engine: MainEngine, event_engine: EventEngine):
|
def __init__(self, main_engine: MainEngine, event_engine: EventEngine):
|
||||||
|
""""""
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.loader = CsvLoader(main_engine, event_engine)
|
self.loader = CsvLoader(main_engine, event_engine)
|
||||||
self.ui = Ui_CsvLoader()
|
self.ui = Ui_CsvLoader()
|
||||||
@ -19,6 +29,7 @@ class CsvLoaderWidget(QtWidgets.QWidget):
|
|||||||
self.init_ui()
|
self.init_ui()
|
||||||
|
|
||||||
def init_ui(self):
|
def init_ui(self):
|
||||||
|
""""""
|
||||||
self.ui.setupUi(self)
|
self.ui.setupUi(self)
|
||||||
|
|
||||||
for i in Interval:
|
for i in Interval:
|
||||||
@ -28,12 +39,14 @@ class CsvLoaderWidget(QtWidgets.QWidget):
|
|||||||
self.ui.exchange_combo.addItem(str(i), i)
|
self.ui.exchange_combo.addItem(str(i), i)
|
||||||
|
|
||||||
def on_choose_button_pressed(self):
|
def on_choose_button_pressed(self):
|
||||||
|
""""""
|
||||||
result: str = QFileDialog.getOpenFileName(self)
|
result: str = QFileDialog.getOpenFileName(self)
|
||||||
filename = result[0]
|
filename = result[0]
|
||||||
if filename:
|
if filename:
|
||||||
self.ui.file_edit.setText(filename)
|
self.ui.file_edit.setText(filename)
|
||||||
|
|
||||||
def on_load_button_pressed(self):
|
def on_load_button_pressed(self):
|
||||||
|
""""""
|
||||||
self.loader.file_path = self.ui.file_edit.text()
|
self.loader.file_path = self.ui.file_edit.text()
|
||||||
self.loader.symbol = self.ui.symbol_edit.text()
|
self.loader.symbol = self.ui.symbol_edit.text()
|
||||||
self.loader.exchange = self.ui.exchange_combo.currentData()
|
self.loader.exchange = self.ui.exchange_combo.currentData()
|
@ -1,120 +0,0 @@
|
|||||||
from PyQt5 import QtCore, QtWidgets
|
|
||||||
from vnpy.trader.constant import Exchange, Interval
|
|
||||||
|
|
||||||
|
|
||||||
class CsvLoaderUI(object):
|
|
||||||
|
|
||||||
def __init__(self, instance: QtWidgets.QDialog):
|
|
||||||
instance.setObjectName("CsvLoader")
|
|
||||||
|
|
||||||
self.vertical_layout = QtWidgets.QVBoxLayout(instance)
|
|
||||||
self.vertical_layout.setObjectName("verticalLayout")
|
|
||||||
self.horizontal_layout = QtWidgets.QHBoxLayout()
|
|
||||||
self.horizontal_layout.setObjectName("horizontalLayout")
|
|
||||||
self.choose_button = QtWidgets.QPushButton(instance)
|
|
||||||
self.choose_button.setObjectName("choose_button")
|
|
||||||
self.horizontal_layout.addWidget(self.choose_button)
|
|
||||||
self.file_edit = QtWidgets.QLineEdit(instance)
|
|
||||||
self.file_edit.setObjectName("file_edit")
|
|
||||||
self.horizontal_layout.addWidget(self.file_edit)
|
|
||||||
self.vertical_layout.addLayout(self.horizontal_layout)
|
|
||||||
self.form_layout = QtWidgets.QFormLayout()
|
|
||||||
self.form_layout.setObjectName("formLayout")
|
|
||||||
|
|
||||||
self.label_8 = QtWidgets.QLabel(instance)
|
|
||||||
self.label_8.setObjectName("label_8")
|
|
||||||
self.form_layout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.label_8)
|
|
||||||
self.label_9 = QtWidgets.QLabel(instance)
|
|
||||||
self.label_9.setObjectName("label_9")
|
|
||||||
self.form_layout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_9)
|
|
||||||
self.symbol_edit = QtWidgets.QLineEdit(instance)
|
|
||||||
self.symbol_edit.setObjectName("symbol_edit")
|
|
||||||
self.form_layout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.symbol_edit)
|
|
||||||
self.label_12 = QtWidgets.QLabel(instance)
|
|
||||||
self.label_12.setObjectName("label_12")
|
|
||||||
self.form_layout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_12)
|
|
||||||
self.exchange_combo = QtWidgets.QComboBox(instance)
|
|
||||||
self.exchange_combo.setObjectName("exchange_combo")
|
|
||||||
self.form_layout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.exchange_combo)
|
|
||||||
self.label_11 = QtWidgets.QLabel(instance)
|
|
||||||
self.label_11.setObjectName("label_11")
|
|
||||||
self.form_layout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_11)
|
|
||||||
self.interval_combo = QtWidgets.QComboBox(instance)
|
|
||||||
self.interval_combo.setObjectName("interval_combo")
|
|
||||||
self.form_layout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.interval_combo)
|
|
||||||
self.label = QtWidgets.QLabel(instance)
|
|
||||||
self.label.setObjectName("label")
|
|
||||||
self.form_layout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.label)
|
|
||||||
self.label_2 = QtWidgets.QLabel(instance)
|
|
||||||
self.label_2.setObjectName("label_2")
|
|
||||||
self.form_layout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.label_2)
|
|
||||||
self.datetime_edit = QtWidgets.QLineEdit(instance)
|
|
||||||
self.datetime_edit.setObjectName("datetime_edit")
|
|
||||||
self.form_layout.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.datetime_edit)
|
|
||||||
self.label_3 = QtWidgets.QLabel(instance)
|
|
||||||
self.label_3.setObjectName("label_3")
|
|
||||||
self.form_layout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.label_3)
|
|
||||||
self.open_edit = QtWidgets.QLineEdit(instance)
|
|
||||||
self.open_edit.setObjectName("open_edit")
|
|
||||||
self.form_layout.setWidget(6, QtWidgets.QFormLayout.FieldRole, self.open_edit)
|
|
||||||
self.label_4 = QtWidgets.QLabel(instance)
|
|
||||||
self.label_4.setObjectName("label_4")
|
|
||||||
self.form_layout.setWidget(7, QtWidgets.QFormLayout.LabelRole, self.label_4)
|
|
||||||
self.high_edit = QtWidgets.QLineEdit(instance)
|
|
||||||
self.high_edit.setObjectName("high_edit")
|
|
||||||
self.form_layout.setWidget(7, QtWidgets.QFormLayout.FieldRole, self.high_edit)
|
|
||||||
self.label_5 = QtWidgets.QLabel(instance)
|
|
||||||
self.label_5.setObjectName("label_5")
|
|
||||||
self.form_layout.setWidget(8, QtWidgets.QFormLayout.LabelRole, self.label_5)
|
|
||||||
self.low_edit = QtWidgets.QLineEdit(instance)
|
|
||||||
self.low_edit.setObjectName("low_edit")
|
|
||||||
self.form_layout.setWidget(8, QtWidgets.QFormLayout.FieldRole, self.low_edit)
|
|
||||||
self.label_6 = QtWidgets.QLabel(instance)
|
|
||||||
self.label_6.setObjectName("label_6")
|
|
||||||
self.form_layout.setWidget(9, QtWidgets.QFormLayout.LabelRole, self.label_6)
|
|
||||||
self.close_edit = QtWidgets.QLineEdit(instance)
|
|
||||||
self.close_edit.setObjectName("close_edit")
|
|
||||||
self.form_layout.setWidget(9, QtWidgets.QFormLayout.FieldRole, self.close_edit)
|
|
||||||
self.label_7 = QtWidgets.QLabel(instance)
|
|
||||||
self.label_7.setObjectName("label_7")
|
|
||||||
self.form_layout.setWidget(10, QtWidgets.QFormLayout.LabelRole, self.label_7)
|
|
||||||
self.volume_edit = QtWidgets.QLineEdit(instance)
|
|
||||||
self.volume_edit.setObjectName("volume_edit")
|
|
||||||
self.form_layout.setWidget(10, QtWidgets.QFormLayout.FieldRole, self.volume_edit)
|
|
||||||
|
|
||||||
self.vertical_layout.addLayout(self.form_layout)
|
|
||||||
self.load_button = QtWidgets.QPushButton(instance)
|
|
||||||
self.load_button.setObjectName("load_button")
|
|
||||||
self.vertical_layout.addWidget(self.load_button)
|
|
||||||
|
|
||||||
for i in Interval:
|
|
||||||
self.interval_combo.addItem(str(i), i)
|
|
||||||
|
|
||||||
for i in Exchange:
|
|
||||||
self.exchange_combo.addItem(str(i), i)
|
|
||||||
|
|
||||||
self.retranslate_ui(instance)
|
|
||||||
QtCore.QMetaObject.connectSlotsByName(instance)
|
|
||||||
|
|
||||||
def retranslate_ui(self, instance):
|
|
||||||
_translate = QtCore.QCoreApplication.translate
|
|
||||||
instance.setWindowTitle(_translate("CsvLoader", "Csv载入器"))
|
|
||||||
self.choose_button.setText(_translate("CsvLoader", "选择文件"))
|
|
||||||
self.label_8.setText(_translate("CsvLoader", "合约信息"))
|
|
||||||
self.label_9.setText(_translate("CsvLoader", "Symbol"))
|
|
||||||
self.label_11.setText(_translate("CsvLoader", "Interval"))
|
|
||||||
self.label_12.setText(_translate("CsvLoader", "Exchange"))
|
|
||||||
self.label.setText(_translate("CsvLoader", "表头属性"))
|
|
||||||
self.label_2.setText(_translate("CsvLoader", "Datetime"))
|
|
||||||
self.datetime_edit.setText(_translate("CsvLoader", "DateTime"))
|
|
||||||
self.label_3.setText(_translate("CsvLoader", "Open"))
|
|
||||||
self.open_edit.setText(_translate("CsvLoader", "Open"))
|
|
||||||
self.label_4.setText(_translate("CsvLoader", "High"))
|
|
||||||
self.high_edit.setText(_translate("CsvLoader", "High"))
|
|
||||||
self.label_5.setText(_translate("CsvLoader", "Low"))
|
|
||||||
self.low_edit.setText(_translate("CsvLoader", "Low"))
|
|
||||||
self.label_6.setText(_translate("CsvLoader", "Close"))
|
|
||||||
self.close_edit.setText(_translate("CsvLoader", "Close"))
|
|
||||||
self.label_7.setText(_translate("CsvLoader", "Volume"))
|
|
||||||
self.volume_edit.setText(_translate("CsvLoader", "Volume"))
|
|
||||||
self.load_button.setText(_translate("CsvLoader", "载入"))
|
|
@ -1,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# Form implementation generated from reading ui file '.\vnpy\app\csv_loader\ui\CsvLoader.ui'
|
# Form implementation generated from reading ui file 'csv_loader.ui'
|
||||||
#
|
#
|
||||||
# Created by: PyQt5 UI code generator 5.11.3
|
# Created by: PyQt5 UI code generator 5.11.3
|
||||||
#
|
#
|
||||||
@ -115,13 +115,3 @@ class Ui_CsvLoader(object):
|
|||||||
self.label_12.setText(_translate("CsvLoader", "Exchange"))
|
self.label_12.setText(_translate("CsvLoader", "Exchange"))
|
||||||
self.load_button.setText(_translate("CsvLoader", "载入"))
|
self.load_button.setText(_translate("CsvLoader", "载入"))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
import sys
|
|
||||||
app = QtWidgets.QApplication(sys.argv)
|
|
||||||
CsvLoader = QtWidgets.QDialog()
|
|
||||||
ui = Ui_CsvLoader()
|
|
||||||
ui.setupUi(CsvLoader)
|
|
||||||
CsvLoader.show()
|
|
||||||
sys.exit(app.exec_())
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user