diff --git a/core/models/candle.py b/core/models/candle.py index b73e21e3..48e634da 100644 --- a/core/models/candle.py +++ b/core/models/candle.py @@ -1,7 +1,7 @@ from enum import Enum -class TrendCandleType(Enum): +class CandleTrendType(Enum): BOTTLE = 1 DOUBLE_TROUBLE = 2 GOLDEN = 3 diff --git a/strategy/generator/bootstrap/_trend_follow.py b/strategy/generator/bootstrap/_trend_follow.py index 678c09ac..41706337 100644 --- a/strategy/generator/bootstrap/_trend_follow.py +++ b/strategy/generator/bootstrap/_trend_follow.py @@ -7,14 +7,15 @@ import numpy as np from core.interfaces.abstract_strategy_generator import AbstractStrategyGenerator -from core.models.candle import TrendCandleType +from core.models.candle import CandleTrendType from core.models.moving_average import MovingAverageType -from core.models.parameter import CategoricalParameter, RandomParameter, StaticParameter +from core.models.parameter import CategoricalParameter, RandomParameter from core.models.smooth import Smooth from core.models.strategy import Strategy, StrategyType from core.models.symbol import Symbol from core.models.timeframe import Timeframe from strategy.generator.baseline.ma import MaBaseLine +from strategy.generator.confirm.cci import CciConfirm from strategy.generator.confirm.dpo import DpoConfirm from strategy.generator.confirm.dso import DsoConfirm from strategy.generator.confirm.eom import EomConfirm @@ -34,67 +35,62 @@ from strategy.generator.pulse.nvol import NvolPulse from strategy.generator.pulse.tdfi import TdfiPulse from strategy.generator.pulse.vo import VoPulse -from strategy.generator.signal.ao_flip import AoFlipSignal -from strategy.generator.signal.ao_saucer import AoSaucerSignal -from strategy.generator.signal.apo_flip import ApoFlipSignal -from strategy.generator.signal.bop_flip import BopFlipSignal -from strategy.generator.signal.cc_flip import CcFlipSignal -from strategy.generator.signal.ce_flip import CeFlipSignal -from strategy.generator.signal.cfo_flip import CfoFlipSignal -from strategy.generator.signal.dch_two_ma import Dch2MaSignal -from strategy.generator.signal.di_cross import DiCrossSignal -from strategy.generator.signal.dmi_cross import DmiCrossSignal -from strategy.generator.signal.dso_cross import DsoCrossSignal -from strategy.generator.signal.dso_flip import DsoFlipSignal -from strategy.generator.signal.hl import HighLowSignal -from strategy.generator.signal.kst_cross import KstCrossSignal -from strategy.generator.signal.ma_three_cross import Ma3CrossSignal -from strategy.generator.signal.macd_bb import MacdBbSignal -from strategy.generator.signal.macd_color_switch import MacdColorSwitchSignal -from strategy.generator.signal.macd_cross import MacdCrossSignal -from strategy.generator.signal.macd_flip import MacdFlipSignal -from strategy.generator.signal.qstick_cross import QstickCrossSignal -from strategy.generator.signal.qstick_flip import QstickFlipSignal -from strategy.generator.signal.roc_flip import RocFlipSignal -from strategy.generator.signal.rsi_ma_pullback import RsiMaPullbackSignal -from strategy.generator.signal.rsi_neutrality_cross import RsiNautralityCrossSignal -from strategy.generator.signal.rsi_neutrality_pullback import ( - RsiNautralityPullbackSignal, -) -from strategy.generator.signal.rsi_neutrality_rejection import ( +from strategy.generator.signal.bb.macd_bb import MacdBbSignal +from strategy.generator.signal.bb.vwap_bb import VwapBbSignal +from strategy.generator.signal.breakout.dch_two_ma import DchMa2BreakoutSignal +from strategy.generator.signal.flip.ce_flip import CeFlipSignal +from strategy.generator.signal.flip.supertrend_flip import SupertrendFlipSignal +from strategy.generator.signal.ma.ma2_rsi import Ma2RsiSignal +from strategy.generator.signal.ma.ma3_cross import Ma3CrossSignal +from strategy.generator.signal.ma.ma_testing_ground import MaTestingGroundSignal +from strategy.generator.signal.ma.vwap_cross import VwapCrossSignal +from strategy.generator.signal.neutrality.dso_neutrality_cross import DsoNeutralityCrossSignal +from strategy.generator.signal.neutrality.rsi_neutrality_cross import RsiNautralityCrossSignal +from strategy.generator.signal.neutrality.rsi_neutrality_pullback import RsiNautralityPullbackSignal +from strategy.generator.signal.neutrality.rsi_neutrality_rejection import ( RsiNautralityRejectionSignal, ) -from strategy.generator.signal.rsi_supertrend import RsiSupertrendSignal -from strategy.generator.signal.rsi_two_ma import Rsi2MaSignal -from strategy.generator.signal.rsi_v import RsiVSignal -from strategy.generator.signal.snatr import SnatrSignal -from strategy.generator.signal.stc_flip import StcFlipSignal -from strategy.generator.signal.stoch_cross import StochCrossSignal -from strategy.generator.signal.supertrend_flip import SupertrendFlipSignal -from strategy.generator.signal.tii_cross import TiiCrossSignal -from strategy.generator.signal.tii_v import TiiVSignal -from strategy.generator.signal.trend_candle import TrendCandleSignal -from strategy.generator.signal.trix_cross import TrixCrossSignal -from strategy.generator.signal.tsi_cross import TsiCrossSignal -from strategy.generator.signal.tsi_flip import TsiFlipSignal -from strategy.generator.signal.vi_cross import ViCrossSignal -from strategy.generator.signal.vwap_bb import VwapBbSignal -from strategy.generator.signal.vwap_cross import VwapCrossSignal +from strategy.generator.signal.pattern.ao_saucer import AoSaucerSignal +from strategy.generator.signal.pattern.candle_trend import CandleTrendSignal +from strategy.generator.signal.pattern.hl import HighLowSignal +from strategy.generator.signal.pattern.macd_colorswitch import MacdColorSwitchSignal +from strategy.generator.signal.pattern.rsi_v import RsiVSignal +from strategy.generator.signal.pattern.tii_v import TiiVSignal +from strategy.generator.signal.reversal.dmi_reversal import DmiReversalSignal +from strategy.generator.signal.reversal.snatr_reversal import SnatrReversalSignal +from strategy.generator.signal.reversal.vi_reversal import ViReversalSignal +from strategy.generator.signal.signalline.di_signalline import DiSignalLineSignal +from strategy.generator.signal.signalline.dso_signalline import DsoSignalLineSignal +from strategy.generator.signal.signalline.kst_signalline import KstSignalLineSignal +from strategy.generator.signal.signalline.macd_signalline import MacdSignalLineSignal +from strategy.generator.signal.signalline.qstick_signalline import QstickSignalLineSignal +from strategy.generator.signal.signalline.rsi_signalline import RsiSignalLineSignal +from strategy.generator.signal.signalline.stoch_signalline import StochSignalLineSignal +from strategy.generator.signal.signalline.trix_signalline import TrixSignalLineSignal +from strategy.generator.signal.signalline.tsi_signalline import TsiSignalLineSignal +from strategy.generator.signal.zerocross.ao_zerocross import AoZeroCrossSignal +from strategy.generator.signal.zerocross.apo_zerocross import ApoZeroCrossSignal +from strategy.generator.signal.zerocross.bop_zerocross import BopZeroCrossSignal +from strategy.generator.signal.zerocross.cc_zerocross import CcZeroCrossSignal +from strategy.generator.signal.zerocross.cfo_zerocross import CfoZeroCrossSignal +from strategy.generator.signal.zerocross.macd_zerocross import MacdZeroCrossSignal +from strategy.generator.signal.zerocross.qstick_zerocross import QstickZeroCrossSignal +from strategy.generator.signal.zerocross.roc_zerocross import RocZeroCrossSignal +from strategy.generator.signal.zerocross.trix_zerocross import TrixZeroCrossSignal +from strategy.generator.signal.zerocross.tsi_zerocross import TsiZeroCrossSignal from strategy.generator.stop_loss.atr import AtrStopLoss class TrendSignalType(Enum): + ZERO_CROSS = auto() + SIGNAL_LINE = auto() BB = auto() - CANDLE = auto() - CROSS = auto() - HISTOGRAM = auto() - HFT = auto() + PATTERN = auto() FLIP = auto() - V = auto() + MA = auto() BREAKOUT = auto() - CUSTOM = auto() - PULLBACK = auto() - VOLATILITY = auto() + REVERSAL = auto() + NEUTRALITY = auto() class TrendFollowStrategyGenerator(AbstractStrategyGenerator): @@ -174,7 +170,7 @@ def _generate_strategy(self): RsiConfirm(), StcConfirm(), DsoConfirm(), - # CciConfirm(), + CciConfirm(), ] ) pulse = np.random.choice( @@ -235,7 +231,7 @@ def candle_invariants(strategy_part): return [] return [ - replace(strategy_part, candle=CategoricalParameter(TrendCandleType)) + replace(strategy_part, candle=CategoricalParameter(CandleTrendType)) for _ in range(5) ] @@ -303,94 +299,103 @@ def factor_invariants(strategy_part): return result def _generate_signal(self, signal: TrendSignalType): - if signal == TrendSignalType.FLIP: + if signal == TrendSignalType.ZERO_CROSS: return np.random.choice( [ - AoFlipSignal(), - DsoFlipSignal(), - MacdFlipSignal(), - SupertrendFlipSignal(), - RocFlipSignal(), - TsiFlipSignal(), - TsiFlipSignal(), - CeFlipSignal(), - QstickFlipSignal(), - CcFlipSignal(), - CeFlipSignal(), - StcFlipSignal(), - ApoFlipSignal(), - BopFlipSignal(), - CfoFlipSignal(), + AoZeroCrossSignal(), + ApoZeroCrossSignal(), + BopZeroCrossSignal(), + MacdZeroCrossSignal(), + RocZeroCrossSignal(), + TsiZeroCrossSignal(), + TrixZeroCrossSignal(), + QstickZeroCrossSignal(), + CcZeroCrossSignal(), + BopZeroCrossSignal(), + CfoZeroCrossSignal(), ] ) - if signal == TrendSignalType.V: - return np.random.choice([TiiVSignal(), RsiVSignal()]) - if signal == TrendSignalType.BB: + if signal == TrendSignalType.SIGNAL_LINE: return np.random.choice( [ - MacdBbSignal(), - VwapBbSignal(), + DiSignalLineSignal(), + DsoSignalLineSignal(), + KstSignalLineSignal(), + MacdSignalLineSignal(), + QstickSignalLineSignal(), + RsiSignalLineSignal(), + StochSignalLineSignal(), + TrixSignalLineSignal(), + TsiSignalLineSignal(), ] ) - if signal == TrendSignalType.CANDLE: + if signal == TrendSignalType.PATTERN: return np.random.choice( [ - TrendCandleSignal(), + AoSaucerSignal(), + CandleTrendSignal(), + HighLowSignal(), + MacdColorSwitchSignal(), + TiiVSignal(), + RsiVSignal(), ] ) - if signal == TrendSignalType.HISTOGRAM: + if signal == TrendSignalType.BB: return np.random.choice( [ - AoSaucerSignal(), - MacdColorSwitchSignal(), + MacdBbSignal(), + VwapBbSignal(), + ] + ) + + if signal == TrendSignalType.FLIP: + return np.random.choice( + [ + CeFlipSignal(), + SupertrendFlipSignal(), ] ) - if signal == TrendSignalType.HFT: - return np.random.choice([HighLowSignal()]) - if signal == TrendSignalType.CROSS: + if signal == TrendSignalType.MA: return np.random.choice( [ Ma3CrossSignal(), - MacdCrossSignal(smooth_type=StaticParameter(Smooth.ZLEMA)), - TiiCrossSignal(), - RsiNautralityCrossSignal(), - TsiCrossSignal(), - DiCrossSignal(), - QstickCrossSignal(), VwapCrossSignal(), - DmiCrossSignal(), - DsoCrossSignal(), - StochCrossSignal(), - KstCrossSignal(), - TrixCrossSignal(), - ViCrossSignal(), + Ma2RsiSignal(), + MaTestingGroundSignal(), + # MaQuadrupleSignal(), + # MaSurpassSignal(), + # MaCrossSignal(), ] ) if signal == TrendSignalType.BREAKOUT: return np.random.choice( [ - Dch2MaSignal(), + DchMa2BreakoutSignal(), ] ) - if signal == TrendSignalType.PULLBACK: + + if signal == TrendSignalType.REVERSAL: return np.random.choice( [ - RsiNautralityPullbackSignal(), - RsiMaPullbackSignal(), + DmiReversalSignal(), + SnatrReversalSignal(), + ViReversalSignal(), ] ) - if signal == TrendSignalType.VOLATILITY: + if signal == TrendSignalType.NEUTRALITY: return np.random.choice( [ - SnatrSignal(), + DsoNeutralityCrossSignal(), + RsiNautralityCrossSignal(), + RsiNautralityPullbackSignal(), + RsiNautralityRejectionSignal(), ] ) return np.random.choice( [ RsiNautralityRejectionSignal(), - RsiSupertrendSignal(), - Rsi2MaSignal(), + MacdZeroCrossSignal(), ] ) diff --git a/strategy/generator/pulse/tdfi.py b/strategy/generator/pulse/tdfi.py index d9763219..ab85a0c2 100644 --- a/strategy/generator/pulse/tdfi.py +++ b/strategy/generator/pulse/tdfi.py @@ -9,6 +9,6 @@ @dataclass(frozen=True) class TdfiPulse(Pulse): type: PulseType = PulseType.Tdfi - smooth_type: Parameter = StaticParameter(Smooth.ZLEMA) + smooth_type: Parameter = StaticParameter(Smooth.EMA) period: Parameter = StaticParameter(14.0) n: Parameter = StaticParameter(3.0) diff --git a/strategy/generator/signal/base.py b/strategy/generator/signal/base.py index 4e7dcf49..4f563e7c 100644 --- a/strategy/generator/signal/base.py +++ b/strategy/generator/signal/base.py @@ -5,55 +5,60 @@ class SignalType(Enum): - AoFlip = "AoFlip" - ApoFlip = "ApoFlip" + # ZeroCross + AoZeroCross = "AoZeroCross" + ApoZeroCross = "ApoZeroCross" + BopZeroCross = "BopZeroCross" + CcZeroCross = "CcZeroCross" + CfoZeroCross = "CfoZeroCross" + DiZeroCross = "DiZeroCross" + MacdZeroCross = "MacdZeroCross" + QstickZeroCross = "QstickZeroCross" + RocZeroCross = "RocZeroCross" + TrixZeroCross = "TrixZeroCross" + TsiZeroCross = "TsiZeroCross" + # Signal Line + DiSignalLine = "DiSignalLine" + DsoSignalLine = "DsoSignalLine" + MacdSignalLine = "MacdSignalLine" + RsiSignalLine = "RsiSignalLine" + StochSignalLine = "StochSignalLine" + QstickSignalLine = "QstickSignalLine" + TrixSignalLine = "TrixSignalLine" + TsiSignalLine = "TsiSignalLine" + KstSignalLine = "KstSignalLine" + # BB + MacdBb = "MacdBb" + VwapBb = "VwapBb" + # Pattern AoSaucer = "AoSaucer" - BopFlip = "BopFlip" - CeFlip = "CeFlip" - CcFlip = "CcFlip" - CfoFlip = "CfoFlip" - DiFlip = "DiFlip" - DiCross = "DiCross" - DmiCross = "DmiCross" - DsoFlip = "DsoFlip" - DsoCross = "DsoCross" HighLow = "HighLow" + MacdColorSwitch = "MacdColorSwitch" + RsiV = "RsiV" + TiiV = "TiiV" + CandleTrend = "CandleTrend" + # Flip + CeFlip = "CeFlip" + SupFlip = "SupFlip" + # Reversal + DmiReversal = "DmiReversal" + SnatrReversal = "SnatrReversal" + ViReversal = "ViReversal" + # Ma Ma3Cross = "Ma3Cross" MaTestingGround = "MaTestingGround" MaQuadruple = "MaQuadruple" MaSurpass = "MaSurpass" - MacdFlip = "MacdFlip" - MacdBb = "MacdBb" - MacdCross = "MacdCross" - MacdColorSwitch = "MacdColorSwitch" + MaCross = "MaCross" + Ma2Rsi = "Ma2Rsi" + VwapCross = "VwapCross" + # Neutrality + DsoNeutralityCross = "DsoNeutralityCross" RsiNeutralityCross = "RsiNeutralityCross" RsiNeutralityPullback = "RsiNeutralityPullback" RsiNeutralityRejection = "RsiNeutralityRejection" - RsiSup = "RsiSup" - Rsi2Ma = "Rsi2Ma" - RsiMaPullback = "RsiMaPullback" - Dch2Ma = "Dch2Ma" - KstCross = "KstCross" - RocFlip = "RocFlip" - RsiV = "RsiV" - SnAtr = "SnAtr" - SupFlip = "SupFlip" - SupPullBack = "SupPullBack" - StcFlip = "StcFlip" - StcUturn = "StcUturn" - StochCross = "StochCross" - TrendCandle = "TrendCandle" - TiiCross = "TiiCross" - TiiV = "TiiV" - TrixFlip = "TrixFlip" - TrixCross = "TrixCross" - TsiFlip = "TsiFlip" - TsiCross = "TsiCross" - QstickFlip = "QstickFlip" - QstickCross = "QstickCross" - ViCross = "ViCross" - VwapBb = "VwapBb" - VwapCross = "VwapCross" + # Breakout + DchMa2Breakout = "DchMa2Breakout" def __str__(self): return self.value.upper() diff --git a/strategy/generator/signal/bb/__init__.py b/strategy/generator/signal/bb/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/strategy/generator/signal/macd_bb.py b/strategy/generator/signal/bb/macd_bb.py similarity index 89% rename from strategy/generator/signal/macd_bb.py rename to strategy/generator/signal/bb/macd_bb.py index 5043d265..b8eed39f 100644 --- a/strategy/generator/signal/macd_bb.py +++ b/strategy/generator/signal/bb/macd_bb.py @@ -5,8 +5,7 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) diff --git a/strategy/generator/signal/vwap_bb.py b/strategy/generator/signal/bb/vwap_bb.py similarity index 87% rename from strategy/generator/signal/vwap_bb.py rename to strategy/generator/signal/bb/vwap_bb.py index 9cf31112..bf43208c 100644 --- a/strategy/generator/signal/vwap_bb.py +++ b/strategy/generator/signal/bb/vwap_bb.py @@ -2,8 +2,7 @@ from core.models.parameter import Parameter, StaticParameter from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) diff --git a/strategy/generator/signal/breakout/__init__.py b/strategy/generator/signal/breakout/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/strategy/generator/signal/dch_two_ma.py b/strategy/generator/signal/breakout/dch_two_ma.py similarity index 76% rename from strategy/generator/signal/dch_two_ma.py rename to strategy/generator/signal/breakout/dch_two_ma.py index 102de7a2..b1ded184 100644 --- a/strategy/generator/signal/dch_two_ma.py +++ b/strategy/generator/signal/breakout/dch_two_ma.py @@ -7,13 +7,12 @@ RandomParameter, StaticParameter, ) - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class Dch2MaSignal(Signal): - type: SignalType = SignalType.Dch2Ma +class DchMa2BreakoutSignal(Signal): + type: SignalType = SignalType.DchMa2Breakout dch_period: Parameter = StaticParameter(20.0) ma: Parameter = CategoricalParameter(MovingAverageType) fast_period: Parameter = RandomParameter(10.0, 50.0, 10.0) diff --git a/strategy/generator/signal/flip/__init__.py b/strategy/generator/signal/flip/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/strategy/generator/signal/ce_flip.py b/strategy/generator/signal/flip/ce_flip.py similarity index 84% rename from strategy/generator/signal/ce_flip.py rename to strategy/generator/signal/flip/ce_flip.py index 8595e2ee..5eddb204 100644 --- a/strategy/generator/signal/ce_flip.py +++ b/strategy/generator/signal/flip/ce_flip.py @@ -4,8 +4,7 @@ Parameter, StaticParameter, ) - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) diff --git a/strategy/generator/signal/supertrend_flip.py b/strategy/generator/signal/flip/supertrend_flip.py similarity index 82% rename from strategy/generator/signal/supertrend_flip.py rename to strategy/generator/signal/flip/supertrend_flip.py index 04d21c41..9397ed7f 100644 --- a/strategy/generator/signal/supertrend_flip.py +++ b/strategy/generator/signal/flip/supertrend_flip.py @@ -1,8 +1,7 @@ from dataclasses import dataclass from core.models.parameter import Parameter, StaticParameter - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) diff --git a/strategy/generator/signal/ma/__init__.py b/strategy/generator/signal/ma/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/strategy/generator/signal/rsi_two_ma.py b/strategy/generator/signal/ma/ma2_rsi.py similarity index 82% rename from strategy/generator/signal/rsi_two_ma.py rename to strategy/generator/signal/ma/ma2_rsi.py index 1748ac8f..34239029 100644 --- a/strategy/generator/signal/rsi_two_ma.py +++ b/strategy/generator/signal/ma/ma2_rsi.py @@ -8,13 +8,12 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class Rsi2MaSignal(Signal): - type: SignalType = SignalType.Rsi2Ma +class Ma2RsiSignal(Signal): + type: SignalType = SignalType.Ma2Rsi smooth_type: Parameter = StaticParameter(Smooth.SMMA) rsi_period: Parameter = StaticParameter(2.0) threshold: Parameter = RandomParameter(0.0, 3.0, 1.0) diff --git a/strategy/generator/signal/ma_three_cross.py b/strategy/generator/signal/ma/ma3_cross.py similarity index 89% rename from strategy/generator/signal/ma_three_cross.py rename to strategy/generator/signal/ma/ma3_cross.py index 3f363645..b391acb5 100644 --- a/strategy/generator/signal/ma_three_cross.py +++ b/strategy/generator/signal/ma/ma3_cross.py @@ -2,8 +2,7 @@ from core.models.moving_average import MovingAverageType from core.models.parameter import CategoricalParameter, Parameter, RandomParameter - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) diff --git a/strategy/generator/signal/ma/ma_cross.py b/strategy/generator/signal/ma/ma_cross.py new file mode 100644 index 00000000..61e25291 --- /dev/null +++ b/strategy/generator/signal/ma/ma_cross.py @@ -0,0 +1,13 @@ +from dataclasses import dataclass +from inspect import Parameter + +from core.models.moving_average import MovingAverageType +from core.models.parameter import CategoricalParameter, RandomParameter +from strategy.generator.signal.base import Signal, SignalType + + +@dataclass(frozen=True) +class MaCrossSignal(Signal): + type: SignalType = SignalType.MaCross + ma: Parameter = CategoricalParameter(MovingAverageType) + period: Parameter = RandomParameter(150.0, 200.0, 10.0) diff --git a/strategy/generator/signal/ma_quadruple.py b/strategy/generator/signal/ma/ma_quadruple.py similarity index 87% rename from strategy/generator/signal/ma_quadruple.py rename to strategy/generator/signal/ma/ma_quadruple.py index 7e49150a..43303e03 100644 --- a/strategy/generator/signal/ma_quadruple.py +++ b/strategy/generator/signal/ma/ma_quadruple.py @@ -3,8 +3,7 @@ from core.models.moving_average import MovingAverageType from core.models.parameter import CategoricalParameter, RandomParameter - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) diff --git a/strategy/generator/signal/ma_surpass.py b/strategy/generator/signal/ma/ma_surpass.py similarity index 87% rename from strategy/generator/signal/ma_surpass.py rename to strategy/generator/signal/ma/ma_surpass.py index 121a9b13..6bc88377 100644 --- a/strategy/generator/signal/ma_surpass.py +++ b/strategy/generator/signal/ma/ma_surpass.py @@ -3,8 +3,7 @@ from core.models.moving_average import MovingAverageType from core.models.parameter import CategoricalParameter, RandomParameter - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) diff --git a/strategy/generator/signal/ma_testing_ground.py b/strategy/generator/signal/ma/ma_testing_ground.py similarity index 86% rename from strategy/generator/signal/ma_testing_ground.py rename to strategy/generator/signal/ma/ma_testing_ground.py index a7555730..c2b0dff5 100644 --- a/strategy/generator/signal/ma_testing_ground.py +++ b/strategy/generator/signal/ma/ma_testing_ground.py @@ -2,8 +2,7 @@ from core.models.moving_average import MovingAverageType from core.models.parameter import CategoricalParameter, Parameter, StaticParameter - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) diff --git a/strategy/generator/signal/vwap_cross.py b/strategy/generator/signal/ma/vwap_cross.py similarity index 79% rename from strategy/generator/signal/vwap_cross.py rename to strategy/generator/signal/ma/vwap_cross.py index 31358b2d..6e49816e 100644 --- a/strategy/generator/signal/vwap_cross.py +++ b/strategy/generator/signal/ma/vwap_cross.py @@ -1,8 +1,7 @@ from dataclasses import dataclass from core.models.parameter import Parameter, StaticParameter - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) diff --git a/strategy/generator/signal/neutrality/__init__.py b/strategy/generator/signal/neutrality/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/strategy/generator/signal/dso_flip.py b/strategy/generator/signal/neutrality/dso_neutrality_cross.py similarity index 70% rename from strategy/generator/signal/dso_flip.py rename to strategy/generator/signal/neutrality/dso_neutrality_cross.py index 003dfad8..0f810a4f 100644 --- a/strategy/generator/signal/dso_flip.py +++ b/strategy/generator/signal/neutrality/dso_neutrality_cross.py @@ -2,13 +2,12 @@ from core.models.parameter import Parameter, StaticParameter from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class DsoFlipSignal(Signal): - type: Signal = SignalType.DsoFlip +class DsoNeutralityCrossSignal(Signal): + type: Signal = SignalType.DsoNeutralityCross smooth_type: Parameter = StaticParameter(Smooth.EMA) smooth_period: Parameter = StaticParameter(13.0) k_period: Parameter = StaticParameter(8.0) diff --git a/strategy/generator/signal/rsi_neutrality_cross.py b/strategy/generator/signal/neutrality/rsi_neutrality_cross.py similarity index 87% rename from strategy/generator/signal/rsi_neutrality_cross.py rename to strategy/generator/signal/neutrality/rsi_neutrality_cross.py index bcecc399..bce5e502 100644 --- a/strategy/generator/signal/rsi_neutrality_cross.py +++ b/strategy/generator/signal/neutrality/rsi_neutrality_cross.py @@ -6,8 +6,7 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) diff --git a/strategy/generator/signal/rsi_neutrality_pullback.py b/strategy/generator/signal/neutrality/rsi_neutrality_pullback.py similarity index 88% rename from strategy/generator/signal/rsi_neutrality_pullback.py rename to strategy/generator/signal/neutrality/rsi_neutrality_pullback.py index 6ea42f6e..406444b1 100644 --- a/strategy/generator/signal/rsi_neutrality_pullback.py +++ b/strategy/generator/signal/neutrality/rsi_neutrality_pullback.py @@ -6,8 +6,7 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) diff --git a/strategy/generator/signal/rsi_neutrality_rejection.py b/strategy/generator/signal/neutrality/rsi_neutrality_rejection.py similarity index 88% rename from strategy/generator/signal/rsi_neutrality_rejection.py rename to strategy/generator/signal/neutrality/rsi_neutrality_rejection.py index 96455a04..84bf9934 100644 --- a/strategy/generator/signal/rsi_neutrality_rejection.py +++ b/strategy/generator/signal/neutrality/rsi_neutrality_rejection.py @@ -6,8 +6,7 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) diff --git a/strategy/generator/signal/pattern/__init__.py b/strategy/generator/signal/pattern/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/strategy/generator/signal/ao_saucer.py b/strategy/generator/signal/pattern/ao_saucer.py similarity index 83% rename from strategy/generator/signal/ao_saucer.py rename to strategy/generator/signal/pattern/ao_saucer.py index 3d9699ca..949e549c 100644 --- a/strategy/generator/signal/ao_saucer.py +++ b/strategy/generator/signal/pattern/ao_saucer.py @@ -4,8 +4,7 @@ Parameter, StaticParameter, ) - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) diff --git a/strategy/generator/signal/pattern/candle_trend.py b/strategy/generator/signal/pattern/candle_trend.py new file mode 100644 index 00000000..239b438f --- /dev/null +++ b/strategy/generator/signal/pattern/candle_trend.py @@ -0,0 +1,11 @@ +from dataclasses import dataclass + +from core.models.candle import CandleTrendType +from core.models.parameter import CategoricalParameter, Parameter +from strategy.generator.signal.base import Signal, SignalType + + +@dataclass(frozen=True) +class CandleTrendSignal(Signal): + type: SignalType = SignalType.CandleTrend + candle: Parameter = CategoricalParameter(CandleTrendType) diff --git a/strategy/generator/signal/hl.py b/strategy/generator/signal/pattern/hl.py similarity index 80% rename from strategy/generator/signal/hl.py rename to strategy/generator/signal/pattern/hl.py index 6b401561..170c10d2 100644 --- a/strategy/generator/signal/hl.py +++ b/strategy/generator/signal/pattern/hl.py @@ -4,8 +4,7 @@ Parameter, StaticParameter, ) - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) diff --git a/strategy/generator/signal/macd_color_switch.py b/strategy/generator/signal/pattern/macd_colorswitch.py similarity index 88% rename from strategy/generator/signal/macd_color_switch.py rename to strategy/generator/signal/pattern/macd_colorswitch.py index 4fda6c9a..b353d84d 100644 --- a/strategy/generator/signal/macd_color_switch.py +++ b/strategy/generator/signal/pattern/macd_colorswitch.py @@ -6,8 +6,7 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) diff --git a/strategy/generator/signal/rsi_v.py b/strategy/generator/signal/pattern/rsi_v.py similarity index 87% rename from strategy/generator/signal/rsi_v.py rename to strategy/generator/signal/pattern/rsi_v.py index e85f66c6..5f2925a7 100644 --- a/strategy/generator/signal/rsi_v.py +++ b/strategy/generator/signal/pattern/rsi_v.py @@ -6,8 +6,7 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) diff --git a/strategy/generator/signal/tii_v.py b/strategy/generator/signal/pattern/tii_v.py similarity index 86% rename from strategy/generator/signal/tii_v.py rename to strategy/generator/signal/pattern/tii_v.py index 0a92c3e8..2819dfa4 100644 --- a/strategy/generator/signal/tii_v.py +++ b/strategy/generator/signal/pattern/tii_v.py @@ -2,8 +2,7 @@ from core.models.parameter import Parameter, StaticParameter from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) diff --git a/strategy/generator/signal/reversal/__init__.py b/strategy/generator/signal/reversal/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/strategy/generator/signal/dmi_cross.py b/strategy/generator/signal/reversal/dmi_reversal.py similarity index 59% rename from strategy/generator/signal/dmi_cross.py rename to strategy/generator/signal/reversal/dmi_reversal.py index 5d920dbc..2a06a615 100644 --- a/strategy/generator/signal/dmi_cross.py +++ b/strategy/generator/signal/reversal/dmi_reversal.py @@ -5,13 +5,12 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class DmiCrossSignal(Signal): - type: SignalType = SignalType.DmiCross +class DmiReversalSignal(Signal): + type: SignalType = SignalType.DmiReversal smooth_type: Parameter = StaticParameter(Smooth.SMMA) adx_period: Parameter = StaticParameter(8.0) - di_period: Parameter = StaticParameter(8.0) + di_period: Parameter = StaticParameter(4.0) diff --git a/strategy/generator/signal/snatr.py b/strategy/generator/signal/reversal/snatr_reversal.py similarity index 73% rename from strategy/generator/signal/snatr.py rename to strategy/generator/signal/reversal/snatr_reversal.py index c512f895..37ec036b 100644 --- a/strategy/generator/signal/snatr.py +++ b/strategy/generator/signal/reversal/snatr_reversal.py @@ -2,13 +2,12 @@ from core.models.parameter import Parameter, RandomParameter, StaticParameter from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class SnatrSignal(Signal): - type: SignalType = SignalType.SnAtr +class SnatrReversalSignal(Signal): + type: SignalType = SignalType.SnatrReversal smooth_type: Parameter = StaticParameter(Smooth.WMA) atr_period: Parameter = StaticParameter(60.0) atr_smooth_period: Parameter = StaticParameter(13.0) diff --git a/strategy/generator/signal/reversal/vi_reversal.py b/strategy/generator/signal/reversal/vi_reversal.py new file mode 100644 index 00000000..5e12c20c --- /dev/null +++ b/strategy/generator/signal/reversal/vi_reversal.py @@ -0,0 +1,11 @@ +from dataclasses import dataclass + +from core.models.parameter import Parameter, StaticParameter +from strategy.generator.signal.base import Signal, SignalType + + +@dataclass(frozen=True) +class ViReversalSignal(Signal): + type: SignalType = SignalType.ViReversal + atr_period: Parameter = StaticParameter(1.0) + period: Parameter = StaticParameter(4.0) diff --git a/strategy/generator/signal/rsi_supertrend.py b/strategy/generator/signal/rsi_supertrend.py deleted file mode 100644 index c4ddcced..00000000 --- a/strategy/generator/signal/rsi_supertrend.py +++ /dev/null @@ -1,20 +0,0 @@ -from dataclasses import dataclass - -from core.models.parameter import ( - Parameter, - RandomParameter, - StaticParameter, -) -from core.models.smooth import Smooth - -from .base import Signal, SignalType - - -@dataclass(frozen=True) -class RsiSupertrendSignal(Signal): - type: SignalType = SignalType.RsiSup - smooth_type: Parameter = StaticParameter(Smooth.SMMA) - rsi_period: Parameter = StaticParameter(34.0) - threshold: Parameter = RandomParameter(2.0, 4.0, 1.0) - atr_period: Parameter = StaticParameter(16.0) - factor: Parameter = StaticParameter(4.5) diff --git a/strategy/generator/signal/signalline/__init__.py b/strategy/generator/signal/signalline/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/strategy/generator/signal/di_cross.py b/strategy/generator/signal/signalline/di_signalline.py similarity index 72% rename from strategy/generator/signal/di_cross.py rename to strategy/generator/signal/signalline/di_signalline.py index 6e20b599..b5699d33 100644 --- a/strategy/generator/signal/di_cross.py +++ b/strategy/generator/signal/signalline/di_signalline.py @@ -6,13 +6,12 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class DiCrossSignal(Signal): - type: SignalType = SignalType.DiCross +class DiSignalLineSignal(Signal): + type: SignalType = SignalType.DiSignalLine period: Parameter = RandomParameter(10.0, 15.0, 1.0) smooth_type: Parameter = StaticParameter(Smooth.WMA) signal_period: Parameter = RandomParameter(4.0, 8.0, 1.0) diff --git a/strategy/generator/signal/dso_cross.py b/strategy/generator/signal/signalline/dso_signalline.py similarity index 72% rename from strategy/generator/signal/dso_cross.py rename to strategy/generator/signal/signalline/dso_signalline.py index 21f08164..136e68d4 100644 --- a/strategy/generator/signal/dso_cross.py +++ b/strategy/generator/signal/signalline/dso_signalline.py @@ -2,13 +2,12 @@ from core.models.parameter import Parameter, StaticParameter from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class DsoCrossSignal(Signal): - type: Signal = SignalType.DsoCross +class DsoSignalLineSignal(Signal): + type: Signal = SignalType.DsoSignalLine smooth_type: Parameter = StaticParameter(Smooth.EMA) smooth_period: Parameter = StaticParameter(13.0) k_period: Parameter = StaticParameter(8.0) diff --git a/strategy/generator/signal/kst_cross.py b/strategy/generator/signal/signalline/kst_signalline.py similarity index 83% rename from strategy/generator/signal/kst_cross.py rename to strategy/generator/signal/signalline/kst_signalline.py index 3fd7ae45..2ed294f4 100644 --- a/strategy/generator/signal/kst_cross.py +++ b/strategy/generator/signal/signalline/kst_signalline.py @@ -5,13 +5,12 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class KstCrossSignal(Signal): - type: SignalType = SignalType.KstCross +class KstSignalLineSignal(Signal): + type: SignalType = SignalType.KstSignalLine smooth_type: Parameter = StaticParameter(Smooth.SMA) roc_period_first: Parameter = StaticParameter(10.0) roc_period_second: Parameter = StaticParameter(15.0) diff --git a/strategy/generator/signal/macd_cross.py b/strategy/generator/signal/signalline/macd_signalline.py similarity index 72% rename from strategy/generator/signal/macd_cross.py rename to strategy/generator/signal/signalline/macd_signalline.py index 355330d0..dda45648 100644 --- a/strategy/generator/signal/macd_cross.py +++ b/strategy/generator/signal/signalline/macd_signalline.py @@ -5,13 +5,12 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class MacdCrossSignal(Signal): - type: SignalType = SignalType.MacdCross +class MacdSignalLineSignal(Signal): + type: SignalType = SignalType.MacdSignalLine smooth_type: Parameter = StaticParameter(Smooth.ZLEMA) fast_period: Parameter = StaticParameter(12.0) slow_period: Parameter = StaticParameter(26.0) diff --git a/strategy/generator/signal/qstick_cross.py b/strategy/generator/signal/signalline/qstick_signalline.py similarity index 71% rename from strategy/generator/signal/qstick_cross.py rename to strategy/generator/signal/signalline/qstick_signalline.py index d8faaf8b..dd4308fd 100644 --- a/strategy/generator/signal/qstick_cross.py +++ b/strategy/generator/signal/signalline/qstick_signalline.py @@ -6,13 +6,12 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class QstickCrossSignal(Signal): - type: SignalType = SignalType.QstickCross +class QstickSignalLineSignal(Signal): + type: SignalType = SignalType.QstickSignalLine smooth_type: Parameter = StaticParameter(Smooth.EMA) period: Parameter = RandomParameter(10.0, 15.0, 1.0) signal_period: Parameter = RandomParameter(4.0, 8.0, 1.0) diff --git a/strategy/generator/signal/rsi_ma_pullback.py b/strategy/generator/signal/signalline/rsi_signalline.py similarity index 77% rename from strategy/generator/signal/rsi_ma_pullback.py rename to strategy/generator/signal/signalline/rsi_signalline.py index a04949a9..d1587203 100644 --- a/strategy/generator/signal/rsi_ma_pullback.py +++ b/strategy/generator/signal/signalline/rsi_signalline.py @@ -6,13 +6,12 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class RsiMaPullbackSignal(Signal): - type: SignalType = SignalType.RsiMaPullback +class RsiSignalLineSignal(Signal): + type: SignalType = SignalType.RsiSignalLine smooth_type: Parameter = StaticParameter(Smooth.SMMA) rsi_period: Parameter = RandomParameter(12.0, 15.0, 1.0) smooth_signal: Parameter = StaticParameter(Smooth.EMA) diff --git a/strategy/generator/signal/stoch_cross.py b/strategy/generator/signal/signalline/stoch_signalline.py similarity index 73% rename from strategy/generator/signal/stoch_cross.py rename to strategy/generator/signal/signalline/stoch_signalline.py index 61334578..7bd4d675 100644 --- a/strategy/generator/signal/stoch_cross.py +++ b/strategy/generator/signal/signalline/stoch_signalline.py @@ -2,13 +2,12 @@ from core.models.parameter import Parameter, RandomParameter, StaticParameter from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class StochCrossSignal(Signal): - type: SignalType = SignalType.StochCross +class StochSignalLineSignal(Signal): + type: SignalType = SignalType.StochSignalLine smooth_type: Parameter = StaticParameter(Smooth.SMA) period: Parameter = RandomParameter(13.0, 16.0, 1.0) k_period: Parameter = RandomParameter(1.0, 5.0, 1.0) diff --git a/strategy/generator/signal/trix_cross.py b/strategy/generator/signal/signalline/trix_signalline.py similarity index 68% rename from strategy/generator/signal/trix_cross.py rename to strategy/generator/signal/signalline/trix_signalline.py index d69f8cd1..2d71232d 100644 --- a/strategy/generator/signal/trix_cross.py +++ b/strategy/generator/signal/signalline/trix_signalline.py @@ -5,13 +5,12 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class TrixCrossSignal(Signal): - type: SignalType = SignalType.TrixCross +class TrixSignalLineSignal(Signal): + type: SignalType = SignalType.TrixSignalLine smooth_type: Parameter = StaticParameter(Smooth.EMA) period: Parameter = StaticParameter(7.0) signal_period: Parameter = StaticParameter(9.0) diff --git a/strategy/generator/signal/tsi_cross.py b/strategy/generator/signal/signalline/tsi_signalline.py similarity index 72% rename from strategy/generator/signal/tsi_cross.py rename to strategy/generator/signal/signalline/tsi_signalline.py index 7f90eaed..9554b1d8 100644 --- a/strategy/generator/signal/tsi_cross.py +++ b/strategy/generator/signal/signalline/tsi_signalline.py @@ -5,13 +5,12 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class TsiCrossSignal(Signal): - type: SignalType = SignalType.TsiCross +class TsiSignalLineSignal(Signal): + type: SignalType = SignalType.TsiSignalLine smooth_type: Parameter = StaticParameter(Smooth.EMA) fast_period: Parameter = StaticParameter(13.0) slow_period: Parameter = StaticParameter(25.0) diff --git a/strategy/generator/signal/stc_flip.py b/strategy/generator/signal/stc_flip.py deleted file mode 100644 index 5b56e217..00000000 --- a/strategy/generator/signal/stc_flip.py +++ /dev/null @@ -1,20 +0,0 @@ -from dataclasses import dataclass - -from core.models.parameter import ( - Parameter, - StaticParameter, -) -from core.models.smooth import Smooth - -from .base import Signal, SignalType - - -@dataclass(frozen=True) -class StcFlipSignal(Signal): - type: SignalType = SignalType.StcFlip - smooth_type: Parameter = StaticParameter(Smooth.EMA) - fast_period: Parameter = StaticParameter(26.0) - slow_period: Parameter = StaticParameter(50.0) - cycle: Parameter = StaticParameter(12.0) - d_first: Parameter = StaticParameter(3.0) - d_second: Parameter = StaticParameter(3.0) diff --git a/strategy/generator/signal/supertrend_pullback.py b/strategy/generator/signal/supertrend_pullback.py deleted file mode 100644 index 753aaebf..00000000 --- a/strategy/generator/signal/supertrend_pullback.py +++ /dev/null @@ -1,12 +0,0 @@ -from dataclasses import dataclass - -from core.models.parameter import Parameter, StaticParameter - -from .base import Signal, SignalType - - -@dataclass(frozen=True) -class SupertrendPullBackSignal(Signal): - type: SignalType = SignalType.SupPullBack - atr_period: Parameter = StaticParameter(10.0) - factor: Parameter = StaticParameter(2.0) diff --git a/strategy/generator/signal/tii_cross.py b/strategy/generator/signal/tii_cross.py deleted file mode 100644 index 8fd5488c..00000000 --- a/strategy/generator/signal/tii_cross.py +++ /dev/null @@ -1,15 +0,0 @@ -from dataclasses import dataclass - -from core.models.parameter import Parameter, RandomParameter, StaticParameter -from core.models.smooth import Smooth - -from .base import Signal, SignalType - - -@dataclass(frozen=True) -class TiiCrossSignal(Signal): - type: SignalType = SignalType.TiiCross - smooth_type: Parameter = StaticParameter(Smooth.SMA) - major_period: Parameter = StaticParameter(60.0) - minor_period: Parameter = StaticParameter(30.0) - threshold: Parameter = RandomParameter(0.0, 3.0, 1.0) diff --git a/strategy/generator/signal/trend_candle.py b/strategy/generator/signal/trend_candle.py deleted file mode 100644 index 47846239..00000000 --- a/strategy/generator/signal/trend_candle.py +++ /dev/null @@ -1,12 +0,0 @@ -from dataclasses import dataclass - -from core.models.candle import TrendCandleType -from core.models.parameter import CategoricalParameter, Parameter - -from .base import Signal, SignalType - - -@dataclass(frozen=True) -class TrendCandleSignal(Signal): - type: SignalType = SignalType.TrendCandle - candle: Parameter = CategoricalParameter(TrendCandleType) diff --git a/strategy/generator/signal/vi_cross.py b/strategy/generator/signal/vi_cross.py deleted file mode 100644 index 52164604..00000000 --- a/strategy/generator/signal/vi_cross.py +++ /dev/null @@ -1,12 +0,0 @@ -from dataclasses import dataclass - -from core.models.parameter import Parameter, StaticParameter - -from .base import Signal, SignalType - - -@dataclass(frozen=True) -class ViCrossSignal(Signal): - type: SignalType = SignalType.ViCross - atr_period: Parameter = StaticParameter(1.0) - period: Parameter = StaticParameter(8.0) diff --git a/strategy/generator/signal/zerocross/__init__.py b/strategy/generator/signal/zerocross/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/strategy/generator/signal/ao_flip.py b/strategy/generator/signal/zerocross/ao_zerocross.py similarity index 62% rename from strategy/generator/signal/ao_flip.py rename to strategy/generator/signal/zerocross/ao_zerocross.py index afe518bf..f0dfcef4 100644 --- a/strategy/generator/signal/ao_flip.py +++ b/strategy/generator/signal/zerocross/ao_zerocross.py @@ -4,12 +4,11 @@ Parameter, StaticParameter, ) - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class AoFlipSignal(Signal): - type: SignalType = SignalType.AoFlip +class AoZeroCrossSignal(Signal): + type: SignalType = SignalType.AoZeroCross fast_period: Parameter = StaticParameter(5.0) slow_period: Parameter = StaticParameter(34.0) diff --git a/strategy/generator/signal/apo_flip.py b/strategy/generator/signal/zerocross/apo_zerocross.py similarity index 62% rename from strategy/generator/signal/apo_flip.py rename to strategy/generator/signal/zerocross/apo_zerocross.py index 113a4e80..bf1f34bb 100644 --- a/strategy/generator/signal/apo_flip.py +++ b/strategy/generator/signal/zerocross/apo_zerocross.py @@ -4,12 +4,11 @@ Parameter, StaticParameter, ) - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class ApoFlipSignal(Signal): - type: SignalType = SignalType.ApoFlip +class ApoZeroCrossSignal(Signal): + type: SignalType = SignalType.ApoZeroCross fast_period: Parameter = StaticParameter(10.0) slow_period: Parameter = StaticParameter(20.0) diff --git a/strategy/generator/signal/bop_flip.py b/strategy/generator/signal/zerocross/bop_zerocross.py similarity index 66% rename from strategy/generator/signal/bop_flip.py rename to strategy/generator/signal/zerocross/bop_zerocross.py index 56eb17c4..66ac112a 100644 --- a/strategy/generator/signal/bop_flip.py +++ b/strategy/generator/signal/zerocross/bop_zerocross.py @@ -5,12 +5,11 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class BopFlipSignal(Signal): - type: SignalType = SignalType.BopFlip +class BopZeroCrossSignal(Signal): + type: SignalType = SignalType.BopZeroCross smooth_type: Parameter = StaticParameter(Smooth.SMA) smooth_period: Parameter = StaticParameter(14.0) diff --git a/strategy/generator/signal/cc_flip.py b/strategy/generator/signal/zerocross/cc_zerocross.py similarity index 73% rename from strategy/generator/signal/cc_flip.py rename to strategy/generator/signal/zerocross/cc_zerocross.py index 22b64ed8..a411f975 100644 --- a/strategy/generator/signal/cc_flip.py +++ b/strategy/generator/signal/zerocross/cc_zerocross.py @@ -5,13 +5,12 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class CcFlipSignal(Signal): - type: SignalType = SignalType.CcFlip +class CcZeroCrossSignal(Signal): + type: SignalType = SignalType.CcZeroCross fast_period: Parameter = StaticParameter(11.0) slow_period: Parameter = StaticParameter(14.0) smooth_type: Parameter = StaticParameter(Smooth.WMA) diff --git a/strategy/generator/signal/cfo_flip.py b/strategy/generator/signal/zerocross/cfo_zerocross.py similarity index 55% rename from strategy/generator/signal/cfo_flip.py rename to strategy/generator/signal/zerocross/cfo_zerocross.py index d789e7e9..3c20f261 100644 --- a/strategy/generator/signal/cfo_flip.py +++ b/strategy/generator/signal/zerocross/cfo_zerocross.py @@ -4,11 +4,10 @@ Parameter, StaticParameter, ) - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class CfoFlipSignal(Signal): - type: SignalType = SignalType.CfoFlip +class CfoZeroCrossSignal(Signal): + type: SignalType = SignalType.CfoZeroCross period: Parameter = StaticParameter(14.0) diff --git a/strategy/generator/signal/di_flip.py b/strategy/generator/signal/zerocross/di_zerocross.py similarity index 68% rename from strategy/generator/signal/di_flip.py rename to strategy/generator/signal/zerocross/di_zerocross.py index be357bb3..bc4d343d 100644 --- a/strategy/generator/signal/di_flip.py +++ b/strategy/generator/signal/zerocross/di_zerocross.py @@ -6,12 +6,11 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class DiFlipSignal(Signal): - type: SignalType = SignalType.DiFlip +class DiZeroCrossSignal(Signal): + type: SignalType = SignalType.DiZeroCross smooth_type: Parameter = StaticParameter(Smooth.WMA) period: Parameter = RandomParameter(10.0, 15.0, 1.0) diff --git a/strategy/generator/signal/macd_flip.py b/strategy/generator/signal/zerocross/macd_zerocross.py similarity index 73% rename from strategy/generator/signal/macd_flip.py rename to strategy/generator/signal/zerocross/macd_zerocross.py index 22a64b17..1a7894db 100644 --- a/strategy/generator/signal/macd_flip.py +++ b/strategy/generator/signal/zerocross/macd_zerocross.py @@ -6,13 +6,12 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class MacdFlipSignal(Signal): - type: SignalType = SignalType.MacdFlip +class MacdZeroCrossSignal(Signal): + type: SignalType = SignalType.MacdZeroCross smooth_type: Parameter = CategoricalParameter(Smooth) fast_period: Parameter = StaticParameter(12.0) slow_period: Parameter = StaticParameter(26.0) diff --git a/strategy/generator/signal/qstick_flip.py b/strategy/generator/signal/zerocross/qstick_zerocross.py similarity index 67% rename from strategy/generator/signal/qstick_flip.py rename to strategy/generator/signal/zerocross/qstick_zerocross.py index 958edf09..884ac925 100644 --- a/strategy/generator/signal/qstick_flip.py +++ b/strategy/generator/signal/zerocross/qstick_zerocross.py @@ -6,12 +6,11 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class QstickFlipSignal(Signal): - type: SignalType = SignalType.QstickFlip +class QstickZeroCrossSignal(Signal): + type: SignalType = SignalType.QstickZeroCross smooth_type: Parameter = StaticParameter(Smooth.EMA) period: Parameter = RandomParameter(10.0, 15.0, 1.0) diff --git a/strategy/generator/signal/roc_flip.py b/strategy/generator/signal/zerocross/roc_zerocross.py similarity index 55% rename from strategy/generator/signal/roc_flip.py rename to strategy/generator/signal/zerocross/roc_zerocross.py index 16cf4723..40e15610 100644 --- a/strategy/generator/signal/roc_flip.py +++ b/strategy/generator/signal/zerocross/roc_zerocross.py @@ -4,11 +4,10 @@ Parameter, StaticParameter, ) - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class RocFlipSignal(Signal): - type: SignalType = SignalType.RocFlip +class RocZeroCrossSignal(Signal): + type: SignalType = SignalType.RocZeroCross period: Parameter = StaticParameter(9.0) diff --git a/strategy/generator/signal/trix_flip.py b/strategy/generator/signal/zerocross/trix_zerocross.py similarity index 65% rename from strategy/generator/signal/trix_flip.py rename to strategy/generator/signal/zerocross/trix_zerocross.py index cdda838e..88c374e8 100644 --- a/strategy/generator/signal/trix_flip.py +++ b/strategy/generator/signal/zerocross/trix_zerocross.py @@ -5,12 +5,11 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class TrixFlipSignal(Signal): - type: SignalType = SignalType.TrixFlip +class TrixZeroCrossSignal(Signal): + type: SignalType = SignalType.TrixZeroCross smooth_type: Parameter = StaticParameter(Smooth.EMA) period: Parameter = StaticParameter(7.0) diff --git a/strategy/generator/signal/tsi_flip.py b/strategy/generator/signal/zerocross/tsi_zerocross.py similarity index 69% rename from strategy/generator/signal/tsi_flip.py rename to strategy/generator/signal/zerocross/tsi_zerocross.py index 0fe2460f..34dcd202 100644 --- a/strategy/generator/signal/tsi_flip.py +++ b/strategy/generator/signal/zerocross/tsi_zerocross.py @@ -5,13 +5,12 @@ StaticParameter, ) from core.models.smooth import Smooth - -from .base import Signal, SignalType +from strategy.generator.signal.base import Signal, SignalType @dataclass(frozen=True) -class TsiFlipSignal(Signal): - type: SignalType = SignalType.TsiFlip +class TsiZeroCrossSignal(Signal): + type: SignalType = SignalType.TsiZeroCross smooth_type: Parameter = StaticParameter(Smooth.EMA) fast_period: Parameter = StaticParameter(13.0) slow_period: Parameter = StaticParameter(25.0) diff --git a/ta_lib/Cargo.lock b/ta_lib/Cargo.lock index 45553e02..84581f29 100644 --- a/ta_lib/Cargo.lock +++ b/ta_lib/Cargo.lock @@ -45,7 +45,7 @@ version = "0.1.0" dependencies = [ "base", "core", - "shared", + "indicator", "signal", "trend", ] @@ -156,7 +156,6 @@ dependencies = [ "base", "core", "momentum", - "shared", "trend", "volume", ] @@ -256,8 +255,8 @@ dependencies = [ "base", "candlestick", "core", + "indicator", "momentum", - "shared", "trend", "volume", ] @@ -274,6 +273,16 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +[[package]] +name = "indicator" +version = "0.1.0" +dependencies = [ + "base", + "candlestick", + "core", + "trend", +] + [[package]] name = "is-terminal" version = "0.4.9" @@ -544,17 +553,6 @@ dependencies = [ "serde", ] -[[package]] -name = "shared" -version = "0.1.0" -dependencies = [ - "base", - "candlestick", - "core", - "momentum", - "trend", -] - [[package]] name = "signal" version = "0.1.0" @@ -562,8 +560,8 @@ dependencies = [ "base", "candlestick", "core", + "indicator", "momentum", - "shared", "trend", "volatility", "volume", @@ -617,10 +615,10 @@ dependencies = [ "confirm", "core", "exit", + "indicator", "pulse", "serde", "serde_json", - "shared", "signal", "stop_loss", ] diff --git a/ta_lib/Cargo.toml b/ta_lib/Cargo.toml index 0f0735d2..41f345b8 100644 --- a/ta_lib/Cargo.toml +++ b/ta_lib/Cargo.toml @@ -15,9 +15,9 @@ members = [ "strategies/stop_loss", "strategies/signal", "strategies/confirm", -"strategies/shared", "strategies/pulse", "strategies/baseline", +"strategies/indicator", ] [workspace.package] diff --git a/ta_lib/core/src/distance.rs b/ta_lib/core/src/distance.rs new file mode 100644 index 00000000..e69de29b diff --git a/ta_lib/strategies/baseline/Cargo.toml b/ta_lib/strategies/baseline/Cargo.toml index 1eac7af6..c8cbb6b4 100644 --- a/ta_lib/strategies/baseline/Cargo.toml +++ b/ta_lib/strategies/baseline/Cargo.toml @@ -15,4 +15,4 @@ base = { path = "../base" } core = { path = "../../core" } trend = { path = "../../indicators/trend" } signal = { path = "../signal" } -shared = { path = "../shared" } \ No newline at end of file +indicator = { path = "../indicator" } \ No newline at end of file diff --git a/ta_lib/strategies/baseline/src/lib.rs b/ta_lib/strategies/baseline/src/lib.rs index f6a78bbf..b3868382 100644 --- a/ta_lib/strategies/baseline/src/lib.rs +++ b/ta_lib/strategies/baseline/src/lib.rs @@ -1,3 +1,3 @@ mod ma; -pub use ma::MABaseLine; +pub use ma::MaBaseLine; diff --git a/ta_lib/strategies/baseline/src/ma.rs b/ta_lib/strategies/baseline/src/ma.rs index f6b47140..05629e6d 100644 --- a/ta_lib/strategies/baseline/src/ma.rs +++ b/ta_lib/strategies/baseline/src/ma.rs @@ -1,33 +1,31 @@ use base::prelude::*; use core::prelude::*; -use shared::{ma_indicator, MovingAverageType}; -use signal::{ - MACandleSignal, MACrossSignal, MAQuadrupleSignal, MASurpassSignal, MATestingGroundSignal, -}; +use indicator::{ma_indicator, MovingAverageType}; +use signal::{MaCrossSignal, MaQuadrupleSignal, MaSurpassSignal, MaTestingGroundSignal}; const DEFAULT_ATR_LOOKBACK: usize = 14; const DEFAULT_ATR_FACTOR: f32 = 1.236; -pub struct MABaseLine { +pub struct MaBaseLine { ma: MovingAverageType, period: usize, signal: Vec>, } -impl MABaseLine { +impl MaBaseLine { pub fn new(ma: MovingAverageType, period: f32) -> Self { Self { ma, period: period as usize, signal: vec![ - Box::new(MASurpassSignal::new(ma, period)), - Box::new(MAQuadrupleSignal::new(ma, period)), + Box::new(MaSurpassSignal::new(ma, period)), + Box::new(MaQuadrupleSignal::new(ma, period)), ], } } } -impl BaseLine for MABaseLine { +impl BaseLine for MaBaseLine { fn lookback(&self) -> usize { let mut m = std::cmp::max(DEFAULT_ATR_LOOKBACK, self.period); diff --git a/ta_lib/strategies/confirm/Cargo.toml b/ta_lib/strategies/confirm/Cargo.toml index ed5b0f3d..dfd52da2 100644 --- a/ta_lib/strategies/confirm/Cargo.toml +++ b/ta_lib/strategies/confirm/Cargo.toml @@ -12,7 +12,6 @@ repository.workspace = true [dependencies] base = { path = "../base" } core = { path = "../../core" } -shared = { path = "../shared" } momentum = { path = "../../indicators/momentum" } trend = { path = "../../indicators/trend" } volume = { path = "../../indicators/volume" } \ No newline at end of file diff --git a/ta_lib/strategies/confirm/src/cci.rs b/ta_lib/strategies/confirm/src/cci.rs index 0ab17a3b..d4a4b855 100644 --- a/ta_lib/strategies/confirm/src/cci.rs +++ b/ta_lib/strategies/confirm/src/cci.rs @@ -5,13 +5,13 @@ use momentum::cci; const CCI_UPPER_BARRIER: f32 = 50.; const CCI_LOWER_BARRIER: f32 = -50.; -pub struct CCIConfirm { +pub struct CciConfirm { smooth_type: Smooth, period: usize, factor: f32, } -impl CCIConfirm { +impl CciConfirm { pub fn new(smooth_type: Smooth, period: f32, factor: f32) -> Self { Self { smooth_type, @@ -21,7 +21,7 @@ impl CCIConfirm { } } -impl Confirm for CCIConfirm { +impl Confirm for CciConfirm { fn lookback(&self) -> usize { self.period } diff --git a/ta_lib/strategies/confirm/src/dpo.rs b/ta_lib/strategies/confirm/src/dpo.rs index 7b7c79e3..1e882040 100644 --- a/ta_lib/strategies/confirm/src/dpo.rs +++ b/ta_lib/strategies/confirm/src/dpo.rs @@ -2,12 +2,12 @@ use base::prelude::*; use core::prelude::*; use trend::dpo; -pub struct DPOConfirm { +pub struct DpoConfirm { smooth_type: Smooth, period: usize, } -impl DPOConfirm { +impl DpoConfirm { pub fn new(smooth_type: Smooth, period: f32) -> Self { Self { smooth_type, @@ -16,7 +16,7 @@ impl DPOConfirm { } } -impl Confirm for DPOConfirm { +impl Confirm for DpoConfirm { fn lookback(&self) -> usize { self.period } diff --git a/ta_lib/strategies/confirm/src/dso.rs b/ta_lib/strategies/confirm/src/dso.rs index 6debebd0..46900088 100644 --- a/ta_lib/strategies/confirm/src/dso.rs +++ b/ta_lib/strategies/confirm/src/dso.rs @@ -2,14 +2,14 @@ use base::prelude::*; use core::prelude::*; use momentum::dso; -pub struct DSOConfirm { +pub struct DsoConfirm { smooth_type: Smooth, smooth_period: usize, k_period: usize, d_period: usize, } -impl DSOConfirm { +impl DsoConfirm { pub fn new(smooth_type: Smooth, smooth_period: f32, k_period: f32, d_period: f32) -> Self { Self { smooth_type, @@ -20,7 +20,7 @@ impl DSOConfirm { } } -impl Confirm for DSOConfirm { +impl Confirm for DsoConfirm { fn lookback(&self) -> usize { let period = std::cmp::max(self.smooth_period, self.k_period); std::cmp::max(period, self.d_period) @@ -47,7 +47,7 @@ mod tests { #[test] fn test_confirm_dso() { - let confirm = DSOConfirm::new(Smooth::EMA, 13.0, 8.0, 9.0); + let confirm = DsoConfirm::new(Smooth::EMA, 13.0, 8.0, 9.0); let data = VecDeque::from([ OHLCV { open: 4.8914, diff --git a/ta_lib/strategies/confirm/src/eom.rs b/ta_lib/strategies/confirm/src/eom.rs index f0cd00ce..b1cf5651 100644 --- a/ta_lib/strategies/confirm/src/eom.rs +++ b/ta_lib/strategies/confirm/src/eom.rs @@ -2,13 +2,13 @@ use base::prelude::*; use core::prelude::*; use volume::eom; -pub struct EOMConfirm { +pub struct EomConfirm { smooth_type: Smooth, period: usize, divisor: f32, } -impl EOMConfirm { +impl EomConfirm { pub fn new(smooth_type: Smooth, period: f32, divisor: f32) -> Self { Self { smooth_type, @@ -18,7 +18,7 @@ impl EOMConfirm { } } -impl Confirm for EOMConfirm { +impl Confirm for EomConfirm { fn lookback(&self) -> usize { self.period } diff --git a/ta_lib/strategies/confirm/src/lib.rs b/ta_lib/strategies/confirm/src/lib.rs index 18096a4b..4e30264a 100644 --- a/ta_lib/strategies/confirm/src/lib.rs +++ b/ta_lib/strategies/confirm/src/lib.rs @@ -7,11 +7,11 @@ mod roc; mod rsi; mod stc; -pub use cci::CCIConfirm; -pub use dpo::DPOConfirm; -pub use dso::DSOConfirm; +pub use cci::CciConfirm; +pub use dpo::DpoConfirm; +pub use dso::DsoConfirm; pub use dumb::DumbConfirm; -pub use eom::EOMConfirm; -pub use roc::ROCConfirm; -pub use rsi::RSIConfirm; -pub use stc::STCConfirm; +pub use eom::EomConfirm; +pub use roc::RocConfirm; +pub use rsi::RsiConfirm; +pub use stc::StcConfirm; diff --git a/ta_lib/strategies/confirm/src/roc.rs b/ta_lib/strategies/confirm/src/roc.rs index aa460405..f06350e8 100644 --- a/ta_lib/strategies/confirm/src/roc.rs +++ b/ta_lib/strategies/confirm/src/roc.rs @@ -2,11 +2,11 @@ use base::prelude::*; use core::prelude::*; use momentum::roc; -pub struct ROCConfirm { +pub struct RocConfirm { period: usize, } -impl ROCConfirm { +impl RocConfirm { pub fn new(period: f32) -> Self { Self { period: period as usize, @@ -14,7 +14,7 @@ impl ROCConfirm { } } -impl Confirm for ROCConfirm { +impl Confirm for RocConfirm { fn lookback(&self) -> usize { self.period } diff --git a/ta_lib/strategies/confirm/src/rsi.rs b/ta_lib/strategies/confirm/src/rsi.rs index 637bf807..95cca08d 100644 --- a/ta_lib/strategies/confirm/src/rsi.rs +++ b/ta_lib/strategies/confirm/src/rsi.rs @@ -5,7 +5,7 @@ use momentum::rsi; const RSI_UPPER_BARRIER: f32 = 75.; const RSI_LOWER_BARRIER: f32 = 35.; -pub struct RSIConfirm { +pub struct RsiConfirm { smooth_type: Smooth, rsi_period: usize, smooth_signal: Smooth, @@ -13,7 +13,7 @@ pub struct RSIConfirm { threshold: f32, } -impl RSIConfirm { +impl RsiConfirm { pub fn new( smooth_type: Smooth, rsi_period: f32, @@ -31,7 +31,7 @@ impl RSIConfirm { } } -impl Confirm for RSIConfirm { +impl Confirm for RsiConfirm { fn lookback(&self) -> usize { std::cmp::max(self.rsi_period, self.smooth_period) } diff --git a/ta_lib/strategies/confirm/src/stc.rs b/ta_lib/strategies/confirm/src/stc.rs index f5bc3757..e3be053e 100644 --- a/ta_lib/strategies/confirm/src/stc.rs +++ b/ta_lib/strategies/confirm/src/stc.rs @@ -5,7 +5,7 @@ use momentum::stc; const LOWER_LINE: f32 = 25.; const UPPER_LINE: f32 = 75.; -pub struct STCConfirm { +pub struct StcConfirm { smooth_type: Smooth, fast_period: usize, slow_period: usize, @@ -14,7 +14,7 @@ pub struct STCConfirm { d_second: usize, } -impl STCConfirm { +impl StcConfirm { pub fn new( smooth_type: Smooth, fast_period: f32, @@ -34,7 +34,7 @@ impl STCConfirm { } } -impl Confirm for STCConfirm { +impl Confirm for StcConfirm { fn lookback(&self) -> usize { let adj_lookback_one = std::cmp::max(self.fast_period, self.slow_period); let adj_lookback_two = std::cmp::max(adj_lookback_one, self.cycle); diff --git a/ta_lib/strategies/exit/Cargo.toml b/ta_lib/strategies/exit/Cargo.toml index 5e6cb1d2..40247050 100644 --- a/ta_lib/strategies/exit/Cargo.toml +++ b/ta_lib/strategies/exit/Cargo.toml @@ -15,5 +15,5 @@ core = { path = "../../core" } candlestick = { path = "../../patterns/candlestick" } trend = { path = "../../indicators/trend" } momentum = { path = "../../indicators/momentum" } -volume = {path = "../../indicators/volume" } -shared = { path = "../shared" } \ No newline at end of file +volume = { path = "../../indicators/volume" } +indicator = { path = "../indicator" } \ No newline at end of file diff --git a/ta_lib/strategies/exit/src/ast.rs b/ta_lib/strategies/exit/src/ast.rs index ef6aee30..cb1c200b 100644 --- a/ta_lib/strategies/exit/src/ast.rs +++ b/ta_lib/strategies/exit/src/ast.rs @@ -27,11 +27,7 @@ impl Exit for AstExit { &data.atr(self.atr_period, Smooth::SMMA), self.factor, ); - let prev_direction = direction.shift(1); - ( - direction.seq(&-1.0) & prev_direction.seq(&1.0), - direction.seq(&1.0) & prev_direction.seq(&-1.0), - ) + (direction.cross_over(&ZERO), direction.cross_under(&ZERO)) } } diff --git a/ta_lib/strategies/exit/src/cci.rs b/ta_lib/strategies/exit/src/cci.rs index 7a047b22..a3fcd32a 100644 --- a/ta_lib/strategies/exit/src/cci.rs +++ b/ta_lib/strategies/exit/src/cci.rs @@ -5,14 +5,14 @@ use momentum::cci; const CCI_OVERBOUGHT: f32 = 100.0; const CCI_OVERSOLD: f32 = -100.0; -pub struct CCIExit { +pub struct CciExit { smooth_type: Smooth, period: usize, factor: f32, threshold: f32, } -impl CCIExit { +impl CciExit { pub fn new(smooth_type: Smooth, period: f32, factor: f32, threshold: f32) -> Self { Self { smooth_type, @@ -23,7 +23,7 @@ impl CCIExit { } } -impl Exit for CCIExit { +impl Exit for CciExit { fn lookback(&self) -> usize { self.period } diff --git a/ta_lib/strategies/exit/src/lib.rs b/ta_lib/strategies/exit/src/lib.rs index 97cc232f..1087cc68 100644 --- a/ta_lib/strategies/exit/src/lib.rs +++ b/ta_lib/strategies/exit/src/lib.rs @@ -8,10 +8,10 @@ mod rsi; mod trix; pub use ast::AstExit; -pub use cci::CCIExit; +pub use cci::CciExit; pub use dumb::DumbExit; pub use highlow::HighLowExit; -pub use ma::MAExit; -pub use mfi::MFIExit; -pub use rsi::RSIExit; -pub use trix::TRIXExit; +pub use ma::MaExit; +pub use mfi::MfiExit; +pub use rsi::RsiExit; +pub use trix::TrixExit; diff --git a/ta_lib/strategies/exit/src/ma.rs b/ta_lib/strategies/exit/src/ma.rs index be98aee1..6aa2617d 100644 --- a/ta_lib/strategies/exit/src/ma.rs +++ b/ta_lib/strategies/exit/src/ma.rs @@ -1,13 +1,13 @@ use base::prelude::*; use core::prelude::*; -use shared::{ma_indicator, MovingAverageType}; +use indicator::{ma_indicator, MovingAverageType}; -pub struct MAExit { +pub struct MaExit { ma: MovingAverageType, period: usize, } -impl MAExit { +impl MaExit { pub fn new(ma: MovingAverageType, period: f32) -> Self { Self { ma, @@ -16,7 +16,7 @@ impl MAExit { } } -impl Exit for MAExit { +impl Exit for MaExit { fn lookback(&self) -> usize { self.period } diff --git a/ta_lib/strategies/exit/src/mfi.rs b/ta_lib/strategies/exit/src/mfi.rs index 8b2d823c..6d1f1af9 100644 --- a/ta_lib/strategies/exit/src/mfi.rs +++ b/ta_lib/strategies/exit/src/mfi.rs @@ -5,12 +5,12 @@ use volume::mfi; const MFI_OVERBOUGHT: f32 = 80.0; const MFI_OVERSOLD: f32 = 20.0; -pub struct MFIExit { +pub struct MfiExit { period: usize, threshold: f32, } -impl MFIExit { +impl MfiExit { pub fn new(period: f32, threshold: f32) -> Self { Self { period: period as usize, @@ -19,7 +19,7 @@ impl MFIExit { } } -impl Exit for MFIExit { +impl Exit for MfiExit { fn lookback(&self) -> usize { self.period } diff --git a/ta_lib/strategies/exit/src/rsi.rs b/ta_lib/strategies/exit/src/rsi.rs index 3ac46068..cb750812 100644 --- a/ta_lib/strategies/exit/src/rsi.rs +++ b/ta_lib/strategies/exit/src/rsi.rs @@ -5,13 +5,13 @@ use momentum::rsi; const RSI_OVERBOUGHT: f32 = 70.0; const RSI_OVERSOLD: f32 = 30.0; -pub struct RSIExit { +pub struct RsiExit { smooth_type: Smooth, period: usize, threshold: f32, } -impl RSIExit { +impl RsiExit { pub fn new(smooth_type: Smooth, period: f32, threshold: f32) -> Self { Self { smooth_type, @@ -21,7 +21,7 @@ impl RSIExit { } } -impl Exit for RSIExit { +impl Exit for RsiExit { fn lookback(&self) -> usize { self.period } diff --git a/ta_lib/strategies/exit/src/trix.rs b/ta_lib/strategies/exit/src/trix.rs index 0c98030b..bf36109e 100644 --- a/ta_lib/strategies/exit/src/trix.rs +++ b/ta_lib/strategies/exit/src/trix.rs @@ -2,13 +2,13 @@ use base::prelude::*; use core::prelude::*; use momentum::trix; -pub struct TRIXExit { +pub struct TrixExit { smooth_type: Smooth, period: usize, signal_period: usize, } -impl TRIXExit { +impl TrixExit { pub fn new(smooth_type: Smooth, period: f32, signal_period: f32) -> Self { Self { smooth_type, @@ -18,7 +18,7 @@ impl TRIXExit { } } -impl Exit for TRIXExit { +impl Exit for TrixExit { fn lookback(&self) -> usize { std::cmp::max(self.period, self.signal_period) } diff --git a/ta_lib/strategies/shared/Cargo.toml b/ta_lib/strategies/indicator/Cargo.toml similarity index 73% rename from ta_lib/strategies/shared/Cargo.toml rename to ta_lib/strategies/indicator/Cargo.toml index 9522247d..9c78a962 100644 --- a/ta_lib/strategies/shared/Cargo.toml +++ b/ta_lib/strategies/indicator/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "shared" +name = "indicator" resolver = "2" authors.workspace = true @@ -10,8 +10,7 @@ readme.workspace = true repository.workspace = true [dependencies] -trend = { path = "../../indicators/trend" } -momentum = { path = "../../indicators/momentum" } -candlestick = { path = "../../patterns/candlestick" } core = { path = "../../core" } base = { path = "../base" } +candlestick = { path = "../../patterns/candlestick" } +trend = { path = "../../indicators/trend" } \ No newline at end of file diff --git a/ta_lib/strategies/shared/src/trend_candle.rs b/ta_lib/strategies/indicator/src/candle.rs similarity index 80% rename from ta_lib/strategies/shared/src/trend_candle.rs rename to ta_lib/strategies/indicator/src/candle.rs index 93c6a051..e3472456 100644 --- a/ta_lib/strategies/shared/src/trend_candle.rs +++ b/ta_lib/strategies/indicator/src/candle.rs @@ -6,7 +6,7 @@ use candlestick::{ use core::prelude::*; #[derive(Copy, Clone)] -pub enum TrendCandleType { +pub enum CandleTrendType { BOTTLE, DOUBLE_TROUBLE, GOLDEN, @@ -23,64 +23,64 @@ pub enum TrendCandleType { THREE_ONE_TWO, } -pub fn trend_candle_indicator( - candle: &TrendCandleType, +pub fn candle_trend_indicator( + candle: &CandleTrendType, data: &OHLCVSeries, ) -> (Series, Series) { match candle { - TrendCandleType::BOTTLE => ( + CandleTrendType::BOTTLE => ( bottle::bullish(&data.open, &data.low, &data.close), bottle::bearish(&data.open, &data.high, &data.close), ), - TrendCandleType::DOUBLE_TROUBLE => ( + CandleTrendType::DOUBLE_TROUBLE => ( double_trouble::bullish(&data.open, &data.high, &data.low, &data.close), double_trouble::bearish(&data.open, &data.high, &data.low, &data.close), ), - TrendCandleType::GOLDEN => ( + CandleTrendType::GOLDEN => ( golden::bullish(&data.open, &data.high, &data.low, &data.close), golden::bearish(&data.open, &data.high, &data.low, &data.close), ), - TrendCandleType::H => ( + CandleTrendType::H => ( h::bullish(&data.open, &data.high, &data.low, &data.close), h::bearish(&data.open, &data.high, &data.low, &data.close), ), - TrendCandleType::HEXAD => ( + CandleTrendType::HEXAD => ( hexad::bullish(&data.open, &data.high, &data.close), hexad::bearish(&data.open, &data.low, &data.close), ), - TrendCandleType::HIKKAKE => ( + CandleTrendType::HIKKAKE => ( hikkake::bullish(&data.open, &data.high, &data.low, &data.close), hikkake::bearish(&data.open, &data.high, &data.low, &data.close), ), - TrendCandleType::MARUBOZU => ( + CandleTrendType::MARUBOZU => ( marubozu::bullish(&data.open, &data.high, &data.low, &data.close), marubozu::bearish(&data.open, &data.high, &data.low, &data.close), ), - TrendCandleType::MASTER_CANDLE => ( + CandleTrendType::MASTER_CANDLE => ( master_candle::bullish(&data.open, &data.high, &data.low, &data.close), master_candle::bearish(&data.open, &data.high, &data.low, &data.close), ), - TrendCandleType::QUINTUPLETS => ( + CandleTrendType::QUINTUPLETS => ( quintuplets::bullish(&data.open, &data.close), quintuplets::bearish(&data.open, &data.close), ), - TrendCandleType::SLINGSHOT => ( + CandleTrendType::SLINGSHOT => ( slingshot::bullish(&data.open, &data.high, &data.low, &data.close), slingshot::bearish(&data.open, &data.high, &data.low, &data.close), ), - TrendCandleType::THREE_CANDLES => ( + CandleTrendType::THREE_CANDLES => ( three_candles::bullish(&data.open, &data.close), three_candles::bearish(&data.open, &data.close), ), - TrendCandleType::THREE_METHODS => ( + CandleTrendType::THREE_METHODS => ( three_methods::bullish(&data.open, &data.high, &data.low, &data.close), three_methods::bearish(&data.open, &data.high, &data.low, &data.close), ), - TrendCandleType::TASUKI => ( + CandleTrendType::TASUKI => ( tasuki::bullish(&data.open, &data.close), tasuki::bearish(&data.open, &data.close), ), - TrendCandleType::THREE_ONE_TWO => ( + CandleTrendType::THREE_ONE_TWO => ( three_one_two::bullish(&data.open, &data.high, &data.low, &data.close), three_one_two::bearish(&data.open, &data.high, &data.low, &data.close), ), diff --git a/ta_lib/strategies/indicator/src/lib.rs b/ta_lib/strategies/indicator/src/lib.rs new file mode 100644 index 00000000..52e690cb --- /dev/null +++ b/ta_lib/strategies/indicator/src/lib.rs @@ -0,0 +1,5 @@ +mod candle; +mod ma; + +pub use candle::*; +pub use ma::*; diff --git a/ta_lib/strategies/shared/src/ma.rs b/ta_lib/strategies/indicator/src/ma.rs similarity index 100% rename from ta_lib/strategies/shared/src/ma.rs rename to ta_lib/strategies/indicator/src/ma.rs diff --git a/ta_lib/strategies/pulse/src/adx.rs b/ta_lib/strategies/pulse/src/adx.rs index 62630920..95795713 100644 --- a/ta_lib/strategies/pulse/src/adx.rs +++ b/ta_lib/strategies/pulse/src/adx.rs @@ -4,14 +4,14 @@ use momentum::dmi; const ADX_LOWER_BARRIER: f32 = 25.; -pub struct ADXPulse { +pub struct AdxPulse { smooth_type: Smooth, adx_period: usize, di_period: usize, threshold: f32, } -impl ADXPulse { +impl AdxPulse { pub fn new(smooth_type: Smooth, adx_period: f32, di_period: f32, threshold: f32) -> Self { Self { smooth_type, @@ -22,7 +22,7 @@ impl ADXPulse { } } -impl Pulse for ADXPulse { +impl Pulse for AdxPulse { fn lookback(&self) -> usize { std::cmp::max(self.adx_period, self.di_period) } diff --git a/ta_lib/strategies/pulse/src/braid.rs b/ta_lib/strategies/pulse/src/braid.rs index b500bd57..5fe7ba15 100644 --- a/ta_lib/strategies/pulse/src/braid.rs +++ b/ta_lib/strategies/pulse/src/braid.rs @@ -62,7 +62,6 @@ impl Pulse for BraidPulse { #[cfg(test)] mod tests { use super::*; - use core::prelude::*; use std::collections::VecDeque; #[test] diff --git a/ta_lib/strategies/pulse/src/chop.rs b/ta_lib/strategies/pulse/src/chop.rs index 0f60cc74..639c268f 100644 --- a/ta_lib/strategies/pulse/src/chop.rs +++ b/ta_lib/strategies/pulse/src/chop.rs @@ -4,13 +4,13 @@ use trend::chop; const CHOP_MIDDLE_LINE: f32 = 38.2; -pub struct CHOPPulse { +pub struct ChopPulse { period: usize, atr_period: usize, threshold: f32, } -impl CHOPPulse { +impl ChopPulse { pub fn new(period: f32, atr_period: f32, threshold: f32) -> Self { Self { period: period as usize, @@ -20,7 +20,7 @@ impl CHOPPulse { } } -impl Pulse for CHOPPulse { +impl Pulse for ChopPulse { fn lookback(&self) -> usize { std::cmp::max(self.period, self.atr_period) } diff --git a/ta_lib/strategies/pulse/src/lib.rs b/ta_lib/strategies/pulse/src/lib.rs index 46caf314..e8f6fc5f 100644 --- a/ta_lib/strategies/pulse/src/lib.rs +++ b/ta_lib/strategies/pulse/src/lib.rs @@ -6,10 +6,10 @@ mod nvol; mod tdfi; mod vo; -pub use adx::ADXPulse; +pub use adx::AdxPulse; pub use braid::BraidPulse; -pub use chop::CHOPPulse; +pub use chop::ChopPulse; pub use dumb::DumbPulse; pub use nvol::NvolPulse; -pub use tdfi::TDFIPulse; +pub use tdfi::TdfiPulse; pub use vo::VoPulse; diff --git a/ta_lib/strategies/pulse/src/tdfi.rs b/ta_lib/strategies/pulse/src/tdfi.rs index 3a88a54b..76918169 100644 --- a/ta_lib/strategies/pulse/src/tdfi.rs +++ b/ta_lib/strategies/pulse/src/tdfi.rs @@ -5,13 +5,13 @@ use momentum::tdfi; const TDFI_UPPER_LINE: f32 = 0.05; const TDFI_LOWER_LINE: f32 = -0.05; -pub struct TDFIPulse { +pub struct TdfiPulse { smooth_type: Smooth, period: usize, n: usize, } -impl TDFIPulse { +impl TdfiPulse { pub fn new(smooth_type: Smooth, period: f32, n: f32) -> Self { Self { smooth_type, @@ -21,7 +21,7 @@ impl TDFIPulse { } } -impl Pulse for TDFIPulse { +impl Pulse for TdfiPulse { fn lookback(&self) -> usize { self.period } diff --git a/ta_lib/strategies/shared/src/lib.rs b/ta_lib/strategies/shared/src/lib.rs deleted file mode 100644 index eaf87688..00000000 --- a/ta_lib/strategies/shared/src/lib.rs +++ /dev/null @@ -1,5 +0,0 @@ -mod ma; -mod trend_candle; - -pub use ma::*; -pub use trend_candle::*; diff --git a/ta_lib/strategies/signal/Cargo.toml b/ta_lib/strategies/signal/Cargo.toml index ba0692ce..cd873e14 100644 --- a/ta_lib/strategies/signal/Cargo.toml +++ b/ta_lib/strategies/signal/Cargo.toml @@ -13,7 +13,7 @@ repository.workspace = true [dependencies] core = { path = "../../core" } base = { path = "../base" } -shared = { path = "../shared" } +indicator = { path = "../indicator" } trend = { path = "../../indicators/trend" } momentum = { path = "../../indicators/momentum" } volatility = { path = "../../indicators/volatility" } diff --git a/ta_lib/strategies/signal/src/macd_bb.rs b/ta_lib/strategies/signal/src/bb/macd_bb.rs similarity index 94% rename from ta_lib/strategies/signal/src/macd_bb.rs rename to ta_lib/strategies/signal/src/bb/macd_bb.rs index 7d7a1707..7b4bf20b 100644 --- a/ta_lib/strategies/signal/src/macd_bb.rs +++ b/ta_lib/strategies/signal/src/bb/macd_bb.rs @@ -3,7 +3,7 @@ use core::prelude::*; use momentum::macd; use volatility::bb; -pub struct MACDBBSignal { +pub struct MacdBbSignal { smooth_type: Smooth, fast_period: usize, slow_period: usize, @@ -12,7 +12,7 @@ pub struct MACDBBSignal { factor: f32, } -impl MACDBBSignal { +impl MacdBbSignal { pub fn new( smooth_type: Smooth, fast_period: f32, @@ -32,7 +32,7 @@ impl MACDBBSignal { } } -impl Signal for MACDBBSignal { +impl Signal for MacdBbSignal { fn lookback(&self) -> usize { let mut adj_lookback = std::cmp::max(self.fast_period, self.slow_period); adj_lookback = std::cmp::max(adj_lookback, self.signal_period); diff --git a/ta_lib/strategies/signal/src/bb/mod.rs b/ta_lib/strategies/signal/src/bb/mod.rs new file mode 100644 index 00000000..6e326789 --- /dev/null +++ b/ta_lib/strategies/signal/src/bb/mod.rs @@ -0,0 +1,5 @@ +mod macd_bb; +mod vwap_bb; + +pub use macd_bb::MacdBbSignal; +pub use vwap_bb::VwapBbSignal; diff --git a/ta_lib/strategies/signal/src/vwap_bb.rs b/ta_lib/strategies/signal/src/bb/vwap_bb.rs similarity index 91% rename from ta_lib/strategies/signal/src/vwap_bb.rs rename to ta_lib/strategies/signal/src/bb/vwap_bb.rs index 40627b56..f199276b 100644 --- a/ta_lib/strategies/signal/src/vwap_bb.rs +++ b/ta_lib/strategies/signal/src/bb/vwap_bb.rs @@ -3,14 +3,14 @@ use core::prelude::*; use volatility::bb; use volume::vwap; -pub struct VWAPBBSignal { +pub struct VwapBbSignal { period: usize, smooth_type: Smooth, bb_period: usize, factor: f32, } -impl VWAPBBSignal { +impl VwapBbSignal { pub fn new(period: f32, smooth_type: Smooth, bb_period: f32, factor: f32) -> Self { Self { period: period as usize, @@ -21,7 +21,7 @@ impl VWAPBBSignal { } } -impl Signal for VWAPBBSignal { +impl Signal for VwapBbSignal { fn lookback(&self) -> usize { std::cmp::max(self.period, self.bb_period) } diff --git a/ta_lib/strategies/signal/src/dch_two_ma.rs b/ta_lib/strategies/signal/src/breakout/dch_ma2_breakout.rs similarity index 88% rename from ta_lib/strategies/signal/src/dch_two_ma.rs rename to ta_lib/strategies/signal/src/breakout/dch_ma2_breakout.rs index 52dae2bc..6d1e9ae7 100644 --- a/ta_lib/strategies/signal/src/dch_two_ma.rs +++ b/ta_lib/strategies/signal/src/breakout/dch_ma2_breakout.rs @@ -1,16 +1,16 @@ use base::prelude::*; use core::prelude::*; -use shared::{ma_indicator, MovingAverageType}; +use indicator::{ma_indicator, MovingAverageType}; use volatility::dch; -pub struct DCH2MASignal { +pub struct DchMa2BreakoutSignal { dch_period: usize, ma: MovingAverageType, fast_period: usize, slow_period: usize, } -impl DCH2MASignal { +impl DchMa2BreakoutSignal { pub fn new(dch_period: f32, ma: MovingAverageType, fast_period: f32, slow_period: f32) -> Self { Self { dch_period: dch_period as usize, @@ -21,7 +21,7 @@ impl DCH2MASignal { } } -impl Signal for DCH2MASignal { +impl Signal for DchMa2BreakoutSignal { fn lookback(&self) -> usize { let adj_lookback = std::cmp::max(self.fast_period, self.slow_period); std::cmp::max(adj_lookback, self.dch_period) diff --git a/ta_lib/strategies/signal/src/breakout/mod.rs b/ta_lib/strategies/signal/src/breakout/mod.rs new file mode 100644 index 00000000..46f9ac52 --- /dev/null +++ b/ta_lib/strategies/signal/src/breakout/mod.rs @@ -0,0 +1,3 @@ +mod dch_ma2_breakout; + +pub use dch_ma2_breakout::DchMa2BreakoutSignal; diff --git a/ta_lib/strategies/signal/src/ce_flip.rs b/ta_lib/strategies/signal/src/flip/ce_flip.rs similarity index 91% rename from ta_lib/strategies/signal/src/ce_flip.rs rename to ta_lib/strategies/signal/src/flip/ce_flip.rs index 1760de84..7345d70e 100644 --- a/ta_lib/strategies/signal/src/ce_flip.rs +++ b/ta_lib/strategies/signal/src/flip/ce_flip.rs @@ -2,13 +2,13 @@ use base::prelude::*; use core::prelude::*; use trend::ce; -pub struct CEFlipSignal { +pub struct CeFlipSignal { period: usize, atr_period: usize, factor: f32, } -impl CEFlipSignal { +impl CeFlipSignal { pub fn new(period: f32, atr_period: f32, factor: f32) -> Self { Self { period: period as usize, @@ -18,7 +18,7 @@ impl CEFlipSignal { } } -impl Signal for CEFlipSignal { +impl Signal for CeFlipSignal { fn lookback(&self) -> usize { std::cmp::max(self.period, self.atr_period) } diff --git a/ta_lib/strategies/signal/src/flip/mod.rs b/ta_lib/strategies/signal/src/flip/mod.rs new file mode 100644 index 00000000..56f2478b --- /dev/null +++ b/ta_lib/strategies/signal/src/flip/mod.rs @@ -0,0 +1,5 @@ +mod ce_flip; +mod supertrend_flip; + +pub use ce_flip::CeFlipSignal; +pub use supertrend_flip::SupertrendFlipSignal; diff --git a/ta_lib/strategies/signal/src/supertrend_flip.rs b/ta_lib/strategies/signal/src/flip/supertrend_flip.rs similarity index 100% rename from ta_lib/strategies/signal/src/supertrend_flip.rs rename to ta_lib/strategies/signal/src/flip/supertrend_flip.rs diff --git a/ta_lib/strategies/signal/src/lib.rs b/ta_lib/strategies/signal/src/lib.rs index bbf33255..c740f668 100644 --- a/ta_lib/strategies/signal/src/lib.rs +++ b/ta_lib/strategies/signal/src/lib.rs @@ -1,101 +1,19 @@ -mod ao_flip; -mod ao_saucer; -mod apo_flip; -mod bop_flip; -mod cc_flip; -mod ce_flip; -mod cfo_flip; -mod dch_two_ma; -mod di_cross; -mod di_flip; -mod dmi_cross; -mod dso_cross; -mod dso_flip; -mod hl; -mod kst_cross; -mod ma_candle; -mod ma_cross; -mod ma_quadruple; -mod ma_surpass; -mod ma_testing_ground; -mod ma_three_cross; -mod macd_bb; -mod macd_color_switch; -mod macd_cross; -mod macd_flip; -mod qstick_cross; -mod qstick_flip; -mod roc_flip; -mod rsi_ma_pullback; -mod rsi_neutrality_cross; -mod rsi_neutrality_pullback; -mod rsi_neutrality_rejection; -mod rsi_supertrend; -mod rsi_two_ma; -mod rsi_v; -mod snatr; -mod stc_flip; -mod stoch_cross; -mod supertrend_flip; -mod supertrend_pullback; -mod tii_cross; -mod tii_v; -mod trend_candle; -mod trix_cross; -mod trix_flip; -mod tsi_cross; -mod tsi_flip; -mod vi_cross; -mod vwap_bb; -mod vwap_cross; +mod bb; +mod breakout; +mod flip; +mod ma; +mod neutrality; +mod pattern; +mod reversal; +mod signalline; +mod zerocross; -pub use ao_flip::AOFlipSignal; -pub use ao_saucer::AOSaucerSignal; -pub use apo_flip::APOFlipSignal; -pub use bop_flip::BOPFlipSignal; -pub use cc_flip::CCFlipSignal; -pub use ce_flip::CEFlipSignal; -pub use cfo_flip::CFOFlipSignal; -pub use dch_two_ma::DCH2MASignal; -pub use di_cross::DICrossSignal; -pub use di_flip::DIFlipSignal; -pub use dmi_cross::DMICrossSignal; -pub use dso_cross::DSOCrossSignal; -pub use dso_flip::DSOFlipSignal; -pub use hl::HighLowSignal; -pub use kst_cross::KSTCrossSignal; -pub use ma_candle::MACandleSignal; -pub use ma_cross::MACrossSignal; -pub use ma_quadruple::MAQuadrupleSignal; -pub use ma_surpass::MASurpassSignal; -pub use ma_testing_ground::MATestingGroundSignal; -pub use ma_three_cross::MA3CrossSignal; -pub use macd_bb::MACDBBSignal; -pub use macd_color_switch::MACDColorSwitchSignal; -pub use macd_cross::MACDCrossSignal; -pub use macd_flip::MACDFlipSignal; -pub use qstick_cross::QSTICKCrossSignal; -pub use qstick_flip::QSTICKFlipSignal; -pub use roc_flip::ROCFlipSignal; -pub use rsi_ma_pullback::RSIMaPullbackSignal; -pub use rsi_neutrality_cross::RSINeutralityCrossSignal; -pub use rsi_neutrality_pullback::RSINeutralityPullbackSignal; -pub use rsi_neutrality_rejection::RSINeutralityRejectionSignal; -pub use rsi_supertrend::RSISupertrendSignal; -pub use rsi_two_ma::RSI2MASignal; -pub use rsi_v::RSIVSignal; -pub use snatr::SNATRSignal; -pub use stc_flip::STCFlipSignal; -pub use stoch_cross::StochCrossSignal; -pub use supertrend_flip::SupertrendFlipSignal; -pub use supertrend_pullback::SupertrendPullBackSignal; -pub use tii_cross::TIICrossSignal; -pub use tii_v::TIIVSignal; -pub use trend_candle::TrendCandleSignal; -pub use trix_cross::TRIXCrossSignal; -pub use trix_flip::TRIXFlipSignal; -pub use tsi_cross::TSICrossSignal; -pub use tsi_flip::TSIFlipSignal; -pub use vi_cross::VICrossSignal; -pub use vwap_bb::VWAPBBSignal; -pub use vwap_cross::VWAPCrossSignal; +pub use bb::*; +pub use breakout::*; +pub use flip::*; +pub use ma::*; +pub use neutrality::*; +pub use pattern::*; +pub use reversal::*; +pub use signalline::*; +pub use zerocross::*; diff --git a/ta_lib/strategies/signal/src/rsi_two_ma.rs b/ta_lib/strategies/signal/src/ma/ma2_rsi.rs similarity index 92% rename from ta_lib/strategies/signal/src/rsi_two_ma.rs rename to ta_lib/strategies/signal/src/ma/ma2_rsi.rs index 991d6db4..798a4427 100644 --- a/ta_lib/strategies/signal/src/rsi_two_ma.rs +++ b/ta_lib/strategies/signal/src/ma/ma2_rsi.rs @@ -1,12 +1,12 @@ use base::prelude::*; use core::prelude::*; +use indicator::{ma_indicator, MovingAverageType}; use momentum::rsi; -use shared::{ma_indicator, MovingAverageType}; const RSI_UPPER_BARRIER: f32 = 85.0; const RSI_LOWER_BARRIER: f32 = 15.0; -pub struct RSI2MASignal { +pub struct Ma2RsiSignal { smooth_type: Smooth, rsi_period: usize, threshold: f32, @@ -15,7 +15,7 @@ pub struct RSI2MASignal { slow_period: usize, } -impl RSI2MASignal { +impl Ma2RsiSignal { pub fn new( smooth_type: Smooth, rsi_period: f32, @@ -35,7 +35,7 @@ impl RSI2MASignal { } } -impl Signal for RSI2MASignal { +impl Signal for Ma2RsiSignal { fn lookback(&self) -> usize { let adj_lookback = std::cmp::max(self.fast_period, self.slow_period); std::cmp::max(adj_lookback, self.rsi_period) diff --git a/ta_lib/strategies/signal/src/ma_three_cross.rs b/ta_lib/strategies/signal/src/ma/ma3_cross.rs similarity index 89% rename from ta_lib/strategies/signal/src/ma_three_cross.rs rename to ta_lib/strategies/signal/src/ma/ma3_cross.rs index 78f4a611..911df067 100644 --- a/ta_lib/strategies/signal/src/ma_three_cross.rs +++ b/ta_lib/strategies/signal/src/ma/ma3_cross.rs @@ -1,15 +1,15 @@ use base::prelude::*; use core::prelude::*; -use shared::{ma_indicator, MovingAverageType}; +use indicator::{ma_indicator, MovingAverageType}; -pub struct MA3CrossSignal { +pub struct Ma3CrossSignal { ma: MovingAverageType, fast_period: usize, medium_period: usize, slow_period: usize, } -impl MA3CrossSignal { +impl Ma3CrossSignal { pub fn new( ma: MovingAverageType, fast_period: f32, @@ -25,7 +25,7 @@ impl MA3CrossSignal { } } -impl Signal for MA3CrossSignal { +impl Signal for Ma3CrossSignal { fn lookback(&self) -> usize { let adjusted_lookback = std::cmp::max(self.fast_period, self.slow_period); std::cmp::max(adjusted_lookback, self.medium_period) diff --git a/ta_lib/strategies/signal/src/ma_cross.rs b/ta_lib/strategies/signal/src/ma/ma_cross.rs similarity index 79% rename from ta_lib/strategies/signal/src/ma_cross.rs rename to ta_lib/strategies/signal/src/ma/ma_cross.rs index 420a83d4..45a9e931 100644 --- a/ta_lib/strategies/signal/src/ma_cross.rs +++ b/ta_lib/strategies/signal/src/ma/ma_cross.rs @@ -1,13 +1,13 @@ use base::prelude::*; use core::prelude::*; -use shared::{ma_indicator, MovingAverageType}; +use indicator::{ma_indicator, MovingAverageType}; -pub struct MACrossSignal { +pub struct MaCrossSignal { ma: MovingAverageType, period: usize, } -impl MACrossSignal { +impl MaCrossSignal { pub fn new(ma: MovingAverageType, period: f32) -> Self { Self { ma, @@ -16,7 +16,7 @@ impl MACrossSignal { } } -impl Signal for MACrossSignal { +impl Signal for MaCrossSignal { fn lookback(&self) -> usize { self.period } diff --git a/ta_lib/strategies/signal/src/ma_quadruple.rs b/ta_lib/strategies/signal/src/ma/ma_quadruple.rs similarity index 91% rename from ta_lib/strategies/signal/src/ma_quadruple.rs rename to ta_lib/strategies/signal/src/ma/ma_quadruple.rs index bdcf61b7..f8f4e1be 100644 --- a/ta_lib/strategies/signal/src/ma_quadruple.rs +++ b/ta_lib/strategies/signal/src/ma/ma_quadruple.rs @@ -1,13 +1,13 @@ use base::prelude::*; use core::prelude::*; -use shared::{ma_indicator, MovingAverageType}; +use indicator::{ma_indicator, MovingAverageType}; -pub struct MAQuadrupleSignal { +pub struct MaQuadrupleSignal { ma: MovingAverageType, period: usize, } -impl MAQuadrupleSignal { +impl MaQuadrupleSignal { pub fn new(ma: MovingAverageType, period: f32) -> Self { Self { ma, @@ -16,7 +16,7 @@ impl MAQuadrupleSignal { } } -impl Signal for MAQuadrupleSignal { +impl Signal for MaQuadrupleSignal { fn lookback(&self) -> usize { self.period } diff --git a/ta_lib/strategies/signal/src/ma_surpass.rs b/ta_lib/strategies/signal/src/ma/ma_surpass.rs similarity index 90% rename from ta_lib/strategies/signal/src/ma_surpass.rs rename to ta_lib/strategies/signal/src/ma/ma_surpass.rs index cce5eea3..ea66da81 100644 --- a/ta_lib/strategies/signal/src/ma_surpass.rs +++ b/ta_lib/strategies/signal/src/ma/ma_surpass.rs @@ -1,13 +1,13 @@ use base::prelude::*; use core::prelude::*; -use shared::{ma_indicator, MovingAverageType}; +use indicator::{ma_indicator, MovingAverageType}; -pub struct MASurpassSignal { +pub struct MaSurpassSignal { ma: MovingAverageType, period: usize, } -impl MASurpassSignal { +impl MaSurpassSignal { pub fn new(ma: MovingAverageType, period: f32) -> Self { Self { ma, @@ -16,7 +16,7 @@ impl MASurpassSignal { } } -impl Signal for MASurpassSignal { +impl Signal for MaSurpassSignal { fn lookback(&self) -> usize { self.period } diff --git a/ta_lib/strategies/signal/src/ma_testing_ground.rs b/ta_lib/strategies/signal/src/ma/ma_testing_ground.rs similarity index 89% rename from ta_lib/strategies/signal/src/ma_testing_ground.rs rename to ta_lib/strategies/signal/src/ma/ma_testing_ground.rs index dfa1f1b6..001b44b3 100644 --- a/ta_lib/strategies/signal/src/ma_testing_ground.rs +++ b/ta_lib/strategies/signal/src/ma/ma_testing_ground.rs @@ -1,13 +1,13 @@ use base::prelude::*; use core::prelude::*; -use shared::{ma_indicator, MovingAverageType}; +use indicator::{ma_indicator, MovingAverageType}; -pub struct MATestingGroundSignal { +pub struct MaTestingGroundSignal { ma: MovingAverageType, period: usize, } -impl MATestingGroundSignal { +impl MaTestingGroundSignal { pub fn new(ma: MovingAverageType, period: f32) -> Self { Self { ma, @@ -16,7 +16,7 @@ impl MATestingGroundSignal { } } -impl Signal for MATestingGroundSignal { +impl Signal for MaTestingGroundSignal { fn lookback(&self) -> usize { self.period } diff --git a/ta_lib/strategies/signal/src/ma/mod.rs b/ta_lib/strategies/signal/src/ma/mod.rs new file mode 100644 index 00000000..53db8729 --- /dev/null +++ b/ta_lib/strategies/signal/src/ma/mod.rs @@ -0,0 +1,15 @@ +mod ma2_rsi; +mod ma3_cross; +mod ma_cross; +mod ma_quadruple; +mod ma_surpass; +mod ma_testing_ground; +mod vwap_cross; + +pub use ma2_rsi::Ma2RsiSignal; +pub use ma3_cross::Ma3CrossSignal; +pub use ma_cross::MaCrossSignal; +pub use ma_quadruple::MaQuadrupleSignal; +pub use ma_surpass::MaSurpassSignal; +pub use ma_testing_ground::MaTestingGroundSignal; +pub use vwap_cross::VwapCrossSignal; diff --git a/ta_lib/strategies/signal/src/vwap_cross.rs b/ta_lib/strategies/signal/src/ma/vwap_cross.rs similarity index 84% rename from ta_lib/strategies/signal/src/vwap_cross.rs rename to ta_lib/strategies/signal/src/ma/vwap_cross.rs index 86bbcd64..4ff7fa40 100644 --- a/ta_lib/strategies/signal/src/vwap_cross.rs +++ b/ta_lib/strategies/signal/src/ma/vwap_cross.rs @@ -2,11 +2,11 @@ use base::prelude::*; use core::prelude::*; use volume::vwap; -pub struct VWAPCrossSignal { +pub struct VwapCrossSignal { period: usize, } -impl VWAPCrossSignal { +impl VwapCrossSignal { pub fn new(period: f32) -> Self { Self { period: period as usize, @@ -14,7 +14,7 @@ impl VWAPCrossSignal { } } -impl Signal for VWAPCrossSignal { +impl Signal for VwapCrossSignal { fn lookback(&self) -> usize { self.period } diff --git a/ta_lib/strategies/signal/src/ma_candle.rs b/ta_lib/strategies/signal/src/ma_candle.rs deleted file mode 100644 index 11c6113b..00000000 --- a/ta_lib/strategies/signal/src/ma_candle.rs +++ /dev/null @@ -1,43 +0,0 @@ -use base::prelude::*; -use candlestick::{hexad, master_candle, slingshot, three_candles, three_one_two}; -use core::prelude::*; -use shared::{ma_indicator, MovingAverageType}; - -pub struct MACandleSignal { - ma: MovingAverageType, - period: usize, -} - -impl MACandleSignal { - pub fn new(ma: MovingAverageType, period: f32) -> Self { - Self { - ma, - period: period as usize, - } - } -} - -impl Signal for MACandleSignal { - fn lookback(&self) -> usize { - self.period - } - - fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { - let ma = ma_indicator(&self.ma, data, self.period); - - ( - (slingshot::bullish(&data.open, &data.high, &data.low, &data.close) - | master_candle::bullish(&data.open, &data.high, &data.low, &data.close) - | three_candles::bullish(&data.open, &data.close) - | hexad::bullish(&data.open, &data.high, &data.close) - | three_one_two::bullish(&data.open, &data.high, &data.low, &data.close)) - & data.close.sgt(&ma), - (slingshot::bearish(&data.open, &data.high, &data.low, &data.close) - | master_candle::bearish(&data.open, &data.high, &data.low, &data.close) - | three_candles::bearish(&data.open, &data.close) - | hexad::bearish(&data.open, &data.low, &data.close) - | three_one_two::bearish(&data.open, &data.high, &data.low, &data.close)) - & data.close.slt(&ma), - ) - } -} diff --git a/ta_lib/strategies/signal/src/dso_flip.rs b/ta_lib/strategies/signal/src/neutrality/dso_neutrality_cross.rs similarity index 89% rename from ta_lib/strategies/signal/src/dso_flip.rs rename to ta_lib/strategies/signal/src/neutrality/dso_neutrality_cross.rs index 2ea0a6de..4dccbbb9 100644 --- a/ta_lib/strategies/signal/src/dso_flip.rs +++ b/ta_lib/strategies/signal/src/neutrality/dso_neutrality_cross.rs @@ -2,14 +2,14 @@ use base::prelude::*; use core::prelude::*; use momentum::dso; -pub struct DSOFlipSignal { +pub struct DsoNeutralityCrossSignal { smooth_type: Smooth, smooth_period: usize, k_period: usize, d_period: usize, } -impl DSOFlipSignal { +impl DsoNeutralityCrossSignal { pub fn new(smooth_type: Smooth, smooth_period: f32, k_period: f32, d_period: f32) -> Self { Self { smooth_type, @@ -20,7 +20,7 @@ impl DSOFlipSignal { } } -impl Signal for DSOFlipSignal { +impl Signal for DsoNeutralityCrossSignal { fn lookback(&self) -> usize { let period = std::cmp::max(self.smooth_period, self.k_period); std::cmp::max(period, self.d_period) diff --git a/ta_lib/strategies/signal/src/neutrality/mod.rs b/ta_lib/strategies/signal/src/neutrality/mod.rs new file mode 100644 index 00000000..cc96d5d4 --- /dev/null +++ b/ta_lib/strategies/signal/src/neutrality/mod.rs @@ -0,0 +1,9 @@ +mod dso_neutrality_cross; +mod rsi_neutrality_cross; +mod rsi_neutrality_pullback; +mod rsi_neutrality_rejection; + +pub use dso_neutrality_cross::DsoNeutralityCrossSignal; +pub use rsi_neutrality_cross::RsiNeutralityCrossSignal; +pub use rsi_neutrality_pullback::RsiNeutralityPullbackSignal; +pub use rsi_neutrality_rejection::RsiNeutralityRejectionSignal; diff --git a/ta_lib/strategies/signal/src/rsi_neutrality_cross.rs b/ta_lib/strategies/signal/src/neutrality/rsi_neutrality_cross.rs similarity index 92% rename from ta_lib/strategies/signal/src/rsi_neutrality_cross.rs rename to ta_lib/strategies/signal/src/neutrality/rsi_neutrality_cross.rs index 5333ad40..bae38d77 100644 --- a/ta_lib/strategies/signal/src/rsi_neutrality_cross.rs +++ b/ta_lib/strategies/signal/src/neutrality/rsi_neutrality_cross.rs @@ -2,13 +2,13 @@ use base::prelude::*; use core::prelude::*; use momentum::rsi; -pub struct RSINeutralityCrossSignal { +pub struct RsiNeutralityCrossSignal { smooth_type: Smooth, rsi_period: usize, threshold: f32, } -impl RSINeutralityCrossSignal { +impl RsiNeutralityCrossSignal { pub fn new(smooth_type: Smooth, rsi_period: f32, threshold: f32) -> Self { Self { smooth_type, @@ -18,7 +18,7 @@ impl RSINeutralityCrossSignal { } } -impl Signal for RSINeutralityCrossSignal { +impl Signal for RsiNeutralityCrossSignal { fn lookback(&self) -> usize { self.rsi_period } diff --git a/ta_lib/strategies/signal/src/rsi_neutrality_pullback.rs b/ta_lib/strategies/signal/src/neutrality/rsi_neutrality_pullback.rs similarity index 91% rename from ta_lib/strategies/signal/src/rsi_neutrality_pullback.rs rename to ta_lib/strategies/signal/src/neutrality/rsi_neutrality_pullback.rs index 8be24076..8c41e013 100644 --- a/ta_lib/strategies/signal/src/rsi_neutrality_pullback.rs +++ b/ta_lib/strategies/signal/src/neutrality/rsi_neutrality_pullback.rs @@ -2,13 +2,13 @@ use base::prelude::*; use core::prelude::*; use momentum::rsi; -pub struct RSINeutralityPullbackSignal { +pub struct RsiNeutralityPullbackSignal { smooth_type: Smooth, rsi_period: usize, threshold: f32, } -impl RSINeutralityPullbackSignal { +impl RsiNeutralityPullbackSignal { pub fn new(smooth_type: Smooth, rsi_period: f32, threshold: f32) -> Self { Self { smooth_type, @@ -18,7 +18,7 @@ impl RSINeutralityPullbackSignal { } } -impl Signal for RSINeutralityPullbackSignal { +impl Signal for RsiNeutralityPullbackSignal { fn lookback(&self) -> usize { self.rsi_period } diff --git a/ta_lib/strategies/signal/src/rsi_neutrality_rejection.rs b/ta_lib/strategies/signal/src/neutrality/rsi_neutrality_rejection.rs similarity index 90% rename from ta_lib/strategies/signal/src/rsi_neutrality_rejection.rs rename to ta_lib/strategies/signal/src/neutrality/rsi_neutrality_rejection.rs index a385162a..a3318071 100644 --- a/ta_lib/strategies/signal/src/rsi_neutrality_rejection.rs +++ b/ta_lib/strategies/signal/src/neutrality/rsi_neutrality_rejection.rs @@ -2,13 +2,13 @@ use base::prelude::*; use core::prelude::*; use momentum::rsi; -pub struct RSINeutralityRejectionSignal { +pub struct RsiNeutralityRejectionSignal { smooth_type: Smooth, rsi_period: usize, threshold: f32, } -impl RSINeutralityRejectionSignal { +impl RsiNeutralityRejectionSignal { pub fn new(smooth_type: Smooth, rsi_period: f32, threshold: f32) -> Self { Self { smooth_type, @@ -18,7 +18,7 @@ impl RSINeutralityRejectionSignal { } } -impl Signal for RSINeutralityRejectionSignal { +impl Signal for RsiNeutralityRejectionSignal { fn lookback(&self) -> usize { self.rsi_period } diff --git a/ta_lib/strategies/signal/src/ao_saucer.rs b/ta_lib/strategies/signal/src/pattern/ao_saucer.rs similarity index 93% rename from ta_lib/strategies/signal/src/ao_saucer.rs rename to ta_lib/strategies/signal/src/pattern/ao_saucer.rs index 704b3f8e..1ffff6bf 100644 --- a/ta_lib/strategies/signal/src/ao_saucer.rs +++ b/ta_lib/strategies/signal/src/pattern/ao_saucer.rs @@ -2,12 +2,12 @@ use base::prelude::*; use core::prelude::*; use momentum::ao; -pub struct AOSaucerSignal { +pub struct AoSaucerSignal { fast_period: usize, slow_period: usize, } -impl AOSaucerSignal { +impl AoSaucerSignal { pub fn new(fast_period: f32, slow_period: f32) -> Self { Self { fast_period: fast_period as usize, @@ -16,7 +16,7 @@ impl AOSaucerSignal { } } -impl Signal for AOSaucerSignal { +impl Signal for AoSaucerSignal { fn lookback(&self) -> usize { std::cmp::max(self.fast_period, self.slow_period) } diff --git a/ta_lib/strategies/signal/src/pattern/candlestick_trend.rs b/ta_lib/strategies/signal/src/pattern/candlestick_trend.rs new file mode 100644 index 00000000..0e9c48fc --- /dev/null +++ b/ta_lib/strategies/signal/src/pattern/candlestick_trend.rs @@ -0,0 +1,25 @@ +use base::prelude::*; +use core::prelude::*; +use indicator::{candle_trend_indicator, CandleTrendType}; + +const DEFAULT_LOOKBACK: usize = 13; + +pub struct CandlestickTrendSignal { + candle: CandleTrendType, +} + +impl CandlestickTrendSignal { + pub fn new(candle: CandleTrendType) -> Self { + Self { candle } + } +} + +impl Signal for CandlestickTrendSignal { + fn lookback(&self) -> usize { + DEFAULT_LOOKBACK + } + + fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { + candle_trend_indicator(&self.candle, data) + } +} diff --git a/ta_lib/strategies/signal/src/hl.rs b/ta_lib/strategies/signal/src/pattern/hl.rs similarity index 100% rename from ta_lib/strategies/signal/src/hl.rs rename to ta_lib/strategies/signal/src/pattern/hl.rs diff --git a/ta_lib/strategies/signal/src/macd_color_switch.rs b/ta_lib/strategies/signal/src/pattern/macd_colorswitch.rs similarity index 93% rename from ta_lib/strategies/signal/src/macd_color_switch.rs rename to ta_lib/strategies/signal/src/pattern/macd_colorswitch.rs index 1fafa46f..0edd6a09 100644 --- a/ta_lib/strategies/signal/src/macd_color_switch.rs +++ b/ta_lib/strategies/signal/src/pattern/macd_colorswitch.rs @@ -2,14 +2,14 @@ use base::prelude::*; use core::prelude::*; use momentum::macd; -pub struct MACDColorSwitchSignal { +pub struct MacdColorSwitchSignal { smooth_type: Smooth, fast_period: usize, slow_period: usize, signal_period: usize, } -impl MACDColorSwitchSignal { +impl MacdColorSwitchSignal { pub fn new( smooth_type: Smooth, fast_period: f32, @@ -25,7 +25,7 @@ impl MACDColorSwitchSignal { } } -impl Signal for MACDColorSwitchSignal { +impl Signal for MacdColorSwitchSignal { fn lookback(&self) -> usize { let adj_lookback = std::cmp::max(self.fast_period, self.slow_period); std::cmp::max(adj_lookback, self.signal_period) diff --git a/ta_lib/strategies/signal/src/pattern/mod.rs b/ta_lib/strategies/signal/src/pattern/mod.rs new file mode 100644 index 00000000..f7701b1b --- /dev/null +++ b/ta_lib/strategies/signal/src/pattern/mod.rs @@ -0,0 +1,13 @@ +mod ao_saucer; +mod candlestick_trend; +mod hl; +mod macd_colorswitch; +mod rsi_v; +mod tii_v; + +pub use ao_saucer::AoSaucerSignal; +pub use candlestick_trend::CandlestickTrendSignal; +pub use hl::HighLowSignal; +pub use macd_colorswitch::MacdColorSwitchSignal; +pub use rsi_v::RsiVSignal; +pub use tii_v::TiiVSignal; diff --git a/ta_lib/strategies/signal/src/rsi_v.rs b/ta_lib/strategies/signal/src/pattern/rsi_v.rs similarity index 94% rename from ta_lib/strategies/signal/src/rsi_v.rs rename to ta_lib/strategies/signal/src/pattern/rsi_v.rs index 11579ede..6755eaa8 100644 --- a/ta_lib/strategies/signal/src/rsi_v.rs +++ b/ta_lib/strategies/signal/src/pattern/rsi_v.rs @@ -5,13 +5,13 @@ use momentum::rsi; const RSI_UPPER_BARRIER: f32 = 80.0; const RSI_LOWER_BARRIER: f32 = 20.0; -pub struct RSIVSignal { +pub struct RsiVSignal { smooth_type: Smooth, rsi_period: usize, threshold: f32, } -impl RSIVSignal { +impl RsiVSignal { pub fn new(smooth_type: Smooth, rsi_period: f32, threshold: f32) -> Self { Self { smooth_type, @@ -21,7 +21,7 @@ impl RSIVSignal { } } -impl Signal for RSIVSignal { +impl Signal for RsiVSignal { fn lookback(&self) -> usize { self.rsi_period } diff --git a/ta_lib/strategies/signal/src/tii_v.rs b/ta_lib/strategies/signal/src/pattern/tii_v.rs similarity index 94% rename from ta_lib/strategies/signal/src/tii_v.rs rename to ta_lib/strategies/signal/src/pattern/tii_v.rs index 5934a4bb..682342d7 100644 --- a/ta_lib/strategies/signal/src/tii_v.rs +++ b/ta_lib/strategies/signal/src/pattern/tii_v.rs @@ -5,13 +5,13 @@ use momentum::tii; const TII_UPPER_BARRIER: f32 = 100.0; const TII_LOWER_BARRIER: f32 = 0.0; -pub struct TIIVSignal { +pub struct TiiVSignal { smooth_type: Smooth, major_period: usize, minor_period: usize, } -impl TIIVSignal { +impl TiiVSignal { pub fn new(smooth_type: Smooth, major_period: f32, minor_period: f32) -> Self { Self { smooth_type, @@ -21,7 +21,7 @@ impl TIIVSignal { } } -impl Signal for TIIVSignal { +impl Signal for TiiVSignal { fn lookback(&self) -> usize { std::cmp::max(self.minor_period, self.major_period) } diff --git a/ta_lib/strategies/signal/src/dmi_cross.rs b/ta_lib/strategies/signal/src/reversal/dmi_reversal.rs similarity index 90% rename from ta_lib/strategies/signal/src/dmi_cross.rs rename to ta_lib/strategies/signal/src/reversal/dmi_reversal.rs index 8712cdb8..0b7b1b18 100644 --- a/ta_lib/strategies/signal/src/dmi_cross.rs +++ b/ta_lib/strategies/signal/src/reversal/dmi_reversal.rs @@ -2,13 +2,13 @@ use base::prelude::*; use core::prelude::*; use momentum::dmi; -pub struct DMICrossSignal { +pub struct DmiReversalSignal { smooth_type: Smooth, adx_period: usize, di_period: usize, } -impl DMICrossSignal { +impl DmiReversalSignal { pub fn new(smooth_type: Smooth, adx_period: f32, di_period: f32) -> Self { Self { smooth_type, @@ -18,7 +18,7 @@ impl DMICrossSignal { } } -impl Signal for DMICrossSignal { +impl Signal for DmiReversalSignal { fn lookback(&self) -> usize { std::cmp::max(self.adx_period, self.di_period) } diff --git a/ta_lib/strategies/signal/src/reversal/mod.rs b/ta_lib/strategies/signal/src/reversal/mod.rs new file mode 100644 index 00000000..ee85c8a3 --- /dev/null +++ b/ta_lib/strategies/signal/src/reversal/mod.rs @@ -0,0 +1,7 @@ +mod dmi_reversal; +mod snatr_reversal; +mod vi_reversal; + +pub use dmi_reversal::DmiReversalSignal; +pub use snatr_reversal::SnatrReversalSignal; +pub use vi_reversal::ViReversalSignal; diff --git a/ta_lib/strategies/signal/src/snatr.rs b/ta_lib/strategies/signal/src/reversal/snatr_reversal.rs similarity index 92% rename from ta_lib/strategies/signal/src/snatr.rs rename to ta_lib/strategies/signal/src/reversal/snatr_reversal.rs index fe40e4a7..5d1e14b5 100644 --- a/ta_lib/strategies/signal/src/snatr.rs +++ b/ta_lib/strategies/signal/src/reversal/snatr_reversal.rs @@ -5,14 +5,14 @@ use volatility::snatr; const SNATR_UPPER_BARRIER: f32 = 0.8; const SNATR_LOWER_BARRIER: f32 = 0.2; -pub struct SNATRSignal { +pub struct SnatrReversalSignal { smooth_type: Smooth, atr_period: usize, atr_smooth_period: usize, threshold: f32, } -impl SNATRSignal { +impl SnatrReversalSignal { pub fn new( smooth_type: Smooth, atr_period: f32, @@ -28,7 +28,7 @@ impl SNATRSignal { } } -impl Signal for SNATRSignal { +impl Signal for SnatrReversalSignal { fn lookback(&self) -> usize { std::cmp::max(self.atr_period, self.atr_smooth_period) } diff --git a/ta_lib/strategies/signal/src/vi_cross.rs b/ta_lib/strategies/signal/src/reversal/vi_reversal.rs similarity index 96% rename from ta_lib/strategies/signal/src/vi_cross.rs rename to ta_lib/strategies/signal/src/reversal/vi_reversal.rs index e6ac9f53..a7b40528 100644 --- a/ta_lib/strategies/signal/src/vi_cross.rs +++ b/ta_lib/strategies/signal/src/reversal/vi_reversal.rs @@ -2,12 +2,12 @@ use base::prelude::*; use core::prelude::*; use trend::vi; -pub struct VICrossSignal { +pub struct ViReversalSignal { atr_period: usize, period: usize, } -impl VICrossSignal { +impl ViReversalSignal { pub fn new(atr_period: f32, period: f32) -> Self { Self { atr_period: atr_period as usize, @@ -16,7 +16,7 @@ impl VICrossSignal { } } -impl Signal for VICrossSignal { +impl Signal for ViReversalSignal { fn lookback(&self) -> usize { std::cmp::max(self.atr_period, self.period) } @@ -40,8 +40,8 @@ mod tests { use std::collections::VecDeque; #[test] - fn test_signal_vi_cross() { - let signal = VICrossSignal::new(1.0, 2.0); + fn test_signal_vi_reversal() { + let signal = ViReversalSignal::new(1.0, 2.0); let data = VecDeque::from([ OHLCV { open: 4.8914, diff --git a/ta_lib/strategies/signal/src/di_cross.rs b/ta_lib/strategies/signal/src/signalline/di_signalline.rs similarity index 88% rename from ta_lib/strategies/signal/src/di_cross.rs rename to ta_lib/strategies/signal/src/signalline/di_signalline.rs index 39df2e48..46a10223 100644 --- a/ta_lib/strategies/signal/src/di_cross.rs +++ b/ta_lib/strategies/signal/src/signalline/di_signalline.rs @@ -2,13 +2,13 @@ use base::prelude::*; use core::prelude::*; use momentum::di; -pub struct DICrossSignal { +pub struct DiSignalLineSignal { smooth_type: Smooth, period: usize, signal_period: usize, } -impl DICrossSignal { +impl DiSignalLineSignal { pub fn new(smooth_type: Smooth, period: f32, signal_period: f32) -> Self { Self { smooth_type, @@ -18,7 +18,7 @@ impl DICrossSignal { } } -impl Signal for DICrossSignal { +impl Signal for DiSignalLineSignal { fn lookback(&self) -> usize { std::cmp::max(self.period, self.signal_period) } diff --git a/ta_lib/strategies/signal/src/dso_cross.rs b/ta_lib/strategies/signal/src/signalline/dso_signalline.rs similarity index 90% rename from ta_lib/strategies/signal/src/dso_cross.rs rename to ta_lib/strategies/signal/src/signalline/dso_signalline.rs index 76ba4f02..22c70d74 100644 --- a/ta_lib/strategies/signal/src/dso_cross.rs +++ b/ta_lib/strategies/signal/src/signalline/dso_signalline.rs @@ -2,14 +2,14 @@ use base::prelude::*; use core::prelude::*; use momentum::dso; -pub struct DSOCrossSignal { +pub struct DsoSignalLineSignal { smooth_type: Smooth, smooth_period: usize, k_period: usize, d_period: usize, } -impl DSOCrossSignal { +impl DsoSignalLineSignal { pub fn new(smooth_type: Smooth, smooth_period: f32, k_period: f32, d_period: f32) -> Self { Self { smooth_type, @@ -20,7 +20,7 @@ impl DSOCrossSignal { } } -impl Signal for DSOCrossSignal { +impl Signal for DsoSignalLineSignal { fn lookback(&self) -> usize { let period = std::cmp::max(self.smooth_period, self.k_period); std::cmp::max(period, self.d_period) diff --git a/ta_lib/strategies/signal/src/kst_cross.rs b/ta_lib/strategies/signal/src/signalline/kst_signalline.rs similarity index 96% rename from ta_lib/strategies/signal/src/kst_cross.rs rename to ta_lib/strategies/signal/src/signalline/kst_signalline.rs index d43f9b66..33afbabc 100644 --- a/ta_lib/strategies/signal/src/kst_cross.rs +++ b/ta_lib/strategies/signal/src/signalline/kst_signalline.rs @@ -2,7 +2,7 @@ use base::prelude::*; use core::prelude::*; use momentum::kst; -pub struct KSTCrossSignal { +pub struct KstSignalLineSignal { smooth_type: Smooth, roc_period_first: usize, roc_period_second: usize, @@ -15,7 +15,7 @@ pub struct KSTCrossSignal { signal_period: usize, } -impl KSTCrossSignal { +impl KstSignalLineSignal { pub fn new( smooth_type: Smooth, roc_period_first: f32, @@ -43,7 +43,7 @@ impl KSTCrossSignal { } } -impl Signal for KSTCrossSignal { +impl Signal for KstSignalLineSignal { fn lookback(&self) -> usize { let adjusted_lookback_one = std::cmp::max(self.roc_period_first, self.roc_period_second); let adjusted_lookback_two = std::cmp::max(adjusted_lookback_one, self.roc_period_third); diff --git a/ta_lib/strategies/signal/src/macd_cross.rs b/ta_lib/strategies/signal/src/signalline/macd_signalline.rs similarity index 91% rename from ta_lib/strategies/signal/src/macd_cross.rs rename to ta_lib/strategies/signal/src/signalline/macd_signalline.rs index bf934b05..00ae81b7 100644 --- a/ta_lib/strategies/signal/src/macd_cross.rs +++ b/ta_lib/strategies/signal/src/signalline/macd_signalline.rs @@ -2,14 +2,14 @@ use base::prelude::*; use core::prelude::*; use momentum::macd; -pub struct MACDCrossSignal { +pub struct MacdSignalLineSignal { smooth_type: Smooth, fast_period: usize, slow_period: usize, signal_period: usize, } -impl MACDCrossSignal { +impl MacdSignalLineSignal { pub fn new( smooth_type: Smooth, fast_period: f32, @@ -25,7 +25,7 @@ impl MACDCrossSignal { } } -impl Signal for MACDCrossSignal { +impl Signal for MacdSignalLineSignal { fn lookback(&self) -> usize { let adj_lookback = std::cmp::max(self.fast_period, self.slow_period); std::cmp::max(adj_lookback, self.signal_period) diff --git a/ta_lib/strategies/signal/src/signalline/mod.rs b/ta_lib/strategies/signal/src/signalline/mod.rs new file mode 100644 index 00000000..b1757558 --- /dev/null +++ b/ta_lib/strategies/signal/src/signalline/mod.rs @@ -0,0 +1,19 @@ +mod di_signalline; +mod dso_signalline; +mod kst_signalline; +mod macd_signalline; +mod qstick_signalline; +mod rsi_signalline; +mod stoch_signalline; +mod trix_signalline; +mod tsi_signalline; + +pub use di_signalline::DiSignalLineSignal; +pub use dso_signalline::DsoSignalLineSignal; +pub use kst_signalline::KstSignalLineSignal; +pub use macd_signalline::MacdSignalLineSignal; +pub use qstick_signalline::QstickSignalLineSignal; +pub use rsi_signalline::RsiSignalLineSignal; +pub use stoch_signalline::StochSignalLineSignal; +pub use trix_signalline::TrixSignalLineSignal; +pub use tsi_signalline::TsiSignalLineSignal; diff --git a/ta_lib/strategies/signal/src/qstick_cross.rs b/ta_lib/strategies/signal/src/signalline/qstick_signalline.rs similarity index 88% rename from ta_lib/strategies/signal/src/qstick_cross.rs rename to ta_lib/strategies/signal/src/signalline/qstick_signalline.rs index 9f1a1a59..6d6f3d0e 100644 --- a/ta_lib/strategies/signal/src/qstick_cross.rs +++ b/ta_lib/strategies/signal/src/signalline/qstick_signalline.rs @@ -2,13 +2,13 @@ use base::prelude::*; use core::prelude::*; use trend::qstick; -pub struct QSTICKCrossSignal { +pub struct QstickSignalLineSignal { smooth_type: Smooth, period: usize, signal_period: usize, } -impl QSTICKCrossSignal { +impl QstickSignalLineSignal { pub fn new(smooth_type: Smooth, period: f32, signal_period: f32) -> Self { Self { smooth_type, @@ -18,7 +18,7 @@ impl QSTICKCrossSignal { } } -impl Signal for QSTICKCrossSignal { +impl Signal for QstickSignalLineSignal { fn lookback(&self) -> usize { std::cmp::max(self.period, self.signal_period) } diff --git a/ta_lib/strategies/signal/src/rsi_ma_pullback.rs b/ta_lib/strategies/signal/src/signalline/rsi_signalline.rs similarity index 94% rename from ta_lib/strategies/signal/src/rsi_ma_pullback.rs rename to ta_lib/strategies/signal/src/signalline/rsi_signalline.rs index 3b82d8d7..998c651c 100644 --- a/ta_lib/strategies/signal/src/rsi_ma_pullback.rs +++ b/ta_lib/strategies/signal/src/signalline/rsi_signalline.rs @@ -2,7 +2,7 @@ use base::prelude::*; use core::prelude::*; use momentum::rsi; -pub struct RSIMaPullbackSignal { +pub struct RsiSignalLineSignal { smooth_type: Smooth, rsi_period: usize, smooth_signal: Smooth, @@ -10,7 +10,7 @@ pub struct RSIMaPullbackSignal { threshold: f32, } -impl RSIMaPullbackSignal { +impl RsiSignalLineSignal { pub fn new( smooth_type: Smooth, rsi_period: f32, @@ -28,7 +28,7 @@ impl RSIMaPullbackSignal { } } -impl Signal for RSIMaPullbackSignal { +impl Signal for RsiSignalLineSignal { fn lookback(&self) -> usize { std::cmp::max(self.rsi_period, self.smooth_period) } diff --git a/ta_lib/strategies/signal/src/stoch_cross.rs b/ta_lib/strategies/signal/src/signalline/stoch_signalline.rs similarity index 76% rename from ta_lib/strategies/signal/src/stoch_cross.rs rename to ta_lib/strategies/signal/src/signalline/stoch_signalline.rs index 23e98999..b3644f65 100644 --- a/ta_lib/strategies/signal/src/stoch_cross.rs +++ b/ta_lib/strategies/signal/src/signalline/stoch_signalline.rs @@ -2,17 +2,14 @@ use base::prelude::*; use core::prelude::*; use momentum::stochosc; -const LOWER_LINE: f32 = 20.0; -const UPPER_LINE: f32 = 80.0; - -pub struct StochCrossSignal { +pub struct StochSignalLineSignal { smooth_type: Smooth, period: usize, k_period: usize, d_period: usize, } -impl StochCrossSignal { +impl StochSignalLineSignal { pub fn new(smooth_type: Smooth, period: f32, k_period: f32, d_period: f32) -> Self { Self { smooth_type, @@ -23,7 +20,7 @@ impl StochCrossSignal { } } -impl Signal for StochCrossSignal { +impl Signal for StochSignalLineSignal { fn lookback(&self) -> usize { let adjusted_lookback = std::cmp::max(self.period, self.k_period); std::cmp::max(adjusted_lookback, self.d_period) @@ -40,9 +37,6 @@ impl Signal for StochCrossSignal { self.d_period, ); - ( - k.cross_over(&d) & d.slt(&LOWER_LINE), - k.cross_under(&d) & d.sgt(&UPPER_LINE), - ) + (k.cross_over(&d), k.cross_under(&d)) } } diff --git a/ta_lib/strategies/signal/src/trix_cross.rs b/ta_lib/strategies/signal/src/signalline/trix_signalline.rs similarity index 88% rename from ta_lib/strategies/signal/src/trix_cross.rs rename to ta_lib/strategies/signal/src/signalline/trix_signalline.rs index f8c398d0..00f999a7 100644 --- a/ta_lib/strategies/signal/src/trix_cross.rs +++ b/ta_lib/strategies/signal/src/signalline/trix_signalline.rs @@ -2,13 +2,13 @@ use base::prelude::*; use core::prelude::*; use momentum::trix; -pub struct TRIXCrossSignal { +pub struct TrixSignalLineSignal { smooth_type: Smooth, period: usize, signal_period: usize, } -impl TRIXCrossSignal { +impl TrixSignalLineSignal { pub fn new(smooth_type: Smooth, period: f32, signal_period: f32) -> Self { Self { smooth_type, @@ -18,7 +18,7 @@ impl TRIXCrossSignal { } } -impl Signal for TRIXCrossSignal { +impl Signal for TrixSignalLineSignal { fn lookback(&self) -> usize { std::cmp::max(self.period, self.signal_period) } diff --git a/ta_lib/strategies/signal/src/tsi_cross.rs b/ta_lib/strategies/signal/src/signalline/tsi_signalline.rs similarity index 91% rename from ta_lib/strategies/signal/src/tsi_cross.rs rename to ta_lib/strategies/signal/src/signalline/tsi_signalline.rs index c9b9023a..1c1bb499 100644 --- a/ta_lib/strategies/signal/src/tsi_cross.rs +++ b/ta_lib/strategies/signal/src/signalline/tsi_signalline.rs @@ -2,14 +2,14 @@ use base::prelude::*; use core::prelude::*; use momentum::tsi; -pub struct TSICrossSignal { +pub struct TsiSignalLineSignal { smooth_type: Smooth, fast_period: usize, slow_period: usize, signal_period: usize, } -impl TSICrossSignal { +impl TsiSignalLineSignal { pub fn new( smooth_type: Smooth, fast_period: f32, @@ -25,7 +25,7 @@ impl TSICrossSignal { } } -impl Signal for TSICrossSignal { +impl Signal for TsiSignalLineSignal { fn lookback(&self) -> usize { let adj_lookback = std::cmp::max(self.fast_period, self.slow_period); std::cmp::max(adj_lookback, self.signal_period) diff --git a/ta_lib/strategies/signal/src/stc_flip.rs b/ta_lib/strategies/signal/src/stc_flip.rs deleted file mode 100644 index 980b3bc4..00000000 --- a/ta_lib/strategies/signal/src/stc_flip.rs +++ /dev/null @@ -1,58 +0,0 @@ -use base::prelude::*; -use core::prelude::*; -use momentum::stc; - -const LOWER_LINE: f32 = 25.0; -const UPPER_LINE: f32 = 75.0; - -pub struct STCFlipSignal { - smooth_type: Smooth, - fast_period: usize, - slow_period: usize, - cycle: usize, - d_first: usize, - d_second: usize, -} - -impl STCFlipSignal { - pub fn new( - smooth_type: Smooth, - fast_period: f32, - slow_period: f32, - cycle: f32, - d_first: f32, - d_second: f32, - ) -> Self { - Self { - smooth_type, - fast_period: fast_period as usize, - slow_period: slow_period as usize, - cycle: cycle as usize, - d_first: d_first as usize, - d_second: d_second as usize, - } - } -} - -impl Signal for STCFlipSignal { - fn lookback(&self) -> usize { - let adj_lookback_one = std::cmp::max(self.fast_period, self.slow_period); - let adj_lookback_two = std::cmp::max(adj_lookback_one, self.cycle); - let adj_lookback_three = std::cmp::max(adj_lookback_two, self.d_first); - std::cmp::max(adj_lookback_three, self.d_second) - } - - fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { - let stc = stc( - &data.close, - self.smooth_type, - self.fast_period, - self.slow_period, - self.cycle, - self.d_first, - self.d_second, - ); - - (stc.cross_over(&LOWER_LINE), stc.cross_under(&UPPER_LINE)) - } -} diff --git a/ta_lib/strategies/signal/src/supertrend_pullback.rs b/ta_lib/strategies/signal/src/supertrend_pullback.rs deleted file mode 100644 index e26e68a8..00000000 --- a/ta_lib/strategies/signal/src/supertrend_pullback.rs +++ /dev/null @@ -1,48 +0,0 @@ -use base::prelude::*; -use core::prelude::*; -use trend::supertrend; - -pub struct SupertrendPullBackSignal { - atr_period: usize, - factor: f32, -} - -impl SupertrendPullBackSignal { - pub fn new(atr_period: f32, factor: f32) -> Self { - Self { - atr_period: atr_period as usize, - factor, - } - } -} - -impl Signal for SupertrendPullBackSignal { - fn lookback(&self) -> usize { - self.atr_period - } - - fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { - let (direction, trendline) = supertrend( - &data.hl2(), - &data.close, - &data.atr(self.atr_period, Smooth::SMMA), - self.factor, - ); - - let above = data.close.sgt(&trendline); - let below = data.close.slt(&trendline); - - ( - data.low.sle(&trendline) - & data.close.sgt(&trendline) - & below.shift(1) - & below.shift(2) - & direction.seq(&1.0), - data.high.sge(&trendline) - & data.close.slt(&trendline) - & above.shift(1) - & above.shift(2) - & direction.seq(&-1.0), - ) - } -} diff --git a/ta_lib/strategies/signal/src/tii_cross.rs b/ta_lib/strategies/signal/src/tii_cross.rs deleted file mode 100644 index c8e55af7..00000000 --- a/ta_lib/strategies/signal/src/tii_cross.rs +++ /dev/null @@ -1,46 +0,0 @@ -use base::prelude::*; -use core::prelude::*; -use momentum::tii; - -const TII_UPPER_BARRIER: f32 = 60.0; -const TII_LOWER_BARRIER: f32 = 40.0; - -pub struct TIICrossSignal { - smooth_type: Smooth, - major_period: usize, - minor_period: usize, - threshold: f32, -} - -impl TIICrossSignal { - pub fn new(smooth_type: Smooth, major_period: f32, minor_period: f32, threshold: f32) -> Self { - Self { - smooth_type, - major_period: major_period as usize, - minor_period: minor_period as usize, - threshold, - } - } -} - -impl Signal for TIICrossSignal { - fn lookback(&self) -> usize { - std::cmp::max(self.minor_period, self.major_period) - } - - fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { - let tii = tii( - &data.close, - self.smooth_type, - self.major_period, - self.minor_period, - ); - let upper_barrier = TII_UPPER_BARRIER + self.threshold; - let lower_barrier = TII_LOWER_BARRIER - self.threshold; - - ( - tii.cross_over(&upper_barrier), - tii.cross_under(&lower_barrier), - ) - } -} diff --git a/ta_lib/strategies/signal/src/trend_candle.rs b/ta_lib/strategies/signal/src/trend_candle.rs deleted file mode 100644 index 22a16dca..00000000 --- a/ta_lib/strategies/signal/src/trend_candle.rs +++ /dev/null @@ -1,25 +0,0 @@ -use base::prelude::*; -use core::prelude::*; -use shared::{trend_candle_indicator, TrendCandleType}; - -const DEFAULT_LOOKBACK: usize = 13; - -pub struct TrendCandleSignal { - candle: TrendCandleType, -} - -impl TrendCandleSignal { - pub fn new(candle: TrendCandleType) -> Self { - Self { candle } - } -} - -impl Signal for TrendCandleSignal { - fn lookback(&self) -> usize { - DEFAULT_LOOKBACK - } - - fn generate(&self, data: &OHLCVSeries) -> (Series, Series) { - trend_candle_indicator(&self.candle, data) - } -} diff --git a/ta_lib/strategies/signal/src/ao_flip.rs b/ta_lib/strategies/signal/src/zerocross/ao_zerocross.rs similarity index 87% rename from ta_lib/strategies/signal/src/ao_flip.rs rename to ta_lib/strategies/signal/src/zerocross/ao_zerocross.rs index ebc6ead5..66ef70a9 100644 --- a/ta_lib/strategies/signal/src/ao_flip.rs +++ b/ta_lib/strategies/signal/src/zerocross/ao_zerocross.rs @@ -2,12 +2,12 @@ use base::prelude::*; use core::prelude::*; use momentum::ao; -pub struct AOFlipSignal { +pub struct AoZeroCrossSignal { fast_period: usize, slow_period: usize, } -impl AOFlipSignal { +impl AoZeroCrossSignal { pub fn new(fast_period: f32, slow_period: f32) -> Self { Self { fast_period: fast_period as usize, @@ -16,7 +16,7 @@ impl AOFlipSignal { } } -impl Signal for AOFlipSignal { +impl Signal for AoZeroCrossSignal { fn lookback(&self) -> usize { std::cmp::max(self.fast_period, self.slow_period) } diff --git a/ta_lib/strategies/signal/src/apo_flip.rs b/ta_lib/strategies/signal/src/zerocross/apo_zerocross.rs similarity index 86% rename from ta_lib/strategies/signal/src/apo_flip.rs rename to ta_lib/strategies/signal/src/zerocross/apo_zerocross.rs index 9dbc86ce..87dfe710 100644 --- a/ta_lib/strategies/signal/src/apo_flip.rs +++ b/ta_lib/strategies/signal/src/zerocross/apo_zerocross.rs @@ -2,12 +2,12 @@ use base::prelude::*; use core::prelude::*; use momentum::apo; -pub struct APOFlipSignal { +pub struct ApoZeroCrossSignal { fast_period: usize, slow_period: usize, } -impl APOFlipSignal { +impl ApoZeroCrossSignal { pub fn new(fast_period: f32, slow_period: f32) -> Self { Self { fast_period: fast_period as usize, @@ -16,7 +16,7 @@ impl APOFlipSignal { } } -impl Signal for APOFlipSignal { +impl Signal for ApoZeroCrossSignal { fn lookback(&self) -> usize { std::cmp::max(self.fast_period, self.slow_period) } diff --git a/ta_lib/strategies/signal/src/bop_flip.rs b/ta_lib/strategies/signal/src/zerocross/bop_zerocross.rs similarity index 88% rename from ta_lib/strategies/signal/src/bop_flip.rs rename to ta_lib/strategies/signal/src/zerocross/bop_zerocross.rs index 0070f1ca..de210830 100644 --- a/ta_lib/strategies/signal/src/bop_flip.rs +++ b/ta_lib/strategies/signal/src/zerocross/bop_zerocross.rs @@ -2,12 +2,12 @@ use base::prelude::*; use core::prelude::*; use momentum::bop; -pub struct BOPFlipSignal { +pub struct BopZeroCrossSignal { smooth_type: Smooth, smooth_period: usize, } -impl BOPFlipSignal { +impl BopZeroCrossSignal { pub fn new(smooth_type: Smooth, smooth_period: f32) -> Self { Self { smooth_type, @@ -16,7 +16,7 @@ impl BOPFlipSignal { } } -impl Signal for BOPFlipSignal { +impl Signal for BopZeroCrossSignal { fn lookback(&self) -> usize { self.smooth_period } diff --git a/ta_lib/strategies/signal/src/cc_flip.rs b/ta_lib/strategies/signal/src/zerocross/cc_zerocross.rs similarity index 91% rename from ta_lib/strategies/signal/src/cc_flip.rs rename to ta_lib/strategies/signal/src/zerocross/cc_zerocross.rs index 78c22fc4..27e2dc32 100644 --- a/ta_lib/strategies/signal/src/cc_flip.rs +++ b/ta_lib/strategies/signal/src/zerocross/cc_zerocross.rs @@ -2,14 +2,14 @@ use base::prelude::*; use core::prelude::*; use momentum::cc; -pub struct CCFlipSignal { +pub struct CcZeroCrossSignal { fast_period: usize, slow_period: usize, smooth_type: Smooth, smooth_period: usize, } -impl CCFlipSignal { +impl CcZeroCrossSignal { pub fn new( fast_period: f32, slow_period: f32, @@ -25,7 +25,7 @@ impl CCFlipSignal { } } -impl Signal for CCFlipSignal { +impl Signal for CcZeroCrossSignal { fn lookback(&self) -> usize { let adj_lookback = std::cmp::max(self.fast_period, self.slow_period); std::cmp::max(adj_lookback, self.smooth_period) diff --git a/ta_lib/strategies/signal/src/cfo_flip.rs b/ta_lib/strategies/signal/src/zerocross/cfo_zerocross.rs similarity index 82% rename from ta_lib/strategies/signal/src/cfo_flip.rs rename to ta_lib/strategies/signal/src/zerocross/cfo_zerocross.rs index a4a57c40..ce699e3b 100644 --- a/ta_lib/strategies/signal/src/cfo_flip.rs +++ b/ta_lib/strategies/signal/src/zerocross/cfo_zerocross.rs @@ -2,11 +2,11 @@ use base::prelude::*; use core::prelude::*; use momentum::cfo; -pub struct CFOFlipSignal { +pub struct CfoZeroCrossSignal { period: usize, } -impl CFOFlipSignal { +impl CfoZeroCrossSignal { pub fn new(period: f32) -> Self { Self { period: period as usize, @@ -14,7 +14,7 @@ impl CFOFlipSignal { } } -impl Signal for CFOFlipSignal { +impl Signal for CfoZeroCrossSignal { fn lookback(&self) -> usize { self.period } diff --git a/ta_lib/strategies/signal/src/di_flip.rs b/ta_lib/strategies/signal/src/zerocross/di_zerocross.rs similarity index 85% rename from ta_lib/strategies/signal/src/di_flip.rs rename to ta_lib/strategies/signal/src/zerocross/di_zerocross.rs index 52db7634..63f40ff1 100644 --- a/ta_lib/strategies/signal/src/di_flip.rs +++ b/ta_lib/strategies/signal/src/zerocross/di_zerocross.rs @@ -2,12 +2,12 @@ use base::prelude::*; use core::prelude::*; use momentum::di; -pub struct DIFlipSignal { +pub struct DiZeroCrossSignal { smooth_type: Smooth, period: usize, } -impl DIFlipSignal { +impl DiZeroCrossSignal { pub fn new(smooth_type: Smooth, period: f32) -> Self { Self { smooth_type, @@ -16,7 +16,7 @@ impl DIFlipSignal { } } -impl Signal for DIFlipSignal { +impl Signal for DiZeroCrossSignal { fn lookback(&self) -> usize { self.period } diff --git a/ta_lib/strategies/signal/src/macd_flip.rs b/ta_lib/strategies/signal/src/zerocross/macd_zerocross.rs similarity index 91% rename from ta_lib/strategies/signal/src/macd_flip.rs rename to ta_lib/strategies/signal/src/zerocross/macd_zerocross.rs index abd7f7d3..b5729168 100644 --- a/ta_lib/strategies/signal/src/macd_flip.rs +++ b/ta_lib/strategies/signal/src/zerocross/macd_zerocross.rs @@ -2,14 +2,14 @@ use base::prelude::*; use core::prelude::*; use momentum::macd; -pub struct MACDFlipSignal { +pub struct MacdZeroCrossSignal { smooth_type: Smooth, fast_period: usize, slow_period: usize, signal_period: usize, } -impl MACDFlipSignal { +impl MacdZeroCrossSignal { pub fn new( smooth_type: Smooth, fast_period: f32, @@ -25,7 +25,7 @@ impl MACDFlipSignal { } } -impl Signal for MACDFlipSignal { +impl Signal for MacdZeroCrossSignal { fn lookback(&self) -> usize { let adj_lookback = std::cmp::max(self.fast_period, self.slow_period); std::cmp::max(adj_lookback, self.signal_period) diff --git a/ta_lib/strategies/signal/src/zerocross/mod.rs b/ta_lib/strategies/signal/src/zerocross/mod.rs new file mode 100644 index 00000000..53f03f9d --- /dev/null +++ b/ta_lib/strategies/signal/src/zerocross/mod.rs @@ -0,0 +1,23 @@ +mod ao_zerocross; +mod apo_zerocross; +mod bop_zerocross; +mod cc_zerocross; +mod cfo_zerocross; +mod di_zerocross; +mod macd_zerocross; +mod qstick_zerocross; +mod roc_zerocross; +mod trix_zerocross; +mod tsi_zerocross; + +pub use ao_zerocross::AoZeroCrossSignal; +pub use apo_zerocross::ApoZeroCrossSignal; +pub use bop_zerocross::BopZeroCrossSignal; +pub use cc_zerocross::CcZeroCrossSignal; +pub use cfo_zerocross::CfoZeroCrossSignal; +pub use di_zerocross::DiZeroCrossSignal; +pub use macd_zerocross::MacdZeroCrossSignal; +pub use qstick_zerocross::QstickZeroCrossSignal; +pub use roc_zerocross::RocZeroCrossSignal; +pub use trix_zerocross::TrixZeroCrossSignal; +pub use tsi_zerocross::TsiZeroCrossSignal; diff --git a/ta_lib/strategies/signal/src/qstick_flip.rs b/ta_lib/strategies/signal/src/zerocross/qstick_zerocross.rs similarity index 85% rename from ta_lib/strategies/signal/src/qstick_flip.rs rename to ta_lib/strategies/signal/src/zerocross/qstick_zerocross.rs index 305ca5a2..ff86eca1 100644 --- a/ta_lib/strategies/signal/src/qstick_flip.rs +++ b/ta_lib/strategies/signal/src/zerocross/qstick_zerocross.rs @@ -2,12 +2,12 @@ use base::prelude::*; use core::prelude::*; use trend::qstick; -pub struct QSTICKFlipSignal { +pub struct QstickZeroCrossSignal { smooth_type: Smooth, period: usize, } -impl QSTICKFlipSignal { +impl QstickZeroCrossSignal { pub fn new(smooth_type: Smooth, period: f32) -> Self { Self { smooth_type, @@ -16,7 +16,7 @@ impl QSTICKFlipSignal { } } -impl Signal for QSTICKFlipSignal { +impl Signal for QstickZeroCrossSignal { fn lookback(&self) -> usize { self.period } diff --git a/ta_lib/strategies/signal/src/roc_flip.rs b/ta_lib/strategies/signal/src/zerocross/roc_zerocross.rs similarity index 82% rename from ta_lib/strategies/signal/src/roc_flip.rs rename to ta_lib/strategies/signal/src/zerocross/roc_zerocross.rs index 2d6ebf9b..2b0b64e7 100644 --- a/ta_lib/strategies/signal/src/roc_flip.rs +++ b/ta_lib/strategies/signal/src/zerocross/roc_zerocross.rs @@ -2,11 +2,11 @@ use base::prelude::*; use core::prelude::*; use momentum::roc; -pub struct ROCFlipSignal { +pub struct RocZeroCrossSignal { period: usize, } -impl ROCFlipSignal { +impl RocZeroCrossSignal { pub fn new(period: f32) -> Self { Self { period: period as usize, @@ -14,7 +14,7 @@ impl ROCFlipSignal { } } -impl Signal for ROCFlipSignal { +impl Signal for RocZeroCrossSignal { fn lookback(&self) -> usize { self.period } diff --git a/ta_lib/strategies/signal/src/trix_flip.rs b/ta_lib/strategies/signal/src/zerocross/trix_zerocross.rs similarity index 84% rename from ta_lib/strategies/signal/src/trix_flip.rs rename to ta_lib/strategies/signal/src/zerocross/trix_zerocross.rs index 4a018568..6a9eec12 100644 --- a/ta_lib/strategies/signal/src/trix_flip.rs +++ b/ta_lib/strategies/signal/src/zerocross/trix_zerocross.rs @@ -2,12 +2,12 @@ use base::prelude::*; use core::prelude::*; use momentum::trix; -pub struct TRIXFlipSignal { +pub struct TrixZeroCrossSignal { smooth_type: Smooth, period: usize, } -impl TRIXFlipSignal { +impl TrixZeroCrossSignal { pub fn new(smooth_type: Smooth, period: f32) -> Self { Self { smooth_type, @@ -16,7 +16,7 @@ impl TRIXFlipSignal { } } -impl Signal for TRIXFlipSignal { +impl Signal for TrixZeroCrossSignal { fn lookback(&self) -> usize { self.period } diff --git a/ta_lib/strategies/signal/src/tsi_flip.rs b/ta_lib/strategies/signal/src/zerocross/tsi_zerocross.rs similarity index 89% rename from ta_lib/strategies/signal/src/tsi_flip.rs rename to ta_lib/strategies/signal/src/zerocross/tsi_zerocross.rs index 3d8f7cd1..2aead088 100644 --- a/ta_lib/strategies/signal/src/tsi_flip.rs +++ b/ta_lib/strategies/signal/src/zerocross/tsi_zerocross.rs @@ -2,13 +2,13 @@ use base::prelude::*; use core::prelude::*; use momentum::tsi; -pub struct TSIFlipSignal { +pub struct TsiZeroCrossSignal { smooth_type: Smooth, fast_period: usize, slow_period: usize, } -impl TSIFlipSignal { +impl TsiZeroCrossSignal { pub fn new(smooth_type: Smooth, fast_period: f32, slow_period: f32) -> Self { Self { smooth_type, @@ -18,7 +18,7 @@ impl TSIFlipSignal { } } -impl Signal for TSIFlipSignal { +impl Signal for TsiZeroCrossSignal { fn lookback(&self) -> usize { std::cmp::max(self.fast_period, self.slow_period) } diff --git a/ta_lib/strategies/stop_loss/Cargo.toml b/ta_lib/strategies/stop_loss/Cargo.toml index 161ac955..f8e5fa8f 100644 --- a/ta_lib/strategies/stop_loss/Cargo.toml +++ b/ta_lib/strategies/stop_loss/Cargo.toml @@ -9,8 +9,6 @@ license.workspace = true readme.workspace = true repository.workspace = true -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] core = { path = "../../core" } base = { path = "../base" } diff --git a/ta_lib/strategies/stop_loss/src/atr.rs b/ta_lib/strategies/stop_loss/src/atr.rs index 9776c5a3..2a039910 100644 --- a/ta_lib/strategies/stop_loss/src/atr.rs +++ b/ta_lib/strategies/stop_loss/src/atr.rs @@ -1,13 +1,13 @@ use base::prelude::*; use core::prelude::*; -pub struct ATRStopLoss { +pub struct AtrStopLoss { smooth_type: Smooth, period: usize, factor: f32, } -impl ATRStopLoss { +impl AtrStopLoss { pub fn new(smooth_type: Smooth, period: f32, factor: f32) -> Self { Self { smooth_type, @@ -17,7 +17,7 @@ impl ATRStopLoss { } } -impl StopLoss for ATRStopLoss { +impl StopLoss for AtrStopLoss { fn lookback(&self) -> usize { self.period } diff --git a/ta_lib/strategies/stop_loss/src/lib.rs b/ta_lib/strategies/stop_loss/src/lib.rs index 1585e2e9..cbc65c55 100644 --- a/ta_lib/strategies/stop_loss/src/lib.rs +++ b/ta_lib/strategies/stop_loss/src/lib.rs @@ -1,3 +1,3 @@ mod atr; -pub use atr::ATRStopLoss; +pub use atr::AtrStopLoss; diff --git a/ta_lib/strategies/trend_follow/Cargo.toml b/ta_lib/strategies/trend_follow/Cargo.toml index 07613ad5..77b0980e 100644 --- a/ta_lib/strategies/trend_follow/Cargo.toml +++ b/ta_lib/strategies/trend_follow/Cargo.toml @@ -17,7 +17,7 @@ signal = { path = "../signal" } confirm = { path = "../confirm" } pulse = { path = "../pulse" } baseline = { path = "../baseline" } -shared = { path = "../shared" } +indicator = { path = "../indicator" } exit = { path = "../exit" } serde = { version = "1.0", default-features = false, features = ["derive"] } serde_json = { version = "1.0", default-features = false, features = ["alloc"] } diff --git a/ta_lib/strategies/trend_follow/src/baseline_mapper.rs b/ta_lib/strategies/trend_follow/src/baseline_mapper.rs deleted file mode 100644 index 0f92ee07..00000000 --- a/ta_lib/strategies/trend_follow/src/baseline_mapper.rs +++ /dev/null @@ -1,18 +0,0 @@ -use crate::ma_mapper::map_to_ma; -use base::prelude::*; -use baseline::*; -use serde::Deserialize; - -#[derive(Deserialize)] -#[serde(tag = "type")] -pub enum BaseLineConfig { - Ma { ma: f32, period: f32 }, -} - -pub fn map_to_baseline(config: BaseLineConfig) -> Box { - match config { - BaseLineConfig::Ma { ma, period } => { - Box::new(MABaseLine::new(map_to_ma(ma as usize), period)) - } - } -} diff --git a/ta_lib/strategies/trend_follow/src/candle_mapper.rs b/ta_lib/strategies/trend_follow/src/candle_mapper.rs deleted file mode 100644 index c98c4151..00000000 --- a/ta_lib/strategies/trend_follow/src/candle_mapper.rs +++ /dev/null @@ -1,21 +0,0 @@ -use shared::TrendCandleType; - -pub fn map_to_candle(candle: usize) -> TrendCandleType { - match candle { - 1 => TrendCandleType::BOTTLE, - 2 => TrendCandleType::DOUBLE_TROUBLE, - 3 => TrendCandleType::GOLDEN, - 4 => TrendCandleType::H, - 5 => TrendCandleType::HEXAD, - 6 => TrendCandleType::HIKKAKE, - 7 => TrendCandleType::MARUBOZU, - 8 => TrendCandleType::MASTER_CANDLE, - 9 => TrendCandleType::QUINTUPLETS, - 10 => TrendCandleType::SLINGSHOT, - 11 => TrendCandleType::THREE_CANDLES, - 12 => TrendCandleType::THREE_METHODS, - 13 => TrendCandleType::TASUKI, - 14 => TrendCandleType::THREE_ONE_TWO, - _ => TrendCandleType::THREE_CANDLES, - } -} diff --git a/ta_lib/strategies/trend_follow/src/config/baseline_config.rs b/ta_lib/strategies/trend_follow/src/config/baseline_config.rs new file mode 100644 index 00000000..4d2107b5 --- /dev/null +++ b/ta_lib/strategies/trend_follow/src/config/baseline_config.rs @@ -0,0 +1,7 @@ +use serde::Deserialize; + +#[derive(Deserialize)] +#[serde(tag = "type")] +pub enum BaseLineConfig { + Ma { ma: f32, period: f32 }, +} diff --git a/ta_lib/strategies/trend_follow/src/config/confirm_config.rs b/ta_lib/strategies/trend_follow/src/config/confirm_config.rs new file mode 100644 index 00000000..40e72604 --- /dev/null +++ b/ta_lib/strategies/trend_follow/src/config/confirm_config.rs @@ -0,0 +1,47 @@ +use serde::Deserialize; + +#[derive(Deserialize)] +#[serde(tag = "type")] +pub enum ConfirmConfig { + Dpo { + smooth_type: f32, + period: f32, + }, + Eom { + smooth_type: f32, + period: f32, + divisor: f32, + }, + Cci { + smooth_type: f32, + period: f32, + factor: f32, + }, + Dumb { + period: f32, + }, + Rsi { + smooth_type: f32, + period: f32, + smooth_signal: f32, + smooth_period: f32, + threshold: f32, + }, + Roc { + period: f32, + }, + Stc { + smooth_type: f32, + fast_period: f32, + slow_period: f32, + cycle: f32, + d_first: f32, + d_second: f32, + }, + Dso { + smooth_type: f32, + smooth_period: f32, + k_period: f32, + d_period: f32, + }, +} diff --git a/ta_lib/strategies/trend_follow/src/config/exit_config.rs b/ta_lib/strategies/trend_follow/src/config/exit_config.rs new file mode 100644 index 00000000..f6f8405e --- /dev/null +++ b/ta_lib/strategies/trend_follow/src/config/exit_config.rs @@ -0,0 +1,38 @@ +use serde::Deserialize; + +#[derive(Deserialize)] +#[serde(tag = "type")] +pub enum ExitConfig { + Ast { + atr_period: f32, + factor: f32, + }, + Cci { + smooth_type: f32, + period: f32, + factor: f32, + threshold: f32, + }, + Dumb {}, + HighLow { + period: f32, + }, + Rsi { + smooth_type: f32, + period: f32, + threshold: f32, + }, + Ma { + ma: f32, + period: f32, + }, + Mfi { + period: f32, + threshold: f32, + }, + Trix { + smooth_type: f32, + period: f32, + signal_period: f32, + }, +} diff --git a/ta_lib/strategies/trend_follow/src/config/mod.rs b/ta_lib/strategies/trend_follow/src/config/mod.rs new file mode 100644 index 00000000..cf17cb31 --- /dev/null +++ b/ta_lib/strategies/trend_follow/src/config/mod.rs @@ -0,0 +1,13 @@ +mod baseline_config; +mod confirm_config; +mod exit_config; +mod pulse_config; +mod signal_config; +mod stoploss_config; + +pub use baseline_config::BaseLineConfig; +pub use confirm_config::ConfirmConfig; +pub use exit_config::ExitConfig; +pub use pulse_config::PulseConfig; +pub use signal_config::SignalConfig; +pub use stoploss_config::StopLossConfig; diff --git a/ta_lib/strategies/trend_follow/src/config/pulse_config.rs b/ta_lib/strategies/trend_follow/src/config/pulse_config.rs new file mode 100644 index 00000000..4d420bda --- /dev/null +++ b/ta_lib/strategies/trend_follow/src/config/pulse_config.rs @@ -0,0 +1,42 @@ +use serde::Deserialize; + +#[derive(Deserialize)] +#[serde(tag = "type")] +pub enum PulseConfig { + Adx { + smooth_type: f32, + adx_period: f32, + di_period: f32, + threshold: f32, + }, + Braid { + smooth_type: f32, + fast_period: f32, + slow_period: f32, + open_period: f32, + strength: f32, + atr_period: f32, + }, + Dumb { + period: f32, + }, + Chop { + atr_period: f32, + period: f32, + threshold: f32, + }, + Nvol { + smooth_type: f32, + period: f32, + }, + Vo { + smooth_type: f32, + fast_period: f32, + slow_period: f32, + }, + Tdfi { + smooth_type: f32, + period: f32, + n: f32, + }, +} diff --git a/ta_lib/strategies/trend_follow/src/config/signal_config.rs b/ta_lib/strategies/trend_follow/src/config/signal_config.rs new file mode 100644 index 00000000..700a60fa --- /dev/null +++ b/ta_lib/strategies/trend_follow/src/config/signal_config.rs @@ -0,0 +1,244 @@ +use serde::Deserialize; + +#[derive(Deserialize)] +#[serde(tag = "type")] +pub enum SignalConfig { + // ZeroCross + AoZeroCross { + fast_period: f32, + slow_period: f32, + }, + ApoZeroCross { + fast_period: f32, + slow_period: f32, + }, + BopZeroCross { + smooth_type: f32, + smooth_period: f32, + }, + CfoZeroCross { + period: f32, + }, + CcZeroCross { + fast_period: f32, + slow_period: f32, + smooth_type: f32, + smooth_period: f32, + }, + DiZeroCross { + smooth_type: f32, + period: f32, + }, + MacdZeroCross { + smooth_type: f32, + fast_period: f32, + slow_period: f32, + signal_period: f32, + }, + QstickZeroCross { + smooth_type: f32, + period: f32, + }, + RocZeroCross { + period: f32, + }, + TrixZeroCross { + smooth_type: f32, + period: f32, + }, + TsiZeroCross { + smooth_type: f32, + fast_period: f32, + slow_period: f32, + }, + // Signal Line + DiSignalLine { + smooth_type: f32, + period: f32, + signal_period: f32, + }, + DsoSignalLine { + smooth_type: f32, + smooth_period: f32, + k_period: f32, + d_period: f32, + }, + RsiSignalLine { + smooth_type: f32, + rsi_period: f32, + smooth_signal: f32, + smooth_period: f32, + threshold: f32, + }, + KstSignalLine { + smooth_type: f32, + roc_period_first: f32, + roc_period_second: f32, + roc_period_third: f32, + roc_period_fouth: f32, + period_first: f32, + period_second: f32, + period_third: f32, + period_fouth: f32, + signal_period: f32, + }, + TrixSignalLine { + smooth_type: f32, + period: f32, + signal_period: f32, + }, + TsiSignalLine { + smooth_type: f32, + fast_period: f32, + slow_period: f32, + signal_period: f32, + }, + QstickSignalLine { + smooth_type: f32, + period: f32, + signal_period: f32, + }, + StochSignalLine { + smooth_type: f32, + period: f32, + k_period: f32, + d_period: f32, + }, + MacdSignalLine { + smooth_type: f32, + fast_period: f32, + slow_period: f32, + signal_period: f32, + }, + // BB + MacdBb { + smooth_type: f32, + fast_period: f32, + slow_period: f32, + signal_period: f32, + bb_period: f32, + factor: f32, + }, + VwapBb { + period: f32, + smooth_type: f32, + bb_period: f32, + factor: f32, + }, + // Reversal + DmiReversal { + smooth_type: f32, + adx_period: f32, + di_period: f32, + }, + SnatrReversal { + smooth_type: f32, + atr_period: f32, + atr_smooth_period: f32, + threshold: f32, + }, + ViReversal { + atr_period: f32, + period: f32, + }, + // Flip + CeFlip { + period: f32, + atr_period: f32, + factor: f32, + }, + SupFlip { + atr_period: f32, + factor: f32, + }, + // Ma + MaCross { + ma: f32, + period: f32, + }, + MaSurpass { + ma: f32, + period: f32, + }, + MaQuadruple { + ma: f32, + period: f32, + }, + MaTestingGround { + ma: f32, + period: f32, + }, + Ma2Rsi { + smooth_type: f32, + rsi_period: f32, + threshold: f32, + ma: f32, + fast_period: f32, + slow_period: f32, + }, + Ma3Cross { + ma: f32, + fast_period: f32, + medium_period: f32, + slow_period: f32, + }, + VwapCross { + period: f32, + }, + // Pattern + AoSaucer { + fast_period: f32, + slow_period: f32, + }, + CandlestickTrend { + candle: f32, + }, + HighLow { + period: f32, + }, + MacdColorSwitch { + smooth_type: f32, + fast_period: f32, + slow_period: f32, + signal_period: f32, + }, + RsiV { + smooth_type: f32, + rsi_period: f32, + threshold: f32, + }, + TiiV { + smooth_type: f32, + major_period: f32, + minor_period: f32, + }, + // Neutrality + DsoNeutralityCross { + smooth_type: f32, + smooth_period: f32, + k_period: f32, + d_period: f32, + }, + RsiNeutralityCross { + smooth_type: f32, + rsi_period: f32, + threshold: f32, + }, + RsiNeutralityPullback { + smooth_type: f32, + rsi_period: f32, + threshold: f32, + }, + RsiNeutralityRejection { + smooth_type: f32, + rsi_period: f32, + threshold: f32, + }, + // Breakout + DchMa2Breakout { + dch_period: f32, + ma: f32, + fast_period: f32, + slow_period: f32, + }, +} diff --git a/ta_lib/strategies/trend_follow/src/config/stoploss_config.rs b/ta_lib/strategies/trend_follow/src/config/stoploss_config.rs new file mode 100644 index 00000000..1701e44b --- /dev/null +++ b/ta_lib/strategies/trend_follow/src/config/stoploss_config.rs @@ -0,0 +1,11 @@ +use serde::Deserialize; + +#[derive(Deserialize)] +#[serde(tag = "type")] +pub enum StopLossConfig { + Atr { + smooth_type: f32, + period: f32, + factor: f32, + }, +} diff --git a/ta_lib/strategies/trend_follow/src/confirm_mapper.rs b/ta_lib/strategies/trend_follow/src/confirm_mapper.rs deleted file mode 100644 index 4b007042..00000000 --- a/ta_lib/strategies/trend_follow/src/confirm_mapper.rs +++ /dev/null @@ -1,118 +0,0 @@ -use crate::smooth_mapper::map_to_smooth; -use base::prelude::*; -use confirm::*; -use serde::Deserialize; - -#[derive(Deserialize)] -#[serde(tag = "type")] -pub enum ConfirmConfig { - Dpo { - smooth_type: f32, - period: f32, - }, - Eom { - smooth_type: f32, - period: f32, - divisor: f32, - }, - Cci { - smooth_type: f32, - period: f32, - factor: f32, - }, - Dumb { - period: f32, - }, - Rsi { - smooth_type: f32, - period: f32, - smooth_signal: f32, - smooth_period: f32, - threshold: f32, - }, - Roc { - period: f32, - }, - Stc { - smooth_type: f32, - fast_period: f32, - slow_period: f32, - cycle: f32, - d_first: f32, - d_second: f32, - }, - Dso { - smooth_type: f32, - smooth_period: f32, - k_period: f32, - d_period: f32, - }, -} - -pub fn map_to_confirm(config: ConfirmConfig) -> Box { - match config { - ConfirmConfig::Dpo { - smooth_type, - period, - } => Box::new(DPOConfirm::new(map_to_smooth(smooth_type as usize), period)), - ConfirmConfig::Dso { - smooth_type, - smooth_period, - k_period, - d_period, - } => Box::new(DSOConfirm::new( - map_to_smooth(smooth_type as usize), - smooth_period, - k_period, - d_period, - )), - ConfirmConfig::Cci { - smooth_type, - period, - factor, - } => Box::new(CCIConfirm::new( - map_to_smooth(smooth_type as usize), - period, - factor, - )), - ConfirmConfig::Eom { - smooth_type, - period, - divisor, - } => Box::new(EOMConfirm::new( - map_to_smooth(smooth_type as usize), - period, - divisor, - )), - ConfirmConfig::Dumb { period } => Box::new(DumbConfirm::new(period)), - ConfirmConfig::Rsi { - smooth_type, - period, - smooth_signal, - smooth_period, - threshold, - } => Box::new(RSIConfirm::new( - map_to_smooth(smooth_type as usize), - period, - map_to_smooth(smooth_signal as usize), - smooth_period, - threshold, - )), - ConfirmConfig::Roc { period } => Box::new(ROCConfirm::new(period)), - ConfirmConfig::Stc { - smooth_type, - fast_period, - slow_period, - cycle, - d_first, - d_second, - } => Box::new(STCConfirm::new( - map_to_smooth(smooth_type as usize), - fast_period, - slow_period, - cycle, - d_first, - d_second, - )), - } -} diff --git a/ta_lib/strategies/trend_follow/src/deserialize/candle_deserialize.rs b/ta_lib/strategies/trend_follow/src/deserialize/candle_deserialize.rs new file mode 100644 index 00000000..3a30e3ba --- /dev/null +++ b/ta_lib/strategies/trend_follow/src/deserialize/candle_deserialize.rs @@ -0,0 +1,22 @@ +use indicator::CandleTrendType; + +#[inline] +pub fn candletrend_deserialize(candle: usize) -> CandleTrendType { + match candle { + 1 => CandleTrendType::BOTTLE, + 2 => CandleTrendType::DOUBLE_TROUBLE, + 3 => CandleTrendType::GOLDEN, + 4 => CandleTrendType::H, + 5 => CandleTrendType::HEXAD, + 6 => CandleTrendType::HIKKAKE, + 7 => CandleTrendType::MARUBOZU, + 8 => CandleTrendType::MASTER_CANDLE, + 9 => CandleTrendType::QUINTUPLETS, + 10 => CandleTrendType::SLINGSHOT, + 11 => CandleTrendType::THREE_CANDLES, + 12 => CandleTrendType::THREE_METHODS, + 13 => CandleTrendType::TASUKI, + 14 => CandleTrendType::THREE_ONE_TWO, + _ => CandleTrendType::THREE_CANDLES, + } +} diff --git a/ta_lib/strategies/trend_follow/src/ma_mapper.rs b/ta_lib/strategies/trend_follow/src/deserialize/ma_deserialize.rs similarity index 90% rename from ta_lib/strategies/trend_follow/src/ma_mapper.rs rename to ta_lib/strategies/trend_follow/src/deserialize/ma_deserialize.rs index eed23d96..538b6099 100644 --- a/ta_lib/strategies/trend_follow/src/ma_mapper.rs +++ b/ta_lib/strategies/trend_follow/src/deserialize/ma_deserialize.rs @@ -1,7 +1,8 @@ -use shared::MovingAverageType; +use indicator::MovingAverageType; -pub fn map_to_ma(smoothing: usize) -> MovingAverageType { - match smoothing { +#[inline] +pub fn ma_deserialize(ma: usize) -> MovingAverageType { + match ma { 1 => MovingAverageType::ALMA, 2 => MovingAverageType::DEMA, 3 => MovingAverageType::CAMA, diff --git a/ta_lib/strategies/trend_follow/src/deserialize/mod.rs b/ta_lib/strategies/trend_follow/src/deserialize/mod.rs new file mode 100644 index 00000000..7de4b91f --- /dev/null +++ b/ta_lib/strategies/trend_follow/src/deserialize/mod.rs @@ -0,0 +1,7 @@ +mod candle_deserialize; +mod ma_deserialize; +mod smooth_deserialize; + +pub use candle_deserialize::candletrend_deserialize; +pub use ma_deserialize::ma_deserialize; +pub use smooth_deserialize::smooth_deserialize; diff --git a/ta_lib/strategies/trend_follow/src/smooth_mapper.rs b/ta_lib/strategies/trend_follow/src/deserialize/smooth_deserialize.rs similarity index 82% rename from ta_lib/strategies/trend_follow/src/smooth_mapper.rs rename to ta_lib/strategies/trend_follow/src/deserialize/smooth_deserialize.rs index 1204c3f7..e21ebb13 100644 --- a/ta_lib/strategies/trend_follow/src/smooth_mapper.rs +++ b/ta_lib/strategies/trend_follow/src/deserialize/smooth_deserialize.rs @@ -1,6 +1,7 @@ use core::prelude::*; -pub fn map_to_smooth(smooth: usize) -> Smooth { +#[inline] +pub fn smooth_deserialize(smooth: usize) -> Smooth { match smooth { 1 => Smooth::EMA, 2 => Smooth::SMA, diff --git a/ta_lib/strategies/trend_follow/src/exit_mapper.rs b/ta_lib/strategies/trend_follow/src/exit_mapper.rs deleted file mode 100644 index ac7d6793..00000000 --- a/ta_lib/strategies/trend_follow/src/exit_mapper.rs +++ /dev/null @@ -1,81 +0,0 @@ -use crate::ma_mapper::map_to_ma; -use crate::smooth_mapper::map_to_smooth; -use base::prelude::*; -use exit::*; -use serde::Deserialize; - -#[derive(Deserialize)] -#[serde(tag = "type")] -pub enum ExitConfig { - Ast { - atr_period: f32, - factor: f32, - }, - Cci { - smooth_type: f32, - period: f32, - factor: f32, - threshold: f32, - }, - Dumb {}, - HighLow { - period: f32, - }, - Rsi { - smooth_type: f32, - period: f32, - threshold: f32, - }, - Ma { - ma: f32, - period: f32, - }, - Mfi { - period: f32, - threshold: f32, - }, - Trix { - smooth_type: f32, - period: f32, - signal_period: f32, - }, -} - -pub fn map_to_exit(config: ExitConfig) -> Box { - match config { - ExitConfig::Ast { atr_period, factor } => Box::new(AstExit::new(atr_period, factor)), - ExitConfig::Cci { - smooth_type, - period, - factor, - threshold, - } => Box::new(CCIExit::new( - map_to_smooth(smooth_type as usize), - period, - factor, - threshold, - )), - ExitConfig::Dumb {} => Box::new(DumbExit {}), - ExitConfig::HighLow { period } => Box::new(HighLowExit::new(period)), - ExitConfig::Rsi { - smooth_type, - period, - threshold, - } => Box::new(RSIExit::new( - map_to_smooth(smooth_type as usize), - period, - threshold, - )), - ExitConfig::Trix { - smooth_type, - period, - signal_period, - } => Box::new(TRIXExit::new( - map_to_smooth(smooth_type as usize), - period, - signal_period, - )), - ExitConfig::Mfi { period, threshold } => Box::new(MFIExit::new(period, threshold)), - ExitConfig::Ma { ma, period } => Box::new(MAExit::new(map_to_ma(ma as usize), period)), - } -} diff --git a/ta_lib/strategies/trend_follow/src/ffi.rs b/ta_lib/strategies/trend_follow/src/ffi.rs index 5fa25444..1e5dfbfb 100644 --- a/ta_lib/strategies/trend_follow/src/ffi.rs +++ b/ta_lib/strategies/trend_follow/src/ffi.rs @@ -1,9 +1,9 @@ -use crate::baseline_mapper::{map_to_baseline, BaseLineConfig}; -use crate::confirm_mapper::{map_to_confirm, ConfirmConfig}; -use crate::exit_mapper::{map_to_exit, ExitConfig}; -use crate::pulse_mapper::{map_to_pulse, PulseConfig}; -use crate::signal_mapper::{map_to_signal, SignalConfig}; -use crate::stop_loss_mapper::{map_to_stoploss, StopLossConfig}; +use crate::config::{ + BaseLineConfig, ConfirmConfig, ExitConfig, PulseConfig, SignalConfig, StopLossConfig, +}; +use crate::mapper::{ + map_to_baseline, map_to_confirm, map_to_exit, map_to_pulse, map_to_signal, map_to_stoploss, +}; use base::prelude::*; fn read_from_memory(ptr: *const u8, len: usize) -> &'static [u8] { diff --git a/ta_lib/strategies/trend_follow/src/lib.rs b/ta_lib/strategies/trend_follow/src/lib.rs index 8b57e708..d7e90b65 100644 --- a/ta_lib/strategies/trend_follow/src/lib.rs +++ b/ta_lib/strategies/trend_follow/src/lib.rs @@ -1,12 +1,6 @@ -mod baseline_mapper; -mod candle_mapper; -mod confirm_mapper; -mod exit_mapper; +mod config; +mod deserialize; mod ffi; -mod ma_mapper; -mod pulse_mapper; -mod signal_mapper; -mod smooth_mapper; -mod stop_loss_mapper; +mod mapper; pub use ffi::*; diff --git a/ta_lib/strategies/trend_follow/src/mapper/baseline_mapper.rs b/ta_lib/strategies/trend_follow/src/mapper/baseline_mapper.rs new file mode 100644 index 00000000..d5c18bb4 --- /dev/null +++ b/ta_lib/strategies/trend_follow/src/mapper/baseline_mapper.rs @@ -0,0 +1,13 @@ +use crate::config::BaseLineConfig; +use crate::deserialize::ma_deserialize; +use base::prelude::*; +use baseline::*; + +#[inline] +pub fn map_to_baseline(config: BaseLineConfig) -> Box { + match config { + BaseLineConfig::Ma { ma, period } => { + Box::new(MaBaseLine::new(ma_deserialize(ma as usize), period)) + } + } +} diff --git a/ta_lib/strategies/trend_follow/src/mapper/confirm_mapper.rs b/ta_lib/strategies/trend_follow/src/mapper/confirm_mapper.rs new file mode 100644 index 00000000..99fe548d --- /dev/null +++ b/ta_lib/strategies/trend_follow/src/mapper/confirm_mapper.rs @@ -0,0 +1,76 @@ +use crate::config::ConfirmConfig; +use crate::deserialize::smooth_deserialize; +use base::prelude::*; +use confirm::*; + +#[inline] +pub fn map_to_confirm(config: ConfirmConfig) -> Box { + match config { + ConfirmConfig::Dpo { + smooth_type, + period, + } => Box::new(DpoConfirm::new( + smooth_deserialize(smooth_type as usize), + period, + )), + ConfirmConfig::Dso { + smooth_type, + smooth_period, + k_period, + d_period, + } => Box::new(DsoConfirm::new( + smooth_deserialize(smooth_type as usize), + smooth_period, + k_period, + d_period, + )), + ConfirmConfig::Cci { + smooth_type, + period, + factor, + } => Box::new(CciConfirm::new( + smooth_deserialize(smooth_type as usize), + period, + factor, + )), + ConfirmConfig::Eom { + smooth_type, + period, + divisor, + } => Box::new(EomConfirm::new( + smooth_deserialize(smooth_type as usize), + period, + divisor, + )), + ConfirmConfig::Dumb { period } => Box::new(DumbConfirm::new(period)), + ConfirmConfig::Rsi { + smooth_type, + period, + smooth_signal, + smooth_period, + threshold, + } => Box::new(RsiConfirm::new( + smooth_deserialize(smooth_type as usize), + period, + smooth_deserialize(smooth_signal as usize), + smooth_period, + threshold, + )), + ConfirmConfig::Roc { period } => Box::new(RocConfirm::new(period)), + ConfirmConfig::Stc { + smooth_type, + fast_period, + slow_period, + cycle, + d_first, + d_second, + } => Box::new(StcConfirm::new( + smooth_deserialize(smooth_type as usize), + fast_period, + slow_period, + cycle, + d_first, + d_second, + )), + } +} diff --git a/ta_lib/strategies/trend_follow/src/mapper/exit_mapper.rs b/ta_lib/strategies/trend_follow/src/mapper/exit_mapper.rs new file mode 100644 index 00000000..23878a0d --- /dev/null +++ b/ta_lib/strategies/trend_follow/src/mapper/exit_mapper.rs @@ -0,0 +1,44 @@ +use crate::config::ExitConfig; +use crate::deserialize::{ma_deserialize, smooth_deserialize}; +use base::prelude::*; +use exit::*; + +#[inline] +pub fn map_to_exit(config: ExitConfig) -> Box { + match config { + ExitConfig::Ast { atr_period, factor } => Box::new(AstExit::new(atr_period, factor)), + ExitConfig::Cci { + smooth_type, + period, + factor, + threshold, + } => Box::new(CciExit::new( + smooth_deserialize(smooth_type as usize), + period, + factor, + threshold, + )), + ExitConfig::Dumb {} => Box::new(DumbExit {}), + ExitConfig::HighLow { period } => Box::new(HighLowExit::new(period)), + ExitConfig::Rsi { + smooth_type, + period, + threshold, + } => Box::new(RsiExit::new( + smooth_deserialize(smooth_type as usize), + period, + threshold, + )), + ExitConfig::Trix { + smooth_type, + period, + signal_period, + } => Box::new(TrixExit::new( + smooth_deserialize(smooth_type as usize), + period, + signal_period, + )), + ExitConfig::Mfi { period, threshold } => Box::new(MfiExit::new(period, threshold)), + ExitConfig::Ma { ma, period } => Box::new(MaExit::new(ma_deserialize(ma as usize), period)), + } +} diff --git a/ta_lib/strategies/trend_follow/src/mapper/mod.rs b/ta_lib/strategies/trend_follow/src/mapper/mod.rs new file mode 100644 index 00000000..f2aaa1d5 --- /dev/null +++ b/ta_lib/strategies/trend_follow/src/mapper/mod.rs @@ -0,0 +1,13 @@ +mod baseline_mapper; +mod confirm_mapper; +mod exit_mapper; +mod pulse_mapper; +mod signal_mapper; +mod stoploss_mapper; + +pub use baseline_mapper::map_to_baseline; +pub use confirm_mapper::map_to_confirm; +pub use exit_mapper::map_to_exit; +pub use pulse_mapper::map_to_pulse; +pub use signal_mapper::map_to_signal; +pub use stoploss_mapper::map_to_stoploss; diff --git a/ta_lib/strategies/trend_follow/src/pulse_mapper.rs b/ta_lib/strategies/trend_follow/src/mapper/pulse_mapper.rs similarity index 50% rename from ta_lib/strategies/trend_follow/src/pulse_mapper.rs rename to ta_lib/strategies/trend_follow/src/mapper/pulse_mapper.rs index 18fb0eb5..42254b67 100644 --- a/ta_lib/strategies/trend_follow/src/pulse_mapper.rs +++ b/ta_lib/strategies/trend_follow/src/mapper/pulse_mapper.rs @@ -1,49 +1,9 @@ -use crate::smooth_mapper::map_to_smooth; +use crate::config::PulseConfig; +use crate::deserialize::smooth_deserialize; use base::prelude::*; use pulse::*; -use serde::Deserialize; - -#[derive(Deserialize)] -#[serde(tag = "type")] -pub enum PulseConfig { - Adx { - smooth_type: f32, - adx_period: f32, - di_period: f32, - threshold: f32, - }, - Braid { - smooth_type: f32, - fast_period: f32, - slow_period: f32, - open_period: f32, - strength: f32, - atr_period: f32, - }, - Dumb { - period: f32, - }, - Chop { - atr_period: f32, - period: f32, - threshold: f32, - }, - Nvol { - smooth_type: f32, - period: f32, - }, - Vo { - smooth_type: f32, - fast_period: f32, - slow_period: f32, - }, - Tdfi { - smooth_type: f32, - period: f32, - n: f32, - }, -} +#[inline] pub fn map_to_pulse(config: PulseConfig) -> Box { match config { PulseConfig::Adx { @@ -51,8 +11,8 @@ pub fn map_to_pulse(config: PulseConfig) -> Box { adx_period, di_period, threshold, - } => Box::new(ADXPulse::new( - map_to_smooth(smooth_type as usize), + } => Box::new(AdxPulse::new( + smooth_deserialize(smooth_type as usize), adx_period, di_period, threshold, @@ -65,7 +25,7 @@ pub fn map_to_pulse(config: PulseConfig) -> Box { strength, atr_period, } => Box::new(BraidPulse::new( - map_to_smooth(smooth_type as usize), + smooth_deserialize(smooth_type as usize), fast_period, slow_period, open_period, @@ -76,18 +36,21 @@ pub fn map_to_pulse(config: PulseConfig) -> Box { atr_period, period, threshold, - } => Box::new(CHOPPulse::new(atr_period, period, threshold)), + } => Box::new(ChopPulse::new(atr_period, period, threshold)), PulseConfig::Dumb { period } => Box::new(DumbPulse::new(period)), PulseConfig::Nvol { smooth_type, period, - } => Box::new(NvolPulse::new(map_to_smooth(smooth_type as usize), period)), + } => Box::new(NvolPulse::new( + smooth_deserialize(smooth_type as usize), + period, + )), PulseConfig::Tdfi { smooth_type, period, n, - } => Box::new(TDFIPulse::new( - map_to_smooth(smooth_type as usize), + } => Box::new(TdfiPulse::new( + smooth_deserialize(smooth_type as usize), period, n, )), @@ -96,7 +59,7 @@ pub fn map_to_pulse(config: PulseConfig) -> Box { fast_period, slow_period, } => Box::new(VoPulse::new( - map_to_smooth(smooth_type as usize), + smooth_deserialize(smooth_type as usize), fast_period, slow_period, )), diff --git a/ta_lib/strategies/trend_follow/src/mapper/signal_mapper.rs b/ta_lib/strategies/trend_follow/src/mapper/signal_mapper.rs new file mode 100644 index 00000000..0ae18bda --- /dev/null +++ b/ta_lib/strategies/trend_follow/src/mapper/signal_mapper.rs @@ -0,0 +1,378 @@ +use crate::config::SignalConfig; +use crate::deserialize::{candletrend_deserialize, ma_deserialize, smooth_deserialize}; +use base::prelude::*; +use signal::*; + +#[inline] +pub fn map_to_signal(config: SignalConfig) -> Box { + match config { + // Zero Cross + SignalConfig::AoZeroCross { + fast_period, + slow_period, + } => Box::new(AoZeroCrossSignal::new(fast_period, slow_period)), + SignalConfig::ApoZeroCross { + fast_period, + slow_period, + } => Box::new(ApoZeroCrossSignal::new(fast_period, slow_period)), + SignalConfig::BopZeroCross { + smooth_type, + smooth_period, + } => Box::new(BopZeroCrossSignal::new( + smooth_deserialize(smooth_type as usize), + smooth_period, + )), + SignalConfig::CfoZeroCross { period } => Box::new(CfoZeroCrossSignal::new(period)), + SignalConfig::CcZeroCross { + fast_period, + slow_period, + smooth_type, + smooth_period, + } => Box::new(CcZeroCrossSignal::new( + fast_period, + slow_period, + smooth_deserialize(smooth_type as usize), + smooth_period, + )), + SignalConfig::DiZeroCross { + smooth_type, + period, + } => Box::new(DiZeroCrossSignal::new( + smooth_deserialize(smooth_type as usize), + period, + )), + SignalConfig::MacdZeroCross { + smooth_type, + fast_period, + slow_period, + signal_period, + } => Box::new(MacdZeroCrossSignal::new( + smooth_deserialize(smooth_type as usize), + fast_period, + slow_period, + signal_period, + )), + SignalConfig::RocZeroCross { period } => Box::new(RocZeroCrossSignal::new(period)), + SignalConfig::TsiZeroCross { + smooth_type, + fast_period, + slow_period, + } => Box::new(TsiZeroCrossSignal::new( + smooth_deserialize(smooth_type as usize), + fast_period, + slow_period, + )), + SignalConfig::TrixZeroCross { + smooth_type, + period, + } => Box::new(TrixZeroCrossSignal::new( + smooth_deserialize(smooth_type as usize), + period, + )), + SignalConfig::QstickZeroCross { + smooth_type, + period, + } => Box::new(QstickZeroCrossSignal::new( + smooth_deserialize(smooth_type as usize), + period, + )), + // Signal Line + SignalConfig::MacdSignalLine { + smooth_type, + fast_period, + slow_period, + signal_period, + } => Box::new(MacdSignalLineSignal::new( + smooth_deserialize(smooth_type as usize), + fast_period, + slow_period, + signal_period, + )), + SignalConfig::RsiSignalLine { + smooth_type, + rsi_period, + smooth_signal, + smooth_period, + threshold, + } => Box::new(RsiSignalLineSignal::new( + smooth_deserialize(smooth_type as usize), + rsi_period, + smooth_deserialize(smooth_signal as usize), + smooth_period, + threshold, + )), + SignalConfig::DsoSignalLine { + smooth_type, + smooth_period, + k_period, + d_period, + } => Box::new(DsoSignalLineSignal::new( + smooth_deserialize(smooth_type as usize), + smooth_period, + k_period, + d_period, + )), + SignalConfig::TrixSignalLine { + smooth_type, + period, + signal_period, + } => Box::new(TrixSignalLineSignal::new( + smooth_deserialize(smooth_type as usize), + period, + signal_period, + )), + SignalConfig::KstSignalLine { + smooth_type, + roc_period_first, + roc_period_second, + roc_period_third, + roc_period_fouth, + period_first, + period_second, + period_third, + period_fouth, + signal_period, + } => Box::new(KstSignalLineSignal::new( + smooth_deserialize(smooth_type as usize), + roc_period_first, + roc_period_second, + roc_period_third, + roc_period_fouth, + period_first, + period_second, + period_third, + period_fouth, + signal_period, + )), + SignalConfig::DiSignalLine { + smooth_type, + period, + signal_period, + } => Box::new(DiSignalLineSignal::new( + smooth_deserialize(smooth_type as usize), + period, + signal_period, + )), + SignalConfig::TsiSignalLine { + smooth_type, + fast_period, + slow_period, + signal_period, + } => Box::new(TsiSignalLineSignal::new( + smooth_deserialize(smooth_type as usize), + fast_period, + slow_period, + signal_period, + )), + SignalConfig::QstickSignalLine { + smooth_type, + period, + signal_period, + } => Box::new(QstickSignalLineSignal::new( + smooth_deserialize(smooth_type as usize), + period, + signal_period, + )), + SignalConfig::StochSignalLine { + smooth_type, + period, + k_period, + d_period, + } => Box::new(StochSignalLineSignal::new( + smooth_deserialize(smooth_type as usize), + period, + k_period, + d_period, + )), + // Flip + SignalConfig::CeFlip { + period, + atr_period, + factor, + } => Box::new(CeFlipSignal::new(period, atr_period, factor)), + SignalConfig::SupFlip { atr_period, factor } => { + Box::new(SupertrendFlipSignal::new(atr_period, factor)) + } + // Pattern + SignalConfig::AoSaucer { + fast_period, + slow_period, + } => Box::new(AoSaucerSignal::new(fast_period, slow_period)), + SignalConfig::MacdColorSwitch { + smooth_type, + fast_period, + slow_period, + signal_period, + } => Box::new(MacdColorSwitchSignal::new( + smooth_deserialize(smooth_type as usize), + fast_period, + slow_period, + signal_period, + )), + SignalConfig::TiiV { + smooth_type, + major_period, + minor_period, + } => Box::new(TiiVSignal::new( + smooth_deserialize(smooth_type as usize), + major_period, + minor_period, + )), + SignalConfig::RsiV { + smooth_type, + rsi_period, + threshold, + } => Box::new(RsiVSignal::new( + smooth_deserialize(smooth_type as usize), + rsi_period, + threshold, + )), + SignalConfig::HighLow { period } => Box::new(HighLowSignal::new(period)), + SignalConfig::CandlestickTrend { candle } => Box::new(CandlestickTrendSignal::new( + candletrend_deserialize(candle as usize), + )), + // BB + SignalConfig::MacdBb { + smooth_type, + fast_period, + slow_period, + signal_period, + bb_period, + factor, + } => Box::new(MacdBbSignal::new( + smooth_deserialize(smooth_type as usize), + fast_period, + slow_period, + signal_period, + bb_period, + factor, + )), + SignalConfig::VwapBb { + period, + smooth_type, + bb_period, + factor, + } => Box::new(VwapBbSignal::new( + period, + smooth_deserialize(smooth_type as usize), + bb_period, + factor, + )), + // Neutrality + SignalConfig::RsiNeutralityCross { + smooth_type, + rsi_period, + threshold, + } => Box::new(RsiNeutralityCrossSignal::new( + smooth_deserialize(smooth_type as usize), + rsi_period, + threshold, + )), + SignalConfig::RsiNeutralityPullback { + smooth_type, + rsi_period, + threshold, + } => Box::new(RsiNeutralityPullbackSignal::new( + smooth_deserialize(smooth_type as usize), + rsi_period, + threshold, + )), + SignalConfig::RsiNeutralityRejection { + smooth_type, + rsi_period, + threshold, + } => Box::new(RsiNeutralityRejectionSignal::new( + smooth_deserialize(smooth_type as usize), + rsi_period, + threshold, + )), + SignalConfig::DsoNeutralityCross { + smooth_type, + smooth_period, + k_period, + d_period, + } => Box::new(DsoNeutralityCrossSignal::new( + smooth_deserialize(smooth_type as usize), + smooth_period, + k_period, + d_period, + )), + // Ma + SignalConfig::Ma3Cross { + ma, + fast_period, + medium_period, + slow_period, + } => Box::new(Ma3CrossSignal::new( + ma_deserialize(ma as usize), + fast_period, + medium_period, + slow_period, + )), + SignalConfig::Ma2Rsi { + smooth_type, + rsi_period, + threshold, + ma, + fast_period, + slow_period, + } => Box::new(Ma2RsiSignal::new( + smooth_deserialize(smooth_type as usize), + rsi_period, + threshold, + ma_deserialize(ma as usize), + fast_period, + slow_period, + )), + SignalConfig::MaTestingGround { ma, period } => Box::new(MaTestingGroundSignal::new( + ma_deserialize(ma as usize), + period, + )), + SignalConfig::MaSurpass { ma, period } => { + Box::new(MaSurpassSignal::new(ma_deserialize(ma as usize), period)) + } + SignalConfig::MaCross { ma, period } => { + Box::new(MaCrossSignal::new(ma_deserialize(ma as usize), period)) + } + SignalConfig::MaQuadruple { ma, period } => { + Box::new(MaQuadrupleSignal::new(ma_deserialize(ma as usize), period)) + } + SignalConfig::VwapCross { period } => Box::new(VwapCrossSignal::new(period)), + // Reversal + SignalConfig::SnatrReversal { + smooth_type, + atr_period, + atr_smooth_period, + threshold, + } => Box::new(SnatrReversalSignal::new( + smooth_deserialize(smooth_type as usize), + atr_period, + atr_smooth_period, + threshold, + )), + SignalConfig::DmiReversal { + smooth_type, + adx_period, + di_period, + } => Box::new(DmiReversalSignal::new( + smooth_deserialize(smooth_type as usize), + adx_period, + di_period, + )), + SignalConfig::ViReversal { period, atr_period } => { + Box::new(ViReversalSignal::new(period, atr_period)) + } + // Breakout + SignalConfig::DchMa2Breakout { + dch_period, + ma, + fast_period, + slow_period, + } => Box::new(DchMa2BreakoutSignal::new( + dch_period, + ma_deserialize(ma as usize), + fast_period, + slow_period, + )), + } +} diff --git a/ta_lib/strategies/trend_follow/src/mapper/stoploss_mapper.rs b/ta_lib/strategies/trend_follow/src/mapper/stoploss_mapper.rs new file mode 100644 index 00000000..ba72c608 --- /dev/null +++ b/ta_lib/strategies/trend_follow/src/mapper/stoploss_mapper.rs @@ -0,0 +1,19 @@ +use crate::config::StopLossConfig; +use crate::deserialize::smooth_deserialize; +use base::prelude::*; +use stop_loss::*; + +#[inline] +pub fn map_to_stoploss(config: StopLossConfig) -> Box { + match config { + StopLossConfig::Atr { + smooth_type, + period, + factor, + } => Box::new(AtrStopLoss::new( + smooth_deserialize(smooth_type as usize), + period, + factor, + )), + } +} diff --git a/ta_lib/strategies/trend_follow/src/signal_mapper.rs b/ta_lib/strategies/trend_follow/src/signal_mapper.rs deleted file mode 100644 index f9ad7fc3..00000000 --- a/ta_lib/strategies/trend_follow/src/signal_mapper.rs +++ /dev/null @@ -1,663 +0,0 @@ -use crate::candle_mapper::map_to_candle; -use crate::ma_mapper::map_to_ma; -use crate::smooth_mapper::map_to_smooth; -use base::Signal; -use serde::Deserialize; -use signal::*; - -#[derive(Deserialize)] -#[serde(tag = "type")] -pub enum SignalConfig { - AoSaucer { - fast_period: f32, - slow_period: f32, - }, - AoFlip { - fast_period: f32, - slow_period: f32, - }, - ApoFlip { - fast_period: f32, - slow_period: f32, - }, - BopFlip { - smooth_type: f32, - smooth_period: f32, - }, - CeFlip { - period: f32, - atr_period: f32, - factor: f32, - }, - CfoFlip { - period: f32, - }, - CcFlip { - fast_period: f32, - slow_period: f32, - smooth_type: f32, - smooth_period: f32, - }, - DmiCross { - smooth_type: f32, - adx_period: f32, - di_period: f32, - }, - DsoFlip { - smooth_type: f32, - smooth_period: f32, - k_period: f32, - d_period: f32, - }, - DsoCross { - smooth_type: f32, - smooth_period: f32, - k_period: f32, - d_period: f32, - }, - HighLow { - period: f32, - }, - KstCross { - smooth_type: f32, - roc_period_first: f32, - roc_period_second: f32, - roc_period_third: f32, - roc_period_fouth: f32, - period_first: f32, - period_second: f32, - period_third: f32, - period_fouth: f32, - signal_period: f32, - }, - Ma3Cross { - ma: f32, - fast_period: f32, - medium_period: f32, - slow_period: f32, - }, - MaTestingGround { - ma: f32, - period: f32, - }, - MaSurpass { - ma: f32, - period: f32, - }, - MaQuadruple { - ma: f32, - period: f32, - }, - MacdFlip { - smooth_type: f32, - fast_period: f32, - slow_period: f32, - signal_period: f32, - }, - MacdCross { - smooth_type: f32, - fast_period: f32, - slow_period: f32, - signal_period: f32, - }, - MacdColorSwitch { - smooth_type: f32, - fast_period: f32, - slow_period: f32, - signal_period: f32, - }, - MacdBb { - smooth_type: f32, - fast_period: f32, - slow_period: f32, - signal_period: f32, - bb_period: f32, - factor: f32, - }, - RocFlip { - period: f32, - }, - RsiNeutralityCross { - smooth_type: f32, - rsi_period: f32, - threshold: f32, - }, - RsiNeutralityPullback { - smooth_type: f32, - rsi_period: f32, - threshold: f32, - }, - RsiNeutralityRejection { - smooth_type: f32, - rsi_period: f32, - threshold: f32, - }, - Rsi2Ma { - smooth_type: f32, - rsi_period: f32, - threshold: f32, - ma: f32, - fast_period: f32, - slow_period: f32, - }, - RsiSup { - smooth_type: f32, - rsi_period: f32, - threshold: f32, - atr_period: f32, - factor: f32, - }, - RsiMaPullback { - smooth_type: f32, - rsi_period: f32, - smooth_signal: f32, - smooth_period: f32, - threshold: f32, - }, - RsiV { - smooth_type: f32, - rsi_period: f32, - threshold: f32, - }, - DiFlip { - smooth_type: f32, - period: f32, - }, - DiCross { - smooth_type: f32, - period: f32, - signal_period: f32, - }, - Dch2Ma { - dch_period: f32, - ma: f32, - fast_period: f32, - slow_period: f32, - }, - TrendCandle { - candle: f32, - }, - TrixFlip { - smooth_type: f32, - period: f32, - }, - TrixCross { - smooth_type: f32, - period: f32, - signal_period: f32, - }, - SnAtr { - smooth_type: f32, - atr_period: f32, - atr_smooth_period: f32, - threshold: f32, - }, - StcFlip { - smooth_type: f32, - fast_period: f32, - slow_period: f32, - cycle: f32, - d_first: f32, - d_second: f32, - }, - StochCross { - smooth_type: f32, - period: f32, - k_period: f32, - d_period: f32, - }, - SupFlip { - atr_period: f32, - factor: f32, - }, - SupPullBack { - atr_period: f32, - factor: f32, - }, - TiiCross { - smooth_type: f32, - major_period: f32, - minor_period: f32, - threshold: f32, - }, - TiiV { - smooth_type: f32, - major_period: f32, - minor_period: f32, - }, - TsiFlip { - smooth_type: f32, - fast_period: f32, - slow_period: f32, - }, - TsiCross { - smooth_type: f32, - fast_period: f32, - slow_period: f32, - signal_period: f32, - }, - QstickFlip { - smooth_type: f32, - period: f32, - }, - QstickCross { - smooth_type: f32, - period: f32, - signal_period: f32, - }, - ViCross { - atr_period: f32, - period: f32, - }, - VwapCross { - period: f32, - }, - VwapBb { - period: f32, - smooth_type: f32, - bb_period: f32, - factor: f32, - }, -} - -pub fn map_to_signal(config: SignalConfig) -> Box { - match config { - SignalConfig::AoFlip { - fast_period, - slow_period, - } => Box::new(AOFlipSignal::new(fast_period, slow_period)), - SignalConfig::AoSaucer { - fast_period, - slow_period, - } => Box::new(AOSaucerSignal::new(fast_period, slow_period)), - SignalConfig::ApoFlip { - fast_period, - slow_period, - } => Box::new(APOFlipSignal::new(fast_period, slow_period)), - SignalConfig::BopFlip { - smooth_type, - smooth_period, - } => Box::new(BOPFlipSignal::new( - map_to_smooth(smooth_type as usize), - smooth_period, - )), - SignalConfig::CeFlip { - period, - atr_period, - factor, - } => Box::new(CEFlipSignal::new(period, atr_period, factor)), - SignalConfig::CfoFlip { period } => Box::new(CFOFlipSignal::new(period)), - SignalConfig::CcFlip { - fast_period, - slow_period, - smooth_type, - smooth_period, - } => Box::new(CCFlipSignal::new( - fast_period, - slow_period, - map_to_smooth(smooth_type as usize), - smooth_period, - )), - SignalConfig::DmiCross { - smooth_type, - adx_period, - di_period, - } => Box::new(DMICrossSignal::new( - map_to_smooth(smooth_type as usize), - adx_period, - di_period, - )), - SignalConfig::Ma3Cross { - ma, - fast_period, - medium_period, - slow_period, - } => Box::new(MA3CrossSignal::new( - map_to_ma(ma as usize), - fast_period, - medium_period, - slow_period, - )), - SignalConfig::MacdFlip { - smooth_type, - fast_period, - slow_period, - signal_period, - } => Box::new(MACDFlipSignal::new( - map_to_smooth(smooth_type as usize), - fast_period, - slow_period, - signal_period, - )), - SignalConfig::MacdCross { - smooth_type, - fast_period, - slow_period, - signal_period, - } => Box::new(MACDCrossSignal::new( - map_to_smooth(smooth_type as usize), - fast_period, - slow_period, - signal_period, - )), - SignalConfig::MacdColorSwitch { - smooth_type, - fast_period, - slow_period, - signal_period, - } => Box::new(MACDColorSwitchSignal::new( - map_to_smooth(smooth_type as usize), - fast_period, - slow_period, - signal_period, - )), - SignalConfig::MacdBb { - smooth_type, - fast_period, - slow_period, - signal_period, - bb_period, - factor, - } => Box::new(MACDBBSignal::new( - map_to_smooth(smooth_type as usize), - fast_period, - slow_period, - signal_period, - bb_period, - factor, - )), - SignalConfig::RsiNeutralityCross { - smooth_type, - rsi_period, - threshold, - } => Box::new(RSINeutralityCrossSignal::new( - map_to_smooth(smooth_type as usize), - rsi_period, - threshold, - )), - SignalConfig::RsiNeutralityPullback { - smooth_type, - rsi_period, - threshold, - } => Box::new(RSINeutralityPullbackSignal::new( - map_to_smooth(smooth_type as usize), - rsi_period, - threshold, - )), - SignalConfig::RsiNeutralityRejection { - smooth_type, - rsi_period, - threshold, - } => Box::new(RSINeutralityRejectionSignal::new( - map_to_smooth(smooth_type as usize), - rsi_period, - threshold, - )), - SignalConfig::Rsi2Ma { - smooth_type, - rsi_period, - threshold, - ma, - fast_period, - slow_period, - } => Box::new(RSI2MASignal::new( - map_to_smooth(smooth_type as usize), - rsi_period, - threshold, - map_to_ma(ma as usize), - fast_period, - slow_period, - )), - SignalConfig::RsiSup { - smooth_type, - rsi_period, - threshold, - atr_period, - factor, - } => Box::new(RSISupertrendSignal::new( - map_to_smooth(smooth_type as usize), - rsi_period, - threshold, - atr_period, - factor, - )), - SignalConfig::RsiMaPullback { - smooth_type, - rsi_period, - smooth_signal, - smooth_period, - threshold, - } => Box::new(RSIMaPullbackSignal::new( - map_to_smooth(smooth_type as usize), - rsi_period, - map_to_smooth(smooth_signal as usize), - smooth_period, - threshold, - )), - SignalConfig::DiFlip { - smooth_type, - period, - } => Box::new(DIFlipSignal::new( - map_to_smooth(smooth_type as usize), - period, - )), - SignalConfig::DsoFlip { - smooth_type, - smooth_period, - k_period, - d_period, - } => Box::new(DSOFlipSignal::new( - map_to_smooth(smooth_type as usize), - smooth_period, - k_period, - d_period, - )), - SignalConfig::DsoCross { - smooth_type, - smooth_period, - k_period, - d_period, - } => Box::new(DSOCrossSignal::new( - map_to_smooth(smooth_type as usize), - smooth_period, - k_period, - d_period, - )), - SignalConfig::DiCross { - smooth_type, - period, - signal_period, - } => Box::new(DICrossSignal::new( - map_to_smooth(smooth_type as usize), - period, - signal_period, - )), - SignalConfig::HighLow { period } => Box::new(HighLowSignal::new(period)), - SignalConfig::Dch2Ma { - dch_period, - ma, - fast_period, - slow_period, - } => Box::new(DCH2MASignal::new( - dch_period, - map_to_ma(ma as usize), - fast_period, - slow_period, - )), - SignalConfig::RocFlip { period } => Box::new(ROCFlipSignal::new(period)), - SignalConfig::MaTestingGround { ma, period } => { - Box::new(MATestingGroundSignal::new(map_to_ma(ma as usize), period)) - } - SignalConfig::MaSurpass { ma, period } => { - Box::new(MASurpassSignal::new(map_to_ma(ma as usize), period)) - } - SignalConfig::TrendCandle { candle } => { - Box::new(TrendCandleSignal::new(map_to_candle(candle as usize))) - } - SignalConfig::TrixFlip { - smooth_type, - period, - } => Box::new(TRIXFlipSignal::new( - map_to_smooth(smooth_type as usize), - period, - )), - SignalConfig::TrixCross { - smooth_type, - period, - signal_period, - } => Box::new(TRIXCrossSignal::new( - map_to_smooth(smooth_type as usize), - period, - signal_period, - )), - SignalConfig::SnAtr { - smooth_type, - atr_period, - atr_smooth_period, - threshold, - } => Box::new(SNATRSignal::new( - map_to_smooth(smooth_type as usize), - atr_period, - atr_smooth_period, - threshold, - )), - SignalConfig::SupFlip { atr_period, factor } => { - Box::new(SupertrendFlipSignal::new(atr_period, factor)) - } - SignalConfig::SupPullBack { atr_period, factor } => { - Box::new(SupertrendPullBackSignal::new(atr_period, factor)) - } - SignalConfig::StcFlip { - smooth_type, - fast_period, - slow_period, - cycle, - d_first, - d_second, - } => Box::new(STCFlipSignal::new( - map_to_smooth(smooth_type as usize), - fast_period, - slow_period, - cycle, - d_first, - d_second, - )), - SignalConfig::StochCross { - smooth_type, - period, - k_period, - d_period, - } => Box::new(StochCrossSignal::new( - map_to_smooth(smooth_type as usize), - period, - k_period, - d_period, - )), - SignalConfig::TiiCross { - smooth_type, - major_period, - minor_period, - threshold, - } => Box::new(TIICrossSignal::new( - map_to_smooth(smooth_type as usize), - major_period, - minor_period, - threshold, - )), - SignalConfig::TiiV { - smooth_type, - major_period, - minor_period, - } => Box::new(TIIVSignal::new( - map_to_smooth(smooth_type as usize), - major_period, - minor_period, - )), - SignalConfig::RsiV { - smooth_type, - rsi_period, - threshold, - } => Box::new(RSIVSignal::new( - map_to_smooth(smooth_type as usize), - rsi_period, - threshold, - )), - SignalConfig::TsiFlip { - smooth_type, - fast_period, - slow_period, - } => Box::new(TSIFlipSignal::new( - map_to_smooth(smooth_type as usize), - fast_period, - slow_period, - )), - SignalConfig::TsiCross { - smooth_type, - fast_period, - slow_period, - signal_period, - } => Box::new(TSICrossSignal::new( - map_to_smooth(smooth_type as usize), - fast_period, - slow_period, - signal_period, - )), - SignalConfig::QstickFlip { - smooth_type, - period, - } => Box::new(QSTICKFlipSignal::new( - map_to_smooth(smooth_type as usize), - period, - )), - SignalConfig::QstickCross { - smooth_type, - period, - signal_period, - } => Box::new(QSTICKCrossSignal::new( - map_to_smooth(smooth_type as usize), - period, - signal_period, - )), - SignalConfig::MaQuadruple { ma, period } => { - Box::new(MAQuadrupleSignal::new(map_to_ma(ma as usize), period)) - } - SignalConfig::ViCross { period, atr_period } => { - Box::new(VICrossSignal::new(period, atr_period)) - } - SignalConfig::VwapCross { period } => Box::new(VWAPCrossSignal::new(period)), - SignalConfig::VwapBb { - period, - smooth_type, - bb_period, - factor, - } => Box::new(VWAPBBSignal::new( - period, - map_to_smooth(smooth_type as usize), - bb_period, - factor, - )), - SignalConfig::KstCross { - smooth_type, - roc_period_first, - roc_period_second, - roc_period_third, - roc_period_fouth, - period_first, - period_second, - period_third, - period_fouth, - signal_period, - } => Box::new(KSTCrossSignal::new( - map_to_smooth(smooth_type as usize), - roc_period_first, - roc_period_second, - roc_period_third, - roc_period_fouth, - period_first, - period_second, - period_third, - period_fouth, - signal_period, - )), - } -} diff --git a/ta_lib/strategies/trend_follow/src/stop_loss_mapper.rs b/ta_lib/strategies/trend_follow/src/stop_loss_mapper.rs deleted file mode 100644 index 9dc735b5..00000000 --- a/ta_lib/strategies/trend_follow/src/stop_loss_mapper.rs +++ /dev/null @@ -1,28 +0,0 @@ -use crate::smooth_mapper::map_to_smooth; -use base::prelude::*; -use serde::Deserialize; -use stop_loss::ATRStopLoss; - -#[derive(Deserialize)] -#[serde(tag = "type")] -pub enum StopLossConfig { - Atr { - smooth_type: f32, - period: f32, - factor: f32, - }, -} - -pub fn map_to_stoploss(config: StopLossConfig) -> Box { - match config { - StopLossConfig::Atr { - smooth_type, - period, - factor, - } => Box::new(ATRStopLoss::new( - map_to_smooth(smooth_type as usize), - period, - factor, - )), - } -}