NexusRegimeAlpha - Adaptive Crypto Breakout Strategy Architecture: 1. Regime Detection (ADX + SMA) 2. Alpha Generation (Keltner Channel Breakout) 3. Dynamic Risk (ATR-based trailing stop)
Timeframe
1h
Direction
Long Only
Stoploss
-99.0%
Trailing Stop
No
ROI
N/A
Interface Version
3
Startup Candles
N/A
Indicators
5
# pragma pylint: disable=missing-docstring, invalid-name, pointless-string-statement
import numpy as np
import pandas as pd
import talib.abstract as ta
from freqtrade.strategy import IStrategy, IntParameter, DecimalParameter
from pandas import DataFrame
class NexusRegimeAlpha(IStrategy):
"""
NexusRegimeAlpha - Adaptive Crypto Breakout Strategy
Architecture:
1. Regime Detection (ADX + SMA)
2. Alpha Generation (Keltner Channel Breakout)
3. Dynamic Risk (ATR-based trailing stop)
"""
INTERFACE_VERSION = 3
# تعریف تایمفریم بهینه برای کریپتو (معمولا ۱ ساعته یا ۴ ساعته برای روندهای اصلی)
timeframe = '1h'
startup_candle_count: int = 200
# پارامترهای قابل بهینهسازی (Hyperoptable)
buy_adx = IntParameter(20, 50, default=25, space="buy")
kc_window = IntParameter(10, 40, default=20, space="buy")
kc_mult = DecimalParameter(1.0, 3.0, default=1.5, space="buy")
atr_sl_mult = DecimalParameter(1.5, 4.0, default=2.5, space="sell")
# خاموش کردن حد ضرر و سود ثابت برای استفاده از مکانیزم پویای استراتژی
stoploss = -0.99
roi = {"0": 100}
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# 1. Volatility (ATR)
dataframe['atr'] = ta.ATR(dataframe, timeperiod=14)
# 2. Market Regime Filters (Trend Direction & Strength)
dataframe['sma_200'] = ta.SMA(dataframe, timeperiod=200)
dataframe['adx'] = ta.ADX(dataframe, timeperiod=14)
# 3. Keltner Channels (Alpha Generator)
dataframe['kc_middle'] = ta.EMA(dataframe, timeperiod=self.kc_window.value)
dataframe['kc_upper'] = dataframe['kc_middle'] + (dataframe['atr'] * self.kc_mult.value)
dataframe['kc_lower'] = dataframe['kc_middle'] - (dataframe['atr'] * self.kc_mult.value)
# 4. Trailing Stop Baseline (Chandelier Exit Logic)
dataframe['highest_high'] = dataframe['high'].rolling(window=22).max()
dataframe['chandelier_sl'] = dataframe['highest_high'] - (dataframe['atr'] * self.atr_sl_mult.value)
return dataframe
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
conditions = []
# شرط رژیم: قیمت بالای میانگین بلندمدت و وجود قدرت روند
regime_bullish = (
(dataframe['close'] > dataframe['sma_200']) &
(dataframe['adx'] > self.buy_adx.value)
)
# شرط تریگر: بسته شدن قیمت بالاتر از باند فوقانی کلتنر
trigger_breakout = (
(dataframe['close'] > dataframe['kc_upper']) &
(dataframe['volume'] > 0)
)
conditions.append(regime_bullish)
conditions.append(trigger_breakout)
if conditions:
dataframe.loc[
reduce(lambda x, y: x & y, conditions),
'enter_long'
] = 1
return dataframe
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# خروجهای پایه (معمولا مدیریت خروج پویا را در متد custom_stoploss مینویسند،
# اما برای سیگنال خروج صریح میتوان بازگشت به میانگین را لحاظ کرد)
conditions = []
trigger_mean_reversion = (
(dataframe['close'] < dataframe['kc_middle'])
)
conditions.append(trigger_mean_reversion)
if conditions:
dataframe.loc[
reduce(lambda x, y: x & y, conditions),
'exit_long'
] = 1
return dataframe
def custom_stoploss(self, pair: str, trade: 'Trade', current_time: 'datetime',
current_rate: float, current_profit: float, **kwargs) -> float:
"""
مدیریت ریسک پویا:
محاسبه فاصله قیمت فعلی تا خط Chandelier به عنوان حد ضرر شناور.
"""
dataframe, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe)
last_candle = dataframe.iloc[-1].squeeze()
# محاسبه درصد افت مجاز از قیمت فعلی تا خط حد ضرر
if last_candle['chandelier_sl'] > 0 and current_rate > last_candle['chandelier_sl']:
sl_rate = last_candle['chandelier_sl']
return (current_rate - sl_rate) / current_rate
return 0.15 # حد ضرر پیشفرض سختگیرانه (Hard Fallback)