Skip to main content

execute_limit/
execute_limit.rs

1//! Example: Listen to ticker and L2 order book updates.
2//!
3//! ```bash
4//! cargo run --example md_listener -- \
5//!     --url wss://exchange-wss.bulk.trade \
6//!     --symbols BTC-USD,ETH-USD
7//! ```
8
9use std::{env, process};
10use std::sync::Arc;
11use clap::Parser;
12use tracing::{info};
13use tracing_subscriber::EnvFilter;
14use bulk_client::api::{BulkHttpClient};
15use bulk_client::api::parts::HttpConfig;
16use bulk_client::common::tif::TimeInForce;
17use bulk_client::msgs::LimitOrder;
18use bulk_client::parts::make_nonce;
19use bulk_client::transaction::{Action, ActionMeta, TransactionSigner};
20
21#[derive(Parser, Debug)]
22#[command(name = "md_query", about = "Query MD")]
23struct Args {
24    /// WebSocket URL
25    #[arg(long, default_value = "http://localhost:12000/api/v1")]
26    url: String,
27}
28
29#[tokio::main]
30async fn main() -> eyre::Result<()> {
31    tracing_subscriber::fmt()
32        .with_env_filter(
33            EnvFilter::from_default_env().add_directive(tracing::Level::INFO.into())
34        )
35        .init();
36
37    let args = Args::parse();
38
39    info!("Connecting to {} for execution", args.url);
40    let key = env::var("BULK_PRIVATE_KEY")?;
41    let signer = TransactionSigner::from_private_key(key.as_str())?;
42    let client = BulkHttpClient::new(&HttpConfig {
43        base_url: args.url,
44        signer: Some(signer.clone()),
45        ..Default::default()
46    }).unwrap();
47
48    let account = signer.public_key();
49    let nonce = make_nonce();
50
51    let mut orders = vec![
52        Action::LimitOrder(LimitOrder {
53            symbol: Arc::from("BTC-USD"),
54            is_buy: true,
55            price: 1000.0,
56            size: 0.0001,
57            tif: TimeInForce::IOC,
58            reduce_only: false,
59            iso: false,
60            meta: ActionMeta {
61                account,
62                nonce,
63                seqno: 0,
64                hash: None,
65            }
66        }),
67        Action::LimitOrder(LimitOrder {
68            symbol: Arc::from("ETH-USD"),
69            is_buy: true,
70            price: 1000.0,
71            size: 0.0001,
72            tif: TimeInForce::IOC,
73            reduce_only: false,
74            iso: false,
75            meta: ActionMeta {
76                account,
77                nonce,
78                seqno: 1,
79                hash: None,
80            }
81        }),
82    ];
83
84    let oids = orders.iter_mut()
85        .map(|o| o.hash().to_string())
86        .collect::<Vec<_>>();
87
88    eprintln!("order IDs: {:?}", oids);
89
90    let results = client.place_tx(orders, Some(account), Some(nonce)).await?;
91    eprintln!("results: {:?}\n", results);
92
93    process::exit(0);
94}