From d33c032f50b887292e52b89c4f7c062fbead7259 Mon Sep 17 00:00:00 2001 From: Masoud Azizi Date: Tue, 13 Apr 2021 21:16:37 +0430 Subject: [PATCH] GodStra Hyperopt script this is the hyperopt script of GodStra Strategy --- user_data/hyperopts/GodStraHo.py | 199 +++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 user_data/hyperopts/GodStraHo.py diff --git a/user_data/hyperopts/GodStraHo.py b/user_data/hyperopts/GodStraHo.py new file mode 100644 index 0000000..2788f07 --- /dev/null +++ b/user_data/hyperopts/GodStraHo.py @@ -0,0 +1,199 @@ +# GodStra Strategy Hyperopt +# Author: @Mablue (Masoud Azizi) +# github: https://github.com/mablue/ +# IMPORTANT: INSTALL TA BEFOUR RUN: +# :~$ pip install ta +# freqtrade hyperopt --hyperopt GodStraHo --hyperopt-loss SharpeHyperOptLossDaily --gene all --strategy GodStra --config config.json -e 100 + +# --- Do not remove these libs --- +from functools import reduce +from typing import Any, Callable, Dict, List + +import numpy as np # noqa +import pandas as pd # noqa +from pandas import DataFrame +from skopt.space import Categorical, Dimension, Integer, Real # noqa + +from freqtrade.optimize.hyperopt_interface import IHyperOpt + +# -------------------------------- +# Add your lib to import here +# import talib.abstract as ta # noqa +from ta import add_all_ta_features +from ta.utils import dropna +import freqtrade.vendor.qtpylib.indicators as qtpylib +# this is your trading strategy DNA Size +# you can change it and see the results... +DNA_SIZE = 1 + + +GodGenes = ["open", "high", "low", "close", "volume", "volume_adi", "volume_obv", + "volume_cmf", "volume_fi", "volume_mfi", "volume_em", "volume_sma_em", "volume_vpt", + "volume_nvi", "volume_vwap", "volatility_atr", "volatility_bbm", "volatility_bbh", + "volatility_bbl", "volatility_bbw", "volatility_bbp", "volatility_bbhi", + "volatility_bbli", "volatility_kcc", "volatility_kch", "volatility_kcl", + "volatility_kcw", "volatility_kcp", "volatility_kchi", "volatility_kcli", + "volatility_dcl", "volatility_dch", "volatility_dcm", "volatility_dcw", + "volatility_dcp", "volatility_ui", "trend_macd", "trend_macd_signal", + "trend_macd_diff", "trend_sma_fast", "trend_sma_slow", "trend_ema_fast", + "trend_ema_slow", "trend_adx", "trend_adx_pos", "trend_adx_neg", "trend_vortex_ind_pos", + "trend_vortex_ind_neg", "trend_vortex_ind_diff", "trend_trix", + "trend_mass_index", "trend_cci", "trend_dpo", "trend_kst", + "trend_kst_sig", "trend_kst_diff", "trend_ichimoku_conv", + "trend_ichimoku_base", "trend_ichimoku_a", "trend_ichimoku_b", + "trend_visual_ichimoku_a", "trend_visual_ichimoku_b", "trend_aroon_up", + "trend_aroon_down", "trend_aroon_ind", "trend_psar_up", "trend_psar_down", + "trend_psar_up_indicator", "trend_psar_down_indicator", "trend_stc", + "momentum_rsi", "momentum_stoch_rsi", "momentum_stoch_rsi_k", + "momentum_stoch_rsi_d", "momentum_tsi", "momentum_uo", "momentum_stoch", + "momentum_stoch_signal", "momentum_wr", "momentum_ao", "momentum_kama", + "momentum_roc", "momentum_ppo", "momentum_ppo_signal", "momentum_ppo_hist", + "others_dr", "others_dlr", "others_cr"] + + +class GodStraHo(IHyperOpt): + + @staticmethod + def indicator_space() -> List[Dimension]: + """ + Define your Hyperopt space for searching buy strategy parameters. + """ + gene = list() + + for i in range(DNA_SIZE): + gene.append(Categorical(GodGenes, name=f'buy-indicator-{i}')) + gene.append(Categorical(GodGenes, name=f'buy-cross-{i}')) + gene.append(Integer(-1, 101, name=f'buy-int-{i}')) + gene.append(Real(-1.1, 1.1, name=f'buy-real-{i}')) + # Operations + # CA: Crossed Above, CB: Crossed Below, + # I: Integer, R: Real, D: Disabled + gene.append(Categorical(["D", ">", "<", "=", "CA", "CB", + ">I", "=I", "R", "=R", " Callable: + """ + Define the buy strategy parameters to be used by Hyperopt. + """ + def populate_buy_trend(dataframe: DataFrame, metadata: dict) -> DataFrame: + """ + Buy strategy Hyperopt will build and use. + """ + conditions = [] + # GUARDS AND TRENDS + for i in range(DNA_SIZE): + + OPR = params[f'buy-oper-{i}'] + IND = params[f'buy-indicator-{i}'] + CRS = params[f'buy-cross-{i}'] + INT = params[f'buy-int-{i}'] + REAL = params[f'buy-real-{i}'] + DFIND = dataframe[IND] + DFCRS = dataframe[CRS] + + if OPR == ">": + conditions.append(DFIND > DFCRS) + elif OPR == "=": + conditions.append(np.isclose(DFIND, DFCRS)) + elif OPR == "<": + conditions.append(DFIND < DFCRS) + elif OPR == "CA": + conditions.append(qtpylib.crossed_above(DFIND, DFCRS)) + elif OPR == "CB": + conditions.append(qtpylib.crossed_below(DFIND, DFCRS)) + elif OPR == ">I": + conditions.append(DFIND > INT) + elif OPR == "=I": + conditions.append(DFIND == INT) + elif OPR == "R": + conditions.append(DFIND > REAL) + elif OPR == "=R": + conditions.append(np.isclose(DFIND, REAL)) + elif OPR == " List[Dimension]: + """ + Define your Hyperopt space for searching sell strategy parameters. + """ + gene = list() + + for i in range(DNA_SIZE): + gene.append(Categorical(GodGenes, name=f'sell-indicator-{i}')) + gene.append(Categorical(GodGenes, name=f'sell-cross-{i}')) + gene.append(Integer(-1, 101, name=f'sell-int-{i}')) + gene.append(Real(-0.01, 1.01, name=f'sell-real-{i}')) + # Operations + # CA: Crossed Above, CB: Crossed Below, + # I: Integer, R: Real, D: Disabled + gene.append(Categorical(["D", ">", "<", "=", "CA", "CB", + ">I", "=I", "R", "=R", " Callable: + """ + Define the sell strategy parameters to be used by Hyperopt. + """ + def populate_sell_trend(dataframe: DataFrame, metadata: dict) -> DataFrame: + """ + Sell strategy Hyperopt will build and use. + """ + conditions = [] + + # GUARDS AND TRENDS + for i in range(DNA_SIZE): + + OPR = params[f'sell-oper-{i}'] + IND = params[f'sell-indicator-{i}'] + CRS = params[f'sell-cross-{i}'] + INT = params[f'sell-int-{i}'] + REAL = params[f'sell-real-{i}'] + DFIND = dataframe[IND] + DFCRS = dataframe[CRS] + + if OPR == ">": + conditions.append(DFIND > DFCRS) + elif OPR == "=": + conditions.append(np.isclose(DFIND, DFCRS)) + elif OPR == "<": + conditions.append(DFIND < DFCRS) + elif OPR == "CA": + conditions.append(qtpylib.crossed_above(DFIND, DFCRS)) + elif OPR == "CB": + conditions.append(qtpylib.crossed_below(DFIND, DFCRS)) + elif OPR == ">I": + conditions.append(DFIND > INT) + elif OPR == "=I": + conditions.append(DFIND == INT) + elif OPR == "R": + conditions.append(DFIND > REAL) + elif OPR == "=R": + conditions.append(np.isclose(DFIND, REAL)) + elif OPR == "