From ad5cc9c58d5a7eb2f5db9e1c2382c96461c4b400 Mon Sep 17 00:00:00 2001 From: BossX Date: Fri, 10 Jul 2026 12:45:49 +0800 Subject: [PATCH] refactor: extract maker strategy crate --- Cargo.lock | 8 ++++++++ Cargo.toml | 2 +- crates/standx-cli/Cargo.toml | 1 + crates/standx-cli/src/commands/maker/cycle.rs | 13 +++++++------ crates/standx-cli/src/commands/maker/mod.rs | 12 +++++++----- crates/standx-cli/src/commands/maker/output.rs | 11 ++++++----- crates/standx-maker/Cargo.toml | 12 ++++++++++++ .../src/maker.rs => standx-maker/src/lib.rs} | 2 +- crates/standx-sdk/src/lib.rs | 1 - 9 files changed, 43 insertions(+), 19 deletions(-) create mode 100644 crates/standx-maker/Cargo.toml rename crates/{standx-sdk/src/maker.rs => standx-maker/src/lib.rs} (99%) diff --git a/Cargo.lock b/Cargo.lock index 599cedf..c06e96f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1861,6 +1861,7 @@ dependencies = [ "rpassword", "serde", "serde_json", + "standx-maker", "standx-sdk", "tabled", "tempfile", @@ -1872,6 +1873,13 @@ dependencies = [ "uuid", ] +[[package]] +name = "standx-maker" +version = "0.1.0" +dependencies = [ + "standx-sdk", +] + [[package]] name = "standx-sdk" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 35f0157..fca07bf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] resolver = "2" -members = ["crates/standx-sdk", "crates/standx-cli"] +members = ["crates/standx-sdk", "crates/standx-maker", "crates/standx-cli"] [workspace.package] edition = "2021" diff --git a/crates/standx-cli/Cargo.toml b/crates/standx-cli/Cargo.toml index 1946eed..8a939ef 100644 --- a/crates/standx-cli/Cargo.toml +++ b/crates/standx-cli/Cargo.toml @@ -16,6 +16,7 @@ path = "src/main.rs" [dependencies] standx-sdk = { path = "../standx-sdk", version = "0.1.0", features = ["tabled"] } +standx-maker = { path = "../standx-maker", version = "0.1.0" } # CLI clap = { version = "4.5", features = ["derive", "env", "cargo"] } diff --git a/crates/standx-cli/src/commands/maker/cycle.rs b/crates/standx-cli/src/commands/maker/cycle.rs index 793ba62..762a99a 100644 --- a/crates/standx-cli/src/commands/maker/cycle.rs +++ b/crates/standx-cli/src/commands/maker/cycle.rs @@ -5,6 +5,7 @@ use super::{ }; use crate::cli::*; use anyhow::Result; +use standx_maker::{self as maker, MakerConfig, MakerStats, RestingQuote, VolBreaker}; use standx_sdk::client::order::CreateOrderParams; use standx_sdk::client::StandXClient; use standx_sdk::models::{OrderSide, OrderType, TimeInForce, Trade}; @@ -19,7 +20,7 @@ use std::time::Duration; pub(super) async fn maker_cycle( client: &StandXClient, symbol: &str, - cfg: &standx_sdk::maker::MakerConfig, + cfg: &MakerConfig, live: bool, cycle: u64, mark: f64, @@ -28,7 +29,7 @@ pub(super) async fn maker_cycle( max_divergence_bps: f64, inventory_exit_pct: f64, inventory_exit_qty: f64, - resting: &mut Vec, + resting: &mut Vec, adopted: &mut HashMap, pending: &mut Vec, inventory_exit_pending: &mut bool, @@ -36,12 +37,12 @@ pub(super) async fn maker_cycle( seen_fill_ids: &mut HashSet, session_started_at: i64, sim_position: &mut f64, - stats: &mut standx_sdk::maker::MakerStats, - breaker: &mut standx_sdk::maker::VolBreaker, + stats: &mut MakerStats, + breaker: &mut VolBreaker, output_format: OutputFormat, order_response_health: Option<&AtomicBool>, ) -> Result<(u64, u64, u64, u64)> { - use standx_sdk::maker::{ + use maker::{ cap_desired_exposure, compute_desired_quotes, format_decimals, mark_mid_divergence_bps, paper_quote_filled, reconcile, skew_center, Action, RestingQuote, }; @@ -248,7 +249,7 @@ pub(super) async fn maker_cycle( // an empty desired set makes reconcile cancel every resting quote // (pull all liquidity) and place none until volatility subsides. let raw_inventory_exit = if live { - standx_sdk::maker::inventory_exit_plan( + maker::inventory_exit_plan( position, cfg.max_position, inventory_exit_pct, diff --git a/crates/standx-cli/src/commands/maker/mod.rs b/crates/standx-cli/src/commands/maker/mod.rs index c0a03ff..f2c14f0 100644 --- a/crates/standx-cli/src/commands/maker/mod.rs +++ b/crates/standx-cli/src/commands/maker/mod.rs @@ -1,5 +1,8 @@ use crate::cli::*; use anyhow::Result; +use standx_maker::{ + self as maker, Alert, AlertMonitor, MakerConfig, MakerStats, RestingQuote, VolBreaker, +}; use standx_sdk::auth::Credentials; use standx_sdk::client::StandXClient; use standx_sdk::error::Error as StandxError; @@ -224,7 +227,7 @@ async fn notify_lifecycle( #[allow(clippy::too_many_arguments)] fn deliver_alert( - alert: &standx_sdk::maker::Alert, + alert: &Alert, symbol: &str, output_format: OutputFormat, http: Option<&reqwest::Client>, @@ -353,7 +356,6 @@ struct MakerRunArgs { } async fn run_maker(symbol: String, args: MakerRunArgs, output_format: OutputFormat) -> Result<()> { - use standx_sdk::maker::{self, MakerConfig, RestingQuote}; use standx_sdk::order_response::OrderResponseStream; let order_session_id = args.live.then(|| uuid::Uuid::new_v4().to_string()); @@ -621,10 +623,10 @@ async fn run_maker(symbol: String, args: MakerRunArgs, output_format: OutputForm let mut total_fills: u64 = 0; let mut total_halted: u64 = 0; let mut sim_position: f64 = 0.0; // paper-mode simulated inventory - let mut stats = maker::MakerStats::default(); - let mut breaker = maker::VolBreaker::new(args.vol_window.max(1) as usize, args.vol_pause_bps); + let mut stats = MakerStats::default(); + let mut breaker = VolBreaker::new(args.vol_window.max(1) as usize, args.vol_pause_bps); let mut alerts = - maker::AlertMonitor::new(args.alert_loss, args.alert_inventory_pct, args.alert_uptime); + AlertMonitor::new(args.alert_loss, args.alert_inventory_pct, args.alert_uptime); let mut last_mark: Option = None; let mut last_src: Option<&'static str> = None; diff --git a/crates/standx-cli/src/commands/maker/output.rs b/crates/standx-cli/src/commands/maker/output.rs index 9022302..378fbc6 100644 --- a/crates/standx-cli/src/commands/maker/output.rs +++ b/crates/standx-cli/src/commands/maker/output.rs @@ -1,4 +1,5 @@ use super::*; +use standx_maker::{self as maker, Action, MakerConfig, MakerStats}; use standx_sdk::models::OrderSide; /// Per-cycle output: one human line + indented actions, or JSON lines. @@ -12,15 +13,15 @@ pub(super) fn emit_maker_cycle( best_bid: Option, best_ask: Option, position: f64, - actions: &[standx_sdk::maker::Action], + actions: &[Action], // Paper-mode simulated fills this cycle: (side, price, qty). Empty in live. fills: &[(OrderSide, f64, f64)], - stats: &standx_sdk::maker::MakerStats, + stats: &MakerStats, // Some(vol_bps) when the volatility breaker halted quoting this cycle. halt_vol_bps: Option, - cfg: &standx_sdk::maker::MakerConfig, + cfg: &MakerConfig, ) { - use standx_sdk::maker::{format_decimals, Action}; + use maker::format_decimals; let pnl = stats.pnl(position, mark); @@ -241,7 +242,7 @@ pub(super) fn log_maker_event( price_decimals: u32, detail: &str, ) { - use standx_sdk::maker::format_decimals; + use maker::format_decimals; match output_format { OutputFormat::Json => { println!( diff --git a/crates/standx-maker/Cargo.toml b/crates/standx-maker/Cargo.toml new file mode 100644 index 0000000..bd1df55 --- /dev/null +++ b/crates/standx-maker/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "standx-maker" +version = "0.1.0" +description = "Deterministic market-making strategy and risk engine for StandX" +edition.workspace = true +authors.workspace = true +license.workspace = true +repository.workspace = true +rust-version.workspace = true + +[dependencies] +standx-sdk = { path = "../standx-sdk", version = "0.1.0" } diff --git a/crates/standx-sdk/src/maker.rs b/crates/standx-maker/src/lib.rs similarity index 99% rename from crates/standx-sdk/src/maker.rs rename to crates/standx-maker/src/lib.rs index 3dd5f5a..68c2cb1 100644 --- a/crates/standx-sdk/src/maker.rs +++ b/crates/standx-maker/src/lib.rs @@ -15,7 +15,7 @@ //! ad-hoc f64 math on the API's string values); if symbols with more than ~8 //! price decimals ever list, revisit with a decimal type. -use crate::models::OrderSide; +use standx_sdk::models::OrderSide; /// Static per-run configuration (CLI args + symbol metadata). #[derive(Debug, Clone)] diff --git a/crates/standx-sdk/src/lib.rs b/crates/standx-sdk/src/lib.rs index 33b607f..7f1bfbd 100644 --- a/crates/standx-sdk/src/lib.rs +++ b/crates/standx-sdk/src/lib.rs @@ -40,7 +40,6 @@ pub mod auth; pub mod client; pub mod error; -pub mod maker; pub mod models; pub mod order_response; pub mod websocket;