The dry-runs can be seen here. The strategies might be changed without further notice, so do check the page regularly to see whether there is any addition or removal of strategies. Below are details of public strategies that I wish to share.
Disclaimers
- I don’t endorse/promote any of the strategies that are being dry-run.
- Don’t look at short-term performances. Wait for at least 6 months before judging the performances.
- Do your own check and test before using any of them. Different config, different exchange, different pairlist, and even just by being a different instance of bot can give you different result compared to the dry bot.
- Past is never future. Always do proper risk management despite any past success.
E0V1E
The original creator is E0V1E, but it has been updated since last time I downloaded the file. The version I’m using is older version, which can be seen below. I don’t hyperopt it. I’m using it as is.
from datetime import datetime, timedelta
import talib.abstract as ta
import pandas_ta as pta
from freqtrade.persistence import Trade
from freqtrade.strategy.interface import IStrategy
from pandas import DataFrame
from freqtrade.strategy import DecimalParameter, IntParameter
from functools import reduce
TMP_HOLD = []
class E0V1E(IStrategy):
minimal_roi = {
"0": 10
}
timeframe = '5m'
process_only_new_candles = True
startup_candle_count = 120
order_types = {
'entry': 'market',
'exit': 'market',
'emergency_exit': 'market',
'force_entry': 'market',
'force_exit': "market",
'stoploss': 'market',
'stoploss_on_exchange': False,
'stoploss_on_exchange_interval': 60,
'stoploss_on_exchange_market_ratio': 0.99
}
stoploss = -0.18
is_optimize_32 = False
buy_rsi_fast_32 = IntParameter(20, 70, default=45, space='buy', optimize=is_optimize_32)
buy_rsi_32 = IntParameter(15, 50, default=35, space='buy', optimize=is_optimize_32)
buy_sma15_32 = DecimalParameter(0.900, 1, default=0.961, decimals=3, space='buy', optimize=is_optimize_32)
buy_cti_32 = DecimalParameter(-1, 0, default=-0.58, decimals=2, space='buy', optimize=is_optimize_32)
sell_fastx = IntParameter(50, 100, default=75, space='sell', optimize=True)
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# buy_1 indicators
dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15)
dataframe['cti'] = pta.cti(dataframe["close"], length=20)
dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4)
dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20)
# profit sell indicators
stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0)
dataframe['fastk'] = stoch_fast['fastk']
return dataframe
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
conditions = []
dataframe.loc[:, 'enter_tag'] = ''
buy_1 = (
(dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) &
(dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) &
(dataframe['rsi'] > self.buy_rsi_32.value) &
(dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) &
(dataframe['cti'] < self.buy_cti_32.value)
)
conditions.append(buy_1)
dataframe.loc[buy_1, 'enter_tag'] += 'buy_1'
if conditions:
dataframe.loc[
reduce(lambda x, y: x | y, conditions),
'enter_long'] = 1
return dataframe
def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float,
current_profit: float, **kwargs):
dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe)
current_candle = dataframe.iloc[-1].squeeze()
if current_time - timedelta(hours=3) > trade.open_date_utc:
if (current_candle["fastk"] >= 70) and (current_profit >= 0):
return "fastk_profit_sell_delay"
if current_profit > 0:
if current_candle["fastk"] > self.sell_fastx.value:
return "fastk_profit_sell"
if current_profit <= -0.1:
# tmp hold
if trade.id not in TMP_HOLD:
TMP_HOLD.append(trade.id)
for i in TMP_HOLD:
# start recover sell it
if trade.id == i and current_profit > -0.1:
if current_candle["fastk"] > self.sell_fastx.value:
TMP_HOLD.remove(i)
return "fastk_loss_sell"
return None
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[(), ['exit_long', 'exit_tag']] = (0, 'long_out')
return dataframe
E0V1E with TSL basically above code with addition of this extra snippet to make the exits into TSL.
The config is (I only wrote things that I change from default)
{
"max_open_trades": 4,
"stake_currency": "USDT",
"stake_amount" : "unlimited",
"available_capital": 70,
"dry_run": true,
"dry_run_wallet": 70,
"pairlists": [
{
"method": "VolumePairList",
"number_assets": 50,
"sort_key": "quoteVolume",
},
{"method": "AgeFilter", "min_days_listed": 30},
],
"trading_mode": "spot",
"ignore_buying_expired_candle_after": 120,
"unfilledtimeout": {
"entry": 2,
"exit": 1,
"unit": "minutes"
},
"order_types": {
"entry": "limit",
"exit": "market",
"emergency_exit": "market",
"force_exit": "market",
"force_entry": "market",
"stoploss": "market",
"stoploss_on_exchange": false,
"stoploss_on_exchange_interval": 60
},
"entry_pricing": {
"price_side": "other",
"use_order_book": true,
"order_book_top": 1,
"price_last_balance": 0.0,
"check_depth_of_market": {
"enabled": false,
"bids_to_ask_delta": 1
}
},
"exit_pricing": {
"price_side": "other",
"use_order_book": true,
"order_book_top": 1
},
}
[…] Detail of dry runs […]
http://ft-dashboard.ddns.net/ isnt loading :/
yeah, the server was down. It’s back online now
Hello, what version of freqtrade are you using? with the last one, the strategy is in error
what is the error message? It should be able to run on any FT version