# --- Do not remove these libs --- from freqtrade.strategy.interface import IStrategy from typing import Dict, List from functools import reduce from pandas import DataFrame # -------------------------------- import talib.abstract as ta import numpy as np import freqtrade.vendor.qtpylib.indicators as qtpylib import datetime from technical.util import resample_to_interval, resampled_merge from freqtrade.strategy import DecimalParameter, IntParameter, BooleanParameter rangeUpper = 60 rangeLower = 5 def EWO(dataframe, ema_length=5, ema2_length=35): df = dataframe.copy() ema1 = ta.EMA(df, timeperiod=ema_length) ema2 = ta.EMA(df, timeperiod=ema2_length) emadif = (ema1 - ema2) / df['close'] * 100 return emadif def valuewhen(dataframe, condition, source, occurrence): copy = dataframe.copy() copy['colFromIndex'] = copy.index copy = copy.sort_values(by=[condition, 'colFromIndex'], ascending=False).reset_index(drop=True) copy['valuewhen'] = np.where(copy[condition] > 0, copy[source].shift(-occurrence), copy[source]) copy['barrsince'] = copy['colFromIndex'] - copy['colFromIndex'].shift(-occurrence) copy.loc[ ( (rangeLower <= copy['barrsince']) & (copy['barrsince'] <= rangeUpper) ) , "in_range"] = 1 copy['in_range'] = copy['in_range'].fillna(0) copy = copy.sort_values(by=['colFromIndex'], ascending=True).reset_index(drop=True) return copy['valuewhen'], copy['in_range'], copy['barrsince'] class Canals(IStrategy): INTERFACE_VERSION = 2 # Buy hyperspace params: buy_params = { } # Sell hyperspace params: sell_params = { } # ROI table: minimal_roi = { "0": 0.05, } # Stoploss: stoploss = -0.08 # Trailing stop: trailing_stop = True trailing_stop_positive = 0.005 trailing_stop_positive_offset = 0.02 trailing_only_offset_is_reached = True # Optimal timeframe for the strategy timeframe = '5m' use_custom_stoploss = False # Number of candles the strategy requires before producing valid signals startup_candle_count: int = 30 osc = 'close' len = 14 src = 'close' lbL = 14 def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe['RSI'] = ta.RSI(dataframe[self.src], self.len) dataframe['RSI'] = dataframe['RSI'].fillna(0) stoch = ta.STOCH(dataframe, fastk_period=10, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0) dataframe['slowk'] = stoch['slowk'] dataframe['slowd'] = stoch['slowd'] dataframe['osc'] = dataframe[self.osc] # plFound = na(pivotlow(osc, lbL, lbR)) ? false : true dataframe['min'] = dataframe['osc'].rolling(self.lbL).min() dataframe['prevMin'] = np.where(dataframe['min'] > dataframe['min'].shift(), dataframe['min'].shift(), dataframe['min']) dataframe.loc[ ( (dataframe['osc'] == dataframe['prevMin']) ) , 'plFound'] = 1 # phFound = na(pivothigh(osc, lbL, lbR)) ? false : true dataframe['max'] = dataframe['osc'].rolling(self.lbL).max() dataframe['prevMax'] = np.where(dataframe['max'] < dataframe['max'].shift(), dataframe['max'].shift(), dataframe['max']) dataframe.loc[ ( (dataframe['osc'] == dataframe['prevMax']) ) , 'phFound'] = 1 dataframe['valuewhen_plFound'], dataframe['inrange_plFound'], dataframe['barssince_plFound'] = valuewhen(dataframe,'plFound', 'close', 1) dataframe['valuewhen_phFound'], dataframe['inrange_phFound'], dataframe['barssince_phFound'] = valuewhen(dataframe, 'phFound', 'close', 1) return dataframe def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: conditions = [] conditions.append( ( (dataframe['bullCond'] > 0) & (dataframe['volume'] > 0) ) ) 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: conditions = [] conditions.append( ( (dataframe['bearCond'] > 0) & (dataframe['volume'] > 0) ) ) if conditions: dataframe.loc[ reduce(lambda x, y: x | y, conditions), 'sell' ] = 1 dataframe.to_csv('user_data/csvs/%s_%s.csv' % (self.__class__.__name__, metadata["pair"].replace("/", "_"))) return dataframe