1use std::time::Duration;
17
18use futures_util::StreamExt;
19use nautilus_model::{
20 enums::{OrderSide, OrderType},
21 identifiers::{ClientOrderId, InstrumentId, StrategyId, TraderId},
22 types::Quantity,
23};
24use nautilus_okx::{
25 common::enums::{OKXInstrumentType, OKXTradeMode},
26 http::OKXHttpClient,
27 websocket::client::OKXWebSocketClient,
28};
29use tokio::{pin, signal};
30use tracing::level_filters::LevelFilter;
31
32#[tokio::main]
33async fn main() -> Result<(), Box<dyn std::error::Error>> {
34 tracing_subscriber::fmt()
35 .with_max_level(LevelFilter::TRACE)
36 .init();
37
38 let rest_client = OKXHttpClient::from_env().unwrap();
39
40 let inst_type = OKXInstrumentType::Swap;
41 let instruments = rest_client.request_instruments(inst_type, None).await?;
42
43 let mut ws_client = OKXWebSocketClient::from_env().unwrap();
44 ws_client.initialize_instruments_cache(instruments.clone());
45 ws_client.connect().await?;
46
47 ws_client.subscribe_orders(inst_type).await?;
49 tokio::time::sleep(Duration::from_secs(1)).await;
53
54 let trader_id = TraderId::from("TRADER-001");
55 let strategy_id = StrategyId::from("SCALPER-001");
56 let instrument_id = InstrumentId::from("BTC-USDT-SWAP.OKX");
57 let client_order_id = ClientOrderId::from("O20250711001");
58 let order_side = OrderSide::Buy;
59 let order_type = OrderType::Market;
60 let quantity = Quantity::from("0.01");
61
62 let resp = ws_client
63 .submit_order(
64 trader_id,
65 strategy_id,
66 instrument_id,
67 OKXTradeMode::Isolated,
68 client_order_id,
69 order_side,
70 order_type,
71 quantity,
72 None, None, None, None, None, None, None, )
80 .await;
81
82 match resp {
83 Ok(resp) => tracing::debug!("{resp:?}"),
84 Err(e) => tracing::error!("{e:?}"),
85 }
86
87 let sigint = signal::ctrl_c();
89 pin!(sigint);
90
91 let stream = ws_client.stream();
92 tokio::pin!(stream); loop {
95 tokio::select! {
96 Some(data) = stream.next() => {
97 tracing::debug!("{data:?}");
98 }
99 _ = &mut sigint => {
100 tracing::info!("Received SIGINT, closing connection...");
101 ws_client.close().await?;
102 break;
103 }
104 else => break,
105 }
106 }
107
108 Ok(())
109}