""" XAU/USD Gold Signals โ Clean Monitor Shows: current signal, entry, SL, TP. Nothing else. """ import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent)) import warnings warnings.filterwarnings("ignore") import streamlit as st import pandas as pd import numpy as np import yfinance as yf from datetime import datetime, timezone st.set_page_config(page_title="XAU Signals", page_icon="๐ฅ", layout="centered") # Hide streamlit branding st.markdown(""" """, unsafe_allow_html=True) # โโโ Import strategy โโโ from strategies.xau_scalp import add_indicators_xau, generate_signals_xau, calculate_performance_xau # โโโ Fetch XAU/USD data directly โโโ def fetch_gold(tf="5m", days=3): raw = yf.download("GC=F", period=f"{max(1,days)}d", interval=tf, progress=False) if raw is None or raw.empty: return None if isinstance(raw.columns, pd.MultiIndex): raw.columns = raw.columns.get_level_values(0) df = raw.reset_index() df.columns = [c.lower().strip() for c in df.columns] m = {"datetime":"time","date":"time","open":"open","high":"high","low":"low","close":"close","volume":"volume"} df = df.rename(columns={k:v for k,v in m.items() if k in df.columns}) df["time"] = pd.to_datetime(df["time"]) return df.sort_values("time").reset_index(drop=True) def format_price(v): return f"${v:,.2f}" if v == v else "โ" # โโโ Load & compute (cached to avoid rate limits) โโโ @st.cache_data(ttl=300) def load_gold(): return fetch_gold("5m", 3) df = load_gold() if df is None or len(df) < 60: st.error("Failed to load XAU/USD data. Try again in a minute.") st.stop() df = add_indicators_xau(df) df = generate_signals_xau(df, mom_threshold=0.55, atr_sl_mult=1.2, atr_tp_mult=2.0, max_hold_bars=4) latest = df.iloc[-1] pos = latest.get("position", 0) price = latest["close"] rsi_val = latest.get("rsi", 50) atr_val = latest.get("atr_pct", 0) # โโโ Find latest signal โโโ signals = df[df["signal"] != 0] last_signal = signals.iloc[-1] if not signals.empty else None # Also look at last 5 for history recent_signals = signals.tail(10) if not signals.empty else pd.DataFrame() # โโโ UI โโโ cols = st.columns([1, 2, 1]) with cols[1]: st.markdown(f"
{datetime.now(timezone.utc).strftime('%H:%M UTC')}
", unsafe_allow_html=True) # โโโ Current Price โโโ st.markdown(f"Price (last 50 candles)
", unsafe_allow_html=True) chart_data = df[["time", "close"]].tail(50).copy() chart_data.columns = ["t", "price"] st.line_chart(chart_data.set_index("t"), height=150, color="#FFD600") # โโโ Recent Signal History โโโ if not recent_signals.empty: st.markdown("---") st.markdown("Recent Signals
", unsafe_allow_html=True) hist = recent_signals[["time", "close", "signal", "exit_reason"]].copy() hist["time"] = hist["time"].dt.strftime("%H:%M") hist["signal"] = hist["signal"].map({1: "๐ข BUY", -1: "๐ด SELL"}) hist = hist.rename(columns={"time": "T", "close": "Price", "signal": "Sig", "exit_reason": "Exit"}) hist["Exit"] = hist["Exit"].replace("", "โ") st.dataframe(hist, width="stretch", hide_index=True, height=200) else: st.markdown("---") st.markdown("No signals generated in recent data.
", unsafe_allow_html=True) # โโโ Footer โโโ st.markdown("---") st.markdown("Data: Yahoo Finance GC=F ยท Refreshes every 5 min ยท Pull down to reload
", unsafe_allow_html=True)