fix(交易信号): 修复极小价格展示精度丢失与策略覆盖匹配失效

Motivation:
部分 meme 币等标的价格极小(如 0.00000059),原有格式化统一保留两位小数会将其显示为 0.00,导致推送消息中的价格信息失真、误导用户;同时 viper 加载配置时会将嵌套 map 的 key 统一转为小写,导致按大写策略编码配置的策略覆盖项无法命中,仓位倍数、杠杆等覆盖参数失效。

Changes:

* 新增价格展示格式化逻辑:绝对值不小于 1 的数值保留两位小数,小于 1 的数值采用最短精确表示,避免极小价格被截断为 0.00
* 策略覆盖查找改为大小写不敏感匹配,兼容 viper 将配置 key 小写化的行为,确保策略编码以任意大小写配置均可生效
* 补充极小价格展示、配置加载解析及策略覆盖匹配的单元测试
This commit is contained in:
2026-08-19 01:03:29 +08:00
parent 7651c57536
commit cd3db8d453
7 changed files with 161 additions and 21 deletions
@@ -250,6 +250,30 @@ func asFloat(t *testing.T, v any) float64 {
}
}
func TestConvertTinyPriceKeepsPrecision(t *testing.T) {
body := []byte(`{
"eventType":"SIGNAL_RECEIVED","symbol":"PEPE","direction":"LONG",
"payload":"{\"strategyCode\":\"ai-crypto-signals\",\"period\":\"1h\",\"currency\":\"PEPE\",\"price\":0.00000059,\"lossPrice\":0.00000055,\"gainPrices\":\"0.00000061,0.00000064\"}",
"eventTime":1786600000000
}`)
_, data, err := Convert(body)
if err != nil {
t.Fatal(err)
}
formatted, _ := data["formatted"].(string)
for _, want := range []string{
"开仓价格: 0.00000059\n",
"止损价格: 0.00000055\n",
} {
if !strings.Contains(formatted, want) {
t.Fatalf("missing %q in\n%s", want, formatted)
}
}
if strings.Contains(formatted, "开仓价格: 0.00\n") {
t.Fatalf("tiny price rounded to 0.00:\n%s", formatted)
}
}
func TestConvertInvalidJSON(t *testing.T) {
_, _, err := Convert([]byte(`{not json`))
if err == nil {