Detail of dry-runs

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
    },
}

5 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *