| from indicators import calculate_ema | |
| class CrossoverAgent: | |
| def run(self, df, short_window=50, long_window=200): | |
| df = calculate_ema(df, short_window) | |
| df = calculate_ema(df, long_window) | |
| df = df.dropna(subset=[f"ema_{short_window}", f"ema_{long_window}"]) | |
| latest = df.iloc[-1] | |
| prev = df.iloc[-2] | |
| crossed_up = ( | |
| prev[f"ema_{short_window}"] < prev[f"ema_{long_window}"] and | |
| latest[f"ema_{short_window}"] > latest[f"ema_{long_window}"] | |
| ) | |
| crossed_down = ( | |
| prev[f"ema_{short_window}"] > prev[f"ema_{long_window}"] and | |
| latest[f"ema_{short_window}"] < latest[f"ema_{long_window}"] | |
| ) | |
| if crossed_up: | |
| return {"crossover": "Bullish", "short": short_window, "long": long_window} | |
| elif crossed_down: | |
| return {"crossover": "Bearish", "short": short_window, "long": long_window} | |
| else: | |
| return {"crossover": "None", "short": short_window, "long": long_window} | |