From ae1bc449de52ad6a1253d11bace799cb761697ca Mon Sep 17 00:00:00 2001 From: iterativ Date: Tue, 10 Dec 2024 18:34:41 +0200 Subject: [PATCH 1/7] X5: add global protection rule (Long). --- NostalgiaForInfinityX5.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/NostalgiaForInfinityX5.py b/NostalgiaForInfinityX5.py index 326682b7c5..a810b771f2 100644 --- a/NostalgiaForInfinityX5.py +++ b/NostalgiaForInfinityX5.py @@ -3751,6 +3751,22 @@ def populate_indicators(self, df: DataFrame, metadata: dict) -> DataFrame: | (df["STOCHk_14_3_3_1d"] < 70.0) | (df["ROC_9_1d"] < 50.0) ) + # 15m & 1h & 4h down move, 15m & 1h still not low enough, 4h still high, 1d still high & overbought + & ( + (df["RSI_3_15m"] > 40.0) + | (df["RSI_3_1h"] > 30.0) + | (df["RSI_3_4h"] > 50.0) + | (df["RSI_14_15m"] < 35.0) + | (df["STOCHk_14_3_3_15m"] < 30.0) + | (df["RSI_14_1h"] < 35.0) + | (df["AROONU_14_1h"] < 25.0) + | (df["STOCHk_14_3_3_1h"] < 30.0) + | (df["RSI_14_4h"] < 40.0) + | (df["AROONU_14_4h"] < 75.0) + | (df["RSI_14_1d"] < 60.0) + | (df["AROONU_14_1d"] < 75.0) + | (df["ROC_9_1d"] < 30.0) + ) # 15m & 1h & 4h down move, 15m & 1h still not low enough, 4h still high & overbought, 1d overbought & ( (df["RSI_3_15m"] > 45.0) From 8e17d26ee11b065a6d533345c9cdab8c8ed775a0 Mon Sep 17 00:00:00 2001 From: iterativ Date: Tue, 10 Dec 2024 19:59:45 +0200 Subject: [PATCH 2/7] X5: add global protection rule (Long). --- NostalgiaForInfinityX5.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/NostalgiaForInfinityX5.py b/NostalgiaForInfinityX5.py index a810b771f2..09fb076448 100644 --- a/NostalgiaForInfinityX5.py +++ b/NostalgiaForInfinityX5.py @@ -67,7 +67,7 @@ class NostalgiaForInfinityX5(IStrategy): INTERFACE_VERSION = 3 def version(self) -> str: - return "v15.1.270" + return "v15.1.271" stoploss = -0.99 @@ -3063,6 +3063,21 @@ def populate_indicators(self, df: DataFrame, metadata: dict) -> DataFrame: | (df["AROONU_14_1d"] < 75.0) | (df["STOCHk_14_3_3_1d"] < 50.0) ) + # 15m & 4h down move, 15m & 1h & 4h still not low enough, 1d still high & overbought + & ( + (df["RSI_3_15m"] > 15.0) + | (df["RSI_3_4h"] > 40.0) + | (df["RSI_14_15m"] < 35.0) + | (df["AROONU_14_15m"] < 25.0) + | (df["STOCHRSIk_14_14_3_3_15m"] < 20.0) + | (df["RSI_14_1h"] < 40.0) + | (df["STOCHRSIk_14_14_3_3_1h"] < 30.0) + | (df["RSI_14_4h"] < 40.0) + | (df["AROONU_14_4h"] < 25.0) + | (df["RSI_14_1d"] < 60.0) + | (df["AROONU_14_1d"] < 75.0) + | (df["ROC_9_1d"] < 30.0) + ) # 15m & 1h & 4h down move, 15m still not low enough, 4h & 1d still high & ( (df["RSI_3_15m"] > 20.0) From 60a911edea813a617be6e704b76c6c0165167ca3 Mon Sep 17 00:00:00 2001 From: iterativ Date: Wed, 11 Dec 2024 10:15:04 +0200 Subject: [PATCH 3/7] X5: add global protection rule (Long). --- NostalgiaForInfinityX5.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/NostalgiaForInfinityX5.py b/NostalgiaForInfinityX5.py index 09fb076448..3a96a6f2d6 100644 --- a/NostalgiaForInfinityX5.py +++ b/NostalgiaForInfinityX5.py @@ -4657,6 +4657,21 @@ def populate_indicators(self, df: DataFrame, metadata: dict) -> DataFrame: | (df["RSI_14_1d"] < 35.0) | (df["ROC_9_1d"] > -40.0) ) + # 15m & 1h down move, 15m still not low enough, 1h & 4h & 1d still high + & ( + (df["RSI_3_15m"] > 15.0) + | (df["RSI_3_1h"] > 45.0) + | (df["RSI_14_15m"] < 15.0) + | (df["RSI_14_1h"] < 40.0) + | (df["CCI_20_1h"] < -0.0) + | (df["STOCHk_14_3_3_1h"] < 30.0) + | (df["RSI_14_4h"] < 50.0) + | (df["CCI_20_4h"] < -0.0) + | (df["STOCHk_14_3_3_4h"] < 30.0) + | (df["RSI_14_1d"] < 50.0) + | (df["AROONU_14_1d"] < 75.0) + | (df["STOCHk_14_3_3_1d"] < 50.0) + ) # 15m & 1h & 4h & 1d down move, 15m downtrend, 1h & 4h still not low enough, 1d still high & ( (df["RSI_3_15m"] > 15.0) From a95cee341c288fc1950b7607b436e68453fdd692 Mon Sep 17 00:00:00 2001 From: iterativ Date: Wed, 11 Dec 2024 11:08:48 +0200 Subject: [PATCH 4/7] X5: add global protection rule (Long). --- NostalgiaForInfinityX5.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/NostalgiaForInfinityX5.py b/NostalgiaForInfinityX5.py index 3a96a6f2d6..ce8f21cf4e 100644 --- a/NostalgiaForInfinityX5.py +++ b/NostalgiaForInfinityX5.py @@ -67,7 +67,7 @@ class NostalgiaForInfinityX5(IStrategy): INTERFACE_VERSION = 3 def version(self) -> str: - return "v15.1.271" + return "v15.1.272" stoploss = -0.99 @@ -4514,6 +4514,22 @@ def populate_indicators(self, df: DataFrame, metadata: dict) -> DataFrame: | (df["RSI_14_1d"] < 50.0) | (df["STOCHk_14_3_3_1d"] < 60.0) ) + # 15m & 1h & 4h & 1d down move, 15m & 1h & 4h still not low enough, 1d still high + & ( + (df["RSI_3_15m"] > 10.0) + | (df["RSI_3_1h"] > 25.0) + | (df["RSI_3_4h"] > 10.0) + | (df["RSI_3_1d"] > 60.0) + | (df["RSI_14_15m"] < 20.0) + | (df["CCI_20_15m"] < -350.0) + | (df["RSI_14_1h"] < 20.0) + | (df["CCI_20_1h"] < -250.0) + | (df["RSI_14_4h"] < 20.0) + | (df["CCI_20_4h"] < -200.0) + | (df["RSI_14_1d"] < 50.0) + | (df["AROONU_14_1d"] < 75.0) + | (df["STOCHk_14_3_3_1d"] < 40.0) + ) # 15m & 1h & 4h & 1d down move, 15m & 1h & 4h & 1d still not low enough & ( (df["RSI_3_15m"] > 10.0) From 36f30ee35d6fee4350ccf9af51acc313eafa1ec3 Mon Sep 17 00:00:00 2001 From: iterativ Date: Wed, 11 Dec 2024 11:57:55 +0200 Subject: [PATCH 5/7] X5: fine tune global protection rule (Long). --- NostalgiaForInfinityX5.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/NostalgiaForInfinityX5.py b/NostalgiaForInfinityX5.py index ce8f21cf4e..63976f5523 100644 --- a/NostalgiaForInfinityX5.py +++ b/NostalgiaForInfinityX5.py @@ -4496,12 +4496,11 @@ def populate_indicators(self, df: DataFrame, metadata: dict) -> DataFrame: | (df["UO_7_14_28_4h"] < 40.0) | (df["RSI_14_1d"] < 40.0) ) - # 15m & 1h & 4h & 1d down move, 15m & 1h & 4h still not low enough, 1d still high + # 15m & 1h & 4h down move, 15m & 1h & 4h still not low enough, 1d still high & ( (df["RSI_3_15m"] > 10.0) | (df["RSI_3_1h"] > 20.0) | (df["RSI_3_4h"] > 35.0) - | (df["RSI_3_1d"] > 60.0) | (df["RSI_14_15m"] < 15.0) | (df["CCI_20_15m"] < -250.0) | (df["RSI_14_1h"] < 30.0) @@ -4510,7 +4509,6 @@ def populate_indicators(self, df: DataFrame, metadata: dict) -> DataFrame: | (df["WILLR_14_4h"] < -80.0) | (df["CCI_20_4h"] < -200.0) | (df["STOCHk_14_3_3_4h"] < 20.0) - | (df["STOCHRSIk_14_14_3_3_4h"] < 20.0) | (df["RSI_14_1d"] < 50.0) | (df["STOCHk_14_3_3_1d"] < 60.0) ) From 2549825a967b24b4192f8cc1f98c83d50c604525 Mon Sep 17 00:00:00 2001 From: iterativ Date: Wed, 11 Dec 2024 12:29:12 +0200 Subject: [PATCH 6/7] Configs: increase the age filter for the volume pairlists. --- configs/pairlist-volume-binance-btc.json | 2 +- configs/pairlist-volume-binance-busd.json | 2 +- configs/pairlist-volume-binance-usdt.json | 2 +- configs/pairlist-volume-bitget-btc.json | 2 +- configs/pairlist-volume-bitget-usdt.json | 2 +- configs/pairlist-volume-bitmart-btc.json | 2 +- configs/pairlist-volume-bitmart-usdt.json | 2 +- configs/pairlist-volume-bitvavo-eur.json | 2 +- configs/pairlist-volume-bybit-btc.json | 2 +- configs/pairlist-volume-bybit-usdt.json | 2 +- configs/pairlist-volume-ftx-btc.json | 2 +- configs/pairlist-volume-ftx-usdt.json | 2 +- configs/pairlist-volume-htx-btc.json | 2 +- configs/pairlist-volume-htx-usdt.json | 2 +- configs/pairlist-volume-kucoin-btc.json | 2 +- configs/pairlist-volume-kucoin-usdt.json | 2 +- configs/pairlist-volume-mexc-btc.json | 2 +- configs/pairlist-volume-mexc-usdt.json | 2 +- configs/pairlist-volume-okx-btc.json | 2 +- configs/pairlist-volume-okx-futures.json | 2 +- configs/pairlist-volume-okx-usdt.json | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) diff --git a/configs/pairlist-volume-binance-btc.json b/configs/pairlist-volume-binance-btc.json index 9e4439542d..8851045535 100644 --- a/configs/pairlist-volume-binance-btc.json +++ b/configs/pairlist-volume-binance-btc.json @@ -7,7 +7,7 @@ "refresh_period": 1800 }, { "method": "FullTradesFilter" }, - { "method": "AgeFilter", "min_days_listed": 4 }, + { "method": "AgeFilter", "min_days_listed": 30 }, { "method": "PriceFilter", "low_price_ratio": 0.01 diff --git a/configs/pairlist-volume-binance-busd.json b/configs/pairlist-volume-binance-busd.json index 5fab8c11fe..cc1644130f 100644 --- a/configs/pairlist-volume-binance-busd.json +++ b/configs/pairlist-volume-binance-busd.json @@ -7,7 +7,7 @@ "refresh_period": 1800 }, { "method": "FullTradesFilter" }, - { "method": "AgeFilter", "min_days_listed": 4 }, + { "method": "AgeFilter", "min_days_listed": 30 }, { "method": "PriceFilter", "low_price_ratio": 0.003 diff --git a/configs/pairlist-volume-binance-usdt.json b/configs/pairlist-volume-binance-usdt.json index 25e8cfd553..626a9f010d 100644 --- a/configs/pairlist-volume-binance-usdt.json +++ b/configs/pairlist-volume-binance-usdt.json @@ -7,7 +7,7 @@ "refresh_period": 1800 }, { "method": "FullTradesFilter" }, - { "method": "AgeFilter", "min_days_listed": 4 }, + { "method": "AgeFilter", "min_days_listed": 30 }, { "method": "PriceFilter", "low_price_ratio": 0.003 diff --git a/configs/pairlist-volume-bitget-btc.json b/configs/pairlist-volume-bitget-btc.json index 450c000170..a5cc771aa8 100644 --- a/configs/pairlist-volume-bitget-btc.json +++ b/configs/pairlist-volume-bitget-btc.json @@ -7,7 +7,7 @@ "refresh_period": 1800 }, { "method": "FullTradesFilter" }, - { "method": "AgeFilter", "min_days_listed": 4 }, + { "method": "AgeFilter", "min_days_listed": 30 }, { "method": "PriceFilter", "low_price_ratio": 0.01 diff --git a/configs/pairlist-volume-bitget-usdt.json b/configs/pairlist-volume-bitget-usdt.json index 527fd4b1c0..9b3ff9bb85 100644 --- a/configs/pairlist-volume-bitget-usdt.json +++ b/configs/pairlist-volume-bitget-usdt.json @@ -7,7 +7,7 @@ "refresh_period": 1800 }, { "method": "FullTradesFilter" }, - { "method": "AgeFilter", "min_days_listed": 4 }, + { "method": "AgeFilter", "min_days_listed": 30 }, { "method": "PriceFilter", "low_price_ratio": 0.003 diff --git a/configs/pairlist-volume-bitmart-btc.json b/configs/pairlist-volume-bitmart-btc.json index 7c6dd19585..072a917b7a 100644 --- a/configs/pairlist-volume-bitmart-btc.json +++ b/configs/pairlist-volume-bitmart-btc.json @@ -7,7 +7,7 @@ "refresh_period": 1800 }, { "method": "FullTradesFilter" }, - { "method": "AgeFilter", "min_days_listed": 4 }, + { "method": "AgeFilter", "min_days_listed": 30 }, { "method": "PriceFilter", "low_price_ratio": 0.01 diff --git a/configs/pairlist-volume-bitmart-usdt.json b/configs/pairlist-volume-bitmart-usdt.json index 13dbcb6369..f3765ff3c0 100644 --- a/configs/pairlist-volume-bitmart-usdt.json +++ b/configs/pairlist-volume-bitmart-usdt.json @@ -7,7 +7,7 @@ "refresh_period": 1800 }, { "method": "FullTradesFilter" }, - { "method": "AgeFilter", "min_days_listed": 4 }, + { "method": "AgeFilter", "min_days_listed": 30 }, { "method": "PriceFilter", "low_price_ratio": 0.003 diff --git a/configs/pairlist-volume-bitvavo-eur.json b/configs/pairlist-volume-bitvavo-eur.json index 13dbcb6369..f3765ff3c0 100644 --- a/configs/pairlist-volume-bitvavo-eur.json +++ b/configs/pairlist-volume-bitvavo-eur.json @@ -7,7 +7,7 @@ "refresh_period": 1800 }, { "method": "FullTradesFilter" }, - { "method": "AgeFilter", "min_days_listed": 4 }, + { "method": "AgeFilter", "min_days_listed": 30 }, { "method": "PriceFilter", "low_price_ratio": 0.003 diff --git a/configs/pairlist-volume-bybit-btc.json b/configs/pairlist-volume-bybit-btc.json index 9e4439542d..8851045535 100644 --- a/configs/pairlist-volume-bybit-btc.json +++ b/configs/pairlist-volume-bybit-btc.json @@ -7,7 +7,7 @@ "refresh_period": 1800 }, { "method": "FullTradesFilter" }, - { "method": "AgeFilter", "min_days_listed": 4 }, + { "method": "AgeFilter", "min_days_listed": 30 }, { "method": "PriceFilter", "low_price_ratio": 0.01 diff --git a/configs/pairlist-volume-bybit-usdt.json b/configs/pairlist-volume-bybit-usdt.json index c4d78cca94..e11e7060f3 100644 --- a/configs/pairlist-volume-bybit-usdt.json +++ b/configs/pairlist-volume-bybit-usdt.json @@ -7,7 +7,7 @@ "refresh_period": 1800 }, { "method": "FullTradesFilter" }, - { "method": "AgeFilter", "min_days_listed": 4 }, + { "method": "AgeFilter", "min_days_listed": 30 }, { "method": "PriceFilter", "low_price_ratio": 0.003 diff --git a/configs/pairlist-volume-ftx-btc.json b/configs/pairlist-volume-ftx-btc.json index 92e338d9eb..d0b8dd7a5e 100644 --- a/configs/pairlist-volume-ftx-btc.json +++ b/configs/pairlist-volume-ftx-btc.json @@ -7,7 +7,7 @@ "refresh_period": 1800 }, { "method": "FullTradesFilter" }, - { "method": "AgeFilter", "min_days_listed": 4 }, + { "method": "AgeFilter", "min_days_listed": 30 }, { "method": "PriceFilter", "low_price_ratio": 0.01 diff --git a/configs/pairlist-volume-ftx-usdt.json b/configs/pairlist-volume-ftx-usdt.json index 5fab8c11fe..cc1644130f 100644 --- a/configs/pairlist-volume-ftx-usdt.json +++ b/configs/pairlist-volume-ftx-usdt.json @@ -7,7 +7,7 @@ "refresh_period": 1800 }, { "method": "FullTradesFilter" }, - { "method": "AgeFilter", "min_days_listed": 4 }, + { "method": "AgeFilter", "min_days_listed": 30 }, { "method": "PriceFilter", "low_price_ratio": 0.003 diff --git a/configs/pairlist-volume-htx-btc.json b/configs/pairlist-volume-htx-btc.json index 6559797198..3f4b8bc7a1 100644 --- a/configs/pairlist-volume-htx-btc.json +++ b/configs/pairlist-volume-htx-btc.json @@ -7,7 +7,7 @@ "refresh_period": 1800 }, { "method": "FullTradesFilter" }, - { "method": "AgeFilter", "min_days_listed": 4 }, + { "method": "AgeFilter", "min_days_listed": 30 }, { "method": "SpreadFilter", "max_spread_ratio": 0.0075 diff --git a/configs/pairlist-volume-htx-usdt.json b/configs/pairlist-volume-htx-usdt.json index 25e8cfd553..626a9f010d 100644 --- a/configs/pairlist-volume-htx-usdt.json +++ b/configs/pairlist-volume-htx-usdt.json @@ -7,7 +7,7 @@ "refresh_period": 1800 }, { "method": "FullTradesFilter" }, - { "method": "AgeFilter", "min_days_listed": 4 }, + { "method": "AgeFilter", "min_days_listed": 30 }, { "method": "PriceFilter", "low_price_ratio": 0.003 diff --git a/configs/pairlist-volume-kucoin-btc.json b/configs/pairlist-volume-kucoin-btc.json index 7c6dd19585..072a917b7a 100644 --- a/configs/pairlist-volume-kucoin-btc.json +++ b/configs/pairlist-volume-kucoin-btc.json @@ -7,7 +7,7 @@ "refresh_period": 1800 }, { "method": "FullTradesFilter" }, - { "method": "AgeFilter", "min_days_listed": 4 }, + { "method": "AgeFilter", "min_days_listed": 30 }, { "method": "PriceFilter", "low_price_ratio": 0.01 diff --git a/configs/pairlist-volume-kucoin-usdt.json b/configs/pairlist-volume-kucoin-usdt.json index 13dbcb6369..f3765ff3c0 100644 --- a/configs/pairlist-volume-kucoin-usdt.json +++ b/configs/pairlist-volume-kucoin-usdt.json @@ -7,7 +7,7 @@ "refresh_period": 1800 }, { "method": "FullTradesFilter" }, - { "method": "AgeFilter", "min_days_listed": 4 }, + { "method": "AgeFilter", "min_days_listed": 30 }, { "method": "PriceFilter", "low_price_ratio": 0.003 diff --git a/configs/pairlist-volume-mexc-btc.json b/configs/pairlist-volume-mexc-btc.json index 9e4439542d..8851045535 100644 --- a/configs/pairlist-volume-mexc-btc.json +++ b/configs/pairlist-volume-mexc-btc.json @@ -7,7 +7,7 @@ "refresh_period": 1800 }, { "method": "FullTradesFilter" }, - { "method": "AgeFilter", "min_days_listed": 4 }, + { "method": "AgeFilter", "min_days_listed": 30 }, { "method": "PriceFilter", "low_price_ratio": 0.01 diff --git a/configs/pairlist-volume-mexc-usdt.json b/configs/pairlist-volume-mexc-usdt.json index 25e8cfd553..626a9f010d 100644 --- a/configs/pairlist-volume-mexc-usdt.json +++ b/configs/pairlist-volume-mexc-usdt.json @@ -7,7 +7,7 @@ "refresh_period": 1800 }, { "method": "FullTradesFilter" }, - { "method": "AgeFilter", "min_days_listed": 4 }, + { "method": "AgeFilter", "min_days_listed": 30 }, { "method": "PriceFilter", "low_price_ratio": 0.003 diff --git a/configs/pairlist-volume-okx-btc.json b/configs/pairlist-volume-okx-btc.json index 9e4439542d..8851045535 100644 --- a/configs/pairlist-volume-okx-btc.json +++ b/configs/pairlist-volume-okx-btc.json @@ -7,7 +7,7 @@ "refresh_period": 1800 }, { "method": "FullTradesFilter" }, - { "method": "AgeFilter", "min_days_listed": 4 }, + { "method": "AgeFilter", "min_days_listed": 30 }, { "method": "PriceFilter", "low_price_ratio": 0.01 diff --git a/configs/pairlist-volume-okx-futures.json b/configs/pairlist-volume-okx-futures.json index 4f666205b9..1dd4d72475 100644 --- a/configs/pairlist-volume-okx-futures.json +++ b/configs/pairlist-volume-okx-futures.json @@ -8,7 +8,7 @@ "lookback_days": 1 }, { "method": "FullTradesFilter" }, - { "method": "AgeFilter", "min_days_listed": 4 }, + { "method": "AgeFilter", "min_days_listed": 30 }, { "method": "PriceFilter", "low_price_ratio": 0.003 diff --git a/configs/pairlist-volume-okx-usdt.json b/configs/pairlist-volume-okx-usdt.json index 25e8cfd553..626a9f010d 100644 --- a/configs/pairlist-volume-okx-usdt.json +++ b/configs/pairlist-volume-okx-usdt.json @@ -7,7 +7,7 @@ "refresh_period": 1800 }, { "method": "FullTradesFilter" }, - { "method": "AgeFilter", "min_days_listed": 4 }, + { "method": "AgeFilter", "min_days_listed": 30 }, { "method": "PriceFilter", "low_price_ratio": 0.003 From c012bd2d818e67232948a0eb5c26a2d778917535 Mon Sep 17 00:00:00 2001 From: iterativ Date: Wed, 11 Dec 2024 12:33:02 +0200 Subject: [PATCH 7/7] X5: add global protection rule (Long). --- NostalgiaForInfinityX5.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/NostalgiaForInfinityX5.py b/NostalgiaForInfinityX5.py index 63976f5523..dff3ae09c3 100644 --- a/NostalgiaForInfinityX5.py +++ b/NostalgiaForInfinityX5.py @@ -67,7 +67,7 @@ class NostalgiaForInfinityX5(IStrategy): INTERFACE_VERSION = 3 def version(self) -> str: - return "v15.1.272" + return "v15.1.273" stoploss = -0.99 @@ -3089,6 +3089,25 @@ def populate_indicators(self, df: DataFrame, metadata: dict) -> DataFrame: | (df["AROONU_14_1d"] < 75.0) | (df["STOCHRSIk_14_14_3_3_1d"] < 70.0) ) + # 15m & 1h & 4h down move, 15m & 1h still not low enough, 4h still high, 1d still high & overbought + & ( + (df["RSI_3_15m"] > 20.0) + | (df["RSI_3_1h"] > 60.0) + | (df["RSI_3_4h"] > 60.0) + | (df["RSI_14_15m"] < 30.0) + | (df["CCI_20_15m"] < -350.0) + | (df["RSI_14_1h"] < 40.0) + | (df["CCI_20_1h"] < -150.0) + | (df["STOCHk_14_3_3_1h"] < 20.0) + | (df["RSI_14_4h"] < 50.0) + | (df["CCI_20_4h"] < -100.0) + | (df["AROONU_14_4h"] < 75.0) + | (df["STOCHk_14_3_3_4h"] < 40.0) + | (df["RSI_14_1d"] < 60.0) + | (df["AROONU_14_1d"] < 75.0) + | (df["STOCHk_14_3_3_1d"] < 50.0) + | (df["ROC_9_1d"] < 20.0) + ) # 15m & 1h & 4h down move, 15m & 1h & 4h still not low enough, 1d high & overbought & ( (df["RSI_3_15m"] > 25.0)