import pandas as pd from strategies.base_strategy import BaseStrategy import logging class MaCrossStrategy(BaseStrategy): """ A strategy based on a fast Simple Moving Average (SMA) crossing a slow SMA. """ # --- FIX: Changed 3rd argument from log_level to trade_signal_queue --- def __init__(self, strategy_name: str, params: dict, trade_signal_queue): # --- FIX: Passed trade_signal_queue to the parent class --- super().__init__(strategy_name, params, trade_signal_queue) self.fast_ma_period = self.params.get('short_ma') or self.params.get('fast') or 0 self.slow_ma_period = self.params.get('long_ma') or self.params.get('slow') or 0 def calculate_signals(self, df: pd.DataFrame) -> pd.DataFrame: if not self.fast_ma_period or not self.slow_ma_period or len(df) < self.slow_ma_period: logging.warning(f"Not enough data for MA periods.") df['signal'] = 0 return df df['fast_sma'] = df['close'].rolling(window=self.fast_ma_period).mean() df['slow_sma'] = df['close'].rolling(window=self.slow_ma_period).mean() df['signal'] = 0 df.loc[df['fast_sma'] > df['slow_sma'], 'signal'] = 1 df.loc[df['fast_sma'] < df['slow_sma'], 'signal'] = -1 return df