#!/usr/bin/env python3 """ Test Bybit public API functionality (no authentication required) """ import os import sys import time import logging # Add the project root to the path sys.path.append(os.path.dirname(os.path.abspath(__file__))) from NN.exchanges.bybit_rest_client import BybitRestClient # Configure logging logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__) def test_public_api(): """Test public API endpoints""" print("=" * 60) print("BYBIT PUBLIC API TEST") print("=" * 60) # Test both testnet and live for public endpoints for testnet in [True, False]: env_name = "TESTNET" if testnet else "LIVE" print(f"\nšŸ”„ Testing {env_name} environment...") client = BybitRestClient( api_key="dummy", api_secret="dummy", testnet=testnet ) # Test 1: Server time try: server_time = client.get_server_time() time_second = server_time.get('result', {}).get('timeSecond') print(f"āœ… Server time: {time_second}") except Exception as e: print(f"āŒ Server time failed: {e}") continue # Test 2: Get ticker for ETHUSDT try: ticker = client.get_ticker('ETHUSDT', 'linear') ticker_data = ticker.get('result', {}).get('list', []) if ticker_data: data = ticker_data[0] print(f"āœ… ETH/USDT ticker:") print(f" Last Price: ${float(data.get('lastPrice', 0)):.2f}") print(f" 24h Volume: {float(data.get('volume24h', 0)):.2f}") print(f" 24h Change: {float(data.get('price24hPcnt', 0)) * 100:.2f}%") else: print("āŒ No ticker data received") except Exception as e: print(f"āŒ Ticker failed: {e}") # Test 3: Get instruments info try: instruments = client.get_instruments_info('linear') instruments_list = instruments.get('result', {}).get('list', []) eth_instruments = [i for i in instruments_list if 'ETH' in i.get('symbol', '')] print(f"āœ… Found {len(eth_instruments)} ETH instruments") for instr in eth_instruments[:3]: # Show first 3 print(f" {instr.get('symbol')} - Status: {instr.get('status')}") except Exception as e: print(f"āŒ Instruments failed: {e}") # Test 4: Get orderbook try: orderbook = client.get_orderbook('ETHUSDT', 'linear', 5) ob_data = orderbook.get('result', {}) bids = ob_data.get('b', []) asks = ob_data.get('a', []) if bids and asks: print(f"āœ… Orderbook (top 3):") print(f" Best bid: ${float(bids[0][0]):.2f} (qty: {float(bids[0][1]):.4f})") print(f" Best ask: ${float(asks[0][0]):.2f} (qty: {float(asks[0][1]):.4f})") spread = float(asks[0][0]) - float(bids[0][0]) print(f" Spread: ${spread:.2f}") else: print("āŒ No orderbook data received") except Exception as e: print(f"āŒ Orderbook failed: {e}") print(f"šŸ“Š {env_name} environment test completed") def test_live_authentication(): """Test live authentication (if user wants to test with live credentials)""" print("\n" + "=" * 60) print("BYBIT LIVE AUTHENTICATION TEST") print("=" * 60) print("āš ļø This will test with LIVE credentials (not testnet)") # Load environment variables try: from dotenv import load_dotenv load_dotenv() except ImportError: # If dotenv is not available, try to load .env manually if os.path.exists('.env'): with open('.env', 'r') as f: for line in f: if line.strip() and not line.startswith('#'): key, value = line.strip().split('=', 1) os.environ[key] = value api_key = os.getenv('BYBIT_API_KEY') api_secret = os.getenv('BYBIT_API_SECRET') if not api_key or not api_secret: print("āŒ No API credentials found in environment") return print(f"šŸ”‘ Using API key: {api_key[:8]}...") # Test with live environment (testnet=False) client = BybitRestClient( api_key=api_key, api_secret=api_secret, testnet=False # Use live environment ) # Test connectivity try: if client.test_connectivity(): print("āœ… Basic connectivity OK") else: print("āŒ Basic connectivity failed") return except Exception as e: print(f"āŒ Connectivity error: {e}") return # Test authentication try: if client.test_authentication(): print("āœ… Authentication successful!") # Get account info account_info = client.get_account_info() accounts = account_info.get('result', {}).get('list', []) if accounts: print("šŸ“Š Account information:") for account in accounts: account_type = account.get('accountType', 'Unknown') print(f" Account Type: {account_type}") coins = account.get('coin', []) usdt_balance = None for coin in coins: if coin.get('coin') == 'USDT': usdt_balance = float(coin.get('walletBalance', 0)) break if usdt_balance: print(f" USDT Balance: ${usdt_balance:.2f}") # Show positions if any try: positions = client.get_positions('linear') pos_list = positions.get('result', {}).get('list', []) active_positions = [p for p in pos_list if float(p.get('size', 0)) != 0] if active_positions: print(f" Active Positions: {len(active_positions)}") for pos in active_positions: symbol = pos.get('symbol') side = pos.get('side') size = float(pos.get('size', 0)) pnl = float(pos.get('unrealisedPnl', 0)) print(f" {symbol}: {side} {size} (PnL: ${pnl:.2f})") else: print(" No active positions") except Exception as e: print(f" āš ļø Could not get positions: {e}") return True else: print("āŒ Authentication failed") return False except Exception as e: print(f"āŒ Authentication error: {e}") return False def main(): """Main function""" print("šŸš€ Starting Bybit API Tests...") # Test public API test_public_api() # Ask user if they want to test live authentication print("\n" + "=" * 60) response = input("Do you want to test live authentication? (y/N): ").lower() if response == 'y' or response == 'yes': success = test_live_authentication() if success: print("\nāœ… Live authentication test passed!") print("šŸŽÆ Your Bybit integration is working!") else: print("\nāŒ Live authentication test failed") else: print("\nšŸ“‹ Skipping live authentication test") print("\nšŸŽ‰ Public API tests completed successfully!") print("šŸ“ˆ Bybit integration is functional for market data") if __name__ == "__main__": main()