crypto_signal / signals /strategy.py
netflypsb's picture
Create signals/strategy.py
5a8fb12 verified
import pandas as pd
from indicators.sma import calculate_sma
from indicators.bollinger_bands import calculate_bollinger_bands
def generate_signals(data):
"""
Analyzes technical indicators to generate buy and sell signals.
Args:
data (pd.DataFrame): DataFrame containing the historical price data and indicators.
Returns:
pd.DataFrame: The input DataFrame augmented with buy and sell signals.
"""
# Ensure the necessary indicators are calculated and present in the DataFrame
if 'SMA_21' not in data.columns or 'SMA_50' not in data.columns:
data['SMA_21'] = calculate_sma(data, period=21)
data['SMA_50'] = calculate_sma(data, period=50)
if 'BB_Upper' not in data.columns:
data = calculate_bollinger_bands(data)
# Initialize columns for signals
data['Buy_Signal'] = False
data['Sell_Signal'] = False
# Loop through the DataFrame to find buy and sell conditions
for i in range(2, len(data)):
# Buy condition: SMA_21 crosses above SMA_50, and has been below SMA_50 for at least 10 periods
if data['SMA_21'].iloc[i] > data['SMA_50'].iloc[i] and data['SMA_21'].iloc[i-1] <= data['SMA_50'].iloc[i-1]:
if data['SMA_50'].iloc[i-10:i-1].isnull().sum() < 1: # Ensure there's enough data
if (data['SMA_21'].iloc[i-10:i-1] < data['SMA_50'].iloc[i-10:i-1]).all():
data.at[data.index[i], 'Buy_Signal'] = True
# Sell condition: Price reaches or exceeds the upper Bollinger band for at least 3 periods after being below it for 5 or more periods
if data['close'].iloc[i] >= data['BB_Upper'].iloc[i] and data['close'].iloc[i-1] < data['BB_Upper'].iloc[i-1] and data['close'].iloc[i-2] < data['BB_Upper'].iloc[i-2]:
if (data['close'].iloc[i-5:i-1] < data['BB_Upper'].iloc[i-5:i-1]).all():
data.at[data.index[i], 'Sell_Signal'] = True
return data
# Example usage:
# Assuming `price_data` is a pandas DataFrame with columns including 'date', 'open', 'high', 'low', 'close', and 'volume':
# signals_data = generate_signals(price_data)