trading/
trading_example.rs

1use bybit_rust_api::dto::{CancelOrderRequest, PlaceOrderRequest};
2use bybit_rust_api::{ApiKeyPair, Category, OrderClient, OrderType, RestClient, Side, TimeInForce};
3use std::env;
4
5#[tokio::main]
6async fn main() -> anyhow::Result<()> {
7    // Get API credentials from environment variables
8    let api_key = env::var("BYBIT_API_KEY").expect("BYBIT_API_KEY not set");
9    let api_secret = env::var("BYBIT_API_SECRET").expect("BYBIT_API_SECRET not set");
10
11    // Create API key pair
12    let api_key_pair = ApiKeyPair::new("trading".to_string(), api_key, api_secret);
13
14    // Create REST client for testnet
15    let rest_client = RestClient::new(api_key_pair, "https://api-testnet.bybit.com".to_string());
16
17    // Create Order client
18    let order_client = OrderClient::new(rest_client);
19
20    // Place a limit order
21    println!("Placing a limit order...");
22    let place_order_request = PlaceOrderRequest {
23        category: Category::Spot,
24        symbol: "BTCUSDT".to_string(),
25        side: Side::Buy,
26        order_type: OrderType::Limit,
27        qty: "0.001".to_string(),
28        price: Some("40000".to_string()),
29        time_in_force: Some(TimeInForce::GTC),
30        order_link_id: Some(format!("rust_sdk_test_{}", chrono::Utc::now().timestamp())),
31        is_leverage: None,
32        trigger_price: None,
33        trigger_direction: None,
34        trigger_by: None,
35        order_filter: None,
36        order_iv: None,
37        position_idx: None,
38        take_profit: None,
39        stop_loss: None,
40        tp_trigger_by: None,
41        sl_trigger_by: None,
42        reduce_only: None,
43        close_on_trigger: None,
44        smp_type: None,
45        mmp: None,
46        tpsl_mode: None,
47        tp_limit_price: None,
48        sl_limit_price: None,
49        tp_order_type: None,
50        sl_order_type: None,
51    };
52
53    match order_client.place_order(place_order_request).await {
54        Ok(response) => {
55            println!("Order placed successfully!");
56            println!("Order ID: {}", response.result.order_id);
57            println!("Order Link ID: {}", response.result.order_link_id);
58
59            // Get open orders
60            println!("\nGetting open orders...");
61            let open_orders = order_client
62                .get_open_orders(
63                    Category::Spot,
64                    Some("BTCUSDT"),
65                    None,
66                    None,
67                    None,
68                    None,
69                    None,
70                    None,
71                    Some(10),
72                    None,
73                )
74                .await?;
75            println!("Open orders count: {}", open_orders.result.list.len());
76
77            // Cancel the order
78            println!("\nCancelling the order...");
79            let cancel_request = CancelOrderRequest {
80                category: Category::Spot,
81                symbol: "BTCUSDT".to_string(),
82                order_id: Some(response.result.order_id.clone()),
83                order_link_id: None,
84                order_filter: None,
85            };
86
87            let cancel_response = order_client.cancel_order(cancel_request).await?;
88            println!("Order cancelled successfully!");
89            println!("Cancelled Order ID: {}", cancel_response.result.order_id);
90        }
91        Err(e) => {
92            eprintln!("Failed to place order: {}", e);
93        }
94    }
95
96    // Get order history
97    println!("\nGetting order history...");
98    let order_history = order_client
99        .get_order_history(
100            Category::Spot,
101            Some("BTCUSDT"),
102            None,
103            None,
104            None,
105            None,
106            None,
107            None,
108            None,
109            None,
110            Some(10),
111            None,
112        )
113        .await?;
114    println!("Order history count: {}", order_history.result.list.len());
115
116    Ok(())
117}