import math
import requests
import sys

def get_binance_data(symbol, interval):
    url = f"https://api.binance.com/api/v1/klines?symbol={symbol}&interval={interval}"
    try:
        response = requests.get(url)
        response.raise_for_status()
        data = response.json()
    except requests.exceptions.RequestException as e:
        raise Exception(f"Erro ao obter dados da Binance: {e}")

    result = []
    for d in data:
        open_time = int(d[0])
        open_price = d[1]
        high = d[2]
        low = d[3]
        close = d[4]
        volume = d[5]
        close_time = int(d[6])

        result.append({
            'OpenTime': open_time,
            'Open': open_price,
            'High': high,
            'Low': low,
            'Close': close,
            'Volume': volume,
            'CloseTime': close_time
        })
    return result

def calculate_volatility(data):
    if len(data) < 2:
        return 0.0

    log_returns = []
    for i in range(1, len(data)):
        prev_close_str = data[i-1]['Close']
        curr_close_str = data[i]['Close']

        prev_close = float(prev_close_str)
        curr_close = float(curr_close_str)

        if prev_close == 0:
            continue

        log_return = math.log(curr_close / prev_close)
        log_returns.append(log_return)

    if not log_returns:
        return 0.0

    mean_return = sum(log_returns) / len(log_returns)
    variance = sum((r - mean_return) ** 2 for r in log_returns) / len(log_returns)
    volatility = math.sqrt(variance)
    return volatility

if __name__ == "__main__":
    symbol = "BTCUSDT"
    interval = "5m"

    try:
        data = get_binance_data(symbol, interval)
    except Exception as e:
        print(f"Erro: {e}")
        sys.exit(1)

    volatility = calculate_volatility(data)
    print(f"A volatilidade intradiária (5min) do BTC/USD é: {volatility}")