Timeframe
1h
Direction
Long Only
Stoploss
-99.0%
Trailing Stop
No
ROI
N/A
Interface Version
2
Startup Candles
N/A
Indicators
2
freqtrade/freqtrade-strategies
freqtrade/freqtrade-strategies
freqtrade/freqtrade-strategies
this is an example class, implementing a PSAR based trailing stop loss you are supposed to take the `custom_stoploss()` and `populate_indicators()` parts and adapt it to your own strategy
freqtrade/freqtrade-strategies
# pragma pylint: disable=missing-docstring, invalid-name, pointless-string-statement
# flake8: noqa: F401
# --- Do not remove these libs ---
import numpy as np # noqa
import pandas as pd # noqa
from pandas import DataFrame
from freqtrade.strategy import IStrategy
from freqtrade.strategy import CategoricalParameter, DecimalParameter, IntParameter
# --------------------------------
# Add your lib to import here
import talib.abstract as ta
import freqtrade.vendor.qtpylib.indicators as qtpylib
import math
#---------------------------------------------------------
# https://www.tradingview.com/script/gf21APTn-HULLTSIBOT/
#
#---------------------------------------------------------
# created by viksal1982
# discord: https://discord.gg/MA9v74M
#---------------------------------------------------------
def hma(dataframe, source, length):
return ta.WMA(
2 * ta.WMA(dataframe[source], int(math.floor(length/2))) - ta.WMA(dataframe[source], length), int(round(np.sqrt(length)))
)
def double_smooth(dataframe, price, long, short):
dft = dataframe.copy()
dft['fist_smooth'] = hma(dataframe, source = price, length = long)
return hma(dft, source = 'fist_smooth', length = short)
class TSIHULLBOT(IStrategy):
# Buy hyperspace params:
buy_params = {
"long_buy": 61,
"price_buy": "close",
"short_buy": 38,
"signal_buy": 46,
}
# Sell hyperspace params:
sell_params = {
"long_sell": 80,
"price_sell": "open",
"short_sell": 29,
"signal_sell": 74,
}
#buy params
long_buy = IntParameter(45, 55, default= int(buy_params['long_buy']), space='buy')
short_buy = IntParameter(45, 55, default=int(buy_params['short_buy']), space='buy')
signal_buy = IntParameter(1, 10, default=int(buy_params['signal_buy']), space='buy')
price_buy = CategoricalParameter(['open', 'close'], default=str(buy_params['price_buy']), space='buy')
### sell params
long_sell = IntParameter(45, 55, default=int(sell_params['long_sell']), space='sell')
short_sell = IntParameter(45, 55, default=int(sell_params['short_sell']), space='sell')
signal_sell = IntParameter(1, 10, default=int(sell_params['signal_sell']), space='sell')
price_sell = CategoricalParameter(['open', 'close'], default=str(sell_params['price_sell']), space='sell')
INTERFACE_VERSION = 2
stoploss = -0.99
trailing_stop = False
timeframe = '1h'
process_only_new_candles = False
# These values can be overridden in the "ask_strategy" section in the config.
use_sell_signal = True
sell_profit_only = False
ignore_roi_if_buy_signal = False
# Number of candles the strategy requires before producing valid signals
startup_candle_count: int = 30
# Optional order type mapping.
order_types = {
'buy': 'limit',
'sell': 'limit',
'stoploss': 'market',
'stoploss_on_exchange': False
}
# Optional order time in force.
order_time_in_force = {
'buy': 'gtc',
'sell': 'gtc'
}
def informative_pairs(self):
return []
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
#buy indicators
dataframe['pc_buy'] = dataframe[self.price_buy.value].diff()
dataframe['pc_abs_buy'] = dataframe['pc_buy'].abs()
dataframe['double_smoothed_pc_buy'] = double_smooth(dataframe, 'pc_buy', self.long_buy.value, self.short_buy.value)
dataframe['double_smoothed_abs_pc_buy'] = double_smooth(dataframe, 'pc_abs_buy', self.long_buy.value, self.short_buy.value)
dataframe['tsi_value_buy'] = ( 100 * (dataframe['double_smoothed_pc_buy']/dataframe['double_smoothed_abs_pc_buy'] )) * 5
dataframe['tsihmaline_buy'] = hma(dataframe, source = 'tsi_value_buy', length = self.signal_buy.value) * 5
#sell indicators
dataframe['pc_sell'] = dataframe[self.price_sell.value].diff()
dataframe['pc_abs_sell'] = dataframe['pc_sell'].abs()
dataframe['double_smoothed_pc_sell'] = double_smooth(dataframe, 'pc_sell', self.long_sell.value, self.short_sell.value)
dataframe['double_smoothed_abs_pc_sell'] = double_smooth(dataframe, 'pc_abs_sell', self.long_sell.value, self.short_sell.value)
dataframe['tsi_value_sell'] = ( 100 * (dataframe['double_smoothed_pc_sell']/dataframe['double_smoothed_abs_pc_sell'] )) * 5
dataframe['tsihmaline_sell'] = hma(dataframe, source = 'tsi_value_sell', length = self.signal_sell.value) * 5
return dataframe
def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[
(
(dataframe['tsihmaline_buy'] > dataframe['tsihmaline_buy'].shift(1)) &
(dataframe[self.price_buy.value] > dataframe[self.price_buy.value].shift(1)) &
(dataframe['volume'] > 0) # Make sure Volume is not 0
),
'buy'] = 1
return dataframe
def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[
(
(dataframe['tsihmaline_sell'] < dataframe['tsihmaline_sell'].shift(1)) &
(dataframe[self.price_sell.value] < dataframe[self.price_sell.value].shift(1)) &
(dataframe['volume'] > 0) # Make sure Volume is not 0
),
'sell'] = 1
return dataframe