user8357568
user8357568

Reputation: 13

How to incorporate the indicator to generate signals?

indicators.py:

import pandas as pd
import numpy as np
import ta

def lsma(data, period=14, regression=True):
    size = len(data)
    out = np.full(size, np.nan)
    w = np.arange(1, period + 1, dtype=np.float64)
    if regression:
        for i in range(period - 1, size):
            e = i + 1
            s = e - period
            intercept, slope = np.dot(np.linalg.pinv(np.vstack((np.ones(period), w)).T), data[s:e])
            out[i] = slope * period + intercept
    else:
        for i in range(period - 1, size):
            e = i + 1
            s = e - period
            out[i] = np.dot(data[s:e], w) / np.sum(w)
    return out

def zlsma(data, period=14, regression=True):
    size = len(data)
    sum_w = np.sum(np.arange(1, period + 1, dtype=np.float64))
    lsma_v = lsma(data, period, regression)
    out = np.full(size, np.nan)
    w = sum_w / (2 * np.sum(np.arange(1, period)))
    for i in range(period - 1, size):
        out[i] = lsma_v[i] + (data[i] - lsma_v[i]) * w
    return out

def add_indicators(df):
    df['FastEMA'] = ta.trend.EMAIndicator(df['Close'], window=5).ema_indicator()
    df['SlowEMA'] = ta.trend.EMAIndicator(df['Close'], window=15).ema_indicator()
    df['LongEMA'] = ta.trend.EMAIndicator(df['Close'], window=50).ema_indicator()
    df['VeryLongEMA'] = ta.trend.EMAIndicator(df['Close'], window=200).ema_indicator()
    df['RSI'] = ta.momentum.RSIIndicator(df['Close'], window=5).rsi()
    bb_bands = ta.volatility.BollingerBands(df['Close'], window=20, window_dev=2)
    df['BB_Lower'] = bb_bands.bollinger_lband()
    df['BB_Upper'] = bb_bands.bollinger_hband()
    df['VolumeAvg'] = ta.trend.SMAIndicator(df['Volume'], window=20).sma_indicator()
    df['ZLSMA'] = zlsma(df['Close'].values, 32)
    df['ATR'] = ta.volatility.AverageTrueRange(df['High'], df['Low'], df['Close'], window=1).average_true_range()
    df['LongExitCE'] = df['High'].rolling(window=1).max() - df['ATR'] * 2
    df['ShortExitCE'] = df['Low'].rolling(window=1).min() + df['ATR'] * 2
    return df

def heikin_ashi(df):
    df['HA_Close'] = (df['Open'] + df['High'] + df['Low'] + df['Close']) / 4

    idx = df.index.name
    df.reset_index(inplace=True)

    for i in range(0, len(df)):
        if i == 0:
            df.at[i, 'HA_Open'] = (df.at[i, 'Open'] + df.at[i, 'Close']) / 2
        else:
            df.at[i, 'HA_Open'] = (df.at[i - 1, 'HA_Open'] + df.at[i - 1, 'HA_Close']) / 2

    if idx:
        df.set_index(idx, inplace=True)

    df['HA_High'] = df[['HA_Open', 'HA_Close', 'High']].max(axis=1)
    df['HA_Low'] = df[['HA_Open', 'HA_Close', 'Low']].min(axis=1)
    return df

def generate_signals(df, predicted_prices):
    df['Signal'] = 0
    df['Predicted_Close'] = predicted_prices[:len(df)]
    df.loc[(df['Close'] > df['FastEMA']) & (df['FastEMA'] > df['ZLSMA']) &
           (df['Close'] > df['BB_Upper']) & (df['Volume'] > df['VolumeAvg'] * 1.5) &
           (df['RSI'] > 55) & (df['Predicted_Close'] > df['Close']), 'Signal'] = 1
    df.loc[(df['Close'] < df['FastEMA']) & (df['FastEMA'] < df['ZLSMA']) &
           (df['Close'] < df['BB_Lower']) & (df['Volume'] > df['VolumeAvg'] * 1.5) &
           (df['RSI'] < 45) & (df['Predicted_Close'] < df['Close']), 'Signal'] = -1
    return df

This is where I call the indicators in main.py:

if __name__ == "__main__":
    exchange = BybitExchange()
    max_pos = 50  # Max current orders
    symbols = exchange.get_tickers()  # getting all symbols from the Bybit Derivatives

    # Infinite loop
    while True:
        balance = exchange.get_balance()
        if balance is None:
            print('Cant connect to API')
        else:
            balance = float(balance)
            print(f'Balance: {balance}')
            pos = exchange.get_positions()
            print(f'You have {len(pos)} positions: {pos}')

            if len(pos) < max_pos:
                # Checking every symbol from the symbols list:
                for elem in symbols:
                    pos = exchange.get_positions()
                    if len(pos) >= max_pos:
                        break
                    # Signal to buy or sell
                    trades = exchange.get_trade(elem)
                    if trades['Signal'].iloc[-1] == 1:
                        print(f'Found BUY signal for {elem}')
                        exchange.set_mode(elem)
                        time.sleep(2)
                        exchange.set_leverage(elem, leverage, leverage)
                        sl_atr = sl_coef * trades.ATR.iloc[-1]
                        tp_sl_ratio = tp_sl_ratio
                        sl = trades['Close'].iloc[-1] - sl_atr
                        tp = trades['Close'].iloc[-1] + sl_atr * tp_sl_ratio
                        exchange.place_order_market('Buy', balance*0.99*leverage*0.97, tp, sl)
                        time.sleep(5)
                    elif trades['Signal'].iloc[-1] == -1:
                        print(f'Found SELL signal for {elem}')
                        exchange.set_mode(elem)
                        time.sleep(2)
                        exchange.set_leverage(elem, leverage, leverage)
                        sl_atr = sl_coef * trades.ATR.iloc[-1]
                        tp_sl_ratio = tp_sl_ratio
                        sl = trades['Close'].iloc[-1] + sl_atr
                        tp = trades['Close'].iloc[-1] - sl_atr * tp_sl_ratio
                        exchange.place_order_market('Sell', balance*0.99*leverage*0.97, tp, sl)
                        time.sleep(5)
        print('Waiting 2 mins')
        time.sleep(120)

The system is running correctly but no trades are being placed as the signal is always 0. It should generate a buy or sell signal and then place an order. Tradingview gives a signal but this one can't find any signals.

Upvotes: 0

Views: 130

Answers (1)

user8357568
user8357568

Reputation: 13

Solved my issue by adding the str function to buyLeverage and sellLeverage, because that function needs to receive strings and not numbers.

Upvotes: 0

Related Questions