统一策略数值别名并保留精确冲突校验

This commit is contained in:
boris
2026-09-11 01:03:22 +08:00
parent 3e8d652af1
commit 1de96494b3
@@ -745,6 +745,16 @@ fn strategy_alias_values_semantically_equal(left: &Value, right: &Value) -> bool
return true;
}
match (left, right) {
(Value::Number(left), Value::Number(right)) => {
const MAX_EXACT: i64 = 9_007_199_254_740_992;
let exact_integer = |value: &serde_json::Number| {
value.as_i64().filter(|v| (-MAX_EXACT..=MAX_EXACT).contains(v)).map(|v| v as f64)
.or_else(|| value.as_u64().filter(|v| *v <= MAX_EXACT as u64).map(|v| v as f64))
};
if left.is_f64() && !right.is_f64() { exact_integer(right).zip(left.as_f64()).is_some_and(|(a,b)| a==b) }
else if right.is_f64() && !left.is_f64() { exact_integer(left).zip(right.as_f64()).is_some_and(|(a,b)| a==b) }
else { false }
}
(Value::String(left), Value::String(right)) => left.trim() == right.trim(),
(Value::String(left), Value::Number(right))
| (Value::Number(right), Value::String(left)) => left
@@ -3180,6 +3190,16 @@ fn normalize_board(symbol: &str, raw_board: Option<&str>) -> String {
mod tests {
use super::*;
#[test]
fn numeric_strategy_aliases_accept_exact_zero_but_never_hide_rounding_or_conflicts() {
let cfg = platform_expr_config_from_value("fees", "000001.SZ", &serde_json::json!({
"execution":{"minimumCommission":0.0,"minimum_commission":0}
})).unwrap();
assert_eq!(cfg.minimum_commission, Some(0.0));
assert!(!strategy_alias_values_semantically_equal(&serde_json::json!(9007199254740992u64), &serde_json::json!(9007199254740993u64)));
assert!(!strategy_alias_values_semantically_equal(&serde_json::json!(0.0), &serde_json::json!(1)));
}
#[test]
fn parses_buy_filter_as_a_separate_trading_condition() {
let cfg = platform_expr_config_from_value("buy-guard", "000001.SZ", &serde_json::json!({