Skip to content

Commit

Permalink
Fixed #12 Inaccurate verify_indicators method in Hexital
Browse files Browse the repository at this point in the history
  • Loading branch information
MerlinR committed Apr 8, 2024
1 parent 60c4c08 commit 159ed44
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 7 deletions.
28 changes: 23 additions & 5 deletions hexital/core/hexital.py
Original file line number Diff line number Diff line change
Expand Up @@ -244,14 +244,32 @@ def recalculate(self, name: Optional[str] = None):
self.purge(name)
self.calculate(name)

def _find_indicator(self, indicator: str) -> CandleManager | None:
for manager in self._candles.values():
if not manager.candles:
return manager
elif manager.find_indicator(indicator):
return manager

return None

def _verify_indicators(
self, indicator: str, indicator_two: Optional[str] = None
) -> List[Candle]:
if indicator and not indicator_two:
for manager in self._candles.values():
if manager.find_indicator(indicator):
return manager.candles
raise MissingIndicator(f"Cannot find {indicator}")
manager = self._find_indicator(indicator)

if not manager and indicator in self._indicators:
return []
elif manager and not indicator_two:
return manager.candles

if not indicator_two or not manager:
raise MissingIndicator("Cannot find Indicator: %s" % indicator)

manager_two = self._find_indicator(indicator_two)

if not manager_two:
raise MissingIndicator("Cannot find Indicator: %s" % indicator_two)

for manager in self._candles.values():
if manager.find_indicator(indicator) and manager.find_indicator(indicator_two):
Expand Down
67 changes: 65 additions & 2 deletions tests/core/test_hexital.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
InvalidAnalysis,
InvalidCandlestickType,
InvalidIndicator,
MissingIndicator,
MixedTimeframes,
)
from hexital.indicators import EMA, SMA
Expand Down Expand Up @@ -303,7 +304,7 @@ def test_hextial_rising(self, candles):
def test_hextial_movement_verification_missing(self, candles):
strat = Hexital("Test Stratergy", candles, [EMA(), SMA()])
strat.calculate()
with pytest.raises(MixedTimeframes):
with pytest.raises(MissingIndicator):
assert strat.above("EMA_10", "FUCK_YOU") is False

@pytest.mark.usefixtures("candles")
Expand Down Expand Up @@ -347,4 +348,66 @@ def test_hextial_candlestick_type_str(self, candles):
@pytest.mark.usefixtures("candles")
def test_hextial_candlestick_type_error(self, candles):
with pytest.raises(InvalidCandlestickType):
strat = Hexital("Test Stratergy", candles, [EMA()], candlestick_type="FUCK")
Hexital("Test Stratergy", candles, [EMA()], candlestick_type="FUCK")


def test_verify_indicators_empty():
strat = Hexital("Test Stratergy", [], [EMA(), SMA()])
assert strat.rising("high") is False


def test_verify_indicators_not_enough_candles(minimal_candles):
strat = Hexital("Test Stratergy", minimal_candles, [EMA(period=200)])
strat.calculate()
assert strat.rising("EMA_200") is False


def test_verify_indicators_standard(candles):
strat = Hexital("Test Stratergy", candles, [EMA(), SMA()])
strat.calculate()
assert strat.rising("high") is False


def test_verify_indicators_indicator(candles):
strat = Hexital("Test Stratergy", candles, [EMA(), SMA()])
strat.calculate()
assert strat.rising("EMA_10") is False


def test_verify_indicators_duo_indicators(candles):
strat = Hexital("Test Stratergy", candles, [EMA(), SMA()])
strat.calculate()
assert strat.above("EMA_10", "SMA_10") is False


def test_verify_indicators_duo_indicators_rev(candles):
strat = Hexital("Test Stratergy", candles, [EMA(), SMA()])
strat.calculate()
assert strat.below("high", "EMA_10") is True


def test_verify_indicators_duo_indicators_missing(candles):
strat = Hexital("Test Stratergy", candles, [EMA(), SMA()])
strat.calculate()
with pytest.raises(MissingIndicator):
assert strat.above("EMA_10", "SMA_100") is False


def test_verify_indicators_missing(candles):
strat = Hexital("Test Stratergy", candles, [EMA()])
strat.calculate()
with pytest.raises(MissingIndicator):
strat.rising("FUCK_10")


def test_verify_indicators_mixed_indicators(candles):
strat = Hexital("Test Stratergy", candles, [EMA(), SMA(timeframe="T5")])
strat.calculate()
with pytest.raises(MixedTimeframes):
strat.above("EMA_10", "SMA_10_T5")


def test_verify_indicators_mixed_indicators_two(candles):
strat = Hexital("Test Stratergy", candles, [EMA(), SMA(timeframe="T5")])
strat.calculate()
assert strat.above("SMA_10_T5", "high") is True

0 comments on commit 159ed44

Please sign in to comment.