Spaces:
Running
Running
Create indicators.py
Browse files- indicators.py +38 -0
indicators.py
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pandas as pd
|
| 2 |
+
|
| 3 |
+
def calculate_rsi(df, period=14):
|
| 4 |
+
delta = df['close'].diff()
|
| 5 |
+
gain = delta.where(delta > 0, 0)
|
| 6 |
+
loss = -delta.where(delta < 0, 0)
|
| 7 |
+
|
| 8 |
+
avg_gain = gain.rolling(window=period).mean()
|
| 9 |
+
avg_loss = loss.rolling(window=period).mean()
|
| 10 |
+
|
| 11 |
+
rs = avg_gain / avg_loss
|
| 12 |
+
rsi = 100 - (100 / (1 + rs))
|
| 13 |
+
return rsi
|
| 14 |
+
|
| 15 |
+
def calculate_ema(df, period=20):
|
| 16 |
+
return df['close'].ewm(span=period, adjust=False).mean()
|
| 17 |
+
|
| 18 |
+
def calculate_macd(df):
|
| 19 |
+
ema12 = df['close'].ewm(span=12, adjust=False).mean()
|
| 20 |
+
ema26 = df['close'].ewm(span=26, adjust=False).mean()
|
| 21 |
+
macd = ema12 - ema26
|
| 22 |
+
signal = macd.ewm(span=9, adjust=False).mean()
|
| 23 |
+
return macd, signal
|
| 24 |
+
|
| 25 |
+
def generate_signal(df):
|
| 26 |
+
rsi = calculate_rsi(df)
|
| 27 |
+
macd, signal = calculate_macd(df)
|
| 28 |
+
|
| 29 |
+
latest_rsi = rsi.iloc[-1]
|
| 30 |
+
latest_macd = macd.iloc[-1]
|
| 31 |
+
latest_signal = signal.iloc[-1]
|
| 32 |
+
|
| 33 |
+
if latest_rsi < 30 and latest_macd > latest_signal:
|
| 34 |
+
return "BUY"
|
| 35 |
+
elif latest_rsi > 70 and latest_macd < latest_signal:
|
| 36 |
+
return "SELL"
|
| 37 |
+
else:
|
| 38 |
+
return "HOLD"
|