Spaces:
Running
Running
Upload 2 files
#1
by 3VVM - opened
- advanced_indicator.py +24 -4
- 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","
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
|
|
|
| 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","
|
| 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:**
|
| 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",
|
| 154 |
-
["BTC-USD",
|
| 155 |
-
["GBPJPY=X",
|
| 156 |
-
["USDJPY=X",
|
| 157 |
-
["ETH-USD",
|
| 158 |
-
["XAUUSD=X",
|
| 159 |
-
["",
|
| 160 |
-
["",
|
|
|
|
|
|
|
| 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 |
)
|