diff --git a/dashboard/xau_monitor.py b/dashboard/xau_monitor.py new file mode 100644 index 0000000..b5d0965 --- /dev/null +++ b/dashboard/xau_monitor.py @@ -0,0 +1,205 @@ +""" +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 โโโ +df = fetch_gold("5m", 3) +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, use_container_width=True, 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("Auto-refresh every 60s ยท Data: Yahoo Finance GC=F
", unsafe_allow_html=True) + +# Auto-refresh +st.rerun(60)