Skip to content

Commit

Permalink
split additional days into separate functions by rule key and rule value
Browse files Browse the repository at this point in the history
  • Loading branch information
jocon15 committed Jan 11, 2025
1 parent d902b4f commit 9e2f55e
Show file tree
Hide file tree
Showing 22 changed files with 57 additions and 49 deletions.
6 changes: 3 additions & 3 deletions src/StockBench/algorithm/algorithm.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ def get_window(self) -> Tuple:

def get_additional_days(self) -> int:
"""Calculate number of additional days required for the strategy."""
# build a list algorithm keys and algorithm values
# build a list of algorithm keys and algorithm values
keys = []
values = []
if BUY_SIDE in self.strategy.keys():
Expand All @@ -68,7 +68,7 @@ def get_additional_days(self) -> int:
keys.append(key)
values.append(self.strategy[SELL_SIDE][key])

# assemble all algorithm into a single list
# assemble all triggers into a single list
triggers = [x for n in (self.__side_agnostic_triggers, self.__buy_only_triggers) for x in n]
triggers = [x for n in (triggers, self.__sell_only_triggers) for x in n]

Expand All @@ -80,7 +80,7 @@ def get_additional_days(self) -> int:
value = values[i]
for trigger in triggers:
if trigger.indicator_symbol in key:
num = trigger.additional_days(key, value)
num = trigger.additional_days_from_rule_key(key, value)
if additional_days < num:
additional_days = num

Expand Down
8 changes: 6 additions & 2 deletions src/StockBench/indicator/trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,12 @@ def get_side(self):
return self.__side

@abstractmethod
def additional_days(self, rule_key: str, rule_value: any) -> int:
raise NotImplementedError('Additional days not implemented!')
def additional_days_from_rule_key(self, rule_key: str) -> int:
raise NotImplementedError('Additional days from rule key not implemented!')

@abstractmethod
def additional_days_from_rule_value(self, rule_value: any) -> int:
raise NotImplementedError('Additional days from rule value not implemented!')

@abstractmethod
def add_to_data(self, rule_key: str, rule_value: any, side: str, data_manager: DataManager):
Expand Down
2 changes: 1 addition & 1 deletion src/StockBench/indicators/candlestick_color/trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class CandlestickColorTrigger(Trigger):
def __init__(self, indicator_symbol):
super().__init__(indicator_symbol, side=Trigger.AGNOSTIC)

def additional_days(self, rule_key, rule_value) -> int:
def additional_days_from_rule_key(self, rule_key, rule_value) -> int:
"""Calculate the additional days required.
Args:
Expand Down
8 changes: 6 additions & 2 deletions src/StockBench/indicators/ema/trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,19 @@ class EMATrigger(Trigger):
def __init__(self, indicator_symbol):
super().__init__(indicator_symbol, side=Trigger.AGNOSTIC)

def additional_days(self, rule_key, rule_value) -> int:
def additional_days_from_rule_key(self, rule_key, rule_value) -> int:
"""Calculate the additional days required.
Args:
rule_key (any): The key value from the strategy.
rule_value (any): The value from the strategy.
"""
# map to a list of ints
# get all numbers from rule key
nums = list(map(int, self.find_all_nums_in_str(rule_key)))

# get all numbers from rule value if this symbol is
if self.indicator_symbol in rule_value:
nums = nums + list(map(int, self.find_all_nums_in_str(rule_value)))
if nums:
return max(nums)
raise StrategyIndicatorError(f'{self.indicator_symbol} key: {rule_key} must have an indicator length!')
Expand Down
2 changes: 1 addition & 1 deletion src/StockBench/indicators/macd/trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class MACDTrigger(Trigger):
def __init__(self, indicator_symbol):
super().__init__(indicator_symbol, side=Trigger.AGNOSTIC)

def additional_days(self, rule_key, rule_value) -> int:
def additional_days_from_rule_key(self, rule_key, rule_value) -> int:
"""Calculate the additional days required.
Args:
Expand Down
2 changes: 1 addition & 1 deletion src/StockBench/indicators/price/trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class PriceTrigger(Trigger):
def __init__(self, indicator_symbol):
super().__init__(indicator_symbol, side=Trigger.AGNOSTIC)

def additional_days(self, rule_key, rule_value) -> int:
def additional_days_from_rule_key(self, rule_key, rule_value) -> int:
"""Calculate the additional days required.
Args:
Expand Down
2 changes: 1 addition & 1 deletion src/StockBench/indicators/rsi/trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class RSITrigger(Trigger):
def __init__(self, indicator_symbol):
super().__init__(indicator_symbol, side=Trigger.AGNOSTIC)

def additional_days(self, rule_key, rule_value) -> int:
def additional_days_from_rule_key(self, rule_key, rule_value) -> int:
"""Calculate the additional days required.
Args:
Expand Down
2 changes: 1 addition & 1 deletion src/StockBench/indicators/sma/trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class SMATrigger(Trigger):
def __init__(self, indicator_symbol):
super().__init__(indicator_symbol, side=Trigger.AGNOSTIC)

def additional_days(self, rule_key, rule_value) -> int:
def additional_days_from_rule_key(self, rule_key, rule_value) -> int:
"""Calculate the additional days required.
Args:
Expand Down
2 changes: 1 addition & 1 deletion src/StockBench/indicators/stochastic/trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class StochasticTrigger(Trigger):
def __init__(self, indicator_symbol):
super().__init__(indicator_symbol, side=Trigger.AGNOSTIC)

def additional_days(self, rule_key, rule_value) -> int:
def additional_days_from_rule_key(self, rule_key, rule_value) -> int:
"""Calculate the additional days required.
Args:
Expand Down
2 changes: 1 addition & 1 deletion src/StockBench/indicators/stop_loss/trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class StopLossTrigger(Trigger):
def __init__(self, indicator_symbol):
super().__init__(indicator_symbol, side=Trigger.SELL)

def additional_days(self, rule_key, rule_value) -> int:
def additional_days_from_rule_key(self, rule_key, rule_value) -> int:
"""Calculate the additional days required.
Args:
Expand Down
2 changes: 1 addition & 1 deletion src/StockBench/indicators/stop_profit/trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class StopProfitTrigger(Trigger):
def __init__(self, indicator_symbol):
super().__init__(indicator_symbol, side=Trigger.SELL)

def additional_days(self, rule_key: str, rule_value: str) -> int:
def additional_days_from_rule_key(self, rule_key: str, rule_value: str) -> int:
"""Calculate the additional days required.
Args:
Expand Down
2 changes: 1 addition & 1 deletion src/StockBench/indicators/volume/trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class VolumeTrigger(Trigger):
def __init__(self, indicator_symbol):
super().__init__(indicator_symbol, side=Trigger.AGNOSTIC)

def additional_days(self, rule_key, rule_value) -> int:
def additional_days_from_rule_key(self, rule_key, rule_value) -> int:
"""Calculate the additional days required.
Args:
Expand Down
4 changes: 2 additions & 2 deletions src/tests/test_candlestick_trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ def test_additional_days_normal(test_object):
# ============= Arrange ==============

# ============= Act ==================
actual = test_object.additional_days('color', {'1': 'red', '0': 'green'})
actual = test_object.additional_days_from_rule_key('color', {'1': 'red', '0': 'green'})

# ============= Assert ===============
assert type(actual) is int
Expand All @@ -27,7 +27,7 @@ def test_additional_days_no_values(test_object):

# ============= Assert ===============
try:
test_object.additional_days('color', {})
test_object.additional_days_from_rule_key('color', {})
assert False
except StrategyIndicatorError:
assert True
Expand Down
14 changes: 7 additions & 7 deletions src/tests/test_ema_trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@ def test_additional_days(test_object):
# ============= Act ==================

# ============= Assert ===============
assert test_object.additional_days('EMA20', '>20') == 20
assert type(test_object.additional_days('EMA20', '>20')) is int
assert test_object.additional_days('EMA50$price', '>20') == 50
assert test_object.additional_days('EMA50$price', '>20') == 50
assert test_object.additional_days('EMA20$slope10', '>20') == 20
assert test_object.additional_days('EMA20$slope30', '>20') == 30
assert test_object.additional_days_from_rule_key('EMA20', '>20') == 20
assert type(test_object.additional_days_from_rule_key('EMA20', '>20')) is int
assert test_object.additional_days_from_rule_key('EMA50$price', '>20') == 50
assert test_object.additional_days_from_rule_key('EMA50$price', '>20') == 50
assert test_object.additional_days_from_rule_key('EMA20$slope10', '>20') == 20
assert test_object.additional_days_from_rule_key('EMA20$slope30', '>20') == 30
try:
test_object.additional_days('EMA', '>20')
test_object.additional_days_from_rule_key('EMA', '>20')
assert False
except StrategyIndicatorError:
assert True
Expand Down
4 changes: 2 additions & 2 deletions src/tests/test_macd_trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ def test_additional_days(test_object):
# ============= Act ==================

# ============= Assert ===============
assert test_object.additional_days('MACD', '>250') == 26
assert test_object.additional_days('MACD', '<$price') == 26
assert test_object.additional_days_from_rule_key('MACD', '>250') == 26
assert test_object.additional_days_from_rule_key('MACD', '<$price') == 26


@patch('logging.getLogger')
Expand Down
2 changes: 1 addition & 1 deletion src/tests/test_price_trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ def test_additional_days(test_object):
# ============= Arrange ==============

# ============= Act ==================
actual = test_object.additional_days('none', '')
actual = test_object.additional_days_from_rule_key('none', '')

# ============= Assert ===============
assert type(actual) is int
Expand Down
10 changes: 5 additions & 5 deletions src/tests/test_rsi_trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ def test_object():
def test_additional_days(data_mocker, test_object):
data_mocker.get_data_length.return_value = 200

assert test_object.additional_days('RSI', '>20') == 14
assert test_object.additional_days_from_rule_key('RSI', '>20') == 14

assert test_object.additional_days('RSI50', '>20') == 50
assert test_object.additional_days_from_rule_key('RSI50', '>20') == 50

assert test_object.additional_days('RSI50$price', '>20') == 50
assert test_object.additional_days_from_rule_key('RSI50$price', '>20') == 50

assert test_object.additional_days('RSI20$slope10', '>20') == 20
assert test_object.additional_days_from_rule_key('RSI20$slope10', '>20') == 20

assert test_object.additional_days('RSI20$slope30', '>20') == 30
assert test_object.additional_days_from_rule_key('RSI20$slope30', '>20') == 30


@patch('logging.getLogger')
Expand Down
14 changes: 7 additions & 7 deletions src/tests/test_sma_trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@ def test_additional_days(test_object):
# ============= Act ==================

# ============= Assert ===============
assert test_object.additional_days('SMA20', '>20') == 20
assert type(test_object.additional_days('SMA20', '>20')) is int
assert test_object.additional_days('SMA50$price', '>20') == 50
assert test_object.additional_days('SMA50$price', '>20') == 50
assert test_object.additional_days('SMA20$slope10', '>20') == 20
assert test_object.additional_days('SMA20$slope30', '>20') == 30
assert test_object.additional_days_from_rule_key('SMA20', '>20') == 20
assert type(test_object.additional_days_from_rule_key('SMA20', '>20')) is int
assert test_object.additional_days_from_rule_key('SMA50$price', '>20') == 50
assert test_object.additional_days_from_rule_key('SMA50$price', '>20') == 50
assert test_object.additional_days_from_rule_key('SMA20$slope10', '>20') == 20
assert test_object.additional_days_from_rule_key('SMA20$slope30', '>20') == 30
try:
test_object.additional_days('SMA', '>20')
test_object.additional_days_from_rule_key('SMA', '>20')
assert False
except StrategyIndicatorError:
assert True
Expand Down
12 changes: 6 additions & 6 deletions src/tests/test_stochastic_trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,17 @@ def test_object():


def test_additional_days(test_object):
assert test_object.additional_days('stochastic', '>20') == 14
assert test_object.additional_days_from_rule_key('stochastic', '>20') == 14

assert test_object.additional_days('stochastic20', '>20') == 20
assert test_object.additional_days_from_rule_key('stochastic20', '>20') == 20

assert test_object.additional_days('stochastic50$price', '>20') == 50
assert test_object.additional_days_from_rule_key('stochastic50$price', '>20') == 50

assert test_object.additional_days('stochastic50$price', '>20') == 50
assert test_object.additional_days_from_rule_key('stochastic50$price', '>20') == 50

assert test_object.additional_days('stochastic20$slope10', '>20') == 20
assert test_object.additional_days_from_rule_key('stochastic20$slope10', '>20') == 20

assert test_object.additional_days('stochastic20$slope30', '>20') == 30
assert test_object.additional_days_from_rule_key('stochastic20$slope30', '>20') == 30


@patch('logging.getLogger')
Expand Down
2 changes: 1 addition & 1 deletion src/tests/test_stop_loss_trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ def test_additional_days(test_object):
# ============= Arrange ==============

# ============= Act ==================
actual = test_object.additional_days('', '')
actual = test_object.additional_days_from_rule_key('', '')

# ============= Assert ===============
assert type(actual) is int
Expand Down
2 changes: 1 addition & 1 deletion src/tests/test_stop_profit_trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ def test_additional_days(test_object):
# ============= Arrange ==============

# ============= Act ==================
actual = test_object.additional_days('', '')
actual = test_object.additional_days_from_rule_key('', '')

# ============= Assert ===============
assert type(actual) is int
Expand Down
2 changes: 1 addition & 1 deletion src/tests/test_volume_trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@


def test_additional_days():
assert test_obj.additional_days('', '') == 0
assert test_obj.additional_days_from_rule_key('', '') == 0

0 comments on commit 9e2f55e

Please sign in to comment.