import numpy as np from functools import reduce import freqtrade.vendor.qtpylib.indicators as qtpylib import talib.abstract as ta import random from freqtrade.strategy.hyper import CategoricalParameter, DecimalParameter, IntParameter from numpy.lib import math from freqtrade.strategy.interface import IStrategy from pandas import DataFrame PAIR_LIST_LENGHT = 2 TREND_CHECK_CANDLES = 4 PAIN_RANGE = 1000 SPELLS = { "Zi": { "buy_params": { "buy_crossed_indicator0": "BOP-4", "buy_crossed_indicator1": "MACD-0-50", "buy_crossed_indicator2": "DEMA-52", "buy_indicator0": "MINUS_DI-50", "buy_indicator1": "HT_TRENDMODE-50", "buy_indicator2": "CORREL-128", "buy_operator0": "/>R", "buy_operator1": "CA", "buy_operator2": "CDT", "buy_real_num0": 0.1763, "buy_real_num1": 0.6891, "buy_real_num2": 0.0509, }, "sell_params": { "sell_crossed_indicator0": "WCLPRICE-52", "sell_crossed_indicator1": "AROONOSC-15", "sell_crossed_indicator2": "CDLRISEFALL3METHODS-52", "sell_indicator0": "COS-50", "sell_indicator1": "CDLCLOSINGMARUBOZU-30", "sell_indicator2": "CDL2CROWS-130", "sell_operator0": "DT", "sell_operator1": ">R", "sell_operator2": "/>R", "sell_real_num0": 0.0678, "sell_real_num1": 0.8698, "sell_real_num2": 0.3917, } }, "Gu": { "buy_params": { "buy_crossed_indicator0": "SMA-20", "buy_crossed_indicator1": "CDLLADDERBOTTOM-20", "buy_crossed_indicator2": "OBV-50", "buy_indicator0": "MAMA-1-50", "buy_indicator1": "SUM-40", "buy_indicator2": "VAR-30", "buy_operator0": "R", "sell_operator2": "CUT", "sell_real_num0": 0.2707, "sell_real_num1": 0.7987, "sell_real_num2": 0.6891, } }, "Lu": { "buy_params": { "buy_crossed_indicator0": "HT_SINE-0-28", "buy_crossed_indicator1": "ADD-130", "buy_crossed_indicator2": "ADD-12", "buy_indicator0": "ADD-28", "buy_indicator1": "AVGPRICE-15", "buy_indicator2": "AVGPRICE-12", "buy_operator0": "DT", "buy_operator1": "D", "buy_operator2": "C", "buy_real_num0": 0.3676, "buy_real_num1": 0.4284, "buy_real_num2": 0.372, }, "sell_params": { "sell_crossed_indicator0": "HT_SINE-0-5", "sell_crossed_indicator1": "HT_SINE-0-4", "sell_crossed_indicator2": "HT_SINE-0-28", "sell_indicator0": "ADD-30", "sell_indicator1": "AVGPRICE-28", "sell_indicator2": "ADD-50", "sell_operator0": "CUT", "sell_operator1": "DT", "sell_operator2": "=R", "sell_real_num0": 0.3205, "sell_real_num1": 0.2055, "sell_real_num2": 0.8467, } }, "La": { "buy_params": { "buy_crossed_indicator0": "WMA-14", "buy_crossed_indicator1": "MAMA-1-14", "buy_crossed_indicator2": "CDLHIKKAKE-14", "buy_indicator0": "T3-14", "buy_indicator1": "BETA-14", "buy_indicator2": "HT_PHASOR-1-14", "buy_operator0": "/>R", "buy_operator1": ">", "buy_operator2": ">R", "buy_real_num0": 0.0551, "buy_real_num1": 0.3469, "buy_real_num2": 0.3871, }, "sell_params": { "sell_crossed_indicator0": "HT_TRENDLINE-14", "sell_crossed_indicator1": "LINEARREG-14", "sell_crossed_indicator2": "STOCHRSI-1-14", "sell_indicator0": "CDLDARKCLOUDCOVER-14", "sell_indicator1": "AD-14", "sell_indicator2": "CDLSTALLEDPATTERN-14", "sell_operator0": "/=R", "sell_operator1": "COT", "sell_operator2": "OT", "sell_real_num0": 0.3992, "sell_real_num1": 0.7747, "sell_real_num2": 0.7415, } }, "Si": { "buy_params": { "buy_crossed_indicator0": "MACDEXT-2-14", "buy_crossed_indicator1": "CORREL-14", "buy_crossed_indicator2": "CMO-14", "buy_indicator0": "MA-14", "buy_indicator1": "ADXR-14", "buy_indicator2": "CDLMARUBOZU-14", "buy_operator0": "<", "buy_operator1": "/", "buy_operator2": "CA", "buy_real_num0": 0.2208, "buy_real_num1": 0.1371, "buy_real_num2": 0.6389, }, "sell_params": { "sell_crossed_indicator0": "MACDEXT-0-15", "sell_crossed_indicator1": "BBANDS-2-15", "sell_crossed_indicator2": "DEMA-15", "sell_indicator0": "ULTOSC-15", "sell_indicator1": "MIDPOINT-12", "sell_indicator2": "PLUS_DI-12", "sell_operator0": "<", "sell_operator1": "DT", "sell_operator2": "COT", "sell_real_num0": 0.278, "sell_real_num1": 0.0643, "sell_real_num2": 0.7065, } }, "De": { "buy_params": { "buy_crossed_indicator0": "HT_DCPERIOD-12", "buy_crossed_indicator1": "HT_PHASOR-0-12", "buy_crossed_indicator2": "MACDFIX-1-15", "buy_indicator0": "CMO-12", "buy_indicator1": "TRIMA-12", "buy_indicator2": "MACDEXT-0-15", "buy_operator0": "<", "buy_operator1": "D", "buy_operator2": "<", "buy_real_num0": 0.3924, "buy_real_num1": 0.5546, "buy_real_num2": 0.7648, }, "sell_params": { "sell_crossed_indicator0": "MACDFIX-1-15", "sell_crossed_indicator1": "MACD-1-15", "sell_crossed_indicator2": "WMA-15", "sell_indicator0": "ROC-15", "sell_indicator1": "MACD-2-15", "sell_indicator2": "CCI-60", "sell_operator0": "CA", "sell_operator1": " 10) dataframe[indicator] = gene_calculator(dataframe, indicator) dataframe[crossed_indicator] = gene_calculator( dataframe, crossed_indicator) indicator_trend_sma = f"{indicator}-SMA-{TREND_CHECK_CANDLES}" if operator in ["UT", "DT", "OT", "CUT", "CDT", "COT"]: dataframe[indicator_trend_sma] = gene_calculator( dataframe, indicator_trend_sma) if operator == ">": condition = ( dataframe[indicator] > dataframe[crossed_indicator] ) elif operator == "=": condition = ( np.isclose(dataframe[indicator], dataframe[crossed_indicator]) ) elif operator == "<": condition = ( dataframe[indicator] < dataframe[crossed_indicator] ) elif operator == "C": condition = ( (qtpylib.crossed_below(dataframe[indicator], dataframe[crossed_indicator])) | (qtpylib.crossed_above( dataframe[indicator], dataframe[crossed_indicator])) ) elif operator == "CA": condition = ( qtpylib.crossed_above( dataframe[indicator], dataframe[crossed_indicator]) ) elif operator == "CB": condition = ( qtpylib.crossed_below( dataframe[indicator], dataframe[crossed_indicator]) ) elif operator == ">R": condition = ( dataframe[indicator] > real_num ) elif operator == "=R": condition = ( np.isclose(dataframe[indicator], real_num) ) elif operator == "R": condition = ( dataframe[indicator].div(dataframe[crossed_indicator]) > real_num ) elif operator == "/=R": condition = ( np.isclose(dataframe[indicator].div( dataframe[crossed_indicator]), real_num) ) elif operator == "/ dataframe[indicator_trend_sma] ) elif operator == "DT": condition = ( dataframe[indicator] < dataframe[indicator_trend_sma] ) elif operator == "OT": condition = ( np.isclose(dataframe[indicator], dataframe[indicator_trend_sma]) ) elif operator == "CUT": condition = ( ( qtpylib.crossed_above( dataframe[indicator], dataframe[indicator_trend_sma] ) ) & ( dataframe[indicator] > dataframe[indicator_trend_sma] ) ) elif operator == "CDT": condition = ( ( qtpylib.crossed_below( dataframe[indicator], dataframe[indicator_trend_sma] ) ) & ( dataframe[indicator] < dataframe[indicator_trend_sma] ) ) elif operator == "COT": condition = ( ( ( qtpylib.crossed_below( dataframe[indicator], dataframe[indicator_trend_sma] ) ) | ( qtpylib.crossed_above( dataframe[indicator], dataframe[indicator_trend_sma] ) ) ) & ( np.isclose( dataframe[indicator], dataframe[indicator_trend_sma] ) ) ) return condition, dataframe class DevilStra_866(IStrategy): buy_params = { "buy_spell": "Zi,Lu,Ra,Ra,La,Si,Pa,Si,Cu,La,De,Lu,De,La,Zi,Zi,Zi,Zi,Zi,Lu,Lu,Lu,Si,La,Ra,Pa,La,Zi,Zi,Gu,Ra,De,Gu,Zi,Ra,Ra,Ra,Cu,Pa,De,De,La,Lu,Lu,Lu,La,Zi,Cu,Ra,Gu,Pa,La,Zi,Zi,Si,Lu,Ra,Cu,Cu,Pa,Si,Gu,De,De,Lu,Gu,Zi,Pa,Lu,Pa,Ra,Gu,Cu,La,Pa,Lu,Zi,La,Zi,Gu,Zi,De,Cu,Ra,Lu,Ra,Gu,Si,Ra,La,La,Lu,Gu,Zi,Si,La,Pa,Pa,Cu,Cu,Zi,Gu,Pa,Zi,Pa,Cu,Lu,Pa,Si,De,Gu,Lu,Lu,Cu,Ra,Si,Pa,Gu,Si,Cu,Pa,Zi,Pa,Zi,Gu,Lu,Ra,Pa,Ra,De,Ra,Pa,Zi,La,Pa,De,Pa,Cu,Gu,De,Lu,La,Ra,Zi,Si,Zi,Zi,Cu,Cu,De,Pa,Pa,Zi,De,Ra,La,Lu,De,Lu,Gu,Cu,Cu,La,De,Gu,Lu,Ra,Pa,Lu,Cu,Pa,Pa,De,Si,Zi,Cu,De,De,De,Lu,Si,Zi,Gu,Si,Si,Ra,Pa,Si,La,La,Lu,Lu,De,Gu,Gu,Zi,Ra,La,Lu,Lu,La,Si,Zi,Si,Zi,Si,Lu,Cu,Zi,Lu,De,La,Ra,Ra,Lu,De,Pa,Zi,Gu,Cu,Zi,Pa,De,Si,Lu,De,Cu,De,Zi,Ra,Gu,De,Si,Lu,Lu,Ra,De,Gu,Cu,Gu,La,De,Lu,Lu,Si,Cu,Lu,Zi,Lu,Cu,Gu,Lu,Lu,Ra,Si,Ra,Pa,Lu,De,Ra,Zi,Gu,Gu,Zi,Lu,Cu,Cu,Cu,Lu", } sell_params = { "sell_spell": "La,Pa,De,De,La,Si,Si,La,La,La,Si,Pa,Pa,Lu,De,Cu,Cu,Gu,Lu,Ra,Lu,Si,Ra,De,La,Cu,La,La,Gu,La,De,Ra,Ra,Ra,Gu,Lu,Si,Si,Zi,Zi,La,Pa,Pa,Zi,Cu,Gu,Gu,Pa,Gu,Cu,Si,Ra,Ra,La,Gu,De,Si,La,Ra,Pa,Si,Lu,Pa,De,Zi,De,Lu,Si,Gu,De,Lu,De,Ra,Ra,Zi,De,Cu,Zi,Gu,Pa,Ra,De,Pa,De,Pa,Ra,Si,Si,Zi,Cu,Lu,Zi,Ra,De,Ra,Zi,Zi,Pa,Lu,Zi,Cu,Pa,Gu,Pa,Cu,De,Zi,De,De,Pa,Pa,Zi,Lu,Ra,Pa,Ra,Lu,Zi,Gu,Zi,Si,Lu,Ra,Ra,Zi,Lu,Pa,Lu,Si,Pa,Pa,Pa,Si,Zi,La,La,Lu,De,Zi,Gu,Ra,Ra,Ra,Zi,Pa,Zi,Cu,Lu,Gu,Cu,De,Lu,Gu,Lu,Gu,Si,Pa,Pa,Si,La,Gu,Ra,Pa,Si,Si,Si,Cu,Cu,Cu,Si,De,Lu,Gu,Gu,Lu,De,Ra,Gu,Gu,Gu,Cu,La,De,Cu,Zi,Pa,Si,De,Pa,Pa,Pa,La,De,Gu,Zi,La,De,Cu,La,Pa,Ra,Si,Si,Zi,Cu,Ra,Pa,Gu,Pa,Ra,Zi,De,Zi,Gu,Gu,Pa,Cu,Lu,Gu,De,Si,Pa,La,Cu,Zi,Gu,De,Gu,La,Cu,Gu,De,Cu,Cu,Gu,Ra,Lu,Zi,De,La,Ra,Pa,Pa,Si,La,Lu,La,De,De,Ra,De,La,La,Pa,Cu,Lu,Pa,Ra,Pa,Pa,Cu,Zi,Gu,Cu,Gu,La,Si,Ra,Pa", } minimal_roi = { "0": 0.574, "1757": 0.158, "3804": 0.089, "6585": 0 } stoploss = -0.97 timeframe = '4h' spell_pot = [ ",".join( tuple( random.choices( list(SPELLS.keys()), k=PAIR_LIST_LENGHT ) ) )for i in range(PAIN_RANGE) ] buy_spell = CategoricalParameter( spell_pot, default=spell_pot[0], space='buy') sell_spell = CategoricalParameter( spell_pot, default=spell_pot[0], space='sell') def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: return dataframe def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: pairs = self.dp.current_whitelist() pairs_len = len(pairs) pair_index = pairs.index(metadata['pair']) buy_spells = self.buy_spell.value.split(",") buy_spells_len = len(buy_spells) if pairs_len > buy_spells_len: print( f"First set PAIR_LIST_LENGHT={pairs_len + 1} And re-hyperopt the") print("Buy strategy And paste result in exact place(lines 535~564)") print("IMPORTANT: You Need An 'STATIC' Pairlist On Your Config.json !!!") exit() buy_params_index = buy_spells[pair_index] params = spell_finder(buy_params_index, 'buy') conditions = list() buy_indicator = params['buy_indicator0'] buy_crossed_indicator = params['buy_crossed_indicator0'] buy_operator = params['buy_operator0'] buy_real_num = params['buy_real_num0'] condition, dataframe = condition_generator( dataframe, buy_operator, buy_indicator, buy_crossed_indicator, buy_real_num ) conditions.append(condition) buy_indicator = params['buy_indicator1'] buy_crossed_indicator = params['buy_crossed_indicator1'] buy_operator = params['buy_operator1'] buy_real_num = params['buy_real_num1'] condition, dataframe = condition_generator( dataframe, buy_operator, buy_indicator, buy_crossed_indicator, buy_real_num ) conditions.append(condition) buy_indicator = params['buy_indicator2'] buy_crossed_indicator = params['buy_crossed_indicator2'] buy_operator = params['buy_operator2'] buy_real_num = params['buy_real_num2'] condition, dataframe = condition_generator( dataframe, buy_operator, buy_indicator, buy_crossed_indicator, buy_real_num ) conditions.append(condition) if conditions: dataframe.loc[ reduce(lambda x, y: x & y, conditions), 'buy']=1 return dataframe def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: pairs = self.dp.current_whitelist() pairs_len = len(pairs) pair_index = pairs.index(metadata['pair']) sell_spells = self.sell_spell.value.split(",") sell_spells_len = len(sell_spells) if pairs_len > sell_spells_len: print( f"First set PAIR_LIST_LENGHT={pairs_len + 1} And re-hyperopt the") print("Sell strategy And paste result in exact place(lines 535~564)") print("IMPORTANT: You Need An 'STATIC' Pairlist On Your Config.json !!!") exit() sell_params_index = sell_spells[pair_index] params = spell_finder(sell_params_index, 'sell') conditions = list() sell_indicator = params['sell_indicator0'] sell_crossed_indicator = params['sell_crossed_indicator0'] sell_operator = params['sell_operator0'] sell_real_num = params['sell_real_num0'] condition, dataframe = condition_generator( dataframe, sell_operator, sell_indicator, sell_crossed_indicator, sell_real_num ) conditions.append(condition) sell_indicator = params['sell_indicator1'] sell_crossed_indicator = params['sell_crossed_indicator1'] sell_operator = params['sell_operator1'] sell_real_num = params['sell_real_num1'] condition, dataframe = condition_generator( dataframe, sell_operator, sell_indicator, sell_crossed_indicator, sell_real_num ) conditions.append(condition) sell_indicator = params['sell_indicator2'] sell_crossed_indicator = params['sell_crossed_indicator2'] sell_operator = params['sell_operator2'] sell_real_num = params['sell_real_num2'] condition, dataframe = condition_generator( dataframe, sell_operator, sell_indicator, sell_crossed_indicator, sell_real_num ) conditions.append(condition) if conditions: dataframe.loc[ reduce(lambda x, y: x & y, conditions), 'sell']=1 return dataframe