60 lines
2.0 KiB
Python
60 lines
2.0 KiB
Python
from freqtrade.strategy.interface import IStrategy
|
||
from freqtrade.freqai.data_kitchen import FreqaiDataKitchen
|
||
from pandas import DataFrame
|
||
import numpy as np
|
||
import logging
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
class AIEnhancedStrategy(IStrategy):
|
||
INTERFACE_VERSION = 3
|
||
|
||
can_short = False # 只做多
|
||
timeframe = '5m'
|
||
|
||
process_only_new_candles = True
|
||
use_exit_signal = True
|
||
exit_profit_only = False
|
||
ignore_roi_if_entry_signal = False
|
||
|
||
def feature_engineering_expand_all(self, dataframe: DataFrame, period: int,
|
||
metadata: dict, **kwargs) -> DataFrame:
|
||
# 自定义特征工程
|
||
for col in ['open', 'high', 'low', 'close', 'volume']:
|
||
dataframe[f'{col}_pct_change'] = dataframe[col].pct_change(periods=period)
|
||
return dataframe
|
||
|
||
def set_freqai_targets(self, dataframe: DataFrame, metadata: dict, **kwargs) -> DataFrame:
|
||
# 目标变量:未来n根K线的收盘价变化
|
||
dataframe['&s-close_pct'] = dataframe['close'].pct_change(periods=5).shift(-5)
|
||
return dataframe
|
||
|
||
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||
dk = self.freqai_info.get("dk", None)
|
||
if not dk:
|
||
raise ValueError("FreqaiDataKitchen is not available.")
|
||
|
||
dataframe = dk.feature_engineering_standard(dataframe, metadata, self)
|
||
|
||
if self.config["runmode"].value in ("live", "dry_run"):
|
||
dataframe = dk.live_models(self, dataframe, metadata=metadata)
|
||
|
||
return dataframe
|
||
|
||
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||
# 预测值大于阈值时开多仓
|
||
dataframe.loc[
|
||
(dataframe["&s-close_pct"] > 0.002),
|
||
"enter_long"
|
||
] = 1
|
||
return dataframe
|
||
|
||
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||
# 预测值小于负阈值时平仓
|
||
dataframe.loc[
|
||
(dataframe["&s-close_pct"] < -0.001),
|
||
"exit_long"
|
||
] = 1
|
||
return dataframe
|
||
|