feat: Add Multi-Pair Divergence Live Trading Module
- 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.
This commit is contained in:
98
check_demo_account.py
Normal file
98
check_demo_account.py
Normal file
@@ -0,0 +1,98 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user