65 lines
1.9 KiB
Python
65 lines
1.9 KiB
Python
from freqtrade.strategy import IStrategy, CategoricalParameter, DecimalParameter, IntParameter
|
|
import pandas as pd
|
|
import numpy as np
|
|
import talib.abstract as ta
|
|
|
|
|
|
class MyHyperoptStrategy(IStrategy):
|
|
INTERFACE_VERSION = 3
|
|
|
|
# Buy hyperspace params:
|
|
buy_params = {
|
|
"ema_short_period": 10,
|
|
"ema_long_period": 50,
|
|
}
|
|
|
|
# Sell hyperspace params:
|
|
sell_params = {
|
|
"rsi_high": 70,
|
|
}
|
|
|
|
ema_short_period = IntParameter(5, 20, default=10, space="buy", optimize=True)
|
|
ema_long_period = IntParameter(40, 100, default=50, space="buy", optimize=True)
|
|
|
|
rsi_high = IntParameter(60, 85, default=70, space="sell", optimize=True)
|
|
|
|
# Minimal ROI designed for the strategy
|
|
minimal_roi = {
|
|
"0": 0.1
|
|
}
|
|
|
|
# Optimal stoploss designed for the strategy
|
|
stoploss = -0.10
|
|
|
|
# Trailing stop
|
|
trailing_stop = False
|
|
|
|
def populate_indicators(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame:
|
|
# Ensure only the 'close' column is passed to RSI
|
|
dataframe['rsi'] = ta.RSI(dataframe['close'], timeperiod=14)
|
|
|
|
dataframe['ema_short'] = dataframe['close'].ewm(span=self.ema_short_period.value, adjust=False).mean()
|
|
dataframe['ema_long'] = dataframe['close'].ewm(span=self.ema_long_period.value, adjust=False).mean()
|
|
|
|
return dataframe
|
|
|
|
def populate_entry_trend(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame:
|
|
dataframe.loc[
|
|
(
|
|
(dataframe['ema_short'] > dataframe['ema_long']) &
|
|
(dataframe['rsi'] < 30)
|
|
),
|
|
'enter_long'
|
|
] = 1
|
|
return dataframe
|
|
|
|
def populate_exit_trend(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame:
|
|
dataframe.loc[
|
|
(
|
|
(dataframe['ema_short'] < dataframe['ema_long']) &
|
|
(dataframe['rsi'] > self.rsi_high.value)
|
|
),
|
|
'exit_long'
|
|
] = 1
|
|
return dataframe
|