28 lines
1.0 KiB
Python
28 lines
1.0 KiB
Python
import pandas as pd
|
|
from strategies.base_strategy import BaseStrategy
|
|
import logging
|
|
|
|
class SingleSmaStrategy(BaseStrategy):
|
|
"""
|
|
A strategy based on the price crossing a single Simple Moving Average (SMA).
|
|
"""
|
|
# --- FIX: Added trade_signal_queue to the constructor ---
|
|
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.sma_period = self.params.get('sma_period', 0)
|
|
|
|
def calculate_signals(self, df: pd.DataFrame) -> pd.DataFrame:
|
|
if not self.sma_period or len(df) < self.sma_period:
|
|
logging.warning(f"Not enough data for SMA period {self.sma_period}.")
|
|
df['signal'] = 0
|
|
return df
|
|
|
|
df['sma'] = df['close'].rolling(window=self.sma_period).mean()
|
|
|
|
df['signal'] = 0
|
|
df.loc[df['close'] > df['sma'], 'signal'] = 1
|
|
df.loc[df['close'] < df['sma'], 'signal'] = -1
|
|
|
|
return df
|