예제 #1
0
    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
예제 #2
0
    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
예제 #3
0
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
예제 #4
0
    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
예제 #5
0
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
예제 #6
0
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
예제 #9
0
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
예제 #10
0
    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
예제 #11
0
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
예제 #12
0
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)
예제 #13
0
    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