Files changed (2) hide show
  1. advanced_indicator.py +24 -4
  2. app.py +15 -12
advanced_indicator.py CHANGED
@@ -291,7 +291,7 @@ NEUTRAL = "NEUTRAL"
291
  TF_MINUTES: Dict[str, float] = {
292
  "30s": 0.5, "1m": 1, "2m": 2, "3m": 3,
293
  "5m": 5, "10m": 10, "15m": 15, "30m": 30,
294
- "1h": 60, "2h": 120,
295
  }
296
 
297
  # yfinance only supports certain intervals; map unsupported β†’ closest supported
@@ -323,13 +323,14 @@ FOREX_PAIRS: List[str] = [
323
  "EURCAD=X","EURCHF=X","EURNZD=X","GBPAUD=X","GBPCAD=X",
324
  "GBPCHF=X","GBPNZD=X","AUDCAD=X","AUDCHF=X","AUDNZD=X",
325
  "CADCHF=X","NZDCAD=X","NZDCHF=X","SGDJPY=X","USDSGD=X",
 
326
  ]
327
 
328
  CRYPTO_PAIRS: List[str] = [
329
  "BTC-USD","ETH-USD","BNB-USD","XRP-USD","SOL-USD",
330
  "ADA-USD","DOGE-USD","DOT-USD","LTC-USD","AVAX-USD",
331
  "LINK-USD","ATOM-USD","TRX-USD","ETC-USD","XLM-USD",
332
- "NEAR-USD","ALGO-USD","VET-USD","POL-USD","SUI20947-USD",
333
  "OP-USD","ARB11841-USD","HBAR-USD",
334
  "ETH-BTC","BNB-BTC","SOL-BTC",
335
  ]
@@ -557,7 +558,10 @@ class DataFetcher:
557
 
558
  def _ccxt(self, symbol: str, tf: str, lookback: int) -> Optional[pd.DataFrame]:
559
  try:
560
- ccxt_sym = symbol.replace("-", "/").replace("=X", "")
 
 
 
561
  ccxt_tf = {"30s":"1m","3m":"3m","10m":"15m"}.get(tf, tf)
562
  # NOTE: datetime.utcnow() returns a *naive* datetime β€” calling
563
  # .timestamp() on it makes Python assume it's in the LOCAL
@@ -571,7 +575,23 @@ class DataFetcher:
571
  )).timestamp() * 1000
572
  )
573
  ex = ccxt.binance({"enableRateLimit": True})
574
- ohlcv = ex.fetch_ohlcv(ccxt_sym, ccxt_tf, since=since, limit=lookback)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
575
  if not ohlcv:
576
  return None
577
 
 
291
  TF_MINUTES: Dict[str, float] = {
292
  "30s": 0.5, "1m": 1, "2m": 2, "3m": 3,
293
  "5m": 5, "10m": 10, "15m": 15, "30m": 30,
294
+ "1h": 60, "60m": 60, "90m": 90, "2h": 120,
295
  }
296
 
297
  # yfinance only supports certain intervals; map unsupported β†’ closest supported
 
323
  "EURCAD=X","EURCHF=X","EURNZD=X","GBPAUD=X","GBPCAD=X",
324
  "GBPCHF=X","GBPNZD=X","AUDCAD=X","AUDCHF=X","AUDNZD=X",
325
  "CADCHF=X","NZDCAD=X","NZDCHF=X","SGDJPY=X","USDSGD=X",
326
+ "XAUUSD=X","XAGUSD=X", # Gold & Silver (valid YF tickers)
327
  ]
328
 
329
  CRYPTO_PAIRS: List[str] = [
330
  "BTC-USD","ETH-USD","BNB-USD","XRP-USD","SOL-USD",
331
  "ADA-USD","DOGE-USD","DOT-USD","LTC-USD","AVAX-USD",
332
  "LINK-USD","ATOM-USD","TRX-USD","ETC-USD","XLM-USD",
333
+ "NEAR-USD","ALGO-USD","VET-USD","MATIC-USD","SUI20947-USD",
334
  "OP-USD","ARB11841-USD","HBAR-USD",
335
  "ETH-BTC","BNB-BTC","SOL-BTC",
336
  ]
 
558
 
559
  def _ccxt(self, symbol: str, tf: str, lookback: int) -> Optional[pd.DataFrame]:
560
  try:
561
+ # Convert Yahoo Finance symbol to CCXT format
562
+ # e.g. BTC-USD β†’ BTC/USD | ETH-BTC β†’ ETH/BTC | EURUSD=X β†’ EURUSD
563
+ ccxt_sym_base = symbol.replace("-", "/").replace("=X", "")
564
+
565
  ccxt_tf = {"30s":"1m","3m":"3m","10m":"15m"}.get(tf, tf)
566
  # NOTE: datetime.utcnow() returns a *naive* datetime β€” calling
567
  # .timestamp() on it makes Python assume it's in the LOCAL
 
575
  )).timestamp() * 1000
576
  )
577
  ex = ccxt.binance({"enableRateLimit": True})
578
+
579
+ # Binance uses USDT pairs (BTC/USDT), not USD (BTC/USD).
580
+ # Try the original symbol first; if that fails, swap /USD β†’ /USDT.
581
+ # Cross-pair symbols like ETH/BTC are used directly.
582
+ candidates = [ccxt_sym_base]
583
+ if "/USD" in ccxt_sym_base and not ccxt_sym_base.endswith("/USDT"):
584
+ candidates.append(ccxt_sym_base.replace("/USD", "/USDT"))
585
+
586
+ ohlcv = None
587
+ for ccxt_sym in candidates:
588
+ try:
589
+ ohlcv = ex.fetch_ohlcv(ccxt_sym, ccxt_tf, since=since, limit=lookback)
590
+ if ohlcv:
591
+ break
592
+ except Exception:
593
+ continue
594
+
595
  if not ohlcv:
596
  return None
597
 
app.py CHANGED
@@ -14,13 +14,14 @@ FOREX_PAIRS = [
14
  "EURCAD=X","EURCHF=X","EURNZD=X","GBPAUD=X","GBPCAD=X",
15
  "GBPCHF=X","GBPNZD=X","AUDCAD=X","AUDCHF=X","AUDNZD=X",
16
  "CADCHF=X","NZDCAD=X","NZDCHF=X","SGDJPY=X","USDSGD=X",
17
- ] # 30 pairs
 
18
 
19
  CRYPTO_PAIRS = [
20
  "BTC-USD","ETH-USD","BNB-USD","XRP-USD","SOL-USD",
21
  "ADA-USD","DOGE-USD","DOT-USD","LTC-USD","AVAX-USD",
22
  "LINK-USD","ATOM-USD","TRX-USD","ETC-USD","XLM-USD",
23
- "NEAR-USD","ALGO-USD","VET-USD","POL-USD","SUI20947-USD",
24
  "OP-USD","ARB11841-USD","HBAR-USD",
25
  "ETH-BTC","BNB-BTC","SOL-BTC",
26
  ] # 26 pairs
@@ -99,7 +100,7 @@ with gr.Blocks(title="Advanced Forex & Crypto Indicator") as app:
99
  # πŸ“Š Advanced Forex & Crypto Trading Indicator v3.0
100
  **Signals:** 🟒 BUY  |  πŸ”΄ SELL  |  βšͺ NEUTRAL
101
  **Analysis:** 35+ TA Β· ML Ensemble (RF + ET + XGB + LGB + MLP) Β· Wavelet Β· Fourier Β· Hurst
102
- **Timezone:** IST (UTC+5:30)  |  **Forex:** 30 pairs  |  **Crypto:** 26 pairs
103
  """)
104
 
105
  with gr.Row():
@@ -110,7 +111,7 @@ with gr.Blocks(title="Advanced Forex & Crypto Indicator") as app:
110
  allow_custom_value=True,
111
  filterable=True,
112
  scale=3,
113
- info=f"πŸ’± Forex: {len(FOREX_PAIRS)} pairs | πŸͺ™ Crypto: {len(CRYPTO_PAIRS)} pairs"
114
  )
115
  tf_inp = gr.Dropdown(
116
  choices=["1m","2m","3m","5m","10m","15m","30m","1h","2h"],
@@ -150,14 +151,16 @@ with gr.Blocks(title="Advanced Forex & Crypto Indicator") as app:
150
  gr.Examples(
151
  label="⚑ Quick Examples (click to load)",
152
  examples=[
153
- ["EURUSD=X", "15m", "None", 5, 300],
154
- ["BTC-USD", "5m", "None", 5, 300],
155
- ["GBPJPY=X", "1h", "None", 5, 300],
156
- ["USDJPY=X", "30m", "None", 5, 300],
157
- ["ETH-USD", "15m", "None", 5, 300],
158
- ["XAUUSD=X", "1h", "None", 5, 300],
159
- ["", "15m", "forex", 5, 300],
160
- ["", "15m", "crypto", 5, 300],
 
 
161
  ],
162
  inputs=[symbol_inp, tf_inp, scan_inp, topn_inp, lookback_inp],
163
  )
 
14
  "EURCAD=X","EURCHF=X","EURNZD=X","GBPAUD=X","GBPCAD=X",
15
  "GBPCHF=X","GBPNZD=X","AUDCAD=X","AUDCHF=X","AUDNZD=X",
16
  "CADCHF=X","NZDCAD=X","NZDCHF=X","SGDJPY=X","USDSGD=X",
17
+ "XAUUSD=X","XAGUSD=X", # Gold & Silver
18
+ ] # 32 pairs
19
 
20
  CRYPTO_PAIRS = [
21
  "BTC-USD","ETH-USD","BNB-USD","XRP-USD","SOL-USD",
22
  "ADA-USD","DOGE-USD","DOT-USD","LTC-USD","AVAX-USD",
23
  "LINK-USD","ATOM-USD","TRX-USD","ETC-USD","XLM-USD",
24
+ "NEAR-USD","ALGO-USD","VET-USD","MATIC-USD","SUI20947-USD",
25
  "OP-USD","ARB11841-USD","HBAR-USD",
26
  "ETH-BTC","BNB-BTC","SOL-BTC",
27
  ] # 26 pairs
 
100
  # πŸ“Š Advanced Forex & Crypto Trading Indicator v3.0
101
  **Signals:** 🟒 BUY  |  πŸ”΄ SELL  |  βšͺ NEUTRAL
102
  **Analysis:** 35+ TA Β· ML Ensemble (RF + ET + XGB + LGB + MLP) Β· Wavelet Β· Fourier Β· Hurst
103
+ **Timezone:** IST (UTC+5:30)  |  **Forex/Metals:** 32 pairs  |  **Crypto:** 26 pairs
104
  """)
105
 
106
  with gr.Row():
 
111
  allow_custom_value=True,
112
  filterable=True,
113
  scale=3,
114
+ info=f"πŸ’± Forex/Metals: {len(FOREX_PAIRS)} pairs | πŸͺ™ Crypto: {len(CRYPTO_PAIRS)} pairs"
115
  )
116
  tf_inp = gr.Dropdown(
117
  choices=["1m","2m","3m","5m","10m","15m","30m","1h","2h"],
 
151
  gr.Examples(
152
  label="⚑ Quick Examples (click to load)",
153
  examples=[
154
+ ["EURUSD=X", "15m", "None", 5, 300],
155
+ ["BTC-USD", "5m", "None", 5, 300],
156
+ ["GBPJPY=X", "1h", "None", 5, 300],
157
+ ["USDJPY=X", "30m", "None", 5, 300],
158
+ ["ETH-USD", "15m", "None", 5, 300],
159
+ ["XAUUSD=X", "1h", "None", 5, 300],
160
+ ["MATIC-USD", "15m", "None", 5, 300],
161
+ ["SOL-USD", "5m", "None", 5, 300],
162
+ ["", "15m", "forex", 5, 300],
163
+ ["", "15m", "crypto", 5, 300],
164
  ],
165
  inputs=[symbol_inp, tf_inp, scan_inp, topn_inp, lookback_inp],
166
  )