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:
@@ -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
@@ -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
@@ -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
@@ -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]))
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user