116 lines
3.6 KiB
Python
116 lines
3.6 KiB
Python
|
import logging
|
||
|
from functools import reduce
|
||
|
|
||
|
import pandas as pd
|
||
|
import talib.abstract as ta
|
||
|
from pandas import DataFrame
|
||
|
|
||
|
from freqtrade.strategy import DecimalParameter, IntParameter, IStrategy, merge_informative_pair
|
||
|
|
||
|
|
||
|
logger = logging.getLogger(__name__)
|
||
|
|
||
|
|
||
|
class freqai_test_spice_rack(IStrategy):
|
||
|
"""
|
||
|
Test strategy - used for testing freqAI functionalities.
|
||
|
DO not use in production.
|
||
|
"""
|
||
|
|
||
|
minimal_roi = {"0": 0.1, "240": -1}
|
||
|
|
||
|
plot_config = {
|
||
|
"main_plot": {},
|
||
|
"subplots": {
|
||
|
"prediction": {"prediction": {"color": "blue"}},
|
||
|
"target_roi": {
|
||
|
"target_roi": {"color": "brown"},
|
||
|
},
|
||
|
"do_predict": {
|
||
|
"do_predict": {"color": "brown"},
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
process_only_new_candles = True
|
||
|
stoploss = -0.05
|
||
|
use_exit_signal = True
|
||
|
startup_candle_count: int = 300
|
||
|
can_short = False
|
||
|
|
||
|
linear_roi_offset = DecimalParameter(
|
||
|
0.00, 0.02, default=0.005, space="sell", optimize=False, load=True
|
||
|
)
|
||
|
max_roi_time_long = IntParameter(0, 800, default=400, space="sell", optimize=False, load=True)
|
||
|
|
||
|
def informative_pairs(self):
|
||
|
whitelist_pairs = self.dp.current_whitelist()
|
||
|
corr_pairs = self.config["freqai"]["feature_parameters"]["include_corr_pairlist"]
|
||
|
informative_pairs = []
|
||
|
for tf in self.config["freqai"]["feature_parameters"]["include_timeframes"]:
|
||
|
for pair in whitelist_pairs:
|
||
|
informative_pairs.append((pair, tf))
|
||
|
for pair in corr_pairs:
|
||
|
if pair in whitelist_pairs:
|
||
|
continue # avoid duplication
|
||
|
informative_pairs.append((pair, tf))
|
||
|
return informative_pairs
|
||
|
|
||
|
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||
|
|
||
|
# Example of how to use the freqai.spice_rack. User treats it the same as any
|
||
|
# typical talib indicator. They set a new column in their dataframe
|
||
|
|
||
|
dataframe['dissimilarity_index'] = self.freqai.spice_rack(
|
||
|
'DI_values', dataframe, metadata, self)
|
||
|
dataframe['maxima'] = self.freqai.spice_rack(
|
||
|
'&s-maxima', dataframe, metadata, self)
|
||
|
dataframe['minima'] = self.freqai.spice_rack(
|
||
|
'&s-minima', dataframe, metadata, self)
|
||
|
self.freqai.close_spice_rack() # user must close the spicerack
|
||
|
|
||
|
dataframe['rsi'] = ta.RSI(dataframe)
|
||
|
|
||
|
return dataframe
|
||
|
|
||
|
def populate_entry_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
|
||
|
|
||
|
df.loc[
|
||
|
(
|
||
|
(df['tema'] > df['tema'].shift(1)) & # Guard: tema is raising
|
||
|
(df['dissimilarity_index'] < 1) &
|
||
|
(df['maxima'] > 0.1)
|
||
|
),
|
||
|
'enter_long'] = 1
|
||
|
|
||
|
df.loc[
|
||
|
(
|
||
|
(df['tema'] < df['tema'].shift(1)) & # Guard: tema is falling
|
||
|
(df['dissimilarity_index'] < 1) &
|
||
|
(df['minima'] > 0.1)
|
||
|
),
|
||
|
'enter_short'] = 1
|
||
|
|
||
|
return df
|
||
|
|
||
|
def populate_exit_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
|
||
|
|
||
|
df.loc[
|
||
|
(
|
||
|
(df['tema'] < df['tema'].shift(1)) & # Guard: tema is falling
|
||
|
(df['dissimilarity_index'] < 1) &
|
||
|
(df['maxima'] > 0.1)
|
||
|
),
|
||
|
|
||
|
'exit_long'] = 1
|
||
|
|
||
|
df.loc[
|
||
|
(
|
||
|
(df['tema'] > df['tema'].shift(1)) & # Guard: tema is raising
|
||
|
(df['dissimilarity_index'] < 1) &
|
||
|
(df['minima'] > 0.1)
|
||
|
),
|
||
|
'exit_short'] = 1
|
||
|
|
||
|
return df
|