Bypass YAHOO_PAIRS for commodities: direct yfinance fetch for XAU/USD GC=F
This commit is contained in:
+29
-5
@@ -92,14 +92,35 @@ if auto_refresh:
|
|||||||
st.sidebar.info("🔄 Auto-refreshing...")
|
st.sidebar.info("🔄 Auto-refreshing...")
|
||||||
st.rerun(60)
|
st.rerun(60)
|
||||||
|
|
||||||
|
def _fetch_commodity(pair, tf, days):
|
||||||
|
"""Direct Yahoo fetch for commodities (bypass YAHOO_PAIRS issues on Streamlit Cloud)."""
|
||||||
|
import yfinance as yf
|
||||||
|
tickers = {"XAU_USD": "GC=F", "XAG_USD": "SI=F"}
|
||||||
|
yf_tf = {"1m":"1m","5m":"5m","15m":"15m","30m":"30m","1h":"60m","4h":"60m","1d":"1d"}
|
||||||
|
raw = yf.download(tickers[pair], period=f"{max(1,days)}d", interval=yf_tf.get(tf,"5m"), 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]
|
||||||
|
col_map = {"datetime":"time","dat":"time","date":"time",
|
||||||
|
"open":"open","high":"high","low":"low","close":"close","volume":"volume"}
|
||||||
|
df = df.rename(columns={k:v for k,v in col_map.items() if k in df.columns})
|
||||||
|
df["pair"] = pair
|
||||||
|
df["time"] = pd.to_datetime(df["time"])
|
||||||
|
return df.sort_values("time").reset_index(drop=True)
|
||||||
|
|
||||||
# ─── Load Data ───
|
# ─── Load Data ───
|
||||||
@st.cache_data(ttl=120)
|
@st.cache_data(ttl=120)
|
||||||
def load_data(pr, tf_str, days):
|
def load_data(pr, tf_str, days):
|
||||||
df = get_forex_data(pr, tf_str, years_back=max(0.01, days/365), cache=True)
|
if pr in ("XAU_USD", "XAG_USD"):
|
||||||
if df.empty or len(df) < 60:
|
df = _fetch_commodity(pr, tf_str, days)
|
||||||
|
else:
|
||||||
|
df = get_forex_data(pr, tf_str, years_back=max(0.01, days/365), cache=True)
|
||||||
|
if df is None or df.empty or len(df) < 60:
|
||||||
return None
|
return None
|
||||||
# Use scalping strategy for gold, momentum for others
|
if pr in ("XAU_USD", "XAG_USD"):
|
||||||
if "XAU" in pr or "XAG" in pr:
|
|
||||||
df = add_indicators_xau(df)
|
df = add_indicators_xau(df)
|
||||||
df = generate_signals_xau(df, mom_threshold=mom_thresh, atr_sl_mult=sl_mult,
|
df = generate_signals_xau(df, mom_threshold=mom_thresh, atr_sl_mult=sl_mult,
|
||||||
atr_tp_mult=tp_mult, max_hold_bars=max_hold)
|
atr_tp_mult=tp_mult, max_hold_bars=max_hold)
|
||||||
@@ -117,7 +138,10 @@ with st.spinner("Loading market data..."):
|
|||||||
cols = st.columns(len(key_pairs))
|
cols = st.columns(len(key_pairs))
|
||||||
for i, p in enumerate(key_pairs):
|
for i, p in enumerate(key_pairs):
|
||||||
try:
|
try:
|
||||||
d = get_forex_data(p, "5m", 0.02, cache=True)
|
if p in ("XAU_USD", "XAG_USD"):
|
||||||
|
d = _fetch_commodity(p, "5m", 5)
|
||||||
|
else:
|
||||||
|
d = get_forex_data(p, "5m", 0.02, cache=True)
|
||||||
if d is not None and len(d) > 2:
|
if d is not None and len(d) > 2:
|
||||||
l = d.iloc[-1]; pv = d.iloc[-2]
|
l = d.iloc[-1]; pv = d.iloc[-2]
|
||||||
chg = (l["close"] - pv["close"]) / pv["close"] * 100
|
chg = (l["close"] - pv["close"]) / pv["close"] * 100
|
||||||
|
|||||||
Reference in New Issue
Block a user