File size: 1,565 Bytes
68025ee
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import logging
import requests

logger = logging.getLogger(__name__)


def fetch_fear_greed() -> dict:
    """Fetch Fear & Greed index from alternative.me (no API key needed)."""
    try:
        resp = requests.get("https://api.alternative.me/fng/?limit=1", timeout=10)
        resp.raise_for_status()
        data = resp.json()
        item = data["data"][0]
        return {
            "value": int(item["value"]),
            "label": item["value_classification"],
            "timestamp": item["timestamp"],
        }
    except Exception as e:
        logger.warning(f"Fear & Greed fetch failed: {e}")
        return {"value": 50, "label": "Neutral", "timestamp": ""}


def fetch_funding_rate(asset: str) -> float | None:
    """Fetch current funding rate from Binance public API."""
    symbol_map = {"BTC/USDT": "BTCUSDT", "ETH/USDT": "ETHUSDT"}
    symbol = symbol_map.get(asset, asset.replace("/", ""))
    try:
        url = "https://fapi.binance.com/fapi/v1/fundingRate"
        params = {"symbol": symbol, "limit": 1}
        resp = requests.get(url, params=params, timeout=10)
        resp.raise_for_status()
        data = resp.json()
        if data:
            return float(data[-1]["fundingRate"]) * 100  # as percentage
    except Exception as e:
        logger.warning(f"Funding rate fetch failed for {asset}: {e}")
    return None


def fetch_onchain_data(asset: str) -> dict:
    """Aggregate all on-chain data for one asset."""
    return {
        "fear_greed": fetch_fear_greed(),
        "funding_rate": fetch_funding_rate(asset),
    }