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
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
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 […]