На главную

Разобраться со скриптом на питоне

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

Разработчик Python/Data Science

Анализ программного обеспечения по обработке документов с большим количеством данным и улучшение его производительности.... цена договорная 2025-03-18

Сделать дизайн-проект квартиры 71 м2 (для всех)

Квартира в бетоне. Необходимо сделать полный проект для выполнения ремонта и представления всех документов в УК (СРО). Необходимо подобрать сантехнику, электрику,...

Нарисовать план схему железобетонного блока с лестницей

Нарисовать план схему железобетонного блока (комнаты) с лестницей с расчетом на несколько таких блоков поставленных друг на... цена договорная 2025-03-28