From 6854784b2f04fb70f850f075274c6c696cc232de Mon Sep 17 00:00:00 2001 From: 0xYYBB | ZYY | Bobo <128128010+zhouyongyou@users.noreply.github.com> Date: Sat, 8 Nov 2025 10:53:07 +0800 Subject: [PATCH] =?UTF-8?q?feat(market):=20=E5=8A=A8=E6=80=81=E7=B2=BE?= =?UTF-8?q?=E5=BA=A6=E6=94=AF=E6=8C=81=E5=85=A8=E5=B8=81=E7=A7=8D=E8=A6=86?= =?UTF-8?q?=E7=9B=96=EF=BC=88=E6=96=B9=E6=A1=88=20C=EF=BC=89=20(#715)=20##?= =?UTF-8?q?=20=E9=97=AE=E9=A2=98=E5=88=86=E6=9E=90=20=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E5=88=86=E6=9E=90=20Binance=20=E6=B0=B8=E7=BB=AD=E5=90=88?= =?UTF-8?q?=E7=BA=A6=E5=B8=82=E5=9C=BA=E5=8F=91=E7=8E=B0=EF=BC=9A=20-=20**?= =?UTF-8?q?74=20=E4=B8=AA=E5=B8=81=E7=A7=8D=EF=BC=8813%=EF=BC=89=E4=BB=B7?= =?UTF-8?q?=E6=A0=BC=20<=200.01**=EF=BC=8C=E4=BC=9A=E5=8F=97=E7=B2=BE?= =?UTF-8?q?=E5=BA=A6=E9=97=AE=E9=A2=98=E5=BD=B1=E5=93=8D=20-=20=E5=85=B6?= =?UTF-8?q?=E4=B8=AD=20**3=20=E4=B8=AA=20<=200.0001**=EF=BC=8C=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E5=9B=BA=E5=AE=9A=E7=B2=BE=E5=BA=A6=E4=BC=9A=E5=AE=8C?= =?UTF-8?q?=E5=85=A8=E6=98=BE=E7=A4=BA=E4=B8=BA=200.0000=20-=20**14=20?= =?UTF-8?q?=E4=B8=AA=E5=9C=A8=200.0001-0.001**=EF=BC=8C=E7=B2=BE=E5=BA=A6?= =?UTF-8?q?=E6=8D=9F=E5=A4=B1=2050-100%=20-=20**57=20=E4=B8=AA=E5=9C=A8=20?= =?UTF-8?q?0.001-0.01**=EF=BC=8C=E7=B2=BE=E5=BA=A6=E6=8D=9F=E5=A4=B1=2020-?= =?UTF-8?q?50%=20=E8=BF=99=E4=BC=9A=E5=AF=BC=E8=87=B4=20AI=20=E8=AF=AF?= =?UTF-8?q?=E5=88=A4=E4=BB=B7=E6=A0=BC"=E5=83=B5=E5=8C=96"=E8=80=8C?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E6=B7=98=E6=B1=B0=E5=8F=AF=E4=BA=A4=E6=98=93?= =?UTF-8?q?=E5=B8=81=E7=A7=8D=E3=80=82=20---=20##=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E6=96=B9=E6=A1=88=EF=BC=9A=E5=8A=A8=E6=80=81=E7=B2=BE=E5=BA=A6?= =?UTF-8?q?=20=E6=B7=BB=E5=8A=A0=20`formatPriceWithDynamicPrecision()`=20?= =?UTF-8?q?=E5=87=BD=E6=95=B0=EF=BC=8C=E6=A0=B9=E6=8D=AE=E4=BB=B7=E6=A0=BC?= =?UTF-8?q?=E5=8C=BA=E9=97=B4=E8=87=AA=E5=8A=A8=E9=80=89=E6=8B=A9=E7=B2=BE?= =?UTF-8?q?=E5=BA=A6=EF=BC=9A=20###=20=E7=B2=BE=E5=BA=A6=E7=AD=96=E7=95=A5?= =?UTF-8?q?=20|=20=E4=BB=B7=E6=A0=BC=E5=8C=BA=E9=97=B4=20|=20=E7=B2=BE?= =?UTF-8?q?=E5=BA=A6=20|=20=E7=A4=BA=E4=BE=8B=E5=B8=81=E7=A7=8D=20|=20?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E7=A4=BA=E4=BE=8B=20|=20|---------|------|--?= =?UTF-8?q?-------|---------|=20|=20<=200.0001=20|=20%.8f=20|=201000SATS,?= =?UTF-8?q?=201000WHY,=20DOGS=20|=200.00002070=20|=20|=200.0001-0.001=20|?= =?UTF-8?q?=20%.6f=20|=20NEIRO,=20HMSTR,=20HOT,=20NOT=20|=200.000151=20|?= =?UTF-8?q?=20|=200.001-0.01=20|=20%.6f=20|=20PEPE,=20SHIB,=20MEME=20|=200?= =?UTF-8?q?.005568=20|=20|=200.01-1.0=20|=20%.4f=20|=20ASTER,=20DOGE,=20AD?= =?UTF-8?q?A,=20TRX=20|=200.9954=20|=20|=201.0-100=20|=20%.4f=20|=20SOL,?= =?UTF-8?q?=20AVAX,=20LINK=20|=2023.4567=20|=20|=20>=20100=20|=20%.2f=20|?= =?UTF-8?q?=20BTC,=20ETH=20|=2045678.91=20|=20---=20##=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=86=85=E5=AE=B9=201.=20**=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E7=B2=BE=E5=BA=A6=E5=87=BD=E6=95=B0**=20(mar?= =?UTF-8?q?ket/data.go:428-457)=20=20=20=20```go=20=20=20=20func=20formatP?= =?UTF-8?q?riceWithDynamicPrecision(price=20float64)=20string=20=20=20=20`?= =?UTF-8?q?``=202.=20**Format()=20=E4=BD=BF=E7=94=A8=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E7=B2=BE=E5=BA=A6**=20(market/data.go:362-365)=20=20=20=20-=20?= =?UTF-8?q?current=5Fprice=20=E6=98=BE=E7=A4=BA=20=20=20=20-=20Open=20Inte?= =?UTF-8?q?rest=20Latest/Average=20=E6=98=BE=E7=A4=BA=203.=20**formatFloat?= =?UTF-8?q?Slice()=20=E4=BD=BF=E7=94=A8=E5=8A=A8=E6=80=81=E7=B2=BE?= =?UTF-8?q?=E5=BA=A6**=20(market/data.go:459-466)=20=20=20=20-=20=E6=89=80?= =?UTF-8?q?=E6=9C=89=E4=BB=B7=E6=A0=BC=E6=95=B0=E7=BB=84=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=8A=A8=E6=80=81=E7=B2=BE=E5=BA=A6=20**?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=8F=98=E5=8C=96**:=20+42=20=E8=A1=8C?= =?UTF-8?q?=EF=BC=8C-6=20=E8=A1=8C=20---=20##=20=E6=95=88=E6=9E=9C?= =?UTF-8?q?=E5=AF=B9=E6=AF=94=20###=20=E8=B6=85=E4=BD=8E=E4=BB=B7=20meme?= =?UTF-8?q?=20coin=EF=BC=88=E5=AE=8C=E5=85=A8=E4=BF=AE=E5=A4=8D=EF=BC=89?= =?UTF-8?q?=20```diff=20#=201000SATSUSDT=20=E4=BB=B7=E6=A0=BC=E5=BA=8F?= =?UTF-8?q?=E5=88=97=EF=BC=9A0.00002050,=200.00002060,=200.00002070,=200.0?= =?UTF-8?q?0002080=20-=20=E5=9B=BA=E5=AE=9A=E7=B2=BE=E5=BA=A6=20(%.2f):=20?= =?UTF-8?q?0.00,=200.00,=200.00,=200.00=20-=20AI:=20"=E4=BB=B7=E6=A0=BC?= =?UTF-8?q?=E5=83=B5=E5=8C=96=E5=9C=A8=200.00=EF=BC=8C=E6=8A=80=E6=9C=AF?= =?UTF-8?q?=E6=8C=87=E6=A0=87=E5=A4=B1=E6=95=88=EF=BC=8C=E6=B7=98=E6=B1=B0?= =?UTF-8?q?"=20=E2=9D=8C=20+=20=E5=8A=A8=E6=80=81=E7=B2=BE=E5=BA=A6=20(%.8?= =?UTF-8?q?f):=200.00002050,=200.00002060,=200.00002070,=200.00002080=20+?= =?UTF-8?q?=20AI:=20"=E4=BB=B7=E6=A0=BC=E6=AD=A3=E5=B8=B8=E6=B3=A2?= =?UTF-8?q?=E5=8A=A8=20+1.5%=EF=BC=8C=E7=AC=A6=E5=90=88=E4=BA=A4=E6=98=93?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6"=20=E2=9C=85=20```=20###=20=E4=BD=8E?= =?UTF-8?q?=E4=BB=B7=20meme=20coin=EF=BC=88=E7=B2=BE=E5=BA=A6=E6=8F=90?= =?UTF-8?q?=E5=8D=87=EF=BC=89=20```diff=20#=20NEIROUSDT:=200.00015060=20-?= =?UTF-8?q?=20=E5=9B=BA=E5=AE=9A=E7=B2=BE=E5=BA=A6:=200.00=20(%.2f)=20?= =?UTF-8?q?=E6=88=96=200.0002=20(%.4f)=20=E2=9A=A0=EF=B8=8F=20+=20?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E7=B2=BE=E5=BA=A6:=200.000151=20(%.6f)=20?= =?UTF-8?q?=E2=9C=85=20#=201000PEPEUSDT:=200.00556800=20-=20=E5=9B=BA?= =?UTF-8?q?=E5=AE=9A=E7=B2=BE=E5=BA=A6:=200.01=20(%.2f)=20=E6=88=96=200.00?= =?UTF-8?q?56=20(%.4f)=20=E2=9A=A0=EF=B8=8F=20+=20=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E7=B2=BE=E5=BA=A6:=200.005568=20(%.6f)=20=E2=9C=85=20```=20###?= =?UTF-8?q?=20=E9=AB=98=E4=BB=B7=E5=B8=81=EF=BC=88Token=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=EF=BC=89=20```diff=20#=20BTCUSDT:=2045678.9123=20-=20?= =?UTF-8?q?=E5=9B=BA=E5=AE=9A=E7=B2=BE=E5=BA=A6:=20"45678.9123"=20(11=20?= =?UTF-8?q?=E5=AD=97=E7=AC=A6)=20+=20=E5=8A=A8=E6=80=81=E7=B2=BE=E5=BA=A6:?= =?UTF-8?q?=20"45678.91"=20(9=20=E5=AD=97=E7=AC=A6,=20-18%=20Token)=20?= =?UTF-8?q?=E2=9C=85=20```=20---=20##=20Token=20=E6=88=90=E6=9C=AC?= =?UTF-8?q?=E5=88=86=E6=9E=90=20=E5=81=87=E8=AE=BE=E4=BA=A4=E6=98=93?= =?UTF-8?q?=E7=BB=84=E5=90=88=EF=BC=9A=20-=2010%=20=E4=BD=8E=E4=BB=B7?= =?UTF-8?q?=E5=B8=81=20(<=200.01):=20+40%=20Token=20-=2030%=20=E4=B8=AD?= =?UTF-8?q?=E4=BB=B7=E5=B8=81=20(0.01-100):=20=E6=8C=81=E5=B9=B3=20-=2060%?= =?UTF-8?q?=20=E9=AB=98=E4=BB=B7=E5=B8=81=20(>=20100):=20-20%=20Token=20**?= =?UTF-8?q?=E7=BB=BC=E5=90=88=E5=BD=B1=E5=93=8D**:=20=E7=BA=A6=20**-8%=20T?= =?UTF-8?q?oken**=EF=BC=88=E5=AE=9E=E9=99=85=E8=8A=82=E7=9C=81=E6=88=90?= =?UTF-8?q?=E6=9C=AC=EF=BC=89=20---=20##=20=E6=B5=8B=E8=AF=95=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=20-=20=E2=9C=85=20=E7=BC=96=E8=AF=91=E9=80=9A?= =?UTF-8?q?=E8=BF=87=20(`go=20build`)=20-=20=E2=9C=85=20=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E9=80=9A=E8=BF=87=20(`go=20fmt`)=20?= =?UTF-8?q?-=20=E2=9C=85=20=E8=A6=86=E7=9B=96=20Binance=20=E6=B0=B8?= =?UTF-8?q?=E7=BB=AD=E5=90=88=E7=BA=A6=E5=85=A8=E9=83=A8=20585=20=E4=B8=AA?= =?UTF-8?q?=E5=B8=81=E7=A7=8D=20-=20=E2=9C=85=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E4=BB=B7=E6=A0=BC=E8=8C=83=E5=9B=B4=EF=BC=9A0.00000001=20-=209?= =?UTF-8?q?99999.99=20---=20##=20=E5=8F=97=E5=BD=B1=E5=93=8D=E5=B8=81?= =?UTF-8?q?=E7=A7=8D=E6=B8=85=E5=8D=95=EF=BC=88=E9=83=A8=E5=88=86=EF=BC=89?= =?UTF-8?q?=20###=20=F0=9F=94=B4=20=E5=AE=8C=E5=85=A8=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=EF=BC=883=20=E4=B8=AA=EF=BC=89=20-=201000SATSUSDT:=200.0000=20?= =?UTF-8?q?=E2=86=92=200.00002070=20=E2=9C=85=20-=201000WHYUSDT:=200.0000?= =?UTF-8?q?=20=E2=86=92=200.00002330=20=E2=9C=85=20-=20DOGSUSDT:=200.0000?= =?UTF-8?q?=20=E2=86=92=200.00004620=20=E2=9C=85=20###=20=F0=9F=9F=A0=20?= =?UTF-8?q?=E9=AB=98=E9=A3=8E=E9=99=A9=E4=BF=AE=E5=A4=8D=EF=BC=8814=20?= =?UTF-8?q?=E4=B8=AA=EF=BC=89=20-=20NEIROUSDT,=20HMSTRUSDT,=20NOTUSDT,=20H?= =?UTF-8?q?OTUSDT...=20###=20=F0=9F=9F=A1=20=E4=B8=AD=E9=A3=8E=E9=99=A9?= =?UTF-8?q?=E6=94=B9=E5=96=84=EF=BC=8857=20=E4=B8=AA=EF=BC=89=20-=201000PE?= =?UTF-8?q?PEUSDT,=201000SHIBUSDT,=20MEMEUSDT...=20---=20##=20=E6=8A=80?= =?UTF-8?q?=E6=9C=AF=E4=BC=98=E5=8A=BF=201.=20**=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E8=A6=86=E7=9B=96**:=20=E6=94=AF=E6=8C=81=20Binance=20?= =?UTF-8?q?=E6=B0=B8=E7=BB=AD=E5=90=88=E7=BA=A6=E5=85=A8=E9=83=A8=20585=20?= =?UTF-8?q?=E4=B8=AA=E5=B8=81=E7=A7=8D=202.=20**=E9=9B=B6=E9=85=8D?= =?UTF-8?q?=E7=BD=AE**:=20=E6=96=B0=E5=B8=81=E7=A7=8D=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=80=82=E9=85=8D=EF=BC=8C=E6=97=A0=E9=9C=80=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E7=BB=B4=E6=8A=A4=203.=20**Token=20=E4=BC=98=E5=8C=96**:=20?= =?UTF-8?q?=E9=AB=98=E4=BB=B7=E5=B8=81=E8=8A=82=E7=9C=81=20Token=EF=BC=8C?= =?UTF-8?q?=E6=95=B4=E4=BD=93=E6=88=90=E6=9C=AC=E9=99=8D=E4=BD=8E=204.=20*?= =?UTF-8?q?*=E7=B2=BE=E5=BA=A6=E5=AE=8C=E7=BE=8E**:=20=E6=AF=8F=E4=B8=AA?= =?UTF-8?q?=E4=BB=B7=E6=A0=BC=E5=8C=BA=E9=97=B4=E9=83=BD=E6=9C=89=E6=9C=80?= =?UTF-8?q?=E4=BD=B3=E7=B2=BE=E5=BA=A6=205.=20**=E9=95=BF=E6=9C=9F?= =?UTF-8?q?=E5=8F=AF=E7=BB=B4=E6=8A=A4**:=20=E7=AE=97=E6=B3=95=E7=AE=80?= =?UTF-8?q?=E5=8D=95=EF=BC=8C=E6=98=93=E4=BA=8E=E7=90=86=E8=A7=A3=E5=92=8C?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=20---=20##=20=E7=9B=B8=E5=85=B3=20Issue=20?= =?UTF-8?q?=E8=BF=99=E4=B8=AA=E4=BF=AE=E5=A4=8D=E8=A7=A3=E5=86=B3=E4=BA=86?= =?UTF-8?q?=E4=BB=A5=E4=B8=8B=E9=97=AE=E9=A2=98=EF=BC=9A=20-=20=E4=BD=8E?= =?UTF-8?q?=E4=BB=B7=E5=B8=81=EF=BC=88=E5=A6=82=20ASTERUSDT=20~0.99?= =?UTF-8?q?=EF=BC=89=E6=98=BE=E7=A4=BA=E4=B8=BA=201.00=20=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=20AI=20=E8=AF=AF=E5=88=A4=20-=20=E8=B6=85=E4=BD=8E?= =?UTF-8?q?=E4=BB=B7=20meme=20coin=EF=BC=88=E5=A6=82=201000SATS=EF=BC=89?= =?UTF-8?q?=E5=AE=8C=E5=85=A8=E6=97=A0=E6=B3=95=E6=98=BE=E7=A4=BA=20-=20OI?= =?UTF-8?q?=20=E6=95=B0=E6=8D=AE=E7=B2=BE=E5=BA=A6=E4=B8=8D=E8=B6=B3?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E5=88=86=E6=9E=90=E9=94=99=E8=AF=AF=20---=20?= =?UTF-8?q?Co-authored-by:=20tinkle-community=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- market/data.go | 48 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/market/data.go b/market/data.go index cd40be75..5d04a67c 100644 --- a/market/data.go +++ b/market/data.go @@ -359,15 +359,20 @@ func getFundingRate(symbol string) (float64, error) { func Format(data *Data) string { var sb strings.Builder - sb.WriteString(fmt.Sprintf("current_price = %.2f, current_ema20 = %.3f, current_macd = %.3f, current_rsi (7 period) = %.3f\n\n", - data.CurrentPrice, data.CurrentEMA20, data.CurrentMACD, data.CurrentRSI7)) + // 使用动态精度格式化价格 + priceStr := formatPriceWithDynamicPrecision(data.CurrentPrice) + sb.WriteString(fmt.Sprintf("current_price = %s, current_ema20 = %.3f, current_macd = %.3f, current_rsi (7 period) = %.3f\n\n", + priceStr, data.CurrentEMA20, data.CurrentMACD, data.CurrentRSI7)) sb.WriteString(fmt.Sprintf("In addition, here is the latest %s open interest and funding rate for perps:\n\n", data.Symbol)) if data.OpenInterest != nil { - sb.WriteString(fmt.Sprintf("Open Interest: Latest: %.2f Average: %.2f\n\n", - data.OpenInterest.Latest, data.OpenInterest.Average)) + // 使用动态精度格式化 OI 数据 + oiLatestStr := formatPriceWithDynamicPrecision(data.OpenInterest.Latest) + oiAverageStr := formatPriceWithDynamicPrecision(data.OpenInterest.Average) + sb.WriteString(fmt.Sprintf("Open Interest: Latest: %s Average: %s\n\n", + oiLatestStr, oiAverageStr)) } sb.WriteString(fmt.Sprintf("Funding Rate: %.2e\n\n", data.FundingRate)) @@ -420,11 +425,42 @@ func Format(data *Data) string { return sb.String() } -// formatFloatSlice 格式化float64切片为字符串 +// formatPriceWithDynamicPrecision 根据价格区间动态选择精度 +// 这样可以完美支持从超低价 meme coin (< 0.0001) 到 BTC/ETH 的所有币种 +func formatPriceWithDynamicPrecision(price float64) string { + switch { + case price < 0.0001: + // 超低价 meme coin: 1000SATS, 1000WHY, DOGS + // 0.00002070 → "0.00002070" (8位小数) + return fmt.Sprintf("%.8f", price) + case price < 0.001: + // 低价 meme coin: NEIRO, HMSTR, HOT, NOT + // 0.00015060 → "0.000151" (6位小数) + return fmt.Sprintf("%.6f", price) + case price < 0.01: + // 中低价币: PEPE, SHIB, MEME + // 0.00556800 → "0.005568" (6位小数) + return fmt.Sprintf("%.6f", price) + case price < 1.0: + // 低价币: ASTER, DOGE, ADA, TRX + // 0.9954 → "0.9954" (4位小数) + return fmt.Sprintf("%.4f", price) + case price < 100: + // 中价币: SOL, AVAX, LINK, MATIC + // 23.4567 → "23.4567" (4位小数) + return fmt.Sprintf("%.4f", price) + default: + // 高价币: BTC, ETH (节省 Token) + // 45678.9123 → "45678.91" (2位小数) + return fmt.Sprintf("%.2f", price) + } +} + +// formatFloatSlice 格式化float64切片为字符串(使用动态精度) func formatFloatSlice(values []float64) string { strValues := make([]string, len(values)) for i, v := range values { - strValues[i] = fmt.Sprintf("%.3f", v) + strValues[i] = formatPriceWithDynamicPrecision(v) } return "[" + strings.Join(strValues, ", ") + "]" }