fix: remove HL-delisted coins from scanner (BNT/CATI/CYBER/ILV/LISTA/OGN/STG) + PIXEL

Root cause: HL WS uses allMids (all coins), BG WS subscribes per-coin.
Delisted coins had stale HL prices showing huge fake spreads (~200%).
Monitor tried entry → BG buy succeeds, HL sell fails (Trading is halted)
→ orphan position on BG accumulated across restarts.

Fix:
- Set HL="" for BNT, CATI, CYBER, ILV, LISTA, OGN, STG, PIXEL
- Add guard in ScanBGHL to skip coins where BG or HL is empty
- Same guard in SpreadWindowTracker.Tick
This commit is contained in:
jackyu66git
2026-05-04 23:12:41 +08:00
parent c04d8ca0da
commit ce204abc81
5 changed files with 62 additions and 9 deletions
+14
View File
@@ -0,0 +1,14 @@
# Telegram 推送
TELEGRAM_BOT_TOKEN=*** TELEGRAM_CHAT_ID=580807463
# API 密钥 (测试模式不需要)
BITGET_API_KEY=bg_0e6bd5f5f082f9e77c56a4402471ece7
BITGET_API_SECRET=e914e1486e2db82866ffe5e2fabbb1d25d380e281d9ed8599b09c82d50c8d620
BITGET_PASSPHRASE=Yoyousoft007
# HyperLiquid testnet API (EVM wallet)
# Private key = API钱包私钥
# Address = 主账号地址(有999 USDC现货)
HL_PRIVATE_KEY=0xcb4e58b6c0921fd4aa8e49cd8a9f06b98b4e6b9cdf7c60c63ba1416856bb0b2a
HL_ADDRESS=0xA834b6d3Fa1D8A55ea8e502685ef5cbD2b2D3343
HL_API_ADDRESS=0x601B09803A46F640C9416C124A7DB858a615F5fF
+1 -1
View File
@@ -8,7 +8,7 @@
"trade_cooldown_ms": 30000, "trade_cooldown_ms": 30000,
"alert_cooldown_sec": 300, "alert_cooldown_sec": 300,
"mock_slippage_pct": 0.05, "mock_slippage_pct": 0.05,
"max_positions": 5, "max_positions": 1,
"blacklist_duration_sec": 3600, "blacklist_duration_sec": 3600,
"initial_capital": 1000, "initial_capital": 1000,
"taker_fee_bitget": 0.060, "taker_fee_bitget": 0.060,
+11 -8
View File
@@ -51,13 +51,13 @@ var TrackedCoins = []TrackedCoin{
{Name: "BIO", BN: "", BG: "BIOUSDT", HL: "BIO"}, {Name: "BIO", BN: "", BG: "BIOUSDT", HL: "BIO"},
{Name: "BLUR", BN: "", BG: "BLURUSDT", HL: "BLUR"}, {Name: "BLUR", BN: "", BG: "BLURUSDT", HL: "BLUR"},
{Name: "BNB", BN: "", BG: "BNBUSDT", HL: "BNB"}, {Name: "BNB", BN: "", BG: "BNBUSDT", HL: "BNB"},
{Name: "BNT", BN: "", BG: "BNTUSDT", HL: "BNT"}, {Name: "BNT", BN: "", BG: "BNTUSDT", HL: ""},
{Name: "BOME", BN: "", BG: "BOMEUSDT", HL: "BOME"}, {Name: "BOME", BN: "", BG: "BOMEUSDT", HL: "BOME"},
{Name: "BRETT", BN: "", BG: "BRETTUSDT", HL: "BRETT"}, {Name: "BRETT", BN: "", BG: "BRETTUSDT", HL: "BRETT"},
{Name: "BSV", BN: "", BG: "BSVUSDT", HL: "BSV"}, {Name: "BSV", BN: "", BG: "BSVUSDT", HL: "BSV"},
{Name: "BTC", BN: "", BG: "BTCUSDT", HL: "BTC"}, {Name: "BTC", BN: "", BG: "BTCUSDT", HL: "BTC"},
{Name: "CAKE", BN: "", BG: "CAKEUSDT", HL: "CAKE"}, {Name: "CAKE", BN: "", BG: "CAKEUSDT", HL: "CAKE"},
{Name: "CATI", BN: "", BG: "CATIUSDT", HL: "CATI"}, {Name: "CATI", BN: "", BG: "CATIUSDT", HL: ""},
{Name: "CC", BN: "", BG: "CCUSDT", HL: "CC"}, {Name: "CC", BN: "", BG: "CCUSDT", HL: "CC"},
{Name: "CELO", BN: "", BG: "CELOUSDT", HL: "CELO"}, {Name: "CELO", BN: "", BG: "CELOUSDT", HL: "CELO"},
{Name: "CFX", BN: "", BG: "CFXUSDT", HL: "CFX"}, {Name: "CFX", BN: "", BG: "CFXUSDT", HL: "CFX"},
@@ -65,7 +65,7 @@ var TrackedCoins = []TrackedCoin{
{Name: "CHIP", BN: "", BG: "CHIPUSDT", HL: "CHIP"}, {Name: "CHIP", BN: "", BG: "CHIPUSDT", HL: "CHIP"},
{Name: "COMP", BN: "", BG: "COMPUSDT", HL: "COMP"}, {Name: "COMP", BN: "", BG: "COMPUSDT", HL: "COMP"},
{Name: "CRV", BN: "", BG: "CRVUSDT", HL: "CRV"}, {Name: "CRV", BN: "", BG: "CRVUSDT", HL: "CRV"},
{Name: "CYBER", BN: "", BG: "CYBERUSDT", HL: "CYBER"}, {Name: "CYBER", BN: "", BG: "CYBERUSDT", HL: ""},
{Name: "DASH", BN: "", BG: "DASHUSDT", HL: "DASH"}, {Name: "DASH", BN: "", BG: "DASHUSDT", HL: "DASH"},
{Name: "DOOD", BN: "", BG: "DOODUSDT", HL: "DOOD"}, {Name: "DOOD", BN: "", BG: "DOODUSDT", HL: "DOOD"},
{Name: "DOT", BN: "", BG: "DOTUSDT", HL: "DOT"}, {Name: "DOT", BN: "", BG: "DOTUSDT", HL: "DOT"},
@@ -92,7 +92,7 @@ var TrackedCoins = []TrackedCoin{
{Name: "HYPE", BN: "", BG: "HYPEUSDT", HL: "HYPE"}, {Name: "HYPE", BN: "", BG: "HYPEUSDT", HL: "HYPE"},
{Name: "HYPER", BN: "", BG: "HYPERUSDT", HL: "HYPER"}, {Name: "HYPER", BN: "", BG: "HYPERUSDT", HL: "HYPER"},
{Name: "ICP", BN: "", BG: "ICPUSDT", HL: "ICP"}, {Name: "ICP", BN: "", BG: "ICPUSDT", HL: "ICP"},
{Name: "ILV", BN: "", BG: "ILVUSDT", HL: "ILV"}, {Name: "ILV", BN: "", BG: "ILVUSDT", HL: ""},
{Name: "IMX", BN: "", BG: "IMXUSDT", HL: "IMX"}, {Name: "IMX", BN: "", BG: "IMXUSDT", HL: "IMX"},
{Name: "INIT", BN: "", BG: "INITUSDT", HL: "INIT"}, {Name: "INIT", BN: "", BG: "INITUSDT", HL: "INIT"},
{Name: "INJ", BN: "", BG: "INJUSDT", HL: "INJ"}, {Name: "INJ", BN: "", BG: "INJUSDT", HL: "INJ"},
@@ -106,7 +106,7 @@ var TrackedCoins = []TrackedCoin{
{Name: "LAYER", BN: "", BG: "LAYERUSDT", HL: "LAYER"}, {Name: "LAYER", BN: "", BG: "LAYERUSDT", HL: "LAYER"},
{Name: "LDO", BN: "", BG: "LDOUSDT", HL: "LDO"}, {Name: "LDO", BN: "", BG: "LDOUSDT", HL: "LDO"},
{Name: "LINEA", BN: "", BG: "LINEAUSDT", HL: "LINEA"}, {Name: "LINEA", BN: "", BG: "LINEAUSDT", HL: "LINEA"},
{Name: "LISTA", BN: "", BG: "LISTAUSDT", HL: "LISTA"}, {Name: "LISTA", BN: "", BG: "LISTAUSDT", HL: ""},
{Name: "LIT", BN: "", BG: "LITUSDT", HL: "LIT"}, {Name: "LIT", BN: "", BG: "LITUSDT", HL: "LIT"},
{Name: "LTC", BN: "", BG: "LTCUSDT", HL: "LTC"}, {Name: "LTC", BN: "", BG: "LTCUSDT", HL: "LTC"},
{Name: "MANTA", BN: "", BG: "MANTAUSDT", HL: "MANTA"}, {Name: "MANTA", BN: "", BG: "MANTAUSDT", HL: "MANTA"},
@@ -128,13 +128,13 @@ var TrackedCoins = []TrackedCoin{
{Name: "NIL", BN: "", BG: "NILUSDT", HL: "NIL"}, {Name: "NIL", BN: "", BG: "NILUSDT", HL: "NIL"},
{Name: "NOT", BN: "", BG: "NOTUSDT", HL: "NOT"}, {Name: "NOT", BN: "", BG: "NOTUSDT", HL: "NOT"},
{Name: "NXPC", BN: "", BG: "NXPCUSDT", HL: "NXPC"}, {Name: "NXPC", BN: "", BG: "NXPCUSDT", HL: "NXPC"},
{Name: "OGN", BN: "", BG: "OGNUSDT", HL: "OGN"}, {Name: "OGN", BN: "", BG: "OGNUSDT", HL: ""},
{Name: "ORDI", BN: "", BG: "ORDIUSDT", HL: "ORDI"}, {Name: "ORDI", BN: "", BG: "ORDIUSDT", HL: "ORDI"},
{Name: "PAXG", BN: "", BG: "PAXGUSDT", HL: "PAXG"}, {Name: "PAXG", BN: "", BG: "PAXGUSDT", HL: "PAXG"},
{Name: "PENDLE", BN: "", BG: "PENDLEUSDT", HL: "PENDLE"}, {Name: "PENDLE", BN: "", BG: "PENDLEUSDT", HL: "PENDLE"},
{Name: "PENGU", BN: "", BG: "PENGUUSDT", HL: "PENGU"}, {Name: "PENGU", BN: "", BG: "PENGUUSDT", HL: "PENGU"},
{Name: "PEOPLE", BN: "", BG: "PEOPLEUSDT", HL: "PEOPLE"}, {Name: "PEOPLE", BN: "", BG: "PEOPLEUSDT", HL: "PEOPLE"},
{Name: "PIXEL", BN: "", BG: "PIXELUSDT", HL: "PIXEL"}, {Name: "PIXEL", BN: "", BG: "PIXELUSDT", HL: ""},
{Name: "PNUT", BN: "", BG: "PNUTUSDT", HL: "PNUT"}, {Name: "PNUT", BN: "", BG: "PNUTUSDT", HL: "PNUT"},
{Name: "POL", BN: "", BG: "POLUSDT", HL: "POL"}, {Name: "POL", BN: "", BG: "POLUSDT", HL: "POL"},
{Name: "POLYX", BN: "", BG: "POLYXUSDT", HL: "POLYX"}, {Name: "POLYX", BN: "", BG: "POLYXUSDT", HL: "POLYX"},
@@ -159,7 +159,7 @@ var TrackedCoins = []TrackedCoin{
{Name: "SPX", BN: "", BG: "SPXUSDT", HL: "SPX"}, {Name: "SPX", BN: "", BG: "SPXUSDT", HL: "SPX"},
{Name: "STABLE", BN: "", BG: "STABLEUSDT", HL: "STABLE"}, {Name: "STABLE", BN: "", BG: "STABLEUSDT", HL: "STABLE"},
{Name: "STBL", BN: "", BG: "STBLUSDT", HL: "STBL"}, {Name: "STBL", BN: "", BG: "STBLUSDT", HL: "STBL"},
{Name: "STG", BN: "", BG: "STGUSDT", HL: "STG"}, {Name: "STG", BN: "", BG: "STGUSDT", HL: ""},
{Name: "STRK", BN: "", BG: "STRKUSDT", HL: "STRK"}, {Name: "STRK", BN: "", BG: "STRKUSDT", HL: "STRK"},
{Name: "STX", BN: "", BG: "STXUSDT", HL: "STX"}, {Name: "STX", BN: "", BG: "STXUSDT", HL: "STX"},
{Name: "SUI", BN: "", BG: "SUIUSDT", HL: "SUI"}, {Name: "SUI", BN: "", BG: "SUIUSDT", HL: "SUI"},
@@ -219,6 +219,9 @@ func ScanBGHL(snap map[string]map[string]float64) []*ArbOpportunity {
var results []*ArbOpportunity var results []*ArbOpportunity
for _, coin := range TrackedCoins { for _, coin := range TrackedCoins {
if coin.BG == "" || coin.HL == "" {
continue // skip coins not available on both exchanges
}
exMap := snap[coin.Name] exMap := snap[coin.Name]
if exMap == nil { if exMap == nil {
continue continue
+33
View File
@@ -0,0 +1,33 @@
//go:build ignore
package main
import (
"fmt"
"os"
"strings"
"exchange-monitor/exchange"
)
func main() {
b, _ := os.ReadFile(".env")
m := map[string]string{}
for _, l := range strings.Split(string(b), "\n") {
l = strings.TrimSpace(l)
if l == "" || l[0] == '#' { continue }
if i := strings.Index(l, "="); i > 0 {
m[strings.TrimSpace(l[:i])] = strings.TrimSpace(l[i+1:])
}
}
bg := exchange.NewBitgetTrade(m["BITGET_API_KEY"], m["BITGET_API_SECRET"], m["BITGET_PASSPHRASE"])
bal, err := bg.GetBalance()
if err != nil {
fmt.Printf("BG balance error: %v\n", err)
} else {
fmt.Printf("BG balance: $%.2f\n", bal)
}
fmt.Println("\nKey prefix:", string(m["BITGET_API_KEY"][:5]))
}
+3
View File
@@ -142,6 +142,9 @@ func NewSpreadWindowTracker() *SpreadWindowTracker {
func (swt *SpreadWindowTracker) Tick(snap map[string]map[string]float64, threshold float64) { func (swt *SpreadWindowTracker) Tick(snap map[string]map[string]float64, threshold float64) {
now := time.Now() now := time.Now()
for _, coin := range TrackedCoins { for _, coin := range TrackedCoins {
if coin.BG == "" || coin.HL == "" {
continue
}
exMap := snap[coin.Name] exMap := snap[coin.Name]
if exMap == nil { if exMap == nil {
continue continue