- Introduced a new module for live trading based on the Multi-Pair Divergence Strategy. - Implemented configuration classes for OKX API and multi-pair settings. - Developed data feed functionality to fetch real-time OHLCV and funding data for multiple assets. - Created a trading bot orchestrator to manage trading cycles, including entry and exit signals based on ML model predictions. - Added comprehensive logging and error handling for robust operation. - Included a README with setup instructions and usage guidelines for the new module.
99 lines
3.4 KiB
Python
99 lines
3.4 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Check OKX demo account positions and recent orders.
|
|
|
|
Usage:
|
|
uv run python check_demo_account.py
|
|
"""
|
|
import sys
|
|
from pathlib import Path
|
|
from datetime import datetime, timezone
|
|
|
|
sys.path.insert(0, str(Path(__file__).parent))
|
|
|
|
from live_trading.config import OKXConfig
|
|
import ccxt
|
|
|
|
|
|
def main():
|
|
"""Check demo account status."""
|
|
config = OKXConfig()
|
|
|
|
print(f"\n{'='*60}")
|
|
print(f" OKX Demo Account Check")
|
|
print(f"{'='*60}")
|
|
print(f" Demo Mode: {config.demo_mode}")
|
|
print(f" API Key: {config.api_key[:8]}..." if config.api_key else " API Key: NOT SET")
|
|
print(f"{'='*60}\n")
|
|
|
|
exchange = ccxt.okx({
|
|
'apiKey': config.api_key,
|
|
'secret': config.secret,
|
|
'password': config.password,
|
|
'sandbox': config.demo_mode,
|
|
'options': {'defaultType': 'swap'},
|
|
'enableRateLimit': True,
|
|
})
|
|
|
|
# Check balance
|
|
print("--- BALANCE ---")
|
|
balance = exchange.fetch_balance()
|
|
usdt = balance.get('USDT', {})
|
|
print(f"USDT Total: {usdt.get('total', 0):.2f}")
|
|
print(f"USDT Free: {usdt.get('free', 0):.2f}")
|
|
print(f"USDT Used: {usdt.get('used', 0):.2f}")
|
|
|
|
# Check all balances
|
|
print("\n--- ALL NON-ZERO BALANCES ---")
|
|
for currency, data in balance.items():
|
|
if isinstance(data, dict) and data.get('total', 0) > 0:
|
|
print(f"{currency}: total={data.get('total', 0):.6f}, free={data.get('free', 0):.6f}")
|
|
|
|
# Check open positions
|
|
print("\n--- OPEN POSITIONS ---")
|
|
positions = exchange.fetch_positions()
|
|
open_positions = [p for p in positions if abs(float(p.get('contracts', 0))) > 0]
|
|
|
|
if open_positions:
|
|
for pos in open_positions:
|
|
print(f" {pos['symbol']}: {pos['side']} {pos['contracts']} contracts @ {pos.get('entryPrice', 'N/A')}")
|
|
print(f" Unrealized PnL: {pos.get('unrealizedPnl', 'N/A')}")
|
|
else:
|
|
print(" No open positions")
|
|
|
|
# Check recent orders (last 50)
|
|
print("\n--- RECENT ORDERS (last 24h) ---")
|
|
try:
|
|
# Fetch closed orders for AVAX
|
|
orders = exchange.fetch_orders('AVAX/USDT:USDT', limit=20)
|
|
if orders:
|
|
for order in orders[-10:]: # Last 10
|
|
ts = datetime.fromtimestamp(order['timestamp']/1000, tz=timezone.utc)
|
|
print(f" [{ts.strftime('%H:%M:%S')}] {order['side'].upper()} {order['amount']} AVAX @ {order.get('average', order.get('price', 'market'))}")
|
|
print(f" Status: {order['status']}, Filled: {order.get('filled', 0)}, ID: {order['id']}")
|
|
else:
|
|
print(" No recent AVAX orders")
|
|
except Exception as e:
|
|
print(f" Could not fetch orders: {e}")
|
|
|
|
# Check order history more broadly
|
|
print("\n--- ORDER HISTORY (AVAX) ---")
|
|
try:
|
|
# Try fetching my trades
|
|
trades = exchange.fetch_my_trades('AVAX/USDT:USDT', limit=10)
|
|
if trades:
|
|
for trade in trades[-5:]:
|
|
ts = datetime.fromtimestamp(trade['timestamp']/1000, tz=timezone.utc)
|
|
print(f" [{ts.strftime('%Y-%m-%d %H:%M:%S')}] {trade['side'].upper()} {trade['amount']} @ {trade['price']}")
|
|
print(f" Fee: {trade.get('fee', {}).get('cost', 'N/A')} {trade.get('fee', {}).get('currency', '')}")
|
|
else:
|
|
print(" No recent AVAX trades")
|
|
except Exception as e:
|
|
print(f" Could not fetch trades: {e}")
|
|
|
|
print(f"\n{'='*60}\n")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|