Разобраться со скриптом на питоне
Написан скрипт на python для парсинга данных с биржи OKX за последние 5 лет, всё реализовано согласно документации отсюда: https://www.okx.com/docs-v5/en/#order-book-trading...Но при работе он отдаёт No data returned, No data available. Код скрипта:import requestsimport pandas as pdfrom datetime import datetime, timedeltaimport time# Function to fetch historical data from OKX APIdef fetch_candlesticks(inst_id, bar='1D', start_time=None, end_time=None, limit=100): url = f"https://www.okx.com/api/v5/market/history-candles" params = { 'instId': inst_id, 'bar': bar, 'limit': limit, } if start_time: params['after'] = start_time # Параметр для получения данных после этой временной метки if end_time: params['before'] = end_time # Параметр для получения данных до этой временной метки print(f"Requesting data for {inst_id} | Bar: {bar} | After: {start_time} | Before: {end_time}") response = requests.get(url, params=params) # Check for rate limit errors (Too many requests) if response.status_code == 429: print("Rate limit exceeded. Waiting for 2 seconds before retrying...") time.sleep(2) # Wait before retrying return fetch_candlesticks(inst_id, bar, start_time, end_time, limit) if response.status_code == 200: data = response.json().get("data", []) print(f"Received {len(data)} rows of data.") return data else: print(f"Error fetching data for {inst_id} with timeframe {bar}: {response.status_code}") return []# Function to get all historical data for a specific timeframe and perioddef fetch_full_history(inst_id, bar='1D', years=5): end_time = int(datetime.now().timestamp() * 1000) # Текущий момент в миллисекундах start_time = int((datetime.now() - timedelta(days=years * 365)).timestamp() * 1000) # 5 лет назад all_data = [] while end_time > start_time: data = fetch_candlesticks(inst_id, bar=bar, end_time=end_time) if not data: print(f"No data returned for {inst_id}. Stopping further requests.") break all_data.extend(data) end_time = int(data[-1][0]) # Обновление end_time до временной метки последней свечи print(f"Updated end_time to {end_time} (millis). Continuing to fetch earlier data.") return all_data# Function to save data to Exceldef save_to_excel(inst_id, data_dict, file_name='candlesticks_data.xlsx'): with pd.ExcelWriter(file_name) as writer: for timeframe, data in data_dict.items(): if not data: print(f"No data available for {inst_id} with timeframe {timeframe}. Skipping.") continue # Этот continue должен быть на том же уровне отступа # Debug: Print the first row to check structure print(f"Sample data for {inst_id} [{timeframe}]: {data[0]}") # Fix for 9 columns: drop duplicate Quote Volume columns = ['Timestamp', 'Open', 'High', 'Low', 'Close', 'Volume', 'Quote Volume', 'Ignored', 'Number of Trades'] try: df = pd.DataFrame(data, columns=columns) # Drop the 'Ignored' column df.drop(columns=['Ignored'], inplace=True) except Exception as e: print(f"Error creating DataFrame for {inst_id} [{timeframe}]: {e}") continue # Этот continue должен быть на том же уровне отступа # Convert Timestamp to human-readable format if 'Timestamp' in df.columns: df['Timestamp'] = pd.to_numeric(df['Timestamp']) # Преобразование в число df['Timestamp'] = pd.to_datetime(df['Timestamp'], unit='ms') df['Date'] = df['Timestamp'].dt.date df['Time'] = df['Timestamp'].dt.strftime('%H:%M:%S') df = df[['Date', 'Time', 'Open', 'High', 'Low', 'Close', 'Volume', 'Quote Volume', 'Number of Trades']] # Save data to the respective sheet try: df.to_excel(writer, sheet_name=f'{timeframe}', index=False) except Exception as e: print(f"Error writing to Excel for {inst_id} [{timeframe}]: {e}") continue # Этот continue также должен быть на том же уровне отступа print(f"Data saved to {file_name}")# List of trading pairs (instrument IDs) with pairs that include USDTinst_ids = [ 'BTC-USDT', 'ETH-USDT', 'SOL-USDT', 'TON-USDT', 'XRP-USDT', # Use USDT pairs '1INCH-USDT', 'ADA-USDT', 'ATOM-USDT', 'DOT-USDT', 'EGLD-USDT', # Update to available USDT pairs 'NEAR-USDT', 'TRX-USDT', 'ISP-USDT', 'KSM-USDT', 'ALGO-USDT']# List of timeframes (5m, 15m, 1H, 1D)timeframes = ['5m', '15m', '1H', '1D'] # Таймфреймы, которые вы указали# Fetch data and save to Excel for each trading pairfor inst_id in inst_ids: data_dict = {} for timeframe in timeframes: print(f"Fetching data for {inst_id} with timeframe {timeframe}...") data = fetch_full_history(inst_id, bar=timeframe, years=5) if data: # Проверяем, что данные не пустые data_dict[timeframe] = data if not data_dict: print(f"No data available for {inst_id}. Skipping.") continue # Этот continue должен быть на том же уровне отступа file_name = f"{inst_id}_candlesticks.xlsx" save_to_excel(inst_id, data_dict, file_name=file_name)
Bots