Reputation: 13
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
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