Adaptive High Risk Strategy for High Returns
Timeframe
1m
Direction
Long Only
Stoploss
-1.5%
Trailing Stop
Yes
ROI
0m: 1.0%, 30m: 0.8%, 60m: 0.5%, 120m: 0.3%
Interface Version
N/A
Startup Candles
200
Indicators
5
freqtrade/freqtrade-strategies
Strategy 003 author@: Gerald Lonlas github@: https://github.com/freqtrade/freqtrade-strategies
from freqtrade.strategy import IStrategy
from pandas import DataFrame
import pandas as pd
import talib.abstract as ta
import numpy as np
from datetime import datetime
from sklearn.ensemble import RandomForestClassifier
import joblib
import os
class AdaptiveHighRiskStrategy(IStrategy):
"""
Adaptive High Risk Strategy for High Returns
Features:
- Market regime detection (trending vs ranging)
- Dynamic leverage adjustment (20x-50x)
- Multiple entry/exit strategies
- Risk management with high drawdown tolerance
"""
timeframe = '1m'
max_open_trades = 3
stake_amount = 100
startup_candle_count = 200
minimal_roi = {
"0": 0.01,
"30": 0.008,
"60": 0.005,
"120": 0.003
}
stoploss = -0.015
trailing_stop = True
trailing_stop_positive = 0.03
trailing_stop_positive_offset = 0.04
trailing_only_offset_is_reached = True
order_types = {
'entry': 'market',
'exit': 'market',
'stoploss': 'market',
'stoploss_on_exchange': False
}
unfilledtimeout = {
'entry': 30,
'exit': 30,
'unit': 'seconds'
}
leverage_config = {
'BTC/USDT:USDT': 5.0,
'ETH/USDT:USDT': 4.0,
'SOL/USDT:USDT': 3.0,
'XRP/USDT:USDT': 2.0,
'DOGE/USDT:USDT': 2.0
}
def informative_pairs(self) -> list:
return []
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
df = dataframe.copy()
# Core indicators for winter market
df['ema_9'] = ta.EMA(df['close'].values, timeperiod=9)
df['ema_21'] = ta.EMA(df['close'].values, timeperiod=21)
df['ema_50'] = ta.EMA(df['close'].values, timeperiod=50)
df['rsi'] = ta.RSI(df['close'].values, timeperiod=14)
df['volume_sma'] = ta.SMA(df['volume'].values, timeperiod=20)
df['volume_ratio'] = df['volume'] / df['volume_sma']
# Momentum indicators
df['momentum'] = df['close'] / df['close'].shift(3) - 1
# Market regime detection (simplified)
df['returns'] = df['close'].pct_change()
df['volatility'] = df['returns'].rolling(20).std()
df['trend_strength'] = abs(df['ema_9'] - df['ema_21']) / df['close']
# Very lenient regime detection for current market
# Allow trading in any regime with basic trend
df['regime'] = np.where(df['trend_strength'] > 0.005, 2, # Very low threshold for trending
np.where(df['volatility'] > df['volatility'].rolling(50).mean() * 1.1, 1, 0)) # Volatile, Ranging
# MACD for timing
macd, macdsignal, macdhist = ta.MACD(df['close'].values)
df['macd'] = macd
df['macd_signal'] = macdsignal
df['macd_hist'] = macdhist
# Bollinger Bands
df['bb_upper'], df['bb_middle'], df['bb_lower'] = ta.BBANDS(df['close'].values)
df['bb_position'] = (df['close'] - df['bb_lower']) / (df['bb_upper'] - df['bb_lower'])
return df
def leverage(self, pair: str, current_time: datetime, current_rate: float,
current_profit: float = 0.0, min_stops: float = 0.0,
max_stops: float = 0.0, current_time_rows: DataFrame = None,
**kwargs) -> float:
base_leverage = self.leverage_config.get(pair, 25.0)
# Adjust based on current profit (only available after position is open)
if current_profit > 0.05:
base_leverage *= 1.1 # Increase leverage when winning
elif current_profit < -0.05:
base_leverage *= 0.9 # Decrease when losing
return min(base_leverage, 50.0) # Cap at 50x
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
df = dataframe.copy()
df['enter_long'] = 0
if len(df) < self.startup_candle_count:
return df
# Different strategies for different market regimes
regime = df['regime']
# Strategy 1: Trending market (conservative winter entries)
trending_condition = (
(regime == 2) & # Only trending regime for winter
(df['ema_9'] > df['ema_21']) & # Clear uptrend
(df['ema_21'] > df['ema_50']) & # Strong uptrend confirmation
(df['rsi'] > 50) & (df['rsi'] < 75) & # RSI in optimal range
(df['macd'] > df['macd_signal']) & # MACD bullish
(df['volume_ratio'] > 1.5) & # Good volume confirmation
(df['trend_strength'] > 0.01) & # Decent trend strength
(df['momentum'] > 0.005) # Positive momentum
)
# Strategy 2: High volatility market (mean reversion entries)
volatile_condition = (
(regime == 1) & # High volatility regime
(df['bb_position'] < 0.2) & # Price near lower BB
(df['rsi'] < 35) & # Oversold
(df['volume_ratio'] > 2.0) & # High volume
(df['volatility'] > df['volatility'].shift(1)) # Increasing volatility
)
# Strategy 3: Ranging market (breakout entries)
ranging_condition = (
(regime == 0) & # Ranging regime
(df['close'] > df['bb_upper'].shift(1)) & # Break upper BB
(df['rsi'] > 70) & # RSI confirming
(df['volume_ratio'] > 1.8) & # Volume spike
(df['macd_hist'] > 0) # MACD positive
)
# Only use trending condition for quality control
# Comment out volatile and ranging for now to focus on trending
# volatile_condition = ...
# ranging_condition = ...
entry_signal = trending_condition
df.loc[entry_signal, 'enter_long'] = 1
return df
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
df = dataframe.copy()
df['exit'] = 0
# Dynamic exit conditions based on regime
regime = df['regime']
# Exit conditions vary by market type
trending_exit = (
(regime == 2) & (
(df['ema_9'] < df['ema_21']) | # Trend reversal
(df['rsi'] > 90) | # Overbought
(df['macd'] < df['macd_signal']) # MACD bearish
)
)
volatile_exit = (
(regime == 1) & (
(df['bb_position'] > 0.8) | # Near upper BB
(df['rsi'] > 75) | # RSI overbought
(df['macd'] < df['macd_signal']) # MACD bearish
)
)
ranging_exit = (
(regime == 0) & (
(df['close'] < df['bb_middle']) | # Return to middle
(df['rsi'] > 80) | # Overbought
(df['macd_hist'] < df['macd_hist'].shift(1)) # MACD weakening
)
)
exit_signal = trending_exit | volatile_exit | ranging_exit
df.loc[exit_signal, 'exit'] = 1
return df
def custom_exit(self, pair: str, current_time: datetime, current_rate: float,
current_profit: float, **kwargs) -> bool:
# Winter market profit taking - let profits run longer
if current_profit > 0.12: # Take profit at 12% (higher threshold)
return True
if current_profit > 0.25: # Take all profit at 25% (let big wins run)
return True
if current_profit < -0.025: # Stop loss at -2.5% (tighter in winter)
return True
return False