15 changed files with 655 additions and 33 deletions
@ -1,4 +1,8 @@
@@ -1,4 +1,8 @@
|
||||
#!/bin/bash |
||||
|
||||
/usr/bin/pyuic5 ui/mainwindow.ui > src/nailab/ui_gen/mainwindow.py |
||||
/usr/bin/pyuic5 ui/csvdatasourceconfigwidget.ui > src/nailab/ui_gen/csvdatasourceconfigwidget.py |
||||
/usr/bin/pyuic5 ui/mainwindow.ui > src/nailab/ui_gen/mainwindow.py.py |
||||
/usr/bin/pyuic5 ui/newdatasourcedialog.ui > src/nailab/ui_gen/newdatasourcedialog.py |
||||
/usr/bin/pyuic5 ui/strategywidget.ui > src/nailab/ui_gen/strategywidget.py |
||||
|
||||
|
||||
|
||||
@ -0,0 +1,19 @@
@@ -0,0 +1,19 @@
|
||||
|
||||
from PyQt5 import QtCore, QtGui, QtWidgets |
||||
from PyQt5.Qsci import * |
||||
|
||||
from ui_gen.csvdatasourceconfigwidget import Ui_CSVDataSourceConfigWidget |
||||
|
||||
class CSVDataSourceConfigWidget(QtWidgets.QWidget): |
||||
|
||||
def __init__(self, parent=None): |
||||
super().__init__(parent) |
||||
|
||||
self.ui = Ui_CSVDataSourceConfigWidget() |
||||
self.ui.setupUi(self) |
||||
|
||||
def browse(self): |
||||
dirname = QtWidgets.QFileDialog.getExistingDirectory(self, self.tr("Select a directory..."), "", QtWidgets.QFileDialog.ShowDirsOnly) |
||||
if dirname != "": |
||||
self.ui.e_path.setText(dirname) |
||||
|
||||
@ -0,0 +1,24 @@
@@ -0,0 +1,24 @@
|
||||
|
||||
from PyQt5 import QtCore, QtGui, QtWidgets |
||||
from PyQt5.Qsci import * |
||||
|
||||
from ui_gen.newdatasourcedialog import Ui_NewDataSourceDialog |
||||
from ui.csvdatasourceconfigwidget import CSVDataSourceConfigWidget |
||||
|
||||
from data.csvfolderdatasource import CsvFolderDataSource |
||||
|
||||
class NewDataSourceDialog(QtWidgets.QDialog): |
||||
|
||||
def __init__(self, parent): |
||||
super().__init__(parent) |
||||
|
||||
self.ui = Ui_NewDataSourceDialog() |
||||
self.ui.setupUi(self) |
||||
|
||||
index = self.ui.widgets.addWidget(CSVDataSourceConfigWidget()) |
||||
self.ui.widgets.setCurrentIndex(index) |
||||
|
||||
def get_data_source(self): |
||||
return CsvFolderDataSource(self.ui.e_sourceName.text(), self.ui.widgets.currentWidget().ui.e_path.text()) |
||||
|
||||
|
||||
@ -0,0 +1,48 @@
@@ -0,0 +1,48 @@
|
||||
# -*- coding: utf-8 -*- |
||||
|
||||
# Form implementation generated from reading ui file 'ui/csvdatasourceconfigwidget.ui' |
||||
# |
||||
# Created by: PyQt5 UI code generator 5.5.1 |
||||
# |
||||
# WARNING! All changes made in this file will be lost! |
||||
|
||||
from PyQt5 import QtCore, QtGui, QtWidgets |
||||
|
||||
class Ui_CSVDataSourceConfigWidget(object): |
||||
def setupUi(self, CSVDataSourceConfigWidget): |
||||
CSVDataSourceConfigWidget.setObjectName("CSVDataSourceConfigWidget") |
||||
CSVDataSourceConfigWidget.resize(529, 313) |
||||
self.gridLayout = QtWidgets.QGridLayout(CSVDataSourceConfigWidget) |
||||
self.gridLayout.setObjectName("gridLayout") |
||||
self.label = QtWidgets.QLabel(CSVDataSourceConfigWidget) |
||||
self.label.setObjectName("label") |
||||
self.gridLayout.addWidget(self.label, 0, 0, 1, 1) |
||||
self.e_path = QtWidgets.QLineEdit(CSVDataSourceConfigWidget) |
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) |
||||
sizePolicy.setHorizontalStretch(0) |
||||
sizePolicy.setVerticalStretch(0) |
||||
sizePolicy.setHeightForWidth(self.e_path.sizePolicy().hasHeightForWidth()) |
||||
self.e_path.setSizePolicy(sizePolicy) |
||||
self.e_path.setObjectName("e_path") |
||||
self.gridLayout.addWidget(self.e_path, 0, 1, 1, 1) |
||||
self.b_browse = QtWidgets.QPushButton(CSVDataSourceConfigWidget) |
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) |
||||
sizePolicy.setHorizontalStretch(0) |
||||
sizePolicy.setVerticalStretch(0) |
||||
sizePolicy.setHeightForWidth(self.b_browse.sizePolicy().hasHeightForWidth()) |
||||
self.b_browse.setSizePolicy(sizePolicy) |
||||
self.b_browse.setObjectName("b_browse") |
||||
self.gridLayout.addWidget(self.b_browse, 0, 2, 1, 1) |
||||
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) |
||||
self.gridLayout.addItem(spacerItem, 1, 0, 1, 1) |
||||
|
||||
self.retranslateUi(CSVDataSourceConfigWidget) |
||||
self.b_browse.clicked.connect(CSVDataSourceConfigWidget.browse) |
||||
QtCore.QMetaObject.connectSlotsByName(CSVDataSourceConfigWidget) |
||||
|
||||
def retranslateUi(self, CSVDataSourceConfigWidget): |
||||
_translate = QtCore.QCoreApplication.translate |
||||
CSVDataSourceConfigWidget.setWindowTitle(_translate("CSVDataSourceConfigWidget", "Form")) |
||||
self.label.setText(_translate("CSVDataSourceConfigWidget", "CSV folder path")) |
||||
self.b_browse.setText(_translate("CSVDataSourceConfigWidget", "...")) |
||||
|
||||
@ -0,0 +1,77 @@
@@ -0,0 +1,77 @@
|
||||
# -*- coding: utf-8 -*- |
||||
|
||||
# Form implementation generated from reading ui file 'ui/mainwindow.ui' |
||||
# |
||||
# Created by: PyQt5 UI code generator 5.5.1 |
||||
# |
||||
# WARNING! All changes made in this file will be lost! |
||||
|
||||
from PyQt5 import QtCore, QtGui, QtWidgets |
||||
|
||||
class Ui_MainWindow(object): |
||||
def setupUi(self, MainWindow): |
||||
MainWindow.setObjectName("MainWindow") |
||||
MainWindow.resize(1060, 587) |
||||
self.centralwidget = QtWidgets.QWidget(MainWindow) |
||||
self.centralwidget.setObjectName("centralwidget") |
||||
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) |
||||
self.gridLayout.setContentsMargins(3, 3, 3, 3) |
||||
self.gridLayout.setObjectName("gridLayout") |
||||
self.tabs = QtWidgets.QTabWidget(self.centralwidget) |
||||
self.tabs.setTabsClosable(True) |
||||
self.tabs.setObjectName("tabs") |
||||
self.gridLayout.addWidget(self.tabs, 0, 0, 1, 1) |
||||
MainWindow.setCentralWidget(self.centralwidget) |
||||
self.menubar = QtWidgets.QMenuBar(MainWindow) |
||||
self.menubar.setGeometry(QtCore.QRect(0, 0, 1060, 19)) |
||||
self.menubar.setObjectName("menubar") |
||||
self.menuFile = QtWidgets.QMenu(self.menubar) |
||||
self.menuFile.setObjectName("menuFile") |
||||
self.menuBacktest = QtWidgets.QMenu(self.menubar) |
||||
self.menuBacktest.setObjectName("menuBacktest") |
||||
MainWindow.setMenuBar(self.menubar) |
||||
self.statusbar = QtWidgets.QStatusBar(MainWindow) |
||||
self.statusbar.setObjectName("statusbar") |
||||
MainWindow.setStatusBar(self.statusbar) |
||||
self.toolBar = QtWidgets.QToolBar(MainWindow) |
||||
self.toolBar.setObjectName("toolBar") |
||||
MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar) |
||||
self.actionOpenTrades = QtWidgets.QAction(MainWindow) |
||||
self.actionOpenTrades.setObjectName("actionOpenTrades") |
||||
self.actionNew_strategy = QtWidgets.QAction(MainWindow) |
||||
self.actionNew_strategy.setObjectName("actionNew_strategy") |
||||
self.actionOpen_strategy = QtWidgets.QAction(MainWindow) |
||||
self.actionOpen_strategy.setObjectName("actionOpen_strategy") |
||||
self.actionExecute = QtWidgets.QAction(MainWindow) |
||||
self.actionExecute.setObjectName("actionExecute") |
||||
self.actionSave_strategy = QtWidgets.QAction(MainWindow) |
||||
self.actionSave_strategy.setObjectName("actionSave_strategy") |
||||
self.menuFile.addAction(self.actionNew_strategy) |
||||
self.menuFile.addAction(self.actionOpen_strategy) |
||||
self.menuBacktest.addAction(self.actionExecute) |
||||
self.menubar.addAction(self.menuFile.menuAction()) |
||||
self.menubar.addAction(self.menuBacktest.menuAction()) |
||||
self.toolBar.addAction(self.actionSave_strategy) |
||||
self.toolBar.addAction(self.actionExecute) |
||||
|
||||
self.retranslateUi(MainWindow) |
||||
self.tabs.setCurrentIndex(-1) |
||||
self.actionOpen_strategy.triggered.connect(MainWindow.openStrategy) |
||||
self.tabs.tabCloseRequested['int'].connect(MainWindow.tabCloseRequested) |
||||
self.actionNew_strategy.triggered.connect(MainWindow.newStrategy) |
||||
self.actionExecute.triggered.connect(MainWindow.executeStrategy) |
||||
self.actionSave_strategy.triggered.connect(MainWindow.saveStrategy) |
||||
QtCore.QMetaObject.connectSlotsByName(MainWindow) |
||||
|
||||
def retranslateUi(self, MainWindow): |
||||
_translate = QtCore.QCoreApplication.translate |
||||
MainWindow.setWindowTitle(_translate("MainWindow", "Nailab")) |
||||
self.menuFile.setTitle(_translate("MainWindow", "File")) |
||||
self.menuBacktest.setTitle(_translate("MainWindow", "Backtest")) |
||||
self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar")) |
||||
self.actionOpenTrades.setText(_translate("MainWindow", "Open...")) |
||||
self.actionNew_strategy.setText(_translate("MainWindow", "New strategy")) |
||||
self.actionOpen_strategy.setText(_translate("MainWindow", "Open strategy")) |
||||
self.actionExecute.setText(_translate("MainWindow", "Execute")) |
||||
self.actionSave_strategy.setText(_translate("MainWindow", "Save strategy")) |
||||
|
||||
@ -0,0 +1,60 @@
@@ -0,0 +1,60 @@
|
||||
# -*- coding: utf-8 -*- |
||||
|
||||
# Form implementation generated from reading ui file 'ui/newdatasourcedialog.ui' |
||||
# |
||||
# Created by: PyQt5 UI code generator 5.5.1 |
||||
# |
||||
# WARNING! All changes made in this file will be lost! |
||||
|
||||
from PyQt5 import QtCore, QtGui, QtWidgets |
||||
|
||||
class Ui_NewDataSourceDialog(object): |
||||
def setupUi(self, NewDataSourceDialog): |
||||
NewDataSourceDialog.setObjectName("NewDataSourceDialog") |
||||
NewDataSourceDialog.resize(786, 334) |
||||
self.gridLayout = QtWidgets.QGridLayout(NewDataSourceDialog) |
||||
self.gridLayout.setObjectName("gridLayout") |
||||
self.widgets = QtWidgets.QStackedWidget(NewDataSourceDialog) |
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding) |
||||
sizePolicy.setHorizontalStretch(0) |
||||
sizePolicy.setVerticalStretch(0) |
||||
sizePolicy.setHeightForWidth(self.widgets.sizePolicy().hasHeightForWidth()) |
||||
self.widgets.setSizePolicy(sizePolicy) |
||||
self.widgets.setObjectName("widgets") |
||||
self.gridLayout.addWidget(self.widgets, 3, 0, 1, 2) |
||||
self.e_sourceName = QtWidgets.QLineEdit(NewDataSourceDialog) |
||||
self.e_sourceName.setObjectName("e_sourceName") |
||||
self.gridLayout.addWidget(self.e_sourceName, 0, 1, 1, 1) |
||||
self.label = QtWidgets.QLabel(NewDataSourceDialog) |
||||
self.label.setObjectName("label") |
||||
self.gridLayout.addWidget(self.label, 1, 0, 1, 1) |
||||
self.cb_sourceType = QtWidgets.QComboBox(NewDataSourceDialog) |
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) |
||||
sizePolicy.setHorizontalStretch(0) |
||||
sizePolicy.setVerticalStretch(0) |
||||
sizePolicy.setHeightForWidth(self.cb_sourceType.sizePolicy().hasHeightForWidth()) |
||||
self.cb_sourceType.setSizePolicy(sizePolicy) |
||||
self.cb_sourceType.setObjectName("cb_sourceType") |
||||
self.cb_sourceType.addItem("") |
||||
self.gridLayout.addWidget(self.cb_sourceType, 1, 1, 1, 1) |
||||
self.label_2 = QtWidgets.QLabel(NewDataSourceDialog) |
||||
self.label_2.setObjectName("label_2") |
||||
self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1) |
||||
self.buttonBox = QtWidgets.QDialogButtonBox(NewDataSourceDialog) |
||||
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok) |
||||
self.buttonBox.setObjectName("buttonBox") |
||||
self.gridLayout.addWidget(self.buttonBox, 4, 0, 1, 2) |
||||
|
||||
self.retranslateUi(NewDataSourceDialog) |
||||
self.widgets.setCurrentIndex(-1) |
||||
self.buttonBox.accepted.connect(NewDataSourceDialog.accept) |
||||
self.buttonBox.rejected.connect(NewDataSourceDialog.reject) |
||||
QtCore.QMetaObject.connectSlotsByName(NewDataSourceDialog) |
||||
|
||||
def retranslateUi(self, NewDataSourceDialog): |
||||
_translate = QtCore.QCoreApplication.translate |
||||
NewDataSourceDialog.setWindowTitle(_translate("NewDataSourceDialog", "New data source")) |
||||
self.label.setText(_translate("NewDataSourceDialog", "Data source type")) |
||||
self.cb_sourceType.setItemText(0, _translate("NewDataSourceDialog", "CSV")) |
||||
self.label_2.setText(_translate("NewDataSourceDialog", "Data source name")) |
||||
|
||||
@ -0,0 +1,84 @@
@@ -0,0 +1,84 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<ui version="4.0"> |
||||
<class>CSVDataSourceConfigWidget</class> |
||||
<widget class="QWidget" name="CSVDataSourceConfigWidget"> |
||||
<property name="geometry"> |
||||
<rect> |
||||
<x>0</x> |
||||
<y>0</y> |
||||
<width>529</width> |
||||
<height>313</height> |
||||
</rect> |
||||
</property> |
||||
<property name="windowTitle"> |
||||
<string>Form</string> |
||||
</property> |
||||
<layout class="QGridLayout" name="gridLayout"> |
||||
<item row="0" column="0"> |
||||
<widget class="QLabel" name="label"> |
||||
<property name="text"> |
||||
<string>CSV folder path</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item row="0" column="1"> |
||||
<widget class="QLineEdit" name="e_path"> |
||||
<property name="sizePolicy"> |
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed"> |
||||
<horstretch>0</horstretch> |
||||
<verstretch>0</verstretch> |
||||
</sizepolicy> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item row="0" column="2"> |
||||
<widget class="QPushButton" name="b_browse"> |
||||
<property name="sizePolicy"> |
||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed"> |
||||
<horstretch>0</horstretch> |
||||
<verstretch>0</verstretch> |
||||
</sizepolicy> |
||||
</property> |
||||
<property name="text"> |
||||
<string>...</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item row="1" column="0"> |
||||
<spacer name="verticalSpacer"> |
||||
<property name="orientation"> |
||||
<enum>Qt::Vertical</enum> |
||||
</property> |
||||
<property name="sizeHint" stdset="0"> |
||||
<size> |
||||
<width>20</width> |
||||
<height>40</height> |
||||
</size> |
||||
</property> |
||||
</spacer> |
||||
</item> |
||||
</layout> |
||||
</widget> |
||||
<resources/> |
||||
<connections> |
||||
<connection> |
||||
<sender>b_browse</sender> |
||||
<signal>clicked()</signal> |
||||
<receiver>CSVDataSourceConfigWidget</receiver> |
||||
<slot>browse()</slot> |
||||
<hints> |
||||
<hint type="sourcelabel"> |
||||
<x>482</x> |
||||
<y>27</y> |
||||
</hint> |
||||
<hint type="destinationlabel"> |
||||
<x>494</x> |
||||
<y>47</y> |
||||
</hint> |
||||
</hints> |
||||
</connection> |
||||
</connections> |
||||
<slots> |
||||
<slot>browse()</slot> |
||||
</slots> |
||||
</ui> |
||||
@ -0,0 +1,106 @@
@@ -0,0 +1,106 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<ui version="4.0"> |
||||
<class>NewDataSourceDialog</class> |
||||
<widget class="QDialog" name="NewDataSourceDialog"> |
||||
<property name="geometry"> |
||||
<rect> |
||||
<x>0</x> |
||||
<y>0</y> |
||||
<width>786</width> |
||||
<height>334</height> |
||||
</rect> |
||||
</property> |
||||
<property name="windowTitle"> |
||||
<string>New data source</string> |
||||
</property> |
||||
<layout class="QGridLayout" name="gridLayout"> |
||||
<item row="3" column="0" colspan="2"> |
||||
<widget class="QStackedWidget" name="widgets"> |
||||
<property name="sizePolicy"> |
||||
<sizepolicy hsizetype="Preferred" vsizetype="Expanding"> |
||||
<horstretch>0</horstretch> |
||||
<verstretch>0</verstretch> |
||||
</sizepolicy> |
||||
</property> |
||||
<property name="currentIndex"> |
||||
<number>-1</number> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item row="0" column="1"> |
||||
<widget class="QLineEdit" name="e_sourceName"/> |
||||
</item> |
||||
<item row="1" column="0"> |
||||
<widget class="QLabel" name="label"> |
||||
<property name="text"> |
||||
<string>Data source type</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item row="1" column="1"> |
||||
<widget class="QComboBox" name="cb_sourceType"> |
||||
<property name="sizePolicy"> |
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> |
||||
<horstretch>0</horstretch> |
||||
<verstretch>0</verstretch> |
||||
</sizepolicy> |
||||
</property> |
||||
<item> |
||||
<property name="text"> |
||||
<string>CSV</string> |
||||
</property> |
||||
</item> |
||||
</widget> |
||||
</item> |
||||
<item row="0" column="0"> |
||||
<widget class="QLabel" name="label_2"> |
||||
<property name="text"> |
||||
<string>Data source name</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item row="4" column="0" colspan="2"> |
||||
<widget class="QDialogButtonBox" name="buttonBox"> |
||||
<property name="standardButtons"> |
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</widget> |
||||
<resources/> |
||||
<connections> |
||||
<connection> |
||||
<sender>buttonBox</sender> |
||||
<signal>accepted()</signal> |
||||
<receiver>NewDataSourceDialog</receiver> |
||||
<slot>accept()</slot> |
||||
<hints> |
||||
<hint type="sourcelabel"> |
||||
<x>623</x> |
||||
<y>323</y> |
||||
</hint> |
||||
<hint type="destinationlabel"> |
||||
<x>600</x> |
||||
<y>333</y> |
||||
</hint> |
||||
</hints> |
||||
</connection> |
||||
<connection> |
||||
<sender>buttonBox</sender> |
||||
<signal>rejected()</signal> |
||||
<receiver>NewDataSourceDialog</receiver> |
||||
<slot>reject()</slot> |
||||
<hints> |
||||
<hint type="sourcelabel"> |
||||
<x>563</x> |
||||
<y>317</y> |
||||
</hint> |
||||
<hint type="destinationlabel"> |
||||
<x>461</x> |
||||
<y>331</y> |
||||
</hint> |
||||
</hints> |
||||
</connection> |
||||
</connections> |
||||
</ui> |
||||
Loading…
Reference in new issue