Spaces:
Sleeping
Sleeping
| # strategy/rule_based_strategy.py | |
| """ | |
| Generates buy/sell signals based on: | |
| - Buy when RSI < 30 and SMA20 crosses above SMA50 | |
| - Sell when RSI > 70 and SMA20 crosses below SMA50 | |
| Returns: | |
| pd.DataFrame: DataFrame with new 'Signal' column: 1 = Buy, -1 = Sell, 0 = Hold | |
| """ | |
| import pandas as pd | |
| def generate_signals_sma(df, rsi_col='RSI', sma_short_col='SMA20', sma_long_col='SMA50'): | |
| df = df.copy() | |
| df['SMA_Signal'] = 0 | |
| # Method 1: Use OR condition (either RSI or SMA crossover) | |
| # Buy condition: RSI < 30 OR SMA20 crosses above SMA50 | |
| rsi_oversold = df[rsi_col] < 30 | |
| sma_bullish_cross = (df[sma_short_col].shift(1) < df[sma_long_col].shift(1)) & (df[sma_short_col] > df[sma_long_col]) | |
| buy_signal = rsi_oversold | sma_bullish_cross | |
| df.loc[buy_signal, 'SMA_Signal'] = 1 | |
| # Sell condition: RSI > 70 OR SMA20 crosses below SMA50 | |
| rsi_overbought = df[rsi_col] > 70 | |
| sma_bearish_cross = (df[sma_short_col].shift(1) > df[sma_long_col].shift(1)) & (df[sma_short_col] < df[sma_long_col]) | |
| sell_signal = rsi_overbought | sma_bearish_cross | |
| df.loc[sell_signal, 'SMA_Signal'] = -1 | |
| return df | |
| def generate_signals_ema(df, rsi_col='RSI', ema_short_col='EMA20', ema_long_col='EMA50'): | |
| df = df.copy() | |
| df['EMA_Signal'] = 0 | |
| # Method 1: Use OR condition (either RSI or EMA crossover) | |
| # Buy condition: RSI < 30 OR EMA20 crosses above EMA50 | |
| rsi_oversold = df[rsi_col] < 30 | |
| ema_bullish_cross = (df[ema_short_col].shift(1) < df[ema_long_col].shift(1)) & (df[ema_short_col] > df[ema_long_col]) | |
| buy_signal = rsi_oversold | ema_bullish_cross | |
| df.loc[buy_signal, 'EMA_Signal'] = 1 | |
| # Sell condition: RSI > 70 OR EMA20 crosses below EMA50 | |
| rsi_overbought = df[rsi_col] > 70 | |
| ema_bearish_cross = (df[ema_short_col].shift(1) > df[ema_long_col].shift(1)) & (df[ema_short_col] < df[ema_long_col]) | |
| sell_signal = rsi_overbought | ema_bearish_cross | |
| df.loc[sell_signal, 'EMA_Signal'] = -1 | |
| return df |