def populate_indicators(self, dataframe: DataFrame) -> DataFrame: dataframe['sma5'] = ta.SMA(dataframe, timeperiod=5) dataframe['sma200'] = ta.SMA(dataframe, timeperiod=200) # resample our dataframes dataframe_short = resample_to_interval(dataframe, self.get_ticker_indicator() * 2) dataframe_long = resample_to_interval(dataframe, self.get_ticker_indicator() * 8) # compute our RSI's dataframe_short['rsi'] = ta.RSI(dataframe_short, timeperiod=14) dataframe_long['rsi'] = ta.RSI(dataframe_long, timeperiod=14) dataframe_short['cmf'] = cmf(dataframe_short, 14) dataframe_long['cmf'] = cmf(dataframe_long, 14) dataframe_short['osc'] = osc(dataframe_short, 14) dataframe_long['osc'] = osc(dataframe_long, 14) # merge dataframe back together dataframe = resampled_merge(dataframe, dataframe_short) dataframe = resampled_merge(dataframe, dataframe_long) dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) # fill NA values with previes dataframe.fillna(method='ffill', inplace=True) # Volume Flow Index: Add VFI, VFIMA, Histogram to DF dataframe['vfi'], dataframe['vfima'], dataframe['vfi_hist'] = \ vfi(dataframe, length=130, coef=0.2, vcoef=2.5, signalLength=5, smoothVFI=True) return dataframe
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe['sma5'] = ta.SMA(dataframe, timeperiod=5) dataframe['sma200'] = ta.SMA(dataframe, timeperiod=200) # resample our dataframes dataframe_short = resample_to_interval(dataframe, self.get_ticker_indicator() * 2) dataframe_long = resample_to_interval(dataframe, self.get_ticker_indicator() * 8) # compute our RSI's dataframe_short['rsi'] = ta.RSI(dataframe_short, timeperiod=14) dataframe_long['rsi'] = ta.RSI(dataframe_long, timeperiod=14) # merge dataframe back together dataframe = resampled_merge(dataframe, dataframe_short) dataframe = resampled_merge(dataframe, dataframe_long) dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) dataframe.fillna(method='ffill', inplace=True) return dataframe
def test_resampled_merge_contains_indicator(testdata_1m_btc): resampled = resample_to_interval(testdata_1m_btc, 5) resampled['cmf'] = cmf(resampled, 5) merged = resampled_merge(testdata_1m_btc, resampled) print(merged) assert "resample_5_cmf" in merged
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: tf_res = timeframe_to_minutes(self.timeframe) * 5 df_res = resample_to_interval(dataframe, tf_res) df_res['sma'] = ta.SMA(df_res, 50, price='close') dataframe = resampled_merge(dataframe, df_res, fill_na=True) dataframe['resample_sma'] = dataframe[f'resample_{tf_res}_sma'] dataframe['ema_high'] = ta.EMA(dataframe, timeperiod=5, price='high') dataframe['ema_close'] = ta.EMA(dataframe, timeperiod=5, price='close') dataframe['ema_low'] = ta.EMA(dataframe, timeperiod=5, price='low') stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) dataframe['fastd'] = stoch_fast['fastd'] dataframe['fastk'] = stoch_fast['fastk'] dataframe['adx'] = ta.ADX(dataframe) dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) dataframe['mfi'] = ta.MFI(dataframe) # required for graphing bollinger = qtpylib.bollinger_bands(dataframe['close'], window=20, stds=2) dataframe['bb_lowerband'] = bollinger['lower'] dataframe['bb_upperband'] = bollinger['upper'] dataframe['bb_middleband'] = bollinger['mid'] return dataframe
def test_resampled_merge_contains_indicator(testdata_1m_btc): resampled = resample_to_interval(testdata_1m_btc, 5) resampled["cmf"] = chaikin_money_flow(resampled, 5) merged = resampled_merge(testdata_1m_btc, resampled) print(merged) assert "resample_5_cmf" in merged
def test_resampled_merge(testdata_1m_btc): resampled = resample_to_interval(testdata_1m_btc, 5) merged = resampled_merge(testdata_1m_btc, resampled) assert (len(merged) == len(testdata_1m_btc)) assert "resample_5_open" in merged assert "resample_5_close" in merged assert "resample_5_low" in merged assert "resample_5_high" in merged assert "resample_5_date" not in merged assert "resample_5_volume" not in merged
def populate_indicators(self, dataframe: DataFrame) -> DataFrame: # otherwise freqshow import won't work # since lambda is too large with all the dependencies from technical.util import resample_to_interval from technical.util import resampled_merge from technical.indicators import cmf from technical.indicators import osc dataframe['sma5'] = ta.SMA(dataframe, timeperiod=5) dataframe['sma200'] = ta.SMA(dataframe, timeperiod=200) # resample our dataframes dataframe_short = resample_to_interval(dataframe, self.get_ticker_indicator() * 2) dataframe_long = resample_to_interval(dataframe, self.get_ticker_indicator() * 8) # compute our RSI's dataframe_short['rsi'] = ta.RSI(dataframe_short, timeperiod=14) dataframe_long['rsi'] = ta.RSI(dataframe_long, timeperiod=14) dataframe_short['cmf'] = cmf(dataframe_short, 14) dataframe_long['cmf'] = cmf(dataframe_long, 14) dataframe_short['osc'] = osc(dataframe_short, 14) dataframe_long['osc'] = osc(dataframe_long, 14) # merge dataframe back together dataframe = resampled_merge(dataframe, dataframe_short) dataframe = resampled_merge(dataframe, dataframe_long) dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) # fill NA values with previes dataframe.fillna(method='ffill', inplace=True) return dataframe
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe['maShort'] = ta.EMA(dataframe, timeperiod=8) dataframe['maMedium'] = ta.EMA(dataframe, timeperiod=21) ################################################################################## # required for graphing bollinger = qtpylib.bollinger_bands(dataframe['close'], window=20, stds=2) dataframe['bb_lowerband'] = bollinger['lower'] dataframe['bb_upperband'] = bollinger['upper'] dataframe['bb_middleband'] = bollinger['mid'] self.resample_interval = timeframe_to_minutes(self.ticker_interval) * 12 dataframe_long = resample_to_interval(dataframe, self.resample_interval) dataframe_long['sma'] = ta.SMA(dataframe_long, timeperiod=50, price='close') dataframe = resampled_merge(dataframe, dataframe_long, fill_na=True) return dataframe
def test_resampled_merge(testdata_1m_btc): resampled = resample_to_interval(testdata_1m_btc, 5) merged = resampled_merge(testdata_1m_btc, resampled) assert len(merged) == len(testdata_1m_btc) assert "resample_5_open" in merged assert "resample_5_close" in merged assert "resample_5_low" in merged assert "resample_5_high" in merged assert "resample_5_date" in merged assert "resample_5_volume" in merged # Verify the assignment goes to the correct candle # If resampling to 5m, then the resampled value needs to be on the 5m candle. date = pd.to_datetime("2017-11-14 22:45:00", utc=True) assert merged.loc[merged["date"] == "2017-11-14 22:48:00", "resample_5_date"].iloc[0] != date # The 5m candle for 22:45 is available at 22:50, # when both :49 1m and :45 5m candles close assert merged.loc[merged["date"] == "2017-11-14 22:49:00", "resample_5_date"].iloc[0] == date assert merged.loc[merged["date"] == "2017-11-14 22:50:00", "resample_5_date"].iloc[0] == date assert merged.loc[merged["date"] == "2017-11-14 22:51:00", "resample_5_date"].iloc[0] == date assert merged.loc[merged["date"] == "2017-11-14 22:52:00", "resample_5_date"].iloc[0] == date assert merged.loc[merged["date"] == "2017-11-14 22:53:00", "resample_5_date"].iloc[0] == date # The 5m candle for 22:50 is available at 22:54, # when both :54 1m and :50 5m candles close date = pd.to_datetime("2017-11-14 22:50:00", utc=True) assert merged.loc[merged["date"] == "2017-11-14 22:54:00", "resample_5_date"].iloc[0] == date assert merged.loc[merged["date"] == "2017-11-14 22:55:00", "resample_5_date"].iloc[0] == date assert merged.loc[merged["date"] == "2017-11-14 22:56:00", "resample_5_date"].iloc[0] == date assert merged.loc[merged["date"] == "2017-11-14 22:57:00", "resample_5_date"].iloc[0] == date assert merged.loc[merged["date"] == "2017-11-14 22:58:00", "resample_5_date"].iloc[0] == date
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: # longer RSI used for determining trend resample_rsi_indicator = self.get_ticker_indicator() * 12 resample_rsi_key = 'resample_{}_rsi'.format(resample_rsi_indicator) dataframe_long = resample_to_interval(dataframe, resample_rsi_indicator) dataframe_long['rsi'] = ta.RSI(dataframe_long, timeperiod=14) dataframe = resampled_merge(dataframe, dataframe_long) dataframe[resample_rsi_key].fillna(method='ffill', inplace=True) # bull used to select between two different sets of buy/sell threshold values # based on long RSI dataframe['bull'] = dataframe[resample_rsi_key].gt(60).astype('int') # normal rsi acts mainly as the buy trigger # used for sell as well, but more likely to ROI or stop out dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) return dataframe
def test_resampled_merge(testdata_1m_btc): resampled = resample_to_interval(testdata_1m_btc, 5) merged = resampled_merge(testdata_1m_btc, resampled) assert len(merged) == len(testdata_1m_btc) assert "resample_5_open" in merged assert "resample_5_close" in merged assert "resample_5_low" in merged assert "resample_5_high" in merged assert "resample_5_date" not in merged assert "resample_5_volume" not in merged # Verify the assignment goes to the correct candle # If resampling to 5m, then the resampled value needs to be on the 5m candle. assert sum(merged.loc[merged["date"] == "2017-11-14 22:54:00", "resample_5_close"].isna()) == 1 assert sum(merged.loc[merged["date"] == "2017-11-14 22:55:00", "resample_5_close"].isna()) == 0 assert sum(merged.loc[merged["date"] == "2017-11-14 22:56:00", "resample_5_close"].isna()) == 1
def test_resample_to_interval(testdata_1m_btc): result = resample_to_interval(testdata_1m_btc, 5) # should be roughly a factor 5 assert (len(testdata_1m_btc) / len(result) > 4.5) assert (len(testdata_1m_btc) / len(result) < 5.5)
def populate_indicators(self, dataframe: DataFrame) -> DataFrame: from technical.util import resample_to_interval from technical.util import resampled_merge dataframe['sma'] = ta.SMA(dataframe, timeperiod=40) # EMA - Exponential Moving Average dataframe['ema3'] = ta.EMA(dataframe, timeperiod=3) dataframe['ema5'] = ta.EMA(dataframe, timeperiod=5) dataframe['ema10'] = ta.EMA(dataframe, timeperiod=10) dataframe['ema20'] = ta.EMA(dataframe, timeperiod=20) dataframe['ema50'] = ta.EMA(dataframe, timeperiod=50) dataframe['ema100'] = ta.EMA(dataframe, timeperiod=100) dataframe['ema200'] = ta.EMA(dataframe, timeperiod=200) # Stoch stoch = ta.STOCH(dataframe, fastk_period=5, slowk_period=2, slowk_matype=0, slowd_period=2, slowd_matype=0) dataframe['slowd15'] = stoch['slowd'] dataframe['slowk15'] = stoch['slowk'] stoch = ta.STOCH(dataframe, fastk_period=10, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0) dataframe['slowd'] = stoch['slowd'] dataframe['slowk'] = stoch['slowk'] # Stoch fast stoch_fast = ta.STOCHF(dataframe) dataframe['fastd'] = stoch_fast['fastd'] dataframe['fastk'] = stoch_fast['fastk'] dataframe['minus_di'] = ta.MINUS_DI(dataframe, timeperiod=24) dataframe['plus_di'] = ta.PLUS_DI(dataframe, timeperiod=24) dataframe['blower'] = ta.BBANDS(dataframe, nbdevup=2, nbdevdn=2)['lowerband'] # Bollinger bands bollinger = qtpylib.bollinger_bands(qtpylib.typical_price(dataframe), window=20, stds=2) dataframe['bb_lowerband'] = bollinger['lower'] dataframe['bb_middleband'] = bollinger['mid'] dataframe['bb_upperband'] = bollinger['upper'] dataframe['sma3'] = ta.SMA(dataframe, timeperiod=3) dataframe['sma5'] = ta.SMA(dataframe, timeperiod=5) dataframe['sma10'] = ta.SMA(dataframe, timeperiod=10) dataframe['sma20'] = ta.SMA(dataframe, timeperiod=20) dataframe['sma50'] = ta.SMA(dataframe, timeperiod=50) dataframe['sma100'] = ta.SMA(dataframe, timeperiod=100) dataframe['sma220'] = ta.SMA(dataframe, timeperiod=220) dataframe['sma200'] = ta.SMA(dataframe, timeperiod=200) dataframe['willr'] = ta.WILLR(dataframe, timeperiod=28) # resample our dataframes dataframe_short = resample_to_interval(dataframe, self.get_ticker_indicator() * 3) dataframe_long = resample_to_interval(dataframe, self.get_ticker_indicator() * 7) # compute our RSI's dataframe_short['rsi'] = ta.RSI(dataframe_short, timeperiod=14) dataframe_long['rsi'] = ta.RSI(dataframe_long, timeperiod=14) dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) dataframe['mfi'] = ta.MFI(dataframe) dataframe['CDLHAMMER'] = ta.CDLHAMMER(dataframe) # merge dataframe back together dataframe = resampled_merge(dataframe, dataframe_short) dataframe = resampled_merge(dataframe, dataframe_long) dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) dataframe.fillna(method='ffill', inplace=True) # Inverse Fisher transform on RSI, values [-1.0, 1.0] (https://goo .gl/2JGGoy) dataframe['fisher_rsi'] = fishers_inverse(dataframe['rsi']) # Inverse Fisher transform on RSI normalized, value [0.0, 100.0] (https://goo.gl/2JGGoy) dataframe['fisher_rsi_norma'] = 50 * (dataframe['fisher_rsi'] + 1) dataframe['resample_rsi_2'] = dataframe['resample_{}_rsi'.format( self.get_ticker_indicator() * 3)] dataframe['resample_rsi_8'] = dataframe['resample_{}_rsi'.format( self.get_ticker_indicator() * 7)] dataframe['average'] = (dataframe['close'] + dataframe['open'] + dataframe['high'] + dataframe['low']) / 4 return dataframe