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. 6
      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. 47
      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. 115
      ui/strategywidget.ui

2
.gitignore vendored

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

2
src/nailab/data/csvfolderdatasource.py

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

2
src/nailab/data/datasourcemanager.py

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

6
src/nailab/execution/executor.py

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

2
src/nailab/nailab.py

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

1
src/nailab/templates/new_strategy.py

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

0
src/nailab/ui/__init__.py

47
src/nailab/ui/mainwindow.py

@ -5,7 +5,7 @@ import importlib.util @@ -5,7 +5,7 @@ import importlib.util
import inspect
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.Qsci import *
@ -14,9 +14,7 @@ from ui_gen.mainwindow import Ui_MainWindow @@ -14,9 +14,7 @@ from ui_gen.mainwindow import Ui_MainWindow
from ui.strategywidget import StrategyWidget
from naiback.strategy import Strategy
def is_strategy(obj):
return inspect.isclass(obj) and Strategy in inspect.getmro(obj)[1:]
from templates.new_strategy import new_strategy_template
class MainWindow(QtWidgets.QMainWindow):
@ -24,6 +22,8 @@ class MainWindow(QtWidgets.QMainWindow): @@ -24,6 +22,8 @@ class MainWindow(QtWidgets.QMainWindow):
super().__init__(parent)
self.sources = []
self.datasourcemanager = DataSourceManager()
self.datasourcemanager.load_sources()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
@ -32,7 +32,7 @@ class MainWindow(QtWidgets.QMainWindow): @@ -32,7 +32,7 @@ class MainWindow(QtWidgets.QMainWindow):
pass
def newStrategy(self):
self._makeEditor()
self._makeEditor(content=new_strategy_template)
def openStrategy(self):
settings = QtCore.QSettings()
@ -42,24 +42,43 @@ class MainWindow(QtWidgets.QMainWindow): @@ -42,24 +42,43 @@ class MainWindow(QtWidgets.QMainWindow):
self._makeEditor(filename, os.path.basename(filename), f.read())
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):
source_file = self.sources[self.ui.tabs.currentIndex()]
source_file = self.ui.tabs.currentWidget().source_file
executor = Executor()
result = executor.execute_from_file(source_file, [])
selected_feed_ids = self.ui.tabs.currentWidget().get_selected_feeds()
selected_feeds = []
for (source_id, feed_id) in selected_feed_ids:
try:
selected_feeds.append(self.datasourcemanager.get_source(source_id).get_feed(feed_id))
except e:
print('Error: ' + str(e))
try:
result = executor.execute_from_file(source_file, selected_feeds, self.ui.tabs.currentWidget().get_time_window())
print(result)
# spec = importlib.util.spec_from_file_location("m", source_file)
# mod = importlib.util.module_from_spec(spec)
# spec.loader.exec_module(mod)
# classes = inspect.getmembers(mod, is_strategy)
# strategy_class = classes[0][0]
self.ui.tabs.currentWidget().set_result(result)
except Exception as e:
print(e)
def tabCloseRequested(self, tab_index):
del self.sources[tab_index]
self.ui.tabs.widget(tab_index).save_state()
self.ui.tabs.removeTab(tab_index)
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.ui.tabs.addTab(editor, tab_name)

134
src/nailab/ui/strategywidget.py

@ -4,14 +4,21 @@ from PyQt5.Qsci import * @@ -4,14 +4,21 @@ from PyQt5.Qsci import *
from ui_gen.strategywidget import Ui_StrategyWidget
ROLE_FEED_ID = QtCore.Qt.UserRole + 1
class StrategyWidget(QtWidgets.QWidget):
def __init__(self, parent=None, content=None):
def __init__(self, datasourcemanager, source_file, parent=None, content=None):
super().__init__(parent)
self.ui = Ui_StrategyWidget()
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.setStretchFactor(0, 1)
self.ui.splitter.setStretchFactor(1, 1)
@ -26,3 +33,128 @@ class StrategyWidget(QtWidgets.QWidget): @@ -26,3 +33,128 @@ class StrategyWidget(QtWidgets.QWidget):
lexer.setFont(font)
self.ui.editor.setLexer(lexer)
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 @@ -11,7 +11,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1050, 712)
MainWindow.resize(1060, 587)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
@ -23,7 +23,7 @@ class Ui_MainWindow(object): @@ -23,7 +23,7 @@ class Ui_MainWindow(object):
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, 1050, 23))
self.menubar.setGeometry(QtCore.QRect(0, 0, 1060, 23))
self.menubar.setObjectName("menubar")
self.menuFile = QtWidgets.QMenu(self.menubar)
self.menuFile.setObjectName("menuFile")
@ -33,6 +33,9 @@ class Ui_MainWindow(object): @@ -33,6 +33,9 @@ class Ui_MainWindow(object):
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)
@ -41,11 +44,15 @@ class Ui_MainWindow(object): @@ -41,11 +44,15 @@ class Ui_MainWindow(object):
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)
@ -53,6 +60,7 @@ class Ui_MainWindow(object): @@ -53,6 +60,7 @@ class Ui_MainWindow(object):
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):
@ -60,8 +68,10 @@ class Ui_MainWindow(object): @@ -60,8 +68,10 @@ class Ui_MainWindow(object):
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"))

72
src/nailab/ui_gen/strategywidget.py

@ -11,25 +11,59 @@ from PyQt5 import QtCore, QtGui, QtWidgets @@ -11,25 +11,59 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_StrategyWidget(object):
def setupUi(self, StrategyWidget):
StrategyWidget.setObjectName("StrategyWidget")
StrategyWidget.resize(839, 464)
self.gridLayout = QtWidgets.QGridLayout(StrategyWidget)
StrategyWidget.resize(977, 569)
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.splitter = QtWidgets.QSplitter(StrategyWidget)
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 = QtWidgets.QSplitter(self.tab)
self.splitter.setOrientation(QtCore.Qt.Horizontal)
self.splitter.setObjectName("splitter")
self.treeWidget = QtWidgets.QTreeWidget(self.splitter)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Expanding)
self.gridLayoutWidget = QtWidgets.QWidget(self.splitter)
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.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.treeWidget.sizePolicy().hasHeightForWidth())
self.treeWidget.setSizePolicy(sizePolicy)
self.treeWidget.setObjectName("treeWidget")
self.treeWidget.headerItem().setText(0, "1")
sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
self.label.setSizePolicy(sizePolicy)
self.label.setObjectName("label")
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)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
@ -39,12 +73,22 @@ class Ui_StrategyWidget(object): @@ -39,12 +73,22 @@ class Ui_StrategyWidget(object):
self.editor.setMinimumSize(QtCore.QSize(300, 0))
self.editor.setObjectName("editor")
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.tabs.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(StrategyWidget)
def retranslateUi(self, StrategyWidget):
_translate = QtCore.QCoreApplication.translate
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

41
ui/mainwindow.ui

@ -6,8 +6,8 @@ @@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>1050</width>
<height>712</height>
<width>1060</width>
<height>587</height>
</rect>
</property>
<property name="windowTitle">
@ -44,7 +44,7 @@ @@ -44,7 +44,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>1050</width>
<width>1060</width>
<height>23</height>
</rect>
</property>
@ -65,6 +65,19 @@ @@ -65,6 +65,19 @@
<addaction name="menuBacktest"/>
</widget>
<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">
<property name="text">
<string>Open...</string>
@ -85,6 +98,11 @@ @@ -85,6 +98,11 @@
<string>Execute</string>
</property>
</action>
<action name="actionSave_strategy">
<property name="text">
<string>Save strategy</string>
</property>
</action>
</widget>
<resources/>
<connections>
@ -152,6 +170,22 @@ @@ -152,6 +170,22 @@
</hint>
</hints>
</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>
<slots>
<slot>openTrades()</slot>
@ -159,5 +193,6 @@ @@ -159,5 +193,6 @@
<slot>tabCloseRequested(int)</slot>
<slot>newStrategy()</slot>
<slot>executeStrategy()</slot>
<slot>saveStrategy()</slot>
</slots>
</ui>

115
ui/strategywidget.ui

@ -6,38 +6,129 @@ @@ -6,38 +6,129 @@
<rect>
<x>0</x>
<y>0</y>
<width>839</width>
<height>464</height>
<width>977</width>
<height>569</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<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">
<widget class="QTabWidget" name="tabs">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>Code</string>
</attribute>
<layout class="QGridLayout" name="gridLayout">
<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">
<widget class="QSplitter" name="splitter">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QTreeWidget" name="treeWidget">
<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="Maximum" vsizetype="Expanding">
<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">
@ -56,6 +147,10 @@ @@ -56,6 +147,10 @@
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QsciScintilla</class>

Loading…
Cancel
Save