You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.4 KiB
52 lines
1.4 KiB
|
8 years ago
|
'''
|
||
|
|
'''
|
||
|
|
|
||
|
|
from .trade import Trade
|
||
|
|
|
||
|
|
class Executor(object):
|
||
|
|
'''
|
||
|
|
'''
|
||
|
|
|
||
|
|
|
||
|
|
def __init__(self, series):
|
||
|
|
'''
|
||
|
|
Constructor
|
||
|
|
'''
|
||
|
|
self.series = series
|
||
|
|
self.max_hold_bars = 1
|
||
|
|
|
||
|
|
def execute(self, signals):
|
||
|
|
self.trades = []
|
||
|
|
sig_vectors = []
|
||
|
|
vec_length = 0
|
||
|
|
for signal in signals:
|
||
|
|
vec = signal.calculate(self.series)
|
||
|
|
sig_vectors.append(vec)
|
||
|
|
if vec_length == 0:
|
||
|
|
vec_length = len(vec)
|
||
|
|
else:
|
||
|
|
assert(vec_length == len(vec))
|
||
|
|
|
||
|
|
in_trade = False
|
||
|
|
current_entry_price = None
|
||
|
|
bar_counter = 0
|
||
|
|
|
||
|
|
for i in range(0, vec_length):
|
||
|
|
if not in_trade:
|
||
|
|
has_signal = True
|
||
|
|
for vec in sig_vectors:
|
||
|
|
if vec[i] is None or vec[i] == False:
|
||
|
|
has_signal = False
|
||
|
|
break
|
||
|
|
|
||
|
|
if has_signal and i + 1 < vec_length:
|
||
|
|
in_trade = True
|
||
|
|
current_entry_price = self.series.get_open(i + 1)
|
||
|
|
bar_counter = 0
|
||
|
|
else:
|
||
|
|
bar_counter += 1
|
||
|
|
if bar_counter >= self.max_hold_bars:
|
||
|
|
in_trade = False
|
||
|
|
self.trades.append(Trade(current_entry_price, self.series.get_close(i)))
|
||
|
|
|
||
|
|
return self.trades
|