Browse Source

Strategy execution

master
Denis Tereshkin 7 years ago
parent
commit
271f19de66
  1. 2
      .gitignore
  2. 2
      src/nailab/data/csvfolderdatasource.py
  3. 2
      src/nailab/data/datasourcemanager.py
  4. 8
      src/nailab/execution/executor.py
  5. 2
      src/nailab/nailab.py
  6. 1
      src/nailab/templates/new_strategy.py
  7. 0
      src/nailab/ui/__init__.py
  8. 49
      src/nailab/ui/mainwindow.py
  9. 134
      src/nailab/ui/strategywidget.py
  10. 14
      src/nailab/ui_gen/mainwindow.py
  11. 72
      src/nailab/ui_gen/strategywidget.py
  12. 41
      ui/mainwindow.ui
  13. 169
      ui/strategywidget.ui

2
.gitignore vendored

@ -5,3 +5,5 @@ build/*
*.pyc *.pyc
src/*.egg-info/* src/*.egg-info/*
*~ *~
\#*
\#*.*

2
src/nailab/data/csvfolderdatasource.py

@ -1,5 +1,5 @@
from nailab.data.datasource import DataSource from data.datasource import DataSource
from naiback.data.feeds.genericcsvfeed import GenericCSVFeed from naiback.data.feeds.genericcsvfeed import GenericCSVFeed

2
src/nailab/data/datasourcemanager.py

@ -1,5 +1,5 @@
from nailab.data.csvfolderdatasource import CsvFolderDataSource from data.csvfolderdatasource import CsvFolderDataSource
class DataSourceManager: class DataSourceManager:

8
src/nailab/execution/executor.py

@ -9,7 +9,7 @@ class Executor:
def __init__(self): def __init__(self):
pass pass
def execute_from_file(self, path, feeds): def execute_from_file(self, path, feeds, extents=None):
loader = SourceFileLoader('execution._current_strategy', path) loader = SourceFileLoader('execution._current_strategy', path)
mod = loader.load_module() mod = loader.load_module()
for item in inspect.getmembers(mod, inspect.isclass): for item in inspect.getmembers(mod, inspect.isclass):
@ -18,7 +18,11 @@ class Executor:
strategy = klass() strategy = klass()
for feed in feeds: for feed in feeds:
strategy.add_feed(feed) strategy.add_feed(feed)
strategy.run()
if extents is None:
strategy.run()
else:
strategy.run(from_time=extents[0], to_time=extents[1])
results = strategy.get_analyzer('stats').get_result() results = strategy.get_analyzer('stats').get_result()
trades = strategy.get_analyzer('tradeslist').get_result() trades = strategy.get_analyzer('tradeslist').get_result()

2
src/nailab/nailab.py

@ -1,7 +1,9 @@
#!/usr/bin/env python3
import sys import sys
from PyQt5.QtWidgets import QApplication from PyQt5.QtWidgets import QApplication
from PyQt5 import QtCore from PyQt5 import QtCore
from ui.mainwindow import MainWindow from ui.mainwindow import MainWindow
def main(): def main():

1
src/nailab/templates/new_strategy.py

@ -1,6 +1,7 @@
new_strategy_template = ''' new_strategy_template = '''
from naiback.strategy import Strategy from naiback.strategy import Strategy
from naiback.indicators import *
class MyStrategy(Strategy): class MyStrategy(Strategy):

0
src/nailab/ui/__init__.py

49
src/nailab/ui/mainwindow.py

@ -5,7 +5,7 @@ import importlib.util
import inspect import inspect
from execution.executor import Executor from execution.executor import Executor
from naiback.data.feeds.genericcsvfeed import GenericCSVFeed from data.datasourcemanager import DataSourceManager
from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qsci import * from PyQt5.Qsci import *
@ -14,9 +14,7 @@ from ui_gen.mainwindow import Ui_MainWindow
from ui.strategywidget import StrategyWidget from ui.strategywidget import StrategyWidget
from naiback.strategy import Strategy from naiback.strategy import Strategy
from templates.new_strategy import new_strategy_template
def is_strategy(obj):
return inspect.isclass(obj) and Strategy in inspect.getmro(obj)[1:]
class MainWindow(QtWidgets.QMainWindow): class MainWindow(QtWidgets.QMainWindow):
@ -24,6 +22,8 @@ class MainWindow(QtWidgets.QMainWindow):
super().__init__(parent) super().__init__(parent)
self.sources = [] self.sources = []
self.datasourcemanager = DataSourceManager()
self.datasourcemanager.load_sources()
self.ui = Ui_MainWindow() self.ui = Ui_MainWindow()
self.ui.setupUi(self) self.ui.setupUi(self)
@ -32,7 +32,7 @@ class MainWindow(QtWidgets.QMainWindow):
pass pass
def newStrategy(self): def newStrategy(self):
self._makeEditor() self._makeEditor(content=new_strategy_template)
def openStrategy(self): def openStrategy(self):
settings = QtCore.QSettings() settings = QtCore.QSettings()
@ -42,24 +42,43 @@ class MainWindow(QtWidgets.QMainWindow):
self._makeEditor(filename, os.path.basename(filename), f.read()) self._makeEditor(filename, os.path.basename(filename), f.read())
settings.setValue("open_strategy_path", os.path.dirname(filename)) settings.setValue("open_strategy_path", os.path.dirname(filename))
def saveStrategy(self):
settings = QtCore.QSettings()
currentWidget = self.ui.tabs.currentWidget()
if currentWidget.source_file is None:
currentWidget.source_file = QtWidgets.QFileDialog.getSaveFileName(self, self.tr("Select a file..."), settings.value("save_strategy_path"), self.tr("Python (*.py);;All (*.*, *)"))[0]
if currentWidget.source_file != "":
settings.setValue("save_strategy_path", os.path.dirname(currentWidget.source_file))
self.ui.tabs.setTabText(self.ui.tabs.currentIndex(), os.path.basename(currentWidget.source_file))
if currentWidget.source_file != "":
currentWidget.save()
def executeStrategy(self): def executeStrategy(self):
source_file = self.sources[self.ui.tabs.currentIndex()] source_file = self.ui.tabs.currentWidget().source_file
executor = Executor() executor = Executor()
result = executor.execute_from_file(source_file, []) selected_feed_ids = self.ui.tabs.currentWidget().get_selected_feeds()
print(result) selected_feeds = []
for (source_id, feed_id) in selected_feed_ids:
# spec = importlib.util.spec_from_file_location("m", source_file) try:
# mod = importlib.util.module_from_spec(spec) selected_feeds.append(self.datasourcemanager.get_source(source_id).get_feed(feed_id))
# spec.loader.exec_module(mod) except e:
# classes = inspect.getmembers(mod, is_strategy) print('Error: ' + str(e))
# strategy_class = classes[0][0]
try:
result = executor.execute_from_file(source_file, selected_feeds, self.ui.tabs.currentWidget().get_time_window())
print(result)
self.ui.tabs.currentWidget().set_result(result)
except Exception as e:
print(e)
def tabCloseRequested(self, tab_index): def tabCloseRequested(self, tab_index):
del self.sources[tab_index] del self.sources[tab_index]
self.ui.tabs.widget(tab_index).save_state()
self.ui.tabs.removeTab(tab_index) self.ui.tabs.removeTab(tab_index)
def _makeEditor(self, source_file=None, tab_name="Untitled", content=None): def _makeEditor(self, source_file=None, tab_name="Untitled", content=None):
editor = StrategyWidget(self, content) editor = StrategyWidget(self.datasourcemanager, source_file, self, content)
self.sources.append(source_file) self.sources.append(source_file)
self.ui.tabs.addTab(editor, tab_name) self.ui.tabs.addTab(editor, tab_name)

134
src/nailab/ui/strategywidget.py

@ -4,14 +4,21 @@ from PyQt5.Qsci import *
from ui_gen.strategywidget import Ui_StrategyWidget from ui_gen.strategywidget import Ui_StrategyWidget
ROLE_FEED_ID = QtCore.Qt.UserRole + 1
class StrategyWidget(QtWidgets.QWidget): class StrategyWidget(QtWidgets.QWidget):
def __init__(self, parent=None, content=None): def __init__(self, datasourcemanager, source_file, parent=None, content=None):
super().__init__(parent) super().__init__(parent)
self.ui = Ui_StrategyWidget() self.ui = Ui_StrategyWidget()
self.ui.setupUi(self) self.ui.setupUi(self)
self.source_file = source_file
self.datasourcemanager = datasourcemanager
self.update_feeds_list()
self.ui.splitter.setSizes([20, 80]) self.ui.splitter.setSizes([20, 80])
self.ui.splitter.setStretchFactor(0, 1) self.ui.splitter.setStretchFactor(0, 1)
self.ui.splitter.setStretchFactor(1, 1) self.ui.splitter.setStretchFactor(1, 1)
@ -26,3 +33,128 @@ class StrategyWidget(QtWidgets.QWidget):
lexer.setFont(font) lexer.setFont(font)
self.ui.editor.setLexer(lexer) self.ui.editor.setLexer(lexer)
self.ui.editor.setUtf8(True) self.ui.editor.setUtf8(True)
self.result = []
self.result_widget = None
s = QtCore.QSettings()
if s.value("time_window") is not None:
(from_time, to_time) = s.value("time_window")
self.ui.rb_timeWindow.setChecked(True)
self.ui.dte_from.setDateTime(from_time)
self.ui.dte_to.setDateTime(to_time)
def save_state(self):
s = QtCore.QSettings()
if self.ui.rb_allData.isChecked():
s.setValue("time_window", None)
else:
s.setValue("time_window", (self.ui.dte_from.dateTime(), self.ui.dte_to.dateTime()))
def save(self):
with open(self.source_file, "w") as f:
f.write(self.ui.editor.text())
def get_time_window(self):
if self.ui.rb_allData.isChecked():
return None
elif self.ui.rb_timeWindow.isChecked():
return (self.ui.dte_from.dateTime(), self.ui.dte_to.dateTime())
def update_feeds_list(self):
sources = self.datasourcemanager.all_sources()
for source in sources:
src_item = QtWidgets.QTreeWidgetItem(self.ui.tw_feeds)
src_item.setText(0, source.name)
src_item.setData(0, ROLE_FEED_ID, "")
for feed in source.available_feeds():
feed_item = QtWidgets.QTreeWidgetItem(src_item)
feed_item.setText(0, feed)
feed_item.setData(0, ROLE_FEED_ID, (source.name, feed))
def get_selected_feeds(self):
feeds = []
items = self.ui.tw_feeds.selectedItems()
for item in items:
feeds.append(item.data(0, ROLE_FEED_ID))
return feeds
def set_result(self, result):
self.result = result
self.update_result()
def update_result(self):
if self.result_widget is None:
self.result_widget = QtWidgets.QTreeWidget(self)
self.ui.tabs.addTab(self.result_widget, "Result")
rw = self.result_widget
rw.clear()
rw.setHeaderLabels(["", "Long", "Short", "All"])
total_trades = QtWidgets.QTreeWidgetItem(self.result_widget)
total_trades.setText(0, "Total trades")
total_trades.setText(1, "{:d}".format(self.result[0]['long']['number_of_trades']))
total_trades.setText(2, "{:d}".format(self.result[0]['short']['number_of_trades']))
total_trades.setText(3, "{:d}".format(self.result[0]['all']['number_of_trades']))
won_trades = QtWidgets.QTreeWidgetItem(self.result_widget)
won_trades.setText(0, "Won trades")
won_trades.setText(1, "{:d}".format(self.result[0]['long']['won']))
won_trades.setText(2, "{:d}".format(self.result[0]['short']['won']))
won_trades.setText(3, "{:d}".format(self.result[0]['all']['won']))
lost_trades = QtWidgets.QTreeWidgetItem(self.result_widget)
lost_trades.setText(0, "Lost trades")
lost_trades.setText(1, "{:d}".format(self.result[0]['long']['lost']))
lost_trades.setText(2, "{:d}".format(self.result[0]['short']['lost']))
lost_trades.setText(3, "{:d}".format(self.result[0]['all']['lost']))
net_profit = QtWidgets.QTreeWidgetItem(self.result_widget)
net_profit.setText(0, "Net profit")
net_profit.setText(1, "{:.3f}".format(self.result[0]['long']['net_profit']))
net_profit.setText(2, "{:.3f}".format(self.result[0]['short']['net_profit']))
net_profit.setText(3, "{:.3f}".format(self.result[0]['all']['net_profit']))
total_won = QtWidgets.QTreeWidgetItem(self.result_widget)
total_won.setText(0, "Total won")
total_won.setText(1, "{:.3f}".format(self.result[0]['long']['total_won']))
total_won.setText(2, "{:.3f}".format(self.result[0]['short']['total_won']))
total_won.setText(3, "{:.3f}".format(self.result[0]['all']['total_won']))
total_lost = QtWidgets.QTreeWidgetItem(self.result_widget)
total_lost.setText(0, "Total lost")
total_lost.setText(1, "{:.3f}".format(self.result[0]['long']['total_lost']))
total_lost.setText(2, "{:.3f}".format(self.result[0]['short']['total_lost']))
total_lost.setText(3, "{:.3f}".format(self.result[0]['all']['total_lost']))
average_pnl = QtWidgets.QTreeWidgetItem(self.result_widget)
average_pnl.setText(0, "Average pnl")
average_pnl.setText(1, "{:.3f}".format(self.result[0]['long']['avg']))
average_pnl.setText(2, "{:.3f}".format(self.result[0]['short']['avg']))
average_pnl.setText(3, "{:.3f}".format(self.result[0]['all']['avg']))
average_percentage = QtWidgets.QTreeWidgetItem(self.result_widget)
average_percentage.setText(0, "Average %")
average_percentage.setText(1, "{:.3f}".format(self.result[0]['long']['avg_percentage']))
average_percentage.setText(2, "{:.3f}".format(self.result[0]['short']['avg_percentage']))
average_percentage.setText(3, "{:.3f}".format(self.result[0]['all']['avg_percentage']))
average_bars_in_trade = QtWidgets.QTreeWidgetItem(self.result_widget)
average_bars_in_trade.setText(0, "Average bars in trade")
average_bars_in_trade.setText(1, "{:.3f}".format(self.result[0]['long']['avg_bars']))
average_bars_in_trade.setText(2, "{:.3f}".format(self.result[0]['short']['avg_bars']))
average_bars_in_trade.setText(3, "{:.3f}".format(self.result[0]['all']['avg_bars']))
profit_factor = QtWidgets.QTreeWidgetItem(self.result_widget)
profit_factor.setText(0, "Profit factor")
profit_factor.setText(1, "{:.3f}".format(self.result[0]['long']['profit_factor']))
profit_factor.setText(2, "{:.3f}".format(self.result[0]['short']['profit_factor']))
profit_factor.setText(3, "{:.3f}".format(self.result[0]['all']['profit_factor']))
self.result_widget.resizeColumnToContents(0)

14
src/nailab/ui_gen/mainwindow.py

@ -11,7 +11,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object): class Ui_MainWindow(object):
def setupUi(self, MainWindow): def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow") MainWindow.setObjectName("MainWindow")
MainWindow.resize(1050, 712) MainWindow.resize(1060, 587)
self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget") self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
@ -23,7 +23,7 @@ class Ui_MainWindow(object):
self.gridLayout.addWidget(self.tabs, 0, 0, 1, 1) self.gridLayout.addWidget(self.tabs, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget) MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1050, 23)) self.menubar.setGeometry(QtCore.QRect(0, 0, 1060, 23))
self.menubar.setObjectName("menubar") self.menubar.setObjectName("menubar")
self.menuFile = QtWidgets.QMenu(self.menubar) self.menuFile = QtWidgets.QMenu(self.menubar)
self.menuFile.setObjectName("menuFile") self.menuFile.setObjectName("menuFile")
@ -33,6 +33,9 @@ class Ui_MainWindow(object):
self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar") self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.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 = QtWidgets.QAction(MainWindow)
self.actionOpenTrades.setObjectName("actionOpenTrades") self.actionOpenTrades.setObjectName("actionOpenTrades")
self.actionNew_strategy = QtWidgets.QAction(MainWindow) self.actionNew_strategy = QtWidgets.QAction(MainWindow)
@ -41,11 +44,15 @@ class Ui_MainWindow(object):
self.actionOpen_strategy.setObjectName("actionOpen_strategy") self.actionOpen_strategy.setObjectName("actionOpen_strategy")
self.actionExecute = QtWidgets.QAction(MainWindow) self.actionExecute = QtWidgets.QAction(MainWindow)
self.actionExecute.setObjectName("actionExecute") 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.actionNew_strategy)
self.menuFile.addAction(self.actionOpen_strategy) self.menuFile.addAction(self.actionOpen_strategy)
self.menuBacktest.addAction(self.actionExecute) self.menuBacktest.addAction(self.actionExecute)
self.menubar.addAction(self.menuFile.menuAction()) self.menubar.addAction(self.menuFile.menuAction())
self.menubar.addAction(self.menuBacktest.menuAction()) self.menubar.addAction(self.menuBacktest.menuAction())
self.toolBar.addAction(self.actionSave_strategy)
self.toolBar.addAction(self.actionExecute)
self.retranslateUi(MainWindow) self.retranslateUi(MainWindow)
self.tabs.setCurrentIndex(-1) self.tabs.setCurrentIndex(-1)
@ -53,6 +60,7 @@ class Ui_MainWindow(object):
self.tabs.tabCloseRequested['int'].connect(MainWindow.tabCloseRequested) self.tabs.tabCloseRequested['int'].connect(MainWindow.tabCloseRequested)
self.actionNew_strategy.triggered.connect(MainWindow.newStrategy) self.actionNew_strategy.triggered.connect(MainWindow.newStrategy)
self.actionExecute.triggered.connect(MainWindow.executeStrategy) self.actionExecute.triggered.connect(MainWindow.executeStrategy)
self.actionSave_strategy.triggered.connect(MainWindow.saveStrategy)
QtCore.QMetaObject.connectSlotsByName(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow): def retranslateUi(self, MainWindow):
@ -60,8 +68,10 @@ class Ui_MainWindow(object):
MainWindow.setWindowTitle(_translate("MainWindow", "Nailab")) MainWindow.setWindowTitle(_translate("MainWindow", "Nailab"))
self.menuFile.setTitle(_translate("MainWindow", "File")) self.menuFile.setTitle(_translate("MainWindow", "File"))
self.menuBacktest.setTitle(_translate("MainWindow", "Backtest")) self.menuBacktest.setTitle(_translate("MainWindow", "Backtest"))
self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))
self.actionOpenTrades.setText(_translate("MainWindow", "Open...")) self.actionOpenTrades.setText(_translate("MainWindow", "Open..."))
self.actionNew_strategy.setText(_translate("MainWindow", "New strategy")) self.actionNew_strategy.setText(_translate("MainWindow", "New strategy"))
self.actionOpen_strategy.setText(_translate("MainWindow", "Open strategy")) self.actionOpen_strategy.setText(_translate("MainWindow", "Open strategy"))
self.actionExecute.setText(_translate("MainWindow", "Execute")) self.actionExecute.setText(_translate("MainWindow", "Execute"))
self.actionSave_strategy.setText(_translate("MainWindow", "Save strategy"))

72
src/nailab/ui_gen/strategywidget.py

@ -11,25 +11,59 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_StrategyWidget(object): class Ui_StrategyWidget(object):
def setupUi(self, StrategyWidget): def setupUi(self, StrategyWidget):
StrategyWidget.setObjectName("StrategyWidget") StrategyWidget.setObjectName("StrategyWidget")
StrategyWidget.resize(839, 464) StrategyWidget.resize(977, 569)
self.gridLayout = QtWidgets.QGridLayout(StrategyWidget) self.gridLayout_3 = QtWidgets.QGridLayout(StrategyWidget)
self.gridLayout_3.setContentsMargins(1, 1, 1, 1)
self.gridLayout_3.setObjectName("gridLayout_3")
self.tabs = QtWidgets.QTabWidget(StrategyWidget)
self.tabs.setObjectName("tabs")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.gridLayout = QtWidgets.QGridLayout(self.tab)
self.gridLayout.setContentsMargins(1, 1, 1, 1)
self.gridLayout.setObjectName("gridLayout") self.gridLayout.setObjectName("gridLayout")
self.splitter = QtWidgets.QSplitter(StrategyWidget) self.splitter = QtWidgets.QSplitter(self.tab)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.splitter.sizePolicy().hasHeightForWidth())
self.splitter.setSizePolicy(sizePolicy)
self.splitter.setOrientation(QtCore.Qt.Horizontal) self.splitter.setOrientation(QtCore.Qt.Horizontal)
self.splitter.setObjectName("splitter") self.splitter.setObjectName("splitter")
self.treeWidget = QtWidgets.QTreeWidget(self.splitter) self.gridLayoutWidget = QtWidgets.QWidget(self.splitter)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Expanding) self.gridLayoutWidget.setObjectName("gridLayoutWidget")
self.gridLayout_2 = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.gridLayout_2.setObjectName("gridLayout_2")
self.dte_to = QtWidgets.QDateTimeEdit(self.gridLayoutWidget)
self.dte_to.setObjectName("dte_to")
self.gridLayout_2.addWidget(self.dte_to, 3, 1, 1, 1)
self.dte_from = QtWidgets.QDateTimeEdit(self.gridLayoutWidget)
self.dte_from.setObjectName("dte_from")
self.gridLayout_2.addWidget(self.dte_from, 2, 1, 1, 1)
self.label_2 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_2.setObjectName("label_2")
self.gridLayout_2.addWidget(self.label_2, 3, 0, 1, 1)
self.rb_allData = QtWidgets.QRadioButton(self.gridLayoutWidget)
self.rb_allData.setChecked(True)
self.rb_allData.setObjectName("rb_allData")
self.gridLayout_2.addWidget(self.rb_allData, 0, 0, 1, 2)
self.tw_feeds = QtWidgets.QTreeWidget(self.gridLayoutWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.tw_feeds.sizePolicy().hasHeightForWidth())
self.tw_feeds.setSizePolicy(sizePolicy)
self.tw_feeds.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
self.tw_feeds.setHeaderHidden(True)
self.tw_feeds.setObjectName("tw_feeds")
self.tw_feeds.headerItem().setText(0, "1")
self.gridLayout_2.addWidget(self.tw_feeds, 4, 0, 1, 2)
self.label = QtWidgets.QLabel(self.gridLayoutWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0) sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0) sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.treeWidget.sizePolicy().hasHeightForWidth()) sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
self.treeWidget.setSizePolicy(sizePolicy) self.label.setSizePolicy(sizePolicy)
self.treeWidget.setObjectName("treeWidget") self.label.setObjectName("label")
self.treeWidget.headerItem().setText(0, "1") self.gridLayout_2.addWidget(self.label, 2, 0, 1, 1)
self.rb_timeWindow = QtWidgets.QRadioButton(self.gridLayoutWidget)
self.rb_timeWindow.setObjectName("rb_timeWindow")
self.gridLayout_2.addWidget(self.rb_timeWindow, 1, 0, 1, 2)
self.editor = Qsci.QsciScintilla(self.splitter) self.editor = Qsci.QsciScintilla(self.splitter)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0) sizePolicy.setHorizontalStretch(0)
@ -39,12 +73,22 @@ class Ui_StrategyWidget(object):
self.editor.setMinimumSize(QtCore.QSize(300, 0)) self.editor.setMinimumSize(QtCore.QSize(300, 0))
self.editor.setObjectName("editor") self.editor.setObjectName("editor")
self.gridLayout.addWidget(self.splitter, 0, 0, 1, 1) self.gridLayout.addWidget(self.splitter, 0, 0, 1, 1)
self.tabs.addTab(self.tab, "")
self.gridLayout_3.addWidget(self.tabs, 0, 0, 1, 1)
self.retranslateUi(StrategyWidget) self.retranslateUi(StrategyWidget)
self.tabs.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(StrategyWidget) QtCore.QMetaObject.connectSlotsByName(StrategyWidget)
def retranslateUi(self, StrategyWidget): def retranslateUi(self, StrategyWidget):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
StrategyWidget.setWindowTitle(_translate("StrategyWidget", "Form")) StrategyWidget.setWindowTitle(_translate("StrategyWidget", "Form"))
self.dte_to.setDisplayFormat(_translate("StrategyWidget", "dd.MM.yyyy H:mm"))
self.dte_from.setDisplayFormat(_translate("StrategyWidget", "dd.MM.yyyy H:mm"))
self.label_2.setText(_translate("StrategyWidget", "To"))
self.rb_allData.setText(_translate("StrategyWidget", "All data"))
self.label.setText(_translate("StrategyWidget", "From"))
self.rb_timeWindow.setText(_translate("StrategyWidget", "Time window"))
self.tabs.setTabText(self.tabs.indexOf(self.tab), _translate("StrategyWidget", "Code"))
from PyQt5 import Qsci from PyQt5 import Qsci

41
ui/mainwindow.ui

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1050</width> <width>1060</width>
<height>712</height> <height>587</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -44,7 +44,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1050</width> <width>1060</width>
<height>23</height> <height>23</height>
</rect> </rect>
</property> </property>
@ -65,6 +65,19 @@
<addaction name="menuBacktest"/> <addaction name="menuBacktest"/>
</widget> </widget>
<widget class="QStatusBar" name="statusbar"/> <widget class="QStatusBar" name="statusbar"/>
<widget class="QToolBar" name="toolBar">
<property name="windowTitle">
<string>toolBar</string>
</property>
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
<addaction name="actionSave_strategy"/>
<addaction name="actionExecute"/>
</widget>
<action name="actionOpenTrades"> <action name="actionOpenTrades">
<property name="text"> <property name="text">
<string>Open...</string> <string>Open...</string>
@ -85,6 +98,11 @@
<string>Execute</string> <string>Execute</string>
</property> </property>
</action> </action>
<action name="actionSave_strategy">
<property name="text">
<string>Save strategy</string>
</property>
</action>
</widget> </widget>
<resources/> <resources/>
<connections> <connections>
@ -152,6 +170,22 @@
</hint> </hint>
</hints> </hints>
</connection> </connection>
<connection>
<sender>actionSave_strategy</sender>
<signal>triggered()</signal>
<receiver>MainWindow</receiver>
<slot>saveStrategy()</slot>
<hints>
<hint type="sourcelabel">
<x>-1</x>
<y>-1</y>
</hint>
<hint type="destinationlabel">
<x>529</x>
<y>293</y>
</hint>
</hints>
</connection>
</connections> </connections>
<slots> <slots>
<slot>openTrades()</slot> <slot>openTrades()</slot>
@ -159,5 +193,6 @@
<slot>tabCloseRequested(int)</slot> <slot>tabCloseRequested(int)</slot>
<slot>newStrategy()</slot> <slot>newStrategy()</slot>
<slot>executeStrategy()</slot> <slot>executeStrategy()</slot>
<slot>saveStrategy()</slot>
</slots> </slots>
</ui> </ui>

169
ui/strategywidget.ui

@ -6,51 +6,146 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>839</width> <width>977</width>
<height>464</height> <height>569</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout_3">
<property name="leftMargin">
<number>1</number>
</property>
<property name="topMargin">
<number>1</number>
</property>
<property name="rightMargin">
<number>1</number>
</property>
<property name="bottomMargin">
<number>1</number>
</property>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QSplitter" name="splitter"> <widget class="QTabWidget" name="tabs">
<property name="sizePolicy"> <property name="currentIndex">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred"> <number>0</number>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property> </property>
<property name="orientation"> <widget class="QWidget" name="tab">
<enum>Qt::Horizontal</enum> <attribute name="title">
</property> <string>Code</string>
<widget class="QTreeWidget" name="treeWidget"> </attribute>
<property name="sizePolicy"> <layout class="QGridLayout" name="gridLayout">
<sizepolicy hsizetype="Maximum" vsizetype="Expanding"> <property name="leftMargin">
<horstretch>0</horstretch> <number>1</number>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<column>
<property name="text">
<string notr="true">1</string>
</property> </property>
</column> <property name="topMargin">
</widget> <number>1</number>
<widget class="QsciScintilla" name="editor" native="true"> </property>
<property name="sizePolicy"> <property name="rightMargin">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred"> <number>1</number>
<horstretch>0</horstretch> </property>
<verstretch>0</verstretch> <property name="bottomMargin">
</sizepolicy> <number>1</number>
</property> </property>
<property name="minimumSize"> <item row="0" column="0">
<size> <widget class="QSplitter" name="splitter">
<width>300</width> <property name="orientation">
<height>0</height> <enum>Qt::Horizontal</enum>
</size> </property>
</property> <widget class="QWidget" name="gridLayoutWidget">
<layout class="QGridLayout" name="gridLayout_2">
<item row="3" column="1">
<widget class="QDateTimeEdit" name="dte_to">
<property name="displayFormat">
<string>dd.MM.yyyy H:mm</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QDateTimeEdit" name="dte_from">
<property name="displayFormat">
<string>dd.MM.yyyy H:mm</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>To</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QRadioButton" name="rb_allData">
<property name="text">
<string>All data</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QTreeWidget" name="tw_feeds">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::MultiSelection</enum>
</property>
<property name="headerHidden">
<bool>true</bool>
</property>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>From</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QRadioButton" name="rb_timeWindow">
<property name="text">
<string>Time window</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QsciScintilla" name="editor" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>300</width>
<height>0</height>
</size>
</property>
</widget>
</widget>
</item>
</layout>
</widget> </widget>
</widget> </widget>
</item> </item>

Loading…
Cancel
Save