Browse Source

IntradayBarNumber signal

master
Denis Tereshkin 8 years ago
parent
commit
fd5d3599c7
  1. 59
      data/signal.py
  2. 4
      execution/executor.py
  3. 3
      solver/solver.py
  4. 6
      ui/mainwindow.py
  5. 16
      ui/mainwindow.ui
  6. 10
      ui/ui_mainwindow.py

59
data/signal.py

@ -7,7 +7,6 @@ import numpy
import talib import talib
from scipy.integrate.tests.test_odeint_jac import rhs from scipy.integrate.tests.test_odeint_jac import rhs
class Signal: class Signal:
def __init__(self): def __init__(self):
@ -852,4 +851,60 @@ class StochasticSignal(Signal):
def get_text(self): def get_text(self):
return "stoch(c, {:d})[{:d}] {:s} {:d}".format(self.period, self.shift, self.inequality_sign_str, int(self.threshold)) return "stoch(c, {:d})[{:d}] {:s} {:d}".format(self.period, self.shift, self.inequality_sign_str, int(self.threshold))
class IntradayBarNumberSignalGenerator:
def __init__(self, max_ibn):
self.max_ibn = max_ibn
def generate(self):
ibn = random.randint(0, self.max_ibn)
ineq_type = random.randint(IntradayBarNumberSignal.LT, IntradayBarNumberSignal.EQ)
return IntradayBarNumberSignal(ibn, ineq_type)
def id(self):
return 'IBN'
class IntradayBarNumberSignal(Signal):
LT = 0
GT = 1
EQ = 2
def __init__(self, ibn, inequality_type):
self.ibn = ibn
self.inequality_type = inequality_type
if inequality_type == IntradayBarNumberSignal.LT:
self.inequality_sign_str = '<'
elif inequality_type == IntradayBarNumberSignal.GT:
self.inequality_sign_str = '>'
else:
self.inequality_sign_str = '=='
def calculate(self, series):
ibn = []
cur_date = None
for i in range(0, series.length()):
if series.get_dt(i).date() != cur_date:
cur_date = series.get_dt(i).date()
ctr = 0
else:
ctr += 1
ibn.append(ctr)
result = []
for i in ibn:
result.append(self.calc_signal(i))
return result
def calc_signal(self, ibn):
if self.inequality_type == IntradayBarNumberSignal.LT:
return ibn < self.ibn
elif self.inequality_type == IntradayBarNumberSignal.GT:
return ibn > self.ibn
elif self.inequality_type == IntradayBarNumberSignal.EQ:
return ibn == self.ibn
def get_text(self):
return "ibn {:s} {:d}".format(self.inequality_sign_str, self.ibn)

4
execution/executor.py

@ -8,12 +8,12 @@ class Executor(object):
''' '''
def __init__(self, series): def __init__(self, series, max_hold_bars):
''' '''
Constructor Constructor
''' '''
self.series = series self.series = series
self.max_hold_bars = 1 self.max_hold_bars = max_hold_bars
def execute(self, signals, long=True): def execute(self, signals, long=True):
self.trades = [] self.trades = []

3
solver/solver.py

@ -25,7 +25,6 @@ class Solver(QObject):
super().__init__(None) super().__init__(None)
self.series = series self.series = series
self.executor = Executor(series)
self.generators = [] self.generators = []
def add_generator(self, generator): def add_generator(self, generator):
@ -34,6 +33,8 @@ class Solver(QObject):
@QtCore.pyqtSlot(dict) @QtCore.pyqtSlot(dict)
def solve(self, params): def solve(self, params):
max_signals = 5 max_signals = 5
max_hold_bars = params.get('max_hold_bars', 1)
self.executor = Executor(self.series, max_hold_bars)
max_strategies = params.get('num_strategies', 1000) max_strategies = params.get('num_strategies', 1000)
results = [] results = []

6
ui/mainwindow.py

@ -10,7 +10,7 @@ from data.signal import PriceComparisonSignalGenerator, RsiSignalGenerator,\
AtrSignalGenerator, DayOfWeekSignalGenerator, CrtdrSignalGenerator,\ AtrSignalGenerator, DayOfWeekSignalGenerator, CrtdrSignalGenerator,\
AtrDeltaSignalGenerator, SmaSignalGenerator, DayOfMonthSignalGenerator,\ AtrDeltaSignalGenerator, SmaSignalGenerator, DayOfMonthSignalGenerator,\
CciSignalGenerator, BbandsSignalGenerator, PivotPointsSignalGenerator,\ CciSignalGenerator, BbandsSignalGenerator, PivotPointsSignalGenerator,\
StochasticSignalGenerator StochasticSignalGenerator, IntradayBarNumberSignalGenerator
from PyQt5.Qt import Qt, QFileDialog, QThread, Q_ARG, QMetaObject from PyQt5.Qt import Qt, QFileDialog, QThread, Q_ARG, QMetaObject
import pyqtgraph import pyqtgraph
@ -51,8 +51,10 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.solver.add_generator(BbandsSignalGenerator()) self.solver.add_generator(BbandsSignalGenerator())
self.solver.add_generator(PivotPointsSignalGenerator()) self.solver.add_generator(PivotPointsSignalGenerator())
self.solver.add_generator(StochasticSignalGenerator()) self.solver.add_generator(StochasticSignalGenerator())
self.solver.add_generator(IntradayBarNumberSignalGenerator(14))
params = { 'num_strategies' : self.sb_strategiesNum.value() } params = { 'num_strategies' : self.sb_strategiesNum.value(),
'max_hold_bars' : self.sb_maxHoldBars.value() }
if self.cb_minTradesFilter.isChecked(): if self.cb_minTradesFilter.isChecked():
params['min_trades'] = self.sb_minTrades.value() params['min_trades'] = self.sb_minTrades.value()

16
ui/mainwindow.ui

@ -84,7 +84,7 @@
<item row="1" column="1"> <item row="1" column="1">
<widget class="QSpinBox" name="sb_strategiesNum"> <widget class="QSpinBox" name="sb_strategiesNum">
<property name="minimum"> <property name="minimum">
<number>100</number> <number>1</number>
</property> </property>
<property name="maximum"> <property name="maximum">
<number>10000</number> <number>10000</number>
@ -197,6 +197,20 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="2">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Max hold bars</string>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QSpinBox" name="sb_maxHoldBars">
<property name="minimum">
<number>1</number>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<widget class="QMenuBar" name="menubar"> <widget class="QMenuBar" name="menubar">

10
ui/ui_mainwindow.py

@ -45,7 +45,7 @@ class Ui_MainWindow(object):
self.e_go.setObjectName("e_go") self.e_go.setObjectName("e_go")
self.gridLayout.addWidget(self.e_go, 1, 9, 1, 1) self.gridLayout.addWidget(self.e_go, 1, 9, 1, 1)
self.sb_strategiesNum = QtWidgets.QSpinBox(self.centralwidget) self.sb_strategiesNum = QtWidgets.QSpinBox(self.centralwidget)
self.sb_strategiesNum.setMinimum(100) self.sb_strategiesNum.setMinimum(1)
self.sb_strategiesNum.setMaximum(10000) self.sb_strategiesNum.setMaximum(10000)
self.sb_strategiesNum.setProperty("value", 1000) self.sb_strategiesNum.setProperty("value", 1000)
self.sb_strategiesNum.setObjectName("sb_strategiesNum") self.sb_strategiesNum.setObjectName("sb_strategiesNum")
@ -77,6 +77,13 @@ class Ui_MainWindow(object):
self.rb_short = QtWidgets.QRadioButton(self.centralwidget) self.rb_short = QtWidgets.QRadioButton(self.centralwidget)
self.rb_short.setObjectName("rb_short") self.rb_short.setObjectName("rb_short")
self.gridLayout.addWidget(self.rb_short, 3, 0, 1, 1) self.gridLayout.addWidget(self.rb_short, 3, 0, 1, 1)
self.label_3 = QtWidgets.QLabel(self.centralwidget)
self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 2, 2, 1, 1)
self.sb_maxHoldBars = QtWidgets.QSpinBox(self.centralwidget)
self.sb_maxHoldBars.setMinimum(1)
self.sb_maxHoldBars.setObjectName("sb_maxHoldBars")
self.gridLayout.addWidget(self.sb_maxHoldBars, 2, 3, 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, 1041, 27)) self.menubar.setGeometry(QtCore.QRect(0, 0, 1041, 27))
@ -112,4 +119,5 @@ class Ui_MainWindow(object):
self.cb_minTradesFilter.setText(_translate("MainWindow", "Min. trades:")) self.cb_minTradesFilter.setText(_translate("MainWindow", "Min. trades:"))
self.cb_minWinRate.setText(_translate("MainWindow", "Min. win rate")) self.cb_minWinRate.setText(_translate("MainWindow", "Min. win rate"))
self.rb_short.setText(_translate("MainWindow", "Short")) self.rb_short.setText(_translate("MainWindow", "Short"))
self.label_3.setText(_translate("MainWindow", "Max hold bars"))

Loading…
Cancel
Save