stable/tests/strategy/strats/freqai_test_spice_rack.py
2022-09-16 01:15:19 +02:00

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