From 4132793219540d67a7de8182e88fd0ca4f284c45 Mon Sep 17 00:00:00 2001 From: boris Date: Sun, 19 Jul 2026 08:44:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=80=80=E5=B8=82=E6=95=B4?= =?UTF-8?q?=E7=90=86=E6=9C=9F=E4=BA=A4=E6=98=93=E7=8A=B6=E6=80=81=E5=88=A4?= =?UTF-8?q?=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/fidc-core/src/risk_control.rs | 41 +++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/crates/fidc-core/src/risk_control.rs b/crates/fidc-core/src/risk_control.rs index b5cbc2e..99c26d5 100644 --- a/crates/fidc-core/src/risk_control.rs +++ b/crates/fidc-core/src/risk_control.rs @@ -199,7 +199,7 @@ impl ChinaAShareRiskControl { let terminal_status = matches!( status.as_str(), "inactive" | "delisted" | "terminated" | "expired" - ) || status.contains("delist"); + ); if terminal_status && instrument.delisted_at.is_none() { return Some("inactive_or_delisted"); } @@ -765,6 +765,45 @@ mod tests { NaiveDate::from_ymd_opt(year, month, day).expect("valid date") } + fn instrument(status: &str, delisted_at: Option) -> Instrument { + Instrument { + symbol: "002898.SZ".to_string(), + name: "赛隆退".to_string(), + board: "SZ".to_string(), + round_lot: 100, + listed_at: Some(d(2017, 9, 12)), + delisted_at, + status: status.to_string(), + } + } + + #[test] + fn delisting_period_status_is_not_terminal_without_delisted_date() { + let date = d(2025, 3, 20); + + assert_eq!( + ChinaAShareRiskControl::instrument_rejection_reason( + Some(&instrument("delisting", None)), + date, + ), + None + ); + assert_eq!( + ChinaAShareRiskControl::instrument_rejection_reason( + Some(&instrument("delisted", None)), + date, + ), + Some("inactive_or_delisted") + ); + assert_eq!( + ChinaAShareRiskControl::instrument_rejection_reason( + Some(&instrument("delisting", Some(d(2026, 7, 20)))), + d(2026, 7, 20), + ), + Some("inactive_or_delisted") + ); + } + fn candidate(date: NaiveDate) -> CandidateEligibility { CandidateEligibility { date,