import gradio as gr import pandas as pd import requests from prophet import Prophet import plotly.graph_objs as go import math import numpy as np # Constants for API endpoints OKX_TICKERS_ENDPOINT = "https://www.okx.com/api/v5/market/tickers?instType=SPOT" OKX_CANDLE_ENDPOINT = "https://www.okx.com/api/v5/market/candles" TIMEFRAME_MAPPING = { "1m": "1m", "5m": "5m", "15m": "15m", "30m": "30m", "1h": "1H", "2h": "2H", "4h": "4H", "6h": "6H", "12h": "12H", "1d": "1D", "1w": "1W", } # Function to calculate technical indicators def calculate_technical_indicators(df): # RSI Calculation delta = df['close'].diff() gain = (delta.where(delta > 0, 0)).rolling(window=14).mean() loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean() rs = gain / loss df['RSI'] = 100 - (100 / (1 + rs)) # MACD Calculation exp1 = df['close'].ewm(span=12, adjust=False).mean() exp2 = df['close'].ewm(span=26, adjust=False).mean() df['MACD'] = exp1 - exp2 df['Signal_Line'] = df['MACD'].ewm(span=9, adjust=False).mean() # Bollinger Bands Calculation df['MA20'] = df['close'].rolling(window=20).mean() df['BB_upper'] = df['MA20'] + 2 * df['close'].rolling(window=20).std() df['BB_lower'] = df['MA20'] - 2 * df['close'].rolling(window=20).std() return df # Function to create technical analysis charts def create_technical_charts(df): # Price and Bollinger Bands Chart fig1 = go.Figure() fig1.add_trace(go.Candlestick( x=df['timestamp'], open=df['open'], high=df['high'], low=df['low'], close=df['close'], name='Price' )) fig1.add_trace(go.Scatter(x=df['timestamp'], y=df['BB_upper'], name='Upper BB', line=dict(color='gray', dash='dash'))) fig1.add_trace(go.Scatter(x=df['timestamp'], y=df['BB_lower'], name='Lower BB', line=dict(color='gray', dash='dash'))) fig1.update_layout(title='Price and Bollinger Bands', xaxis_title='Date', yaxis_title='Price') # RSI Chart fig2 = go.Figure() fig2.add_trace(go.Scatter(x=df['timestamp'], y=df['RSI'], name='RSI')) fig2.add_hline(y=70, line_dash="dash", line_color="red") fig2.add_hline(y=30, line_dash="dash", line_color="green") fig2.update_layout(title='RSI Indicator', xaxis_title='Date', yaxis_title='RSI') # MACD Chart fig3 = go.Figure() fig3.add_trace(go.Scatter(x=df['timestamp'], y=df['MACD'], name='MACD')) fig3.add_trace(go.Scatter(x=df['timestamp'], y=df['Signal_Line'], name='Signal Line')) fig3.update_layout(title='MACD', xaxis_title='Date', yaxis_title='Value') return fig1, fig2, fig3 # Fetch available symbols from OKX API def fetch_okx_symbols(): try: resp = requests.get(OKX_TICKERS_ENDPOINT) data = resp.json().get("data", []) symbols = [item["instId"] for item in data if item.get("instType") == "SPOT"] return ["BTC-USDT"] + symbols if symbols else ["BTC-USDT"] except Exception as e: return ["BTC-USDT"] # Fetch historical candle data from OKX API def fetch_okx_candles(symbol, timeframe="1H", total=2000): calls_needed = math.ceil(total / 300) all_data = [] for _ in range(calls_needed): params = {"instId": symbol, "bar": timeframe, "limit": 300} resp = requests.get(OKX_CANDLE_ENDPOINT, params=params) data = resp.json().get("data", []) if not data: break columns = ["ts", "o", "h", "l", "c"] df_chunk = pd.DataFrame(data, columns=columns) df_chunk.rename(columns={"ts": "timestamp", "o": "open", "h": "high", "l": "low", "c": "close"}, inplace=True) all_data.append(df_chunk) if len(data) < 300: break if not all_data: return pd.DataFrame() df_all = pd.concat(all_data) # Convert timestamps to datetime and calculate indicators ...