#![allow(clippy::disallowed_methods)]
use ccxt_exchanges::okx::OkxBuilder;
use dotenvy::dotenv;
use std::env;
#[tokio::main]
async fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
dotenv().ok();
println!("=== OKX Account Management Example ===\n");
let api_key = env::var("OKX_API_KEY").unwrap_or_default();
let secret = env::var("OKX_SECRET").unwrap_or_default();
let passphrase = env::var("OKX_PASSPHRASE").unwrap_or_default();
if api_key.is_empty() || secret.is_empty() || passphrase.is_empty() {
println!("⚠️ Skipping example: OKX_API_KEY, OKX_SECRET, or OKX_PASSPHRASE not set");
println!(" Please set these environment variables to run this example.");
return Ok(());
}
let exchange = OkxBuilder::new()
.api_key(&api_key)
.secret(&secret)
.passphrase(&passphrase)
.build()?;
println!("1. 【fetch_balance】Get account balance");
match exchange.fetch_balance().await {
Ok(balance) => {
println!(" ✓ Successfully fetched balance");
println!(" Non-zero balances:");
let mut found_any = false;
for (currency, entry) in balance.balances.iter() {
if entry.total > rust_decimal::Decimal::ZERO {
println!(
" - {}: Total={}, Free={}, Used={}",
currency, entry.total, entry.free, entry.used
);
found_any = true;
}
}
if !found_any {
println!(" (No non-zero balances found)");
}
}
Err(e) => println!(" ✗ Error: {}", e),
}
println!();
println!("2. 【fetch_my_trades】Get my recent trades (BTC/USDT)");
if let Err(e) = exchange.load_markets(false).await {
println!(" ⚠️ Failed to load markets: {}", e);
} else {
match exchange.fetch_my_trades("BTC/USDT", None, Some(5)).await {
Ok(trades) => {
if trades.is_empty() {
println!(" ℹ No recent trades found");
} else {
println!(" ✓ Found {} recent trades:", trades.len());
for (i, trade) in trades.iter().enumerate() {
println!(
" {}. {:?} {} @ {} ({})",
i + 1,
trade.side,
trade.amount,
trade.price,
trade.datetime.as_deref().unwrap_or("N/A")
);
}
}
}
Err(e) => println!(" ✗ Error: {}", e),
}
}
println!();
println!("=== Example Complete ===");
Ok(())
}