Introduces the possibility of hyperoptimizing parameters
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
"""
|
||||
Supertrend strategy:
|
||||
* Description: Generate a 3 supertrend indicators based on different pairs for [period, multiplier] -> [period: 10, multiplier: 1], [period: 11, multiplier: 2], [period: 13, multiplier: 3]
|
||||
Buys if the 3 indicators are 'up'
|
||||
Sells if the 3 indicators are 'down'
|
||||
* Description: Generate a 3 supertrend indicators for 'buy' strategies & 3 supertrend indicators for 'sell' strategies
|
||||
Buys if the 3 'buy' indicators are 'up'
|
||||
Sells if the 3 'sell' indicators are 'down'
|
||||
* Author: @juankysoriano (Juan Carlos Soriano)
|
||||
* github: https://github.com/juankysoriano/
|
||||
"""
|
||||
@@ -16,9 +16,29 @@ import talib.abstract as ta
|
||||
import numpy as np
|
||||
|
||||
class Supertrend(IStrategy):
|
||||
# ROI, Stoploss and Trailing Stop are values generated by 'freqtrade hyperopt --strategy Supertrend --hyperopt-loss ShortTradeDurHyperOptLoss --timerange=20210101- --timeframe=1h --spaces roi stoploss trailing'
|
||||
# Buy params, Sell params, ROI, Stoploss and Trailing Stop are values generated by 'freqtrade hyperopt --strategy Supertrend --hyperopt-loss ShortTradeDurHyperOptLoss --timerange=20210101- --timeframe=1h --spaces all'
|
||||
# It's encourage you find the values that better suites your needs and risk management strategies
|
||||
|
||||
# Buy hyperspace params:
|
||||
buy_params = {
|
||||
"buy_m1": 4,
|
||||
"buy_m2": 7,
|
||||
"buy_m3": 1,
|
||||
"buy_p1": 8,
|
||||
"buy_p2": 9,
|
||||
"buy_p3": 8,
|
||||
}
|
||||
|
||||
# Sell hyperspace params:
|
||||
sell_params = {
|
||||
"sell_m1": 1,
|
||||
"sell_m2": 3,
|
||||
"sell_m3": 6,
|
||||
"sell_p1": 16,
|
||||
"sell_p2": 18,
|
||||
"sell_p3": 18,
|
||||
}
|
||||
|
||||
# ROI table:
|
||||
minimal_roi = {
|
||||
"0": 0.087,
|
||||
@@ -38,23 +58,57 @@ class Supertrend(IStrategy):
|
||||
|
||||
timeframe = '1h'
|
||||
|
||||
startup_candle_count = 10
|
||||
startup_candle_count = 18
|
||||
|
||||
buy_m1 = IntParameter(1, 7, default=4)
|
||||
buy_m2 = IntParameter(1, 7, default=4)
|
||||
buy_m3 = IntParameter(1, 7, default=4)
|
||||
buy_p1 = IntParameter(7, 21, default=14)
|
||||
buy_p2 = IntParameter(7, 21, default=14)
|
||||
buy_p3 = IntParameter(7, 21, default=14)
|
||||
|
||||
sell_m1 = IntParameter(1, 7, default=4)
|
||||
sell_m2 = IntParameter(1, 7, default=4)
|
||||
sell_m3 = IntParameter(1, 7, default=4)
|
||||
sell_p1 = IntParameter(7, 21, default=14)
|
||||
sell_p2 = IntParameter(7, 21, default=14)
|
||||
sell_p3 = IntParameter(7, 21, default=14)
|
||||
|
||||
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||
dataframe['supertrend_1'] = self.supertrend(dataframe, 1, 10)['STX']
|
||||
dataframe['supertrend_2'] = self.supertrend(dataframe, 2, 11)['STX']
|
||||
dataframe['supertrend_3'] = self.supertrend(dataframe, 3, 12)['STX']
|
||||
for multiplier in self.buy_m1.range:
|
||||
for period in self.buy_p1.range:
|
||||
dataframe[f'supertrend_1_buy_{multiplier}_{period}'] = self.supertrend(dataframe, multiplier, period)['STX']
|
||||
|
||||
for multiplier in self.buy_m2.range:
|
||||
for period in self.buy_p2.range:
|
||||
dataframe[f'supertrend_2_buy_{multiplier}_{period}'] = self.supertrend(dataframe, multiplier, period)['STX']
|
||||
|
||||
for multiplier in self.buy_m3.range:
|
||||
for period in self.buy_p3.range:
|
||||
dataframe[f'supertrend_3_buy_{multiplier}_{period}'] = self.supertrend(dataframe, multiplier, period)['STX']
|
||||
|
||||
for multiplier in self.sell_m1.range:
|
||||
for period in self.sell_p1.range:
|
||||
dataframe[f'supertrend_1_sell_{multiplier}_{period}'] = self.supertrend(dataframe, multiplier, period)['STX']
|
||||
|
||||
for multiplier in self.sell_m2.range:
|
||||
for period in self.sell_p2.range:
|
||||
dataframe[f'supertrend_2_sell_{multiplier}_{period}'] = self.supertrend(dataframe, multiplier, period)['STX']
|
||||
|
||||
for multiplier in self.sell_m3.range:
|
||||
for period in self.sell_p3.range:
|
||||
dataframe[f'supertrend_3_sell_{multiplier}_{period}'] = self.supertrend(dataframe, multiplier, period)['STX']
|
||||
|
||||
return dataframe
|
||||
|
||||
def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||
dataframe.loc[
|
||||
(
|
||||
(dataframe['supertrend_1'] == 'up') &
|
||||
(dataframe['supertrend_2'] == 'up') &
|
||||
(dataframe['supertrend_3'] == 'up') & # The three indicators are 'up' for the current candle
|
||||
(dataframe[f'supertrend_1_buy_{self.buy_m1.value}_{self.buy_p1.value}'] == 'up') &
|
||||
(dataframe[f'supertrend_2_buy_{self.buy_m2.value}_{self.buy_p2.value}'] == 'up') &
|
||||
(dataframe[f'supertrend_3_buy_{self.buy_m3.value}_{self.buy_p3.value}'] == 'up') & # The three indicators are 'up' for the current candle
|
||||
(dataframe['volume'] > 0) # There is at least some trading volume
|
||||
),
|
||||
),
|
||||
'buy'] = 1
|
||||
|
||||
return dataframe
|
||||
@@ -62,9 +116,9 @@ class Supertrend(IStrategy):
|
||||
def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||
dataframe.loc[
|
||||
(
|
||||
(dataframe['supertrend_1'] == 'down') &
|
||||
(dataframe['supertrend_2'] == 'down') &
|
||||
(dataframe['supertrend_3'] == 'down') & # The three indicators are 'down' for the current candle
|
||||
(dataframe[f'supertrend_1_sell_{self.sell_m1.value}_{self.sell_p1.value}'] == 'down') &
|
||||
(dataframe[f'supertrend_2_sell_{self.sell_m2.value}_{self.sell_p2.value}'] == 'down') &
|
||||
(dataframe[f'supertrend_3_sell_{self.sell_m3.value}_{self.sell_p3.value}'] == 'down') & # The three indicators are 'down' for the current candle
|
||||
(dataframe['volume'] > 0) # There is at least some trading volume
|
||||
),
|
||||
'sell'] = 1
|
||||
@@ -72,6 +126,7 @@ class Supertrend(IStrategy):
|
||||
return dataframe
|
||||
|
||||
|
||||
|
||||
"""
|
||||
Supertrend Indicator; adapted for freqtrade
|
||||
from: https://github.com/freqtrade/freqtrade-strategies/issues/30
|
||||
|
||||
Reference in New Issue
Block a user