diff --git a/hexital/core/hexital.py b/hexital/core/hexital.py index ba400ae..f009dd7 100644 --- a/hexital/core/hexital.py +++ b/hexital/core/hexital.py @@ -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): diff --git a/tests/core/test_hexital.py b/tests/core/test_hexital.py index ef64fbf..8d6d908 100644 --- a/tests/core/test_hexital.py +++ b/tests/core/test_hexital.py @@ -9,6 +9,7 @@ InvalidAnalysis, InvalidCandlestickType, InvalidIndicator, + MissingIndicator, MixedTimeframes, ) from hexital.indicators import EMA, SMA @@ -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") @@ -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