feat: 重构为三所价差异动监控系统

删除 HyperLiquid + 全部交易功能,构建自适应 surge 检测器。
- 新增 surge_detector.go: 每币独立滚动窗口基线,检测三所价差异常飙升
- 新增 SpreadCard/SurgeCard 前端组件
- 保留 momentum/trend/cumulative/trend_filter 扫描功能
- 更新文档和配置以反映新系统

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
jackyu66git
2026-05-08 02:01:18 +08:00
co-authored by Claude Opus 4.6
parent 559d7bb870
commit d38782490c
36 changed files with 1201 additions and 6374 deletions
+227 -233
View File
@@ -4,263 +4,257 @@ import (
"sort"
)
// Exchange names — Bitget and HyperLiquid are trading exchanges; Binance and OKX are for momentum/display
// Exchange names
const (
ExHyperLiquid = "HyperLiquid"
ExBitget = "Bitget"
ExBinance = "Binance"
ExOKX = "OKX"
ExBitget = "Bitget"
ExBinance = "Binance"
ExOKX = "OKX"
)
// Taker fee rates (%) — for IOC market orders on trading exchanges
var takerFees = map[string]float64{
ExHyperLiquid: 0.045,
ExBitget: 0.060,
}
var TrackedCoins = []TrackedCoin{
{Name: "DOGE", BN: "DOGEUSDT", BG: "DOGEUSDT", HL: "DOGE", OK: "DOGE-USDT-SWAP"},
{Name: "LINK", BN: "LINKUSDT", BG: "LINKUSDT", HL: "LINK", OK: "LINK-USDT-SWAP"},
{Name: "ONDO", BN: "ONDOUSDT", BG: "ONDOUSDT", HL: "ONDO", OK: "ONDO-USDT-SWAP"},
{Name: "OP", BN: "OPUSDT", BG: "OPUSDT", HL: "OP", OK: "OP-USDT-SWAP"},
{Name: "WIF", BN: "WIFUSDT", BG: "WIFUSDT", HL: "WIF", OK: "WIF-USDT-SWAP"},
{Name: "ARB", BN: "ARBUSDT", BG: "ARBUSDT", HL: "ARB", OK: "ARB-USDT-SWAP"},
{Name: "0G", BN: "0GUSDT", BG: "0GUSDT", HL: "0G", OK: "0G-USDT-SWAP"},
{Name: "2Z", BN: "2ZUSDT", BG: "2ZUSDT", HL: "2Z", OK: "2Z-USDT-SWAP"},
{Name: "AAVE", BN: "AAVEUSDT", BG: "AAVEUSDT", HL: "AAVE", OK: "AAVE-USDT-SWAP"},
{Name: "ACE", BN: "ACEUSDT", BG: "ACEUSDT", HL: "ACE", OK: "ACE-USDT-SWAP"},
{Name: "ADA", BN: "ADAUSDT", BG: "ADAUSDT", HL: "ADA", OK: "ADA-USDT-SWAP"},
{Name: "AIXBT", BN: "AIXBTUSDT", BG: "AIXBTUSDT", HL: "AIXBT", OK: "AIXBT-USDT-SWAP"},
{Name: "ALGO", BN: "ALGOUSDT", BG: "ALGOUSDT", HL: "ALGO", OK: "ALGO-USDT-SWAP"},
{Name: "ALT", BN: "ALTUSDT", BG: "ALTUSDT", HL: "ALT", OK: "ALT-USDT-SWAP"},
{Name: "ANIME", BN: "ANIMEUSDT", BG: "ANIMEUSDT", HL: "ANIME", OK: "ANIME-USDT-SWAP"},
{Name: "APE", BN: "APEUSDT", BG: "APEUSDT", HL: "APE", OK: "APE-USDT-SWAP"},
{Name: "APT", BN: "APTUSDT", BG: "APTUSDT", HL: "APT", OK: "APT-USDT-SWAP"},
{Name: "AR", BN: "ARUSDT", BG: "ARUSDT", HL: "AR", OK: "AR-USDT-SWAP"},
{Name: "ARK", BN: "ARKUSDT", BG: "ARKUSDT", HL: "ARK", OK: "ARK-USDT-SWAP"},
{Name: "ASTER", BN: "ASTERUSDT", BG: "ASTERUSDT", HL: "ASTER", OK: "ASTER-USDT-SWAP"},
{Name: "ATOM", BN: "ATOMUSDT", BG: "ATOMUSDT", HL: "ATOM", OK: "ATOM-USDT-SWAP"},
{Name: "AVAX", BN: "AVAXUSDT", BG: "AVAXUSDT", HL: "AVAX", OK: "AVAX-USDT-SWAP"},
{Name: "AVNT", BN: "AVNTUSDT", BG: "AVNTUSDT", HL: "AVNT", OK: "AVNT-USDT-SWAP"},
{Name: "AXS", BN: "AXSUSDT", BG: "AXSUSDT", HL: "AXS", OK: "AXS-USDT-SWAP"},
{Name: "AZTEC", BN: "AZTECUSDT", BG: "AZTECUSDT", HL: "AZTEC", OK: "AZTEC-USDT-SWAP"},
{Name: "BABY", BN: "BABYUSDT", BG: "BABYUSDT", HL: "BABY", OK: "BABY-USDT-SWAP"},
{Name: "BANANA", BN: "BANANAUSDT", BG: "BANANAUSDT", HL: "BANANA", OK: "BANANA-USDT-SWAP"},
{Name: "BCH", BN: "BCHUSDT", BG: "BCHUSDT", HL: "BCH", OK: "BCH-USDT-SWAP"},
{Name: "BERA", BN: "BERAUSDT", BG: "BERAUSDT", HL: "BERA", OK: "BERA-USDT-SWAP"},
{Name: "BIGTIME", BN: "BIGTIMEUSDT", BG: "BIGTIMEUSDT", HL: "BIGTIME", OK: "BIGTIME-USDT-SWAP"},
{Name: "BIO", BN: "BIOUSDT", BG: "BIOUSDT", HL: "BIO", OK: "BIO-USDT-SWAP"},
{Name: "BLUR", BN: "BLURUSDT", BG: "BLURUSDT", HL: "BLUR", OK: "BLUR-USDT-SWAP"},
{Name: "BNB", BN: "BNBUSDT", BG: "BNBUSDT", HL: "BNB", OK: "BNB-USDT-SWAP"},
{Name: "BNT", BN: "BNTUSDT", BG: "BNTUSDT", HL: "", OK: "BNT-USDT-SWAP"},
{Name: "BOME", BN: "BOMEUSDT", BG: "BOMEUSDT", HL: "BOME", OK: "BOME-USDT-SWAP"},
{Name: "BRETT", BN: "BRETTUSDT", BG: "BRETTUSDT", HL: "BRETT", OK: "BRETT-USDT-SWAP"},
{Name: "BSV", BN: "BSVUSDT", BG: "BSVUSDT", HL: "BSV", OK: "BSV-USDT-SWAP"},
{Name: "BTC", BN: "BTCUSDT", BG: "BTCUSDT", HL: "BTC", OK: "BTC-USDT-SWAP"},
{Name: "CAKE", BN: "CAKEUSDT", BG: "CAKEUSDT", HL: "CAKE", OK: "CAKE-USDT-SWAP"},
{Name: "CATI", BN: "CATIUSDT", BG: "CATIUSDT", HL: "", OK: "CATI-USDT-SWAP"},
{Name: "CC", BN: "CCUSDT", BG: "CCUSDT", HL: "CC", OK: "CC-USDT-SWAP"},
{Name: "CELO", BN: "CELOUSDT", BG: "CELOUSDT", HL: "CELO", OK: "CELO-USDT-SWAP"},
{Name: "CFX", BN: "CFXUSDT", BG: "CFXUSDT", HL: "CFX", OK: "CFX-USDT-SWAP"},
{Name: "CHILLGUY", BN: "CHILLGUYUSDT", BG: "CHILLGUYUSDT", HL: "CHILLGUY", OK: "CHILLGUY-USDT-SWAP"},
{Name: "CHIP", BN: "CHIPUSDT", BG: "CHIPUSDT", HL: "CHIP", OK: "CHIP-USDT-SWAP"},
{Name: "COMP", BN: "COMPUSDT", BG: "COMPUSDT", HL: "COMP", OK: "COMP-USDT-SWAP"},
{Name: "CRV", BN: "CRVUSDT", BG: "CRVUSDT", HL: "CRV", OK: "CRV-USDT-SWAP"},
{Name: "CYBER", BN: "CYBERUSDT", BG: "CYBERUSDT", HL: "", OK: "CYBER-USDT-SWAP"},
{Name: "DASH", BN: "DASHUSDT", BG: "DASHUSDT", HL: "DASH", OK: "DASH-USDT-SWAP"},
{Name: "DOOD", BN: "DOODUSDT", BG: "DOODUSDT", HL: "DOOD", OK: "DOOD-USDT-SWAP"},
{Name: "DOT", BN: "DOTUSDT", BG: "DOTUSDT", HL: "DOT", OK: "DOT-USDT-SWAP"},
{Name: "DYDX", BN: "DYDXUSDT", BG: "DYDXUSDT", HL: "DYDX", OK: "DYDX-USDT-SWAP"},
{Name: "DYM", BN: "DYMUSDT", BG: "DYMUSDT", HL: "DYM", OK: "DYM-USDT-SWAP"},
{Name: "EIGEN", BN: "EIGENUSDT", BG: "EIGENUSDT", HL: "EIGEN", OK: "EIGEN-USDT-SWAP"},
{Name: "ENA", BN: "ENAUSDT", BG: "ENAUSDT", HL: "ENA", OK: "ENA-USDT-SWAP"},
{Name: "ENS", BN: "ENSUSDT", BG: "ENSUSDT", HL: "ENS", OK: "ENS-USDT-SWAP"},
{Name: "ETC", BN: "ETCUSDT", BG: "ETCUSDT", HL: "ETC", OK: "ETC-USDT-SWAP"},
{Name: "ETH", BN: "ETHUSDT", BG: "ETHUSDT", HL: "ETH", OK: "ETH-USDT-SWAP"},
{Name: "ETHFI", BN: "ETHFIUSDT", BG: "ETHFIUSDT", HL: "ETHFI", OK: "ETHFI-USDT-SWAP"},
{Name: "FARTCOIN", BN: "FARTCOINUSDT", BG: "FARTCOINUSDT", HL: "FARTCOIN", OK: "FARTCOIN-USDT-SWAP"},
{Name: "FET", BN: "FETUSDT", BG: "FETUSDT", HL: "FET", OK: "FET-USDT-SWAP"},
{Name: "FIL", BN: "FILUSDT", BG: "FILUSDT", HL: "FIL", OK: "FIL-USDT-SWAP"},
{Name: "FOGO", BN: "FOGOUSDT", BG: "FOGOUSDT", HL: "FOGO", OK: "FOGO-USDT-SWAP"},
{Name: "GALA", BN: "GALAUSDT", BG: "GALAUSDT", HL: "GALA", OK: "GALA-USDT-SWAP"},
{Name: "GAS", BN: "GASUSDT", BG: "GASUSDT", HL: "GAS", OK: "GAS-USDT-SWAP"},
{Name: "GMT", BN: "GMTUSDT", BG: "GMTUSDT", HL: "GMT", OK: "GMT-USDT-SWAP"},
{Name: "GMX", BN: "GMXUSDT", BG: "GMXUSDT", HL: "GMX", OK: "GMX-USDT-SWAP"},
{Name: "GOAT", BN: "GOATUSDT", BG: "GOATUSDT", HL: "GOAT", OK: "GOAT-USDT-SWAP"},
{Name: "GRASS", BN: "GRASSUSDT", BG: "GRASSUSDT", HL: "GRASS", OK: "GRASS-USDT-SWAP"},
{Name: "GRIFFAIN", BN: "GRIFFAINUSDT", BG: "GRIFFAINUSDT", HL: "GRIFFAIN", OK: "GRIFFAIN-USDT-SWAP"},
{Name: "HBAR", BN: "HBARUSDT", BG: "HBARUSDT", HL: "HBAR", OK: "HBAR-USDT-SWAP"},
{Name: "HYPE", BN: "HYPEUSDT", BG: "HYPEUSDT", HL: "HYPE", OK: "HYPE-USDT-SWAP"},
{Name: "HYPER", BN: "HYPERUSDT", BG: "HYPERUSDT", HL: "HYPER", OK: "HYPER-USDT-SWAP"},
{Name: "ICP", BN: "ICPUSDT", BG: "ICPUSDT", HL: "ICP", OK: "ICP-USDT-SWAP"},
{Name: "ILV", BN: "ILVUSDT", BG: "ILVUSDT", HL: "", OK: "ILV-USDT-SWAP"},
{Name: "IMX", BN: "IMXUSDT", BG: "IMXUSDT", HL: "IMX", OK: "IMX-USDT-SWAP"},
{Name: "INIT", BN: "INITUSDT", BG: "INITUSDT", HL: "INIT", OK: "INIT-USDT-SWAP"},
{Name: "INJ", BN: "INJUSDT", BG: "INJUSDT", HL: "INJ", OK: "INJ-USDT-SWAP"},
{Name: "IO", BN: "IOUSDT", BG: "IOUSDT", HL: "IO", OK: "IO-USDT-SWAP"},
{Name: "IOTA", BN: "IOTAUSDT", BG: "IOTAUSDT", HL: "IOTA", OK: "IOTA-USDT-SWAP"},
{Name: "IP", BN: "IPUSDT", BG: "IPUSDT", HL: "IP", OK: "IP-USDT-SWAP"},
{Name: "JTO", BN: "JTOUSDT", BG: "JTOUSDT", HL: "JTO", OK: "JTO-USDT-SWAP"},
{Name: "JUP", BN: "JUPUSDT", BG: "JUPUSDT", HL: "JUP", OK: "JUP-USDT-SWAP"},
{Name: "KAITO", BN: "KAITOUSDT", BG: "KAITOUSDT", HL: "KAITO", OK: "KAITO-USDT-SWAP"},
{Name: "KAS", BN: "KASUSDT", BG: "KASUSDT", HL: "KAS", OK: "KAS-USDT-SWAP"},
{Name: "LAYER", BN: "LAYERUSDT", BG: "LAYERUSDT", HL: "LAYER", OK: "LAYER-USDT-SWAP"},
{Name: "LDO", BN: "LDOUSDT", BG: "LDOUSDT", HL: "LDO", OK: "LDO-USDT-SWAP"},
{Name: "LINEA", BN: "LINEAUSDT", BG: "LINEAUSDT", HL: "LINEA", OK: "LINEA-USDT-SWAP"},
{Name: "LISTA", BN: "LISTAUSDT", BG: "LISTAUSDT", HL: "", OK: "LISTA-USDT-SWAP"},
{Name: "LIT", BN: "LITUSDT", BG: "LITUSDT", HL: "LIT", OK: "LIT-USDT-SWAP"},
{Name: "LTC", BN: "LTCUSDT", BG: "LTCUSDT", HL: "LTC", OK: "LTC-USDT-SWAP"},
{Name: "MANTA", BN: "MANTAUSDT", BG: "MANTAUSDT", HL: "MANTA", OK: "MANTA-USDT-SWAP"},
{Name: "MAV", BN: "MAVUSDT", BG: "MAVUSDT", HL: "MAV", OK: "MAV-USDT-SWAP"},
{Name: "ME", BN: "MEUSDT", BG: "MEUSDT", HL: "ME", OK: "ME-USDT-SWAP"},
{Name: "MEGA", BN: "MEGAUSDT", BG: "MEGAUSDT", HL: "MEGA", OK: "MEGA-USDT-SWAP"},
{Name: "MELANIA", BN: "MELANIAUSDT", BG: "MELANIAUSDT", HL: "MELANIA", OK: "MELANIA-USDT-SWAP"},
{Name: "MEME", BN: "MEMEUSDT", BG: "MEMEUSDT", HL: "MEME", OK: "MEME-USDT-SWAP"},
{Name: "MERL", BN: "MERLUSDT", BG: "MERLUSDT", HL: "MERL", OK: "MERL-USDT-SWAP"},
{Name: "MET", BN: "METUSDT", BG: "METUSDT", HL: "MET", OK: "MET-USDT-SWAP"},
{Name: "MINA", BN: "MINAUSDT", BG: "MINAUSDT", HL: "MINA", OK: "MINA-USDT-SWAP"},
{Name: "MON", BN: "MONUSDT", BG: "MONUSDT", HL: "MON", OK: "MON-USDT-SWAP"},
{Name: "MOODENG", BN: "MOODENGUSDT", BG: "MOODENGUSDT", HL: "MOODENG", OK: "MOODENG-USDT-SWAP"},
{Name: "MORPHO", BN: "MORPHOUSDT", BG: "MORPHOUSDT", HL: "MORPHO", OK: "MORPHO-USDT-SWAP"},
{Name: "MOVE", BN: "MOVEUSDT", BG: "MOVEUSDT", HL: "MOVE", OK: "MOVE-USDT-SWAP"},
{Name: "NEAR", BN: "NEARUSDT", BG: "NEARUSDT", HL: "NEAR", OK: "NEAR-USDT-SWAP"},
{Name: "NEO", BN: "NEOUSDT", BG: "NEOUSDT", HL: "NEO", OK: "NEO-USDT-SWAP"},
{Name: "NIL", BN: "NILUSDT", BG: "NILUSDT", HL: "NIL", OK: "NIL-USDT-SWAP"},
{Name: "NOT", BN: "NOTUSDT", BG: "NOTUSDT", HL: "NOT", OK: "NOT-USDT-SWAP"},
{Name: "NXPC", BN: "NXPCUSDT", BG: "NXPCUSDT", HL: "NXPC", OK: "NXPC-USDT-SWAP"},
{Name: "OGN", BN: "OGNUSDT", BG: "OGNUSDT", HL: "", OK: "OGN-USDT-SWAP"},
{Name: "ORDI", BN: "ORDIUSDT", BG: "ORDIUSDT", HL: "ORDI", OK: "ORDI-USDT-SWAP"},
{Name: "PAXG", BN: "PAXGUSDT", BG: "PAXGUSDT", HL: "PAXG", OK: "PAXG-USDT-SWAP"},
{Name: "PENDLE", BN: "PENDLEUSDT", BG: "PENDLEUSDT", HL: "PENDLE", OK: "PENDLE-USDT-SWAP"},
{Name: "PENGU", BN: "PENGUUSDT", BG: "PENGUUSDT", HL: "PENGU", OK: "PENGU-USDT-SWAP"},
{Name: "PEOPLE", BN: "PEOPLEUSDT", BG: "PEOPLEUSDT", HL: "PEOPLE", OK: "PEOPLE-USDT-SWAP"},
{Name: "PIXEL", BN: "PIXELUSDT", BG: "PIXELUSDT", HL: "", OK: "PIXEL-USDT-SWAP"},
{Name: "PNUT", BN: "PNUTUSDT", BG: "PNUTUSDT", HL: "PNUT", OK: "PNUT-USDT-SWAP"},
{Name: "POL", BN: "POLUSDT", BG: "POLUSDT", HL: "POL", OK: "POL-USDT-SWAP"},
{Name: "POLYX", BN: "POLYXUSDT", BG: "POLYXUSDT", HL: "POLYX", OK: "POLYX-USDT-SWAP"},
{Name: "POPCAT", BN: "POPCATUSDT", BG: "POPCATUSDT", HL: "POPCAT", OK: "POPCAT-USDT-SWAP"},
{Name: "PROVE", BN: "PROVEUSDT", BG: "PROVEUSDT", HL: "PROVE", OK: "PROVE-USDT-SWAP"},
{Name: "PUMP", BN: "PUMPUSDT", BG: "PUMPUSDT", HL: "PUMP", OK: "PUMP-USDT-SWAP"},
{Name: "PYTH", BN: "PYTHUSDT", BG: "PYTHUSDT", HL: "PYTH", OK: "PYTH-USDT-SWAP"},
{Name: "RENDER", BN: "RENDERUSDT", BG: "RENDERUSDT", HL: "RENDER", OK: "RENDER-USDT-SWAP"},
{Name: "RESOLV", BN: "RESOLVUSDT", BG: "RESOLVUSDT", HL: "RESOLV", OK: "RESOLV-USDT-SWAP"},
{Name: "REZ", BN: "REZUSDT", BG: "REZUSDT", HL: "REZ", OK: "REZ-USDT-SWAP"},
{Name: "RSR", BN: "RSRUSDT", BG: "RSRUSDT", HL: "RSR", OK: "RSR-USDT-SWAP"},
{Name: "RUNE", BN: "RUNEUSDT", BG: "RUNEUSDT", HL: "RUNE", OK: "RUNE-USDT-SWAP"},
{Name: "S", BN: "SUSDT", BG: "SUSDT", HL: "S", OK: "S-USDT-SWAP"},
{Name: "SAGA", BN: "SAGAUSDT", BG: "SAGAUSDT", HL: "SAGA", OK: "SAGA-USDT-SWAP"},
{Name: "SAND", BN: "SANDUSDT", BG: "SANDUSDT", HL: "SAND", OK: "SAND-USDT-SWAP"},
{Name: "SEI", BN: "SEIUSDT", BG: "SEIUSDT", HL: "SEI", OK: "SEI-USDT-SWAP"},
{Name: "SKR", BN: "SKRUSDT", BG: "SKRUSDT", HL: "SKR", OK: "SKR-USDT-SWAP"},
{Name: "SKY", BN: "SKYUSDT", BG: "SKYUSDT", HL: "SKY", OK: "SKY-USDT-SWAP"},
{Name: "SNX", BN: "SNXUSDT", BG: "SNXUSDT", HL: "SNX", OK: "SNX-USDT-SWAP"},
{Name: "SOL", BN: "SOLUSDT", BG: "SOLUSDT", HL: "SOL", OK: "SOL-USDT-SWAP"},
{Name: "SOPH", BN: "SOPHUSDT", BG: "SOPHUSDT", HL: "SOPH", OK: "SOPH-USDT-SWAP"},
{Name: "SPX", BN: "SPXUSDT", BG: "SPXUSDT", HL: "SPX", OK: "SPX-USDT-SWAP"},
{Name: "STABLE", BN: "STABLEUSDT", BG: "STABLEUSDT", HL: "STABLE", OK: "STABLE-USDT-SWAP"},
{Name: "STG", BN: "STGUSDT", BG: "STGUSDT", HL: "", OK: "STG-USDT-SWAP"},
{Name: "STRK", BN: "STRKUSDT", BG: "STRKUSDT", HL: "STRK", OK: "STRK-USDT-SWAP"},
{Name: "STX", BN: "STXUSDT", BG: "STXUSDT", HL: "STX", OK: "STX-USDT-SWAP"},
{Name: "SUI", BN: "SUIUSDT", BG: "SUIUSDT", HL: "SUI", OK: "SUI-USDT-SWAP"},
{Name: "SUPER", BN: "SUPERUSDT", BG: "SUPERUSDT", HL: "SUPER", OK: "SUPER-USDT-SWAP"},
{Name: "SUSHI", BN: "SUSHIUSDT", BG: "SUSHIUSDT", HL: "SUSHI", OK: "SUSHI-USDT-SWAP"},
{Name: "SYRUP", BN: "SYRUPUSDT", BG: "SYRUPUSDT", HL: "SYRUP", OK: "SYRUP-USDT-SWAP"},
{Name: "TAO", BN: "TAOUSDT", BG: "TAOUSDT", HL: "TAO", OK: "TAO-USDT-SWAP"},
{Name: "TIA", BN: "TIAUSDT", BG: "TIAUSDT", HL: "TIA", OK: "TIA-USDT-SWAP"},
{Name: "TNSR", BN: "TNSRUSDT", BG: "TNSRUSDT", HL: "TNSR", OK: "TNSR-USDT-SWAP"},
{Name: "TON", BN: "TONUSDT", BG: "TONUSDT", HL: "TON", OK: "TON-USDT-SWAP"},
{Name: "TRB", BN: "TRBUSDT", BG: "TRBUSDT", HL: "TRB", OK: "TRB-USDT-SWAP"},
{Name: "TRUMP", BN: "TRUMPUSDT", BG: "TRUMPUSDT", HL: "TRUMP", OK: "TRUMP-USDT-SWAP"},
{Name: "TRX", BN: "TRXUSDT", BG: "TRXUSDT", HL: "TRX", OK: "TRX-USDT-SWAP"},
{Name: "TURBO", BN: "TURBOUSDT", BG: "TURBOUSDT", HL: "TURBO", OK: "TURBO-USDT-SWAP"},
{Name: "UMA", BN: "UMAUSDT", BG: "UMAUSDT", HL: "UMA", OK: "UMA-USDT-SWAP"},
{Name: "UNI", BN: "UNIUSDT", BG: "UNIUSDT", HL: "UNI", OK: "UNI-USDT-SWAP"},
{Name: "USUAL", BN: "USUALUSDT", BG: "USUALUSDT", HL: "USUAL", OK: "USUAL-USDT-SWAP"},
{Name: "VIRTUAL", BN: "VIRTUALUSDT", BG: "VIRTUALUSDT", HL: "VIRTUAL", OK: "VIRTUAL-USDT-SWAP"},
{Name: "VVV", BN: "VVVUSDT", BG: "VVVUSDT", HL: "VVV", OK: "VVV-USDT-SWAP"},
{Name: "W", BN: "WUSDT", BG: "WUSDT", HL: "W", OK: "W-USDT-SWAP"},
{Name: "WCT", BN: "WCTUSDT", BG: "WCTUSDT", HL: "WCT", OK: "WCT-USDT-SWAP"},
{Name: "WLD", BN: "WLDUSDT", BG: "WLDUSDT", HL: "WLD", OK: "WLD-USDT-SWAP"},
{Name: "WLFI", BN: "WLFIUSDT", BG: "WLFIUSDT", HL: "WLFI", OK: "WLFI-USDT-SWAP"},
{Name: "XAI", BN: "XAIUSDT", BG: "XAIUSDT", HL: "XAI", OK: "XAI-USDT-SWAP"},
{Name: "XLM", BN: "XLMUSDT", BG: "XLMUSDT", HL: "XLM", OK: "XLM-USDT-SWAP"},
{Name: "XMR", BN: "XMRUSDT", BG: "XMRUSDT", HL: "XMR", OK: "XMR-USDT-SWAP"},
{Name: "XPL", BN: "XPLUSDT", BG: "XPLUSDT", HL: "XPL", OK: "XPL-USDT-SWAP"},
{Name: "XRP", BN: "XRPUSDT", BG: "XRPUSDT", HL: "XRP", OK: "XRP-USDT-SWAP"},
{Name: "YGG", BN: "YGGUSDT", BG: "YGGUSDT", HL: "YGG", OK: "YGG-USDT-SWAP"},
{Name: "ZEC", BN: "ZECUSDT", BG: "ZECUSDT", HL: "ZEC", OK: "ZEC-USDT-SWAP"},
{Name: "ZEN", BN: "ZENUSDT", BG: "ZENUSDT", HL: "ZEN", OK: "ZEN-USDT-SWAP"},
{Name: "ZETA", BN: "ZETAUSDT", BG: "ZETAUSDT", HL: "ZETA", OK: "ZETA-USDT-SWAP"},
{Name: "ZK", BN: "ZKUSDT", BG: "ZKUSDT", HL: "ZK", OK: "ZK-USDT-SWAP"},
{Name: "ZORA", BN: "ZORAUSDT", BG: "ZORAUSDT", HL: "ZORA", OK: "ZORA-USDT-SWAP"},
{Name: "ZRO", BN: "ZROUSDT", BG: "ZROUSDT", HL: "ZRO", OK: "ZRO-USDT-SWAP"},
{Name: "DOGE", BN: "DOGEUSDT", BG: "DOGEUSDT", OK: "DOGE-USDT-SWAP"},
{Name: "LINK", BN: "LINKUSDT", BG: "LINKUSDT", OK: "LINK-USDT-SWAP"},
{Name: "ONDO", BN: "ONDOUSDT", BG: "ONDOUSDT", OK: "ONDO-USDT-SWAP"},
{Name: "OP", BN: "OPUSDT", BG: "OPUSDT", OK: "OP-USDT-SWAP"},
{Name: "WIF", BN: "WIFUSDT", BG: "WIFUSDT", OK: "WIF-USDT-SWAP"},
{Name: "ARB", BN: "ARBUSDT", BG: "ARBUSDT", OK: "ARB-USDT-SWAP"},
{Name: "0G", BN: "0GUSDT", BG: "0GUSDT", OK: "0G-USDT-SWAP"},
{Name: "2Z", BN: "2ZUSDT", BG: "2ZUSDT", OK: "2Z-USDT-SWAP"},
{Name: "AAVE", BN: "AAVEUSDT", BG: "AAVEUSDT", OK: "AAVE-USDT-SWAP"},
{Name: "ACE", BN: "ACEUSDT", BG: "ACEUSDT", OK: "ACE-USDT-SWAP"},
{Name: "ADA", BN: "ADAUSDT", BG: "ADAUSDT", OK: "ADA-USDT-SWAP"},
{Name: "AIXBT", BN: "AIXBTUSDT", BG: "AIXBTUSDT", OK: "AIXBT-USDT-SWAP"},
{Name: "ALGO", BN: "ALGOUSDT", BG: "ALGOUSDT", OK: "ALGO-USDT-SWAP"},
{Name: "ALT", BN: "ALTUSDT", BG: "ALTUSDT", OK: "ALT-USDT-SWAP"},
{Name: "ANIME", BN: "ANIMEUSDT", BG: "ANIMEUSDT", OK: "ANIME-USDT-SWAP"},
{Name: "APE", BN: "APEUSDT", BG: "APEUSDT", OK: "APE-USDT-SWAP"},
{Name: "APT", BN: "APTUSDT", BG: "APTUSDT", OK: "APT-USDT-SWAP"},
{Name: "AR", BN: "ARUSDT", BG: "ARUSDT", OK: "AR-USDT-SWAP"},
{Name: "ARK", BN: "ARKUSDT", BG: "ARKUSDT", OK: "ARK-USDT-SWAP"},
{Name: "ASTER", BN: "ASTERUSDT", BG: "ASTERUSDT", OK: "ASTER-USDT-SWAP"},
{Name: "ATOM", BN: "ATOMUSDT", BG: "ATOMUSDT", OK: "ATOM-USDT-SWAP"},
{Name: "AVAX", BN: "AVAXUSDT", BG: "AVAXUSDT", OK: "AVAX-USDT-SWAP"},
{Name: "AVNT", BN: "AVNTUSDT", BG: "AVNTUSDT", OK: "AVNT-USDT-SWAP"},
{Name: "AXS", BN: "AXSUSDT", BG: "AXSUSDT", OK: "AXS-USDT-SWAP"},
{Name: "AZTEC", BN: "AZTECUSDT", BG: "AZTECUSDT", OK: "AZTEC-USDT-SWAP"},
{Name: "BABY", BN: "BABYUSDT", BG: "BABYUSDT", OK: "BABY-USDT-SWAP"},
{Name: "BANANA", BN: "BANANAUSDT", BG: "BANANAUSDT", OK: "BANANA-USDT-SWAP"},
{Name: "BCH", BN: "BCHUSDT", BG: "BCHUSDT", OK: "BCH-USDT-SWAP"},
{Name: "BERA", BN: "BERAUSDT", BG: "BERAUSDT", OK: "BERA-USDT-SWAP"},
{Name: "BIGTIME", BN: "BIGTIMEUSDT", BG: "BIGTIMEUSDT", OK: "BIGTIME-USDT-SWAP"},
{Name: "BIO", BN: "BIOUSDT", BG: "BIOUSDT", OK: "BIO-USDT-SWAP"},
{Name: "BLUR", BN: "BLURUSDT", BG: "BLURUSDT", OK: "BLUR-USDT-SWAP"},
{Name: "BNB", BN: "BNBUSDT", BG: "BNBUSDT", OK: "BNB-USDT-SWAP"},
{Name: "BNT", BN: "BNTUSDT", BG: "BNTUSDT", OK: "BNT-USDT-SWAP"},
{Name: "BOME", BN: "BOMEUSDT", BG: "BOMEUSDT", OK: "BOME-USDT-SWAP"},
{Name: "BRETT", BN: "BRETTUSDT", BG: "BRETTUSDT", OK: "BRETT-USDT-SWAP"},
{Name: "BSV", BN: "BSVUSDT", BG: "BSVUSDT", OK: "BSV-USDT-SWAP"},
{Name: "BTC", BN: "BTCUSDT", BG: "BTCUSDT", OK: "BTC-USDT-SWAP"},
{Name: "CAKE", BN: "CAKEUSDT", BG: "CAKEUSDT", OK: "CAKE-USDT-SWAP"},
{Name: "CATI", BN: "CATIUSDT", BG: "CATIUSDT", OK: "CATI-USDT-SWAP"},
{Name: "CC", BN: "CCUSDT", BG: "CCUSDT", OK: "CC-USDT-SWAP"},
{Name: "CELO", BN: "CELOUSDT", BG: "CELOUSDT", OK: "CELO-USDT-SWAP"},
{Name: "CFX", BN: "CFXUSDT", BG: "CFXUSDT", OK: "CFX-USDT-SWAP"},
{Name: "CHILLGUY", BN: "CHILLGUYUSDT", BG: "CHILLGUYUSDT", OK: "CHILLGUY-USDT-SWAP"},
{Name: "CHIP", BN: "CHIPUSDT", BG: "CHIPUSDT", OK: "CHIP-USDT-SWAP"},
{Name: "COMP", BN: "COMPUSDT", BG: "COMPUSDT", OK: "COMP-USDT-SWAP"},
{Name: "CRV", BN: "CRVUSDT", BG: "CRVUSDT", OK: "CRV-USDT-SWAP"},
{Name: "CYBER", BN: "CYBERUSDT", BG: "CYBERUSDT", OK: "CYBER-USDT-SWAP"},
{Name: "DASH", BN: "DASHUSDT", BG: "DASHUSDT", OK: "DASH-USDT-SWAP"},
{Name: "DOOD", BN: "DOODUSDT", BG: "DOODUSDT", OK: "DOOD-USDT-SWAP"},
{Name: "DOT", BN: "DOTUSDT", BG: "DOTUSDT", OK: "DOT-USDT-SWAP"},
{Name: "DYDX", BN: "DYDXUSDT", BG: "DYDXUSDT", OK: "DYDX-USDT-SWAP"},
{Name: "DYM", BN: "DYMUSDT", BG: "DYMUSDT", OK: "DYM-USDT-SWAP"},
{Name: "EIGEN", BN: "EIGENUSDT", BG: "EIGENUSDT", OK: "EIGEN-USDT-SWAP"},
{Name: "ENA", BN: "ENAUSDT", BG: "ENAUSDT", OK: "ENA-USDT-SWAP"},
{Name: "ENS", BN: "ENSUSDT", BG: "ENSUSDT", OK: "ENS-USDT-SWAP"},
{Name: "ETC", BN: "ETCUSDT", BG: "ETCUSDT", OK: "ETC-USDT-SWAP"},
{Name: "ETH", BN: "ETHUSDT", BG: "ETHUSDT", OK: "ETH-USDT-SWAP"},
{Name: "ETHFI", BN: "ETHFIUSDT", BG: "ETHFIUSDT", OK: "ETHFI-USDT-SWAP"},
{Name: "FARTCOIN", BN: "FARTCOINUSDT", BG: "FARTCOINUSDT", OK: "FARTCOIN-USDT-SWAP"},
{Name: "FET", BN: "FETUSDT", BG: "FETUSDT", OK: "FET-USDT-SWAP"},
{Name: "FIL", BN: "FILUSDT", BG: "FILUSDT", OK: "FIL-USDT-SWAP"},
{Name: "FOGO", BN: "FOGOUSDT", BG: "FOGOUSDT", OK: "FOGO-USDT-SWAP"},
{Name: "GALA", BN: "GALAUSDT", BG: "GALAUSDT", OK: "GALA-USDT-SWAP"},
{Name: "GAS", BN: "GASUSDT", BG: "GASUSDT", OK: "GAS-USDT-SWAP"},
{Name: "GMT", BN: "GMTUSDT", BG: "GMTUSDT", OK: "GMT-USDT-SWAP"},
{Name: "GMX", BN: "GMXUSDT", BG: "GMXUSDT", OK: "GMX-USDT-SWAP"},
{Name: "GOAT", BN: "GOATUSDT", BG: "GOATUSDT", OK: "GOAT-USDT-SWAP"},
{Name: "GRASS", BN: "GRASSUSDT", BG: "GRASSUSDT", OK: "GRASS-USDT-SWAP"},
{Name: "GRIFFAIN", BN: "GRIFFAINUSDT", BG: "GRIFFAINUSDT", OK: "GRIFFAIN-USDT-SWAP"},
{Name: "HBAR", BN: "HBARUSDT", BG: "HBARUSDT", OK: "HBAR-USDT-SWAP"},
{Name: "HYPE", BN: "HYPEUSDT", BG: "HYPEUSDT", OK: "HYPE-USDT-SWAP"},
{Name: "HYPER", BN: "HYPERUSDT", BG: "HYPERUSDT", OK: "HYPER-USDT-SWAP"},
{Name: "ICP", BN: "ICPUSDT", BG: "ICPUSDT", OK: "ICP-USDT-SWAP"},
{Name: "ILV", BN: "ILVUSDT", BG: "ILVUSDT", OK: "ILV-USDT-SWAP"},
{Name: "IMX", BN: "IMXUSDT", BG: "IMXUSDT", OK: "IMX-USDT-SWAP"},
{Name: "INIT", BN: "INITUSDT", BG: "INITUSDT", OK: "INIT-USDT-SWAP"},
{Name: "INJ", BN: "INJUSDT", BG: "INJUSDT", OK: "INJ-USDT-SWAP"},
{Name: "IO", BN: "IOUSDT", BG: "IOUSDT", OK: "IO-USDT-SWAP"},
{Name: "IOTA", BN: "IOTAUSDT", BG: "IOTAUSDT", OK: "IOTA-USDT-SWAP"},
{Name: "IP", BN: "IPUSDT", BG: "IPUSDT", OK: "IP-USDT-SWAP"},
{Name: "JTO", BN: "JTOUSDT", BG: "JTOUSDT", OK: "JTO-USDT-SWAP"},
{Name: "JUP", BN: "JUPUSDT", BG: "JUPUSDT", OK: "JUP-USDT-SWAP"},
{Name: "KAITO", BN: "KAITOUSDT", BG: "KAITOUSDT", OK: "KAITO-USDT-SWAP"},
{Name: "KAS", BN: "KASUSDT", BG: "KASUSDT", OK: "KAS-USDT-SWAP"},
{Name: "LAYER", BN: "LAYERUSDT", BG: "LAYERUSDT", OK: "LAYER-USDT-SWAP"},
{Name: "LDO", BN: "LDOUSDT", BG: "LDOUSDT", OK: "LDO-USDT-SWAP"},
{Name: "LINEA", BN: "LINEAUSDT", BG: "LINEAUSDT", OK: "LINEA-USDT-SWAP"},
{Name: "LISTA", BN: "LISTAUSDT", BG: "LISTAUSDT", OK: "LISTA-USDT-SWAP"},
{Name: "LIT", BN: "LITUSDT", BG: "LITUSDT", OK: "LIT-USDT-SWAP"},
{Name: "LTC", BN: "LTCUSDT", BG: "LTCUSDT", OK: "LTC-USDT-SWAP"},
{Name: "MANTA", BN: "MANTAUSDT", BG: "MANTAUSDT", OK: "MANTA-USDT-SWAP"},
{Name: "MAV", BN: "MAVUSDT", BG: "MAVUSDT", OK: "MAV-USDT-SWAP"},
{Name: "ME", BN: "MEUSDT", BG: "MEUSDT", OK: "ME-USDT-SWAP"},
{Name: "MEGA", BN: "MEGAUSDT", BG: "MEGAUSDT", OK: "MEGA-USDT-SWAP"},
{Name: "MELANIA", BN: "MELANIAUSDT", BG: "MELANIAUSDT", OK: "MELANIA-USDT-SWAP"},
{Name: "MEME", BN: "MEMEUSDT", BG: "MEMEUSDT", OK: "MEME-USDT-SWAP"},
{Name: "MERL", BN: "MERLUSDT", BG: "MERLUSDT", OK: "MERL-USDT-SWAP"},
{Name: "MET", BN: "METUSDT", BG: "METUSDT", OK: "MET-USDT-SWAP"},
{Name: "MINA", BN: "MINAUSDT", BG: "MINAUSDT", OK: "MINA-USDT-SWAP"},
{Name: "MON", BN: "MONUSDT", BG: "MONUSDT", OK: "MON-USDT-SWAP"},
{Name: "MOODENG", BN: "MOODENGUSDT", BG: "MOODENGUSDT", OK: "MOODENG-USDT-SWAP"},
{Name: "MORPHO", BN: "MORPHOUSDT", BG: "MORPHOUSDT", OK: "MORPHO-USDT-SWAP"},
{Name: "MOVE", BN: "MOVEUSDT", BG: "MOVEUSDT", OK: "MOVE-USDT-SWAP"},
{Name: "NEAR", BN: "NEARUSDT", BG: "NEARUSDT", OK: "NEAR-USDT-SWAP"},
{Name: "NEO", BN: "NEOUSDT", BG: "NEOUSDT", OK: "NEO-USDT-SWAP"},
{Name: "NIL", BN: "NILUSDT", BG: "NILUSDT", OK: "NIL-USDT-SWAP"},
{Name: "NOT", BN: "NOTUSDT", BG: "NOTUSDT", OK: "NOT-USDT-SWAP"},
{Name: "NXPC", BN: "NXPCUSDT", BG: "NXPCUSDT", OK: "NXPC-USDT-SWAP"},
{Name: "OGN", BN: "OGNUSDT", BG: "OGNUSDT", OK: "OGN-USDT-SWAP"},
{Name: "ORDI", BN: "ORDIUSDT", BG: "ORDIUSDT", OK: "ORDI-USDT-SWAP"},
{Name: "PAXG", BN: "PAXGUSDT", BG: "PAXGUSDT", OK: "PAXG-USDT-SWAP"},
{Name: "PENDLE", BN: "PENDLEUSDT", BG: "PENDLEUSDT", OK: "PENDLE-USDT-SWAP"},
{Name: "PENGU", BN: "PENGUUSDT", BG: "PENGUUSDT", OK: "PENGU-USDT-SWAP"},
{Name: "PEOPLE", BN: "PEOPLEUSDT", BG: "PEOPLEUSDT", OK: "PEOPLE-USDT-SWAP"},
{Name: "PIXEL", BN: "PIXELUSDT", BG: "PIXELUSDT", OK: "PIXEL-USDT-SWAP"},
{Name: "PNUT", BN: "PNUTUSDT", BG: "PNUTUSDT", OK: "PNUT-USDT-SWAP"},
{Name: "POL", BN: "POLUSDT", BG: "POLUSDT", OK: "POL-USDT-SWAP"},
{Name: "POLYX", BN: "POLYXUSDT", BG: "POLYXUSDT", OK: "POLYX-USDT-SWAP"},
{Name: "POPCAT", BN: "POPCATUSDT", BG: "POPCATUSDT", OK: "POPCAT-USDT-SWAP"},
{Name: "PROVE", BN: "PROVEUSDT", BG: "PROVEUSDT", OK: "PROVE-USDT-SWAP"},
{Name: "PUMP", BN: "PUMPUSDT", BG: "PUMPUSDT", OK: "PUMP-USDT-SWAP"},
{Name: "PYTH", BN: "PYTHUSDT", BG: "PYTHUSDT", OK: "PYTH-USDT-SWAP"},
{Name: "RENDER", BN: "RENDERUSDT", BG: "RENDERUSDT", OK: "RENDER-USDT-SWAP"},
{Name: "RESOLV", BN: "RESOLVUSDT", BG: "RESOLVUSDT", OK: "RESOLV-USDT-SWAP"},
{Name: "REZ", BN: "REZUSDT", BG: "REZUSDT", OK: "REZ-USDT-SWAP"},
{Name: "RSR", BN: "RSRUSDT", BG: "RSRUSDT", OK: "RSR-USDT-SWAP"},
{Name: "RUNE", BN: "RUNEUSDT", BG: "RUNEUSDT", OK: "RUNE-USDT-SWAP"},
{Name: "S", BN: "SUSDT", BG: "SUSDT", OK: "S-USDT-SWAP"},
{Name: "SAGA", BN: "SAGAUSDT", BG: "SAGAUSDT", OK: "SAGA-USDT-SWAP"},
{Name: "SAND", BN: "SANDUSDT", BG: "SANDUSDT", OK: "SAND-USDT-SWAP"},
{Name: "SEI", BN: "SEIUSDT", BG: "SEIUSDT", OK: "SEI-USDT-SWAP"},
{Name: "SKR", BN: "SKRUSDT", BG: "SKRUSDT", OK: "SKR-USDT-SWAP"},
{Name: "SKY", BN: "SKYUSDT", BG: "SKYUSDT", OK: "SKY-USDT-SWAP"},
{Name: "SNX", BN: "SNXUSDT", BG: "SNXUSDT", OK: "SNX-USDT-SWAP"},
{Name: "SOL", BN: "SOLUSDT", BG: "SOLUSDT", OK: "SOL-USDT-SWAP"},
{Name: "SOPH", BN: "SOPHUSDT", BG: "SOPHUSDT", OK: "SOPH-USDT-SWAP"},
{Name: "SPX", BN: "SPXUSDT", BG: "SPXUSDT", OK: "SPX-USDT-SWAP"},
{Name: "STABLE", BN: "STABLEUSDT", BG: "STABLEUSDT", OK: "STABLE-USDT-SWAP"},
{Name: "STG", BN: "STGUSDT", BG: "STGUSDT", OK: "STG-USDT-SWAP"},
{Name: "STRK", BN: "STRKUSDT", BG: "STRKUSDT", OK: "STRK-USDT-SWAP"},
{Name: "STX", BN: "STXUSDT", BG: "STXUSDT", OK: "STX-USDT-SWAP"},
{Name: "SUI", BN: "SUIUSDT", BG: "SUIUSDT", OK: "SUI-USDT-SWAP"},
{Name: "SUPER", BN: "SUPERUSDT", BG: "SUPERUSDT", OK: "SUPER-USDT-SWAP"},
{Name: "SUSHI", BN: "SUSHIUSDT", BG: "SUSHIUSDT", OK: "SUSHI-USDT-SWAP"},
{Name: "SYRUP", BN: "SYRUPUSDT", BG: "SYRUPUSDT", OK: "SYRUP-USDT-SWAP"},
{Name: "TAO", BN: "TAOUSDT", BG: "TAOUSDT", OK: "TAO-USDT-SWAP"},
{Name: "TIA", BN: "TIAUSDT", BG: "TIAUSDT", OK: "TIA-USDT-SWAP"},
{Name: "TNSR", BN: "TNSRUSDT", BG: "TNSRUSDT", OK: "TNSR-USDT-SWAP"},
{Name: "TON", BN: "TONUSDT", BG: "TONUSDT", OK: "TON-USDT-SWAP"},
{Name: "TRB", BN: "TRBUSDT", BG: "TRBUSDT", OK: "TRB-USDT-SWAP"},
{Name: "TRUMP", BN: "TRUMPUSDT", BG: "TRUMPUSDT", OK: "TRUMP-USDT-SWAP"},
{Name: "TRX", BN: "TRXUSDT", BG: "TRXUSDT", OK: "TRX-USDT-SWAP"},
{Name: "TURBO", BN: "TURBOUSDT", BG: "TURBOUSDT", OK: "TURBO-USDT-SWAP"},
{Name: "UMA", BN: "UMAUSDT", BG: "UMAUSDT", OK: "UMA-USDT-SWAP"},
{Name: "UNI", BN: "UNIUSDT", BG: "UNIUSDT", OK: "UNI-USDT-SWAP"},
{Name: "USUAL", BN: "USUALUSDT", BG: "USUALUSDT", OK: "USUAL-USDT-SWAP"},
{Name: "VIRTUAL", BN: "VIRTUALUSDT", BG: "VIRTUALUSDT", OK: "VIRTUAL-USDT-SWAP"},
{Name: "VVV", BN: "VVVUSDT", BG: "VVVUSDT", OK: "VVV-USDT-SWAP"},
{Name: "W", BN: "WUSDT", BG: "WUSDT", OK: "W-USDT-SWAP"},
{Name: "WCT", BN: "WCTUSDT", BG: "WCTUSDT", OK: "WCT-USDT-SWAP"},
{Name: "WLD", BN: "WLDUSDT", BG: "WLDUSDT", OK: "WLD-USDT-SWAP"},
{Name: "WLFI", BN: "WLFIUSDT", BG: "WLFIUSDT", OK: "WLFI-USDT-SWAP"},
{Name: "XAI", BN: "XAIUSDT", BG: "XAIUSDT", OK: "XAI-USDT-SWAP"},
{Name: "XLM", BN: "XLMUSDT", BG: "XLMUSDT", OK: "XLM-USDT-SWAP"},
{Name: "XMR", BN: "XMRUSDT", BG: "XMRUSDT", OK: "XMR-USDT-SWAP"},
{Name: "XPL", BN: "XPLUSDT", BG: "XPLUSDT", OK: "XPL-USDT-SWAP"},
{Name: "XRP", BN: "XRPUSDT", BG: "XRPUSDT", OK: "XRP-USDT-SWAP"},
{Name: "YGG", BN: "YGGUSDT", BG: "YGGUSDT", OK: "YGG-USDT-SWAP"},
{Name: "ZEC", BN: "ZECUSDT", BG: "ZECUSDT", OK: "ZEC-USDT-SWAP"},
{Name: "ZEN", BN: "ZENUSDT", BG: "ZENUSDT", OK: "ZEN-USDT-SWAP"},
{Name: "ZETA", BN: "ZETAUSDT", BG: "ZETAUSDT", OK: "ZETA-USDT-SWAP"},
{Name: "ZK", BN: "ZKUSDT", BG: "ZKUSDT", OK: "ZK-USDT-SWAP"},
{Name: "ZORA", BN: "ZORAUSDT", BG: "ZORAUSDT", OK: "ZORA-USDT-SWAP"},
{Name: "ZRO", BN: "ZROUSDT", BG: "ZROUSDT", OK: "ZRO-USDT-SWAP"},
}
// netProfit calculates net profit % after fees for a complete round trip (entry + exit).
// NOTE: Does NOT swap prices — callers (ScanArbWithFees) pass prices in explicit buy/sell order
// and try both directions via addPair. Using exchange.CalcNetProfit would double-swap (B#6).
func netProfit(buyPrice, sellPrice, buyFee, sellFee float64) float64 {
if buyPrice <= 0 || sellPrice <= 0 {
return 0
}
// Entry: buy at buyPrice (pay buyFee), sell short at sellPrice (pay sellFee)
cost := buyPrice * (1 + buyFee/100)
revenue := sellPrice * (1 - sellFee/100)
// Exit: sell long (pay sellFee), buy back short (pay buyFee)
// Total fees = 2 * (buyFee + sellFee), first round already in formula above
return (revenue/cost - 1)*100 - 2*(buyFee + sellFee)
// ThreeExSpread holds the 3-exchange max spread for a single coin.
type ThreeExSpread struct {
Coin string
BnPrice float64
OkxPrice float64
BgPrice float64
SpreadPct float64 // (max-min)/min*100 across 3 exchanges
MaxEx string // exchange with highest price
MinEx string // exchange with lowest price
}
// ScanBGHL scans coins for arbitrage ONLY between Bitget and HyperLiquid (P3-1).
// Returns both directions (BG->HL and HL->BG) sorted by net profit descending.
func ScanBGHL(snap map[string]map[string]float64) []*ArbOpportunity {
var results []*ArbOpportunity
// Scan3Ex computes 3-exchange max spread for all tracked coins.
// Requires at least 2 of 3 exchanges to have a price.
func Scan3Ex(snap map[string]map[string]float64) []ThreeExSpread {
var results []ThreeExSpread
for _, coin := range TrackedCoins {
if coin.BG == "" || coin.HL == "" {
continue // skip coins not available on both exchanges
}
exMap := snap[coin.Name]
if exMap == nil {
continue
}
bnP := exMap[ExBinance]
okxP := exMap[ExOKX]
bgP := exMap[ExBitget]
hlP := exMap[ExHyperLiquid]
if bgP <= 0 || hlP <= 0 {
// Need at least 2 exchanges
count := 0
if bnP > 0 { count++ }
if okxP > 0 { count++ }
if bgP > 0 { count++ }
if count < 2 {
continue
}
// BG->HL: buy cheap at Bitget, sell expensive at HyperLiquid
profitBG := netProfit(bgP, hlP, takerFees[ExBitget], takerFees[ExHyperLiquid])
// HL->BG: buy cheap at HyperLiquid, sell expensive at Bitget
profitHL := netProfit(hlP, bgP, takerFees[ExHyperLiquid], takerFees[ExBitget])
// Find min/max among available prices
prices := []struct {
ex string
p float64
}{}
if bnP > 0 { prices = append(prices, struct{ ex string; p float64 }{ExBinance, bnP}) }
if okxP > 0 { prices = append(prices, struct{ ex string; p float64 }{ExOKX, okxP}) }
if bgP > 0 { prices = append(prices, struct{ ex string; p float64 }{ExBitget, bgP}) }
grossBG := (hlP - bgP) / bgP * 100
grossHL := (bgP - hlP) / hlP * 100
minP, maxP := prices[0], prices[0]
for _, pp := range prices[1:] {
if pp.p < minP.p { minP = pp }
if pp.p > maxP.p { maxP = pp }
}
results = append(results, &ArbOpportunity{
Coin: coin.Name,
Direction: "BG->HL",
BuyEx: ExBitget,
SellEx: ExHyperLiquid,
BuyPrice: bgP,
SellPrice: hlP,
NetProfit: profitBG,
GrossBasis: grossBG,
}, &ArbOpportunity{
Coin: coin.Name,
Direction: "HL->BG",
BuyEx: ExHyperLiquid,
SellEx: ExBitget,
BuyPrice: hlP,
SellPrice: bgP,
NetProfit: profitHL,
GrossBasis: grossHL,
spread := (maxP.p - minP.p) / minP.p * 100
results = append(results, ThreeExSpread{
Coin: coin.Name,
BnPrice: bnP,
OkxPrice: okxP,
BgPrice: bgP,
SpreadPct: spread,
MaxEx: maxP.ex,
MinEx: minP.ex,
})
}
// Sort by spread descending
sort.Slice(results, func(i, j int) bool {
return results[i].NetProfit > results[j].NetProfit
return results[i].SpreadPct > results[j].SpreadPct
})
return results