import yfinance as yf
import pandas as pd
import numpy as np
import ta

# Pobranie danych dla złota
gold = yf.download('GC=F', start='2023-01-01', end='2024-01-01')

# Dodanie podstawowych wskaźników
gold['EMA20'] = ta.trend.ema_indicator(gold['Close'], window=20)
gold['EMA50'] = ta.trend.ema_indicator(gold['Close'], window=50)
gold['EMA200'] = ta.trend.ema_indicator(gold['Close'], window=200)
gold['RSI'] = ta.momentum.rsi(gold['Close'])

# Dodanie MACD
gold['MACD'] = ta.trend.macd_diff(gold['Close'])

# Dodanie Bollinger Bands
gold['BB_upper'] = ta.volatility.bollinger_hband(gold['Close'])
gold['BB_middle'] = ta.volatility.bollinger_mavg(gold['Close'])
gold['BB_lower'] = ta.volatility.bollinger_lband(gold['Close'])

# Dodanie ATR (Average True Range) dla zmienności
gold['ATR'] = ta.volatility.average_true_range(gold['High'], gold['Low'], gold['Close'])

# Obliczenie świec japońskich
gold['Body'] = gold['Close'] - gold['Open']
gold['Upper_Shadow'] = gold['High'] - np.maximum(gold['Open'], gold['Close'])
gold['Lower_Shadow'] = np.minimum(gold['Open'], gold['Close']) - gold['Low']

# Generowanie sygnałów
gold['Signal'] = 0

# Warunki dla sygnału kupna (1)
buy_conditions = (
    (gold['EMA20'] > gold['EMA50']) &  # Trend wzrostowy krótkoterminowy
    (gold['EMA50'] > gold['EMA200']) &  # Trend wzrostowy długoterminowy
    (gold['RSI'] > 30) & (gold['RSI'] < 70) &  # RSI w strefie neutralnej
    (gold['MACD'] > 0) &  # MACD powyżej 0
    (gold['Close'] > gold['BB_middle']) &  # Cena powyżej średniej Bollingera
    (gold['ATR'] > gold['ATR'].rolling(window=20).mean())  # Zwiększona zmienność
)

# Warunki dla sygnału sprzedaży (-1)
sell_conditions = (
    (gold['EMA20'] < gold['EMA50']) &  # Trend spadkowy krótkoterminowy
    (gold['EMA50'] < gold['EMA200']) &  # Trend spadkowy długoterminowy
    (gold['RSI'] > 70) &  # RSI w strefie wykupienia
    (gold['MACD'] < 0) &  # MACD poniżej 0
    (gold['Close'] < gold['BB_middle']) &  # Cena poniżej średniej Bollingera
    (gold['ATR'] > gold['ATR'].rolling(window=20).mean())  # Zwiększona zmienność
)

# Przypisanie sygnałów
gold.loc[buy_conditions, 'Signal'] = 1
gold.loc[sell_conditions, 'Signal'] = -1

# Dodanie kolumny z siłą sygnału (0-100%)
gold['Signal_Strength'] = 0
gold.loc[gold['Signal'] == 1, 'Signal_Strength'] = (
    (gold['RSI'] - 30) / 40 * 100 +  # Komponenta RSI
    (gold['Close'] - gold['BB_middle']) / (gold['BB_upper'] - gold['BB_middle']) * 100  # Komponenta Bollingera
) / 2

gold.loc[gold['Signal'] == -1, 'Signal_Strength'] = (
    (70 - gold['RSI']) / 40 * 100 +  # Komponenta RSI
    (gold['BB_middle'] - gold['Close']) / (gold['BB_middle'] - gold['BB_lower']) * 100  # Komponenta Bollingera
) / 2

# Wyświetl ostatnie sygnały
print("\nOstatnie sygnały z ich siłą:")
print(gold[['Close', 'Signal', 'Signal_Strength', 'RSI', 'MACD']].tail(10))

# Zapisz wyniki do pliku CSV
gold.to_csv('gold_signals_enhanced.csv')
