""" SOL5mStrategyV7 - 趋势跟随仅做空策略 基于V5分析: - 做空 +7.42%(盈利) - 做多 -13.63%(亏损) - 市场整体下跌 -33.15%,做空顺势 改进: - 只做空,不做多 - 去掉trend_reversal退出 - 更宽松的做空入场条件(ADX > 15,降低门槛) """ from datetime import datetime from typing import Optional import talib.abstract as ta from pandas import DataFrame from freqtrade.persistence import Trade from freqtrade.strategy import IStrategy class SOL5mStrategyV7(IStrategy): INTERFACE_VERSION: int = 3 timeframe = "15m" can_short = True startup_candle_count: int = 200 stoploss = -0.025 use_custom_stoploss = False trailing_stop = True trailing_stop_positive = 0.006 trailing_stop_positive_offset = 0.015 trailing_only_offset_is_reached = True minimal_roi = { "0": 0.05, "60": 0.035, "180": 0.02, "360": 0.01, "720": 0.005, "1440": 0, } order_types = { "entry": "market", "exit": "market", "stoploss": "market", "stoploss_on_exchange": False, } def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe["ema20"] = ta.EMA(dataframe, timeperiod=20) dataframe["ema50"] = ta.EMA(dataframe, timeperiod=50) dataframe["ema100"] = ta.EMA(dataframe, timeperiod=100) dataframe["rsi"] = ta.RSI(dataframe, timeperiod=14) macd = ta.MACD(dataframe, fastperiod=12, slowperiod=26, signalperiod=9) dataframe["macd"] = macd["macd"] dataframe["macdsignal"] = macd["macdsignal"] dataframe["macdhist"] = macd["macdhist"] dataframe["adx"] = ta.ADX(dataframe, timeperiod=14) return dataframe def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: # 只做空 - 下降趋势回调入场 dataframe.loc[ (dataframe["ema20"] < dataframe["ema50"]) & (dataframe["ema50"] < dataframe["ema100"]) & (dataframe["close"] >= dataframe["ema20"] * 0.995) & (dataframe["close"] <= dataframe["ema50"]) & (dataframe["rsi"] < 60) & (dataframe["rsi"] > 35) & (dataframe["macdhist"] < 0) & (dataframe["adx"] > 15), # 更宽松的ADX门槛 ["enter_short", "enter_tag"], ] = (1, "trend_pullback_short") return dataframe def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: # 不使用信号退出 return dataframe 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: return 1.0