From 8fa4ab24fb93d6e248569312bed8b36e16b88054 Mon Sep 17 00:00:00 2001 From: boris Date: Sat, 4 Jul 2026 14:36:24 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E9=BD=90=E5=9B=9E=E6=B5=8B=E9=A3=8E?= =?UTF-8?q?=E6=8E=A7=E7=BB=9F=E4=B8=80=E5=8D=B0=E8=8A=B1=E7=A8=8E=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fidc-core/src/platform_strategy_spec.rs | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/crates/fidc-core/src/platform_strategy_spec.rs b/crates/fidc-core/src/platform_strategy_spec.rs index 5eec821..df947d4 100644 --- a/crates/fidc-core/src/platform_strategy_spec.rs +++ b/crates/fidc-core/src/platform_strategy_spec.rs @@ -87,6 +87,8 @@ pub struct StrategyExecutionSpec { alias = "minCommission" )] pub minimum_commission: Option, + #[serde(default, alias = "stamp_tax_rate")] + pub stamp_tax_rate: Option, #[serde(default, alias = "stamp_tax_rate_before_change")] pub stamp_tax_rate_before_change: Option, #[serde(default, alias = "stamp_tax_rate_after_change")] @@ -153,6 +155,8 @@ pub struct StrategyEngineConfig { alias = "minCommission" )] pub minimum_commission: Option, + #[serde(default, alias = "stamp_tax_rate")] + pub stamp_tax_rate: Option, #[serde(default, alias = "stamp_tax_rate_before_change")] pub stamp_tax_rate_before_change: Option, #[serde(default, alias = "stamp_tax_rate_after_change")] @@ -255,6 +259,8 @@ pub struct StrategyRiskPolicySpec { alias = "minCommission" )] pub minimum_commission: Option, + #[serde(default, alias = "stamp_tax_rate")] + pub stamp_tax_rate: Option, #[serde(default, alias = "stamp_tax_rate_before_change")] pub stamp_tax_rate_before_change: Option, #[serde(default, alias = "stamp_tax_rate_after_change")] @@ -312,6 +318,7 @@ const RISK_POLICY_VALUE_ALIAS_GROUPS: &[(&str, &[&str])] = &[ "minimumCommission", &["minimum_commission", "min_commission", "minCommission"], ), + ("stampTaxRate", &["stamp_tax_rate"]), ( "stampTaxRateBeforeChange", &["stamp_tax_rate_before_change"], @@ -725,6 +732,7 @@ fn apply_cost_overrides( cfg: &mut PlatformExprStrategyConfig, commission_rate: Option, minimum_commission: Option, + stamp_tax_rate: Option, stamp_tax_rate_before_change: Option, stamp_tax_rate_after_change: Option, stamp_tax_change_date: Option<&str>, @@ -737,6 +745,16 @@ fn apply_cost_overrides( cfg.minimum_commission = Some(value); cfg.risk_config.trading_constraints.minimum_commission = value; } + if let Some(value) = valid_non_negative(stamp_tax_rate) { + cfg.stamp_tax_rate_before_change = Some(value); + cfg.stamp_tax_rate_after_change = Some(value); + cfg.risk_config + .trading_constraints + .stamp_tax_rate_before_change = value; + cfg.risk_config + .trading_constraints + .stamp_tax_rate_after_change = value; + } if let Some(value) = valid_non_negative(stamp_tax_rate_before_change) { cfg.stamp_tax_rate_before_change = Some(value); cfg.risk_config @@ -879,6 +897,7 @@ fn apply_risk_policy_overrides( cfg, policy.commission_rate, policy.minimum_commission, + policy.stamp_tax_rate, policy.stamp_tax_rate_before_change, policy.stamp_tax_rate_after_change, policy.stamp_tax_change_date.as_deref(), @@ -1221,6 +1240,7 @@ pub fn platform_expr_config_from_spec( &mut cfg, engine.commission_rate, engine.minimum_commission, + engine.stamp_tax_rate, engine.stamp_tax_rate_before_change, engine.stamp_tax_rate_after_change, engine.stamp_tax_change_date.as_deref(), @@ -1630,6 +1650,7 @@ pub fn platform_expr_config_from_spec( &mut cfg, execution.commission_rate, execution.minimum_commission, + execution.stamp_tax_rate, execution.stamp_tax_rate_before_change, execution.stamp_tax_rate_after_change, execution.stamp_tax_change_date.as_deref(), @@ -2231,6 +2252,7 @@ mod tests { "liquidityLimitEnabled": true, "commissionRate": 0.0003, "minimumCommission": 5.0, + "stampTaxRate": 0.0007, "stampTaxChangeDate": "20240103" } }, @@ -2240,7 +2262,8 @@ mod tests { "rejectLowerLimitSelection": true, "rejectUpperLimitBuy": true, "rejectLowerLimitSell": true, - "volumePercent": 25 + "volumePercent": 25, + "stampTaxRateAfterChange": 0.0004 } } }); @@ -2265,6 +2288,20 @@ mod tests { assert!(cfg.risk_config.trading_constraints.volume_limit_enabled); assert!(cfg.risk_config.trading_constraints.liquidity_limit_enabled); assert!((cfg.risk_config.trading_constraints.volume_percent - 0.25).abs() < 1e-12); + assert_eq!( + cfg.risk_config + .trading_constraints + .stamp_tax_rate_before_change, + 0.0007 + ); + assert_eq!( + cfg.risk_config + .trading_constraints + .stamp_tax_rate_after_change, + 0.0004 + ); + assert_eq!(cfg.stamp_tax_rate_before_change, Some(0.0007)); + assert_eq!(cfg.stamp_tax_rate_after_change, Some(0.0004)); assert_eq!( cfg.risk_config.trading_constraints.stamp_tax_change_date, NaiveDate::from_ymd_opt(2024, 1, 3).unwrap()