103 lines
2.9 KiB
Python
103 lines
2.9 KiB
Python
"""
|
|
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
|