trading/
trading_example.rs

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