from freqtrade.strategy.interface import IStrategy
from pandas import DataFrame
from datetime import datetime
from typing import Optional
class LeverageStrategy(IStrategy):
timeframe = '5m'
leverage = 3 # 默认杠杆(用于回测)
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
"""
计算指标:添加20周期简单移动均线(ma20)
"""
dataframe['ma20'] = dataframe['close'].rolling(20).mean()
return dataframe
def populate_entry_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
"""
入场信号:当当前收盘价高于ma20时,标记为多头进场信号
"""
df['enter_long'] = df['close'] > df['ma20']
return df
def populate_exit_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
"""
出场信号:当当前收盘价低于ma20时,标记为多头退出信号
"""
df['exit_long'] = df['close'] < df['ma20']
return df
def leverage(self, pair: str, current_time: datetime, current_rate: float,
proposed_leverage: float, max_leverage: float, entry_tag: Optional[str],
side: str, **kwargs) -> float:
"""
根据当前价格与ma20均线的关系动态调整杠杆倍数
逻辑:
1. 获取分析过的数据框,读取最新的ma20均线值
2. 计算当前价格与ma20的比值 ratio
3. 若ratio大于1.02,认为趋势强劲,使用较高杠杆(最高不超过max_leverage,最高5倍)
4. 若ratio低于0.98,认为趋势弱,保守使用1倍杠杆
5. 否则使用中间杠杆2倍
返回:
- 调整后的杠杆倍数(浮点数)
"""
df = self.dp.get_analyzed_dataframe(pair, self.timeframe)[0]
ma = df['ma20'].iloc[-1]
ratio = current_rate / ma
if ratio > 1.02:
return min(5.0, max_leverage)
elif ratio < 0.98:
return 1.0
else:
return 2.0