Spaces:
Running
Running
| import pandas as pd | |
| def calculate_rsi(df, period=14): | |
| delta = df['close'].diff() | |
| gain = delta.where(delta > 0, 0) | |
| loss = -delta.where(delta < 0, 0) | |
| avg_gain = gain.rolling(window=period).mean() | |
| avg_loss = loss.rolling(window=period).mean() | |
| rs = avg_gain / avg_loss | |
| rsi = 100 - (100 / (1 + rs)) | |
| return rsi | |
| def calculate_macd(df): | |
| ema12 = df['close'].ewm(span=12, adjust=False).mean() | |
| ema26 = df['close'].ewm(span=26, adjust=False).mean() | |
| macd = ema12 - ema26 | |
| signal = macd.ewm(span=9, adjust=False).mean() | |
| return macd, signal | |
| def generate_signal(df): | |
| rsi = calculate_rsi(df) | |
| macd, signal = calculate_macd(df) | |
| if len(rsi) < 1 or len(macd) < 1 or len(signal) < 1: | |
| return "Not enough data" | |
| latest_rsi = rsi.iloc[-1] | |
| latest_macd = macd.iloc[-1] | |
| latest_signal = signal.iloc[-1] | |
| if latest_rsi < 30 and latest_macd > latest_signal: | |
| return "BUY" | |
| elif latest_rsi > 70 and latest_macd < latest_signal: | |
| return "SELL" | |
| else: | |
| return "HOLD" | |