diff --git a/config.json b/config.json index cfc0df3..c49965c 100644 --- a/config.json +++ b/config.json @@ -1,9 +1,9 @@ { "test_mode": false, "trade_enabled": true, - "arb_threshold": 0.02, + "arb_threshold": 0.3, "scan_interval_ms": 200, - "trade_threshold": 0.03, + "trade_threshold": 0.3, "trade_amount_usd": 20, "trade_cooldown_ms": 30000, "alert_cooldown_sec": 300, @@ -13,11 +13,11 @@ "initial_capital": 1000, "taker_fee_bitget": 0.060, "taker_fee_hyperliquid": 0.045, - "take_profit_pct": 0.20, + "take_profit_pct": 0.3, "spread_reverse_exit_pct": 0, "position_timeout_sec": 1800, "leg_delay_ms": 300, "reversal_tolerance_pct": 0.1, - "scale_step_pct": 0.10, + "scale_step_pct": 0.3, "scale_cooldown_sec": 5 } diff --git a/db/trade_repo.go b/db/trade_repo.go index efcf64b..1492d2d 100644 --- a/db/trade_repo.go +++ b/db/trade_repo.go @@ -74,7 +74,7 @@ func (d *DB) SaveTrade(t *TradeRecord) (int64, error) { long_pnl, short_pnl, fee_entry, fee_exit, net_pnl, amount_usd, scale_count, exit_reason, convergence, opened_at, closed_at, pnl_long_usd, pnl_short_usd, fee_long_usd, fee_short_usd - ) VALUES (?,?,?,?,?, ?,?,?,?,?, ?,?,?,?,?, ?,?,?,?,?, ?,?,?,?,?)`, + ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`, t.Coin, t.Direction, t.Status, t.EntrySpread, t.ExitSpread, t.LongExchange, t.ShortExchange, t.LongEntry, t.LongExit, t.ShortEntry, t.ShortExit, t.LongPnl, t.ShortPnl, t.FeeEntry, t.FeeExit, t.NetPnl, diff --git a/exchange/bitget_trade.go b/exchange/bitget_trade.go index 7184063..9136b4f 100644 --- a/exchange/bitget_trade.go +++ b/exchange/bitget_trade.go @@ -19,7 +19,6 @@ type BitgetTrade struct { APISecret string Passphrase string client *http.Client - paperMode bool } func NewBitgetTrade(apiKey, apiSecret, passphrase string) *BitgetTrade { @@ -28,7 +27,6 @@ func NewBitgetTrade(apiKey, apiSecret, passphrase string) *BitgetTrade { APISecret: apiSecret, Passphrase: passphrase, client: &http.Client{Timeout: 10 * time.Second}, - paperMode: strings.HasPrefix(apiKey, "bg_"), } } @@ -60,9 +58,6 @@ func (b *BitgetTrade) PlaceMarketOrder(side, symbol, size, tradeSide string) (st req.Header.Set("ACCESS-SIGN", sign) req.Header.Set("ACCESS-TIMESTAMP", ts) req.Header.Set("ACCESS-PASSPHRASE", b.Passphrase) - if b.paperMode { - req.Header.Set("paptrading", "1") - } resp, err := b.client.Do(req) if err != nil { @@ -101,9 +96,6 @@ func (b *BitgetTrade) GetTradeFee(symbol, orderID string) (feeUSD float64, err e req.Header.Set("ACCESS-SIGN", sign) req.Header.Set("ACCESS-TIMESTAMP", ts) req.Header.Set("ACCESS-PASSPHRASE", b.Passphrase) - if b.paperMode { - req.Header.Set("paptrading", "1") - } resp, err := b.client.Do(req) if err != nil { @@ -113,9 +105,11 @@ func (b *BitgetTrade) GetTradeFee(symbol, orderID string) (feeUSD float64, err e respBody, _ := io.ReadAll(resp.Body) var raw struct { - Code string `json:"code"` - Msg string `json:"msg"` - Data []json.RawMessage `json:"data"` + Code string `json:"code"` + Msg string `json:"msg"` + Data struct { + FillList []json.RawMessage `json:"fillList"` + } `json:"data"` } if err := json.Unmarshal(respBody, &raw); err != nil { return 0, fmt.Errorf("parse: %s", string(respBody)) @@ -125,7 +119,7 @@ func (b *BitgetTrade) GetTradeFee(symbol, orderID string) (feeUSD float64, err e } var totalFee float64 - for _, item := range raw.Data { + for _, item := range raw.Data.FillList { var fill struct { FillFee string `json:"fillFee"` } @@ -158,9 +152,6 @@ func (b *BitgetTrade) GetBalance() (float64, error) { req.Header.Set("ACCESS-SIGN", sign) req.Header.Set("ACCESS-TIMESTAMP", ts) req.Header.Set("ACCESS-PASSPHRASE", b.Passphrase) - if b.paperMode { - req.Header.Set("paptrading", "1") - } resp, err := b.client.Do(req) if err != nil { diff --git a/exchange/hyperliquid.go b/exchange/hyperliquid.go index 0df7b90..e3b030a 100644 --- a/exchange/hyperliquid.go +++ b/exchange/hyperliquid.go @@ -25,7 +25,7 @@ func NewHyperLiquidWS(tracked []string) *HyperLiquidWS { } // Run connects to HyperLiquid WS and streams mid prices. func (h *HyperLiquidWS) Run(updateFn func(coin string, price, bid, ask float64)) error { - conn := NewPriceConnector("wss://api.hyperliquid-testnet.xyz/ws", "HyperLiquid", 120*time.Second, 30*time.Second) + conn := NewPriceConnector("wss://api.hyperliquid.xyz/ws", "HyperLiquid", 120*time.Second, 30*time.Second) conn.PingInterval = 45 * time.Second conn.OnConnect = func() { diff --git a/exchange/hyperliquid_trade.go b/exchange/hyperliquid_trade.go index 70b3b3a..74c40b4 100644 --- a/exchange/hyperliquid_trade.go +++ b/exchange/hyperliquid_trade.go @@ -45,7 +45,7 @@ func NewHyperLiquidTrade(privateKeyHex, mainAddress, apiAddress string) (*HyperL ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() - info := hl.NewInfo(ctx, hl.TestnetAPIURL, true, nil, nil, nil) + info := hl.NewInfo(ctx, hl.MainnetAPIURL, true, nil, nil, nil) return &HyperLiquidTrade{ privateKey: privKey, @@ -75,7 +75,7 @@ func (h *HyperLiquidTrade) initExchange() error { return fmt.Errorf("spot meta: %w", err) } - h.exchange = hl.NewExchange(ctx, h.privateKey, hl.TestnetAPIURL, meta, "", h.mainAddress, spotMeta, nil) + h.exchange = hl.NewExchange(ctx, h.privateKey, hl.MainnetAPIURL, meta, "", h.mainAddress, spotMeta, nil) return nil } diff --git a/scanner.go b/scanner.go index 223216f..b1998c2 100644 --- a/scanner.go +++ b/scanner.go @@ -16,28 +16,186 @@ var takerFees = map[string]float64{ ExBitget: 0.060, } -// TickerCoins defines all coins we monitor. var TrackedCoins = []TrackedCoin{ {Name: "DOGE", BN: "DOGEUSDT", BG: "DOGEUSDT", HL: "DOGE"}, - // LINK removed โ€” not listed on HL testnet + {Name: "LINK", BN: "LINKUSDT", BG: "LINKUSDT", HL: "LINK"}, {Name: "ONDO", BN: "ONDOUSDT", BG: "ONDOUSDT", HL: "ONDO"}, + {Name: "OP", BN: "OPUSDT", BG: "OPUSDT", HL: "OP"}, + {Name: "WIF", BN: "WIFUSDT", BG: "WIFUSDT", HL: "WIF"}, {Name: "ARB", BN: "ARBUSDT", BG: "ARBUSDT", HL: "ARB"}, - // Bitget testnet (ๆจกๆ‹Ÿ็›˜) confirmed: ALGO, ADA, HBAR, FET, WLD, - // SUI, APT, NEAR, FIL, DYDX, JUP, TIA are all valid (no 40034) - // Removed (40034 - does not exist on BG testnet): OP, WIF, PYTH, - // SAND, IOTA, MOVE, MINA - {Name: "ALGO", BG: "ALGOUSDT", HL: "ALGO"}, - {Name: "ADA", BG: "ADAUSDT", HL: "ADA"}, - {Name: "HBAR", BG: "HBARUSDT", HL: "HBAR"}, - {Name: "FET", BG: "FETUSDT", HL: "FET"}, - {Name: "WLD", BG: "WLDUSDT", HL: "WLD"}, - {Name: "SUI", BG: "SUIUSDT", HL: "SUI"}, - {Name: "APT", BG: "APTUSDT", HL: "APT"}, - {Name: "NEAR", BG: "NEARUSDT", HL: "NEAR"}, - {Name: "FIL", BG: "FILUSDT", HL: "FIL"}, - {Name: "DYDX", BG: "DYDXUSDT", HL: "DYDX"}, - {Name: "JUP", BG: "JUPUSDT", HL: "JUP"}, - {Name: "TIA", BG: "TIAUSDT", HL: "TIA"}, + {Name: "0G", BN: "", BG: "0GUSDT", HL: "0G"}, + {Name: "2Z", BN: "", BG: "2ZUSDT", HL: "2Z"}, + {Name: "AAVE", BN: "", BG: "AAVEUSDT", HL: "AAVE"}, + {Name: "ACE", BN: "", BG: "ACEUSDT", HL: "ACE"}, + {Name: "ADA", BN: "", BG: "ADAUSDT", HL: "ADA"}, + {Name: "AERO", BN: "", BG: "AEROUSDT", HL: "AERO"}, + {Name: "AIXBT", BN: "", BG: "AIXBTUSDT", HL: "AIXBT"}, + {Name: "ALGO", BN: "", BG: "ALGOUSDT", HL: "ALGO"}, + {Name: "ALT", BN: "", BG: "ALTUSDT", HL: "ALT"}, + {Name: "ANIME", BN: "", BG: "ANIMEUSDT", HL: "ANIME"}, + {Name: "APE", BN: "", BG: "APEUSDT", HL: "APE"}, + {Name: "APT", BN: "", BG: "APTUSDT", HL: "APT"}, + {Name: "AR", BN: "", BG: "ARUSDT", HL: "AR"}, + {Name: "ARK", BN: "", BG: "ARKUSDT", HL: "ARK"}, + {Name: "ASTER", BN: "", BG: "ASTERUSDT", HL: "ASTER"}, + {Name: "ATOM", BN: "", BG: "ATOMUSDT", HL: "ATOM"}, + {Name: "AVAX", BN: "", BG: "AVAXUSDT", HL: "AVAX"}, + {Name: "AVNT", BN: "", BG: "AVNTUSDT", HL: "AVNT"}, + {Name: "AXS", BN: "", BG: "AXSUSDT", HL: "AXS"}, + {Name: "AZTEC", BN: "", BG: "AZTECUSDT", HL: "AZTEC"}, + {Name: "BABY", BN: "", BG: "BABYUSDT", HL: "BABY"}, + {Name: "BANANA", BN: "", BG: "BANANAUSDT", HL: "BANANA"}, + {Name: "BCH", BN: "", BG: "BCHUSDT", HL: "BCH"}, + {Name: "BERA", BN: "", BG: "BERAUSDT", HL: "BERA"}, + {Name: "BIGTIME", BN: "", BG: "BIGTIMEUSDT", HL: "BIGTIME"}, + {Name: "BIO", BN: "", BG: "BIOUSDT", HL: "BIO"}, + {Name: "BLUR", BN: "", BG: "BLURUSDT", HL: "BLUR"}, + {Name: "BNB", BN: "", BG: "BNBUSDT", HL: "BNB"}, + {Name: "BNT", BN: "", BG: "BNTUSDT", HL: "BNT"}, + {Name: "BOME", BN: "", BG: "BOMEUSDT", HL: "BOME"}, + {Name: "BRETT", BN: "", BG: "BRETTUSDT", HL: "BRETT"}, + {Name: "BSV", BN: "", BG: "BSVUSDT", HL: "BSV"}, + {Name: "BTC", BN: "", BG: "BTCUSDT", HL: "BTC"}, + {Name: "CAKE", BN: "", BG: "CAKEUSDT", HL: "CAKE"}, + {Name: "CATI", BN: "", BG: "CATIUSDT", HL: "CATI"}, + {Name: "CC", BN: "", BG: "CCUSDT", HL: "CC"}, + {Name: "CELO", BN: "", BG: "CELOUSDT", HL: "CELO"}, + {Name: "CFX", BN: "", BG: "CFXUSDT", HL: "CFX"}, + {Name: "CHILLGUY", BN: "", BG: "CHILLGUYUSDT", HL: "CHILLGUY"}, + {Name: "CHIP", BN: "", BG: "CHIPUSDT", HL: "CHIP"}, + {Name: "COMP", BN: "", BG: "COMPUSDT", HL: "COMP"}, + {Name: "CRV", BN: "", BG: "CRVUSDT", HL: "CRV"}, + {Name: "CYBER", BN: "", BG: "CYBERUSDT", HL: "CYBER"}, + {Name: "DASH", BN: "", BG: "DASHUSDT", HL: "DASH"}, + {Name: "DOOD", BN: "", BG: "DOODUSDT", HL: "DOOD"}, + {Name: "DOT", BN: "", BG: "DOTUSDT", HL: "DOT"}, + {Name: "DYDX", BN: "", BG: "DYDXUSDT", HL: "DYDX"}, + {Name: "DYM", BN: "", BG: "DYMUSDT", HL: "DYM"}, + {Name: "EIGEN", BN: "", BG: "EIGENUSDT", HL: "EIGEN"}, + {Name: "ENA", BN: "", BG: "ENAUSDT", HL: "ENA"}, + {Name: "ENS", BN: "", BG: "ENSUSDT", HL: "ENS"}, + {Name: "ETC", BN: "", BG: "ETCUSDT", HL: "ETC"}, + {Name: "ETH", BN: "", BG: "ETHUSDT", HL: "ETH"}, + {Name: "ETHFI", BN: "", BG: "ETHFIUSDT", HL: "ETHFI"}, + {Name: "FARTCOIN", BN: "", BG: "FARTCOINUSDT", HL: "FARTCOIN"}, + {Name: "FET", BN: "", BG: "FETUSDT", HL: "FET"}, + {Name: "FIL", BN: "", BG: "FILUSDT", HL: "FIL"}, + {Name: "FOGO", BN: "", BG: "FOGOUSDT", HL: "FOGO"}, + {Name: "GALA", BN: "", BG: "GALAUSDT", HL: "GALA"}, + {Name: "GAS", BN: "", BG: "GASUSDT", HL: "GAS"}, + {Name: "GMT", BN: "", BG: "GMTUSDT", HL: "GMT"}, + {Name: "GMX", BN: "", BG: "GMXUSDT", HL: "GMX"}, + {Name: "GOAT", BN: "", BG: "GOATUSDT", HL: "GOAT"}, + {Name: "GRASS", BN: "", BG: "GRASSUSDT", HL: "GRASS"}, + {Name: "GRIFFAIN", BN: "", BG: "GRIFFAINUSDT", HL: "GRIFFAIN"}, + {Name: "HBAR", BN: "", BG: "HBARUSDT", HL: "HBAR"}, + {Name: "HYPE", BN: "", BG: "HYPEUSDT", HL: "HYPE"}, + {Name: "HYPER", BN: "", BG: "HYPERUSDT", HL: "HYPER"}, + {Name: "ICP", BN: "", BG: "ICPUSDT", HL: "ICP"}, + {Name: "ILV", BN: "", BG: "ILVUSDT", HL: "ILV"}, + {Name: "IMX", BN: "", BG: "IMXUSDT", HL: "IMX"}, + {Name: "INIT", BN: "", BG: "INITUSDT", HL: "INIT"}, + {Name: "INJ", BN: "", BG: "INJUSDT", HL: "INJ"}, + {Name: "IO", BN: "", BG: "IOUSDT", HL: "IO"}, + {Name: "IOTA", BN: "", BG: "IOTAUSDT", HL: "IOTA"}, + {Name: "IP", BN: "", BG: "IPUSDT", HL: "IP"}, + {Name: "JTO", BN: "", BG: "JTOUSDT", HL: "JTO"}, + {Name: "JUP", BN: "", BG: "JUPUSDT", HL: "JUP"}, + {Name: "KAITO", BN: "", BG: "KAITOUSDT", HL: "KAITO"}, + {Name: "KAS", BN: "", BG: "KASUSDT", HL: "KAS"}, + {Name: "LAYER", BN: "", BG: "LAYERUSDT", HL: "LAYER"}, + {Name: "LDO", BN: "", BG: "LDOUSDT", HL: "LDO"}, + {Name: "LINEA", BN: "", BG: "LINEAUSDT", HL: "LINEA"}, + {Name: "LISTA", BN: "", BG: "LISTAUSDT", HL: "LISTA"}, + {Name: "LIT", BN: "", BG: "LITUSDT", HL: "LIT"}, + {Name: "LTC", BN: "", BG: "LTCUSDT", HL: "LTC"}, + {Name: "MANTA", BN: "", BG: "MANTAUSDT", HL: "MANTA"}, + {Name: "MAV", BN: "", BG: "MAVUSDT", HL: "MAV"}, + {Name: "ME", BN: "", BG: "MEUSDT", HL: "ME"}, + {Name: "MEGA", BN: "", BG: "MEGAUSDT", HL: "MEGA"}, + {Name: "MELANIA", BN: "", BG: "MELANIAUSDT", HL: "MELANIA"}, + {Name: "MEME", BN: "", BG: "MEMEUSDT", HL: "MEME"}, + {Name: "MERL", BN: "", BG: "MERLUSDT", HL: "MERL"}, + {Name: "MET", BN: "", BG: "METUSDT", HL: "MET"}, + {Name: "MEW", BN: "", BG: "MEWUSDT", HL: "MEW"}, + {Name: "MINA", BN: "", BG: "MINAUSDT", HL: "MINA"}, + {Name: "MON", BN: "", BG: "MONUSDT", HL: "MON"}, + {Name: "MOODENG", BN: "", BG: "MOODENGUSDT", HL: "MOODENG"}, + {Name: "MORPHO", BN: "", BG: "MORPHOUSDT", HL: "MORPHO"}, + {Name: "MOVE", BN: "", BG: "MOVEUSDT", HL: "MOVE"}, + {Name: "NEAR", BN: "", BG: "NEARUSDT", HL: "NEAR"}, + {Name: "NEO", BN: "", BG: "NEOUSDT", HL: "NEO"}, + {Name: "NIL", BN: "", BG: "NILUSDT", HL: "NIL"}, + {Name: "NOT", BN: "", BG: "NOTUSDT", HL: "NOT"}, + {Name: "NXPC", BN: "", BG: "NXPCUSDT", HL: "NXPC"}, + {Name: "OGN", BN: "", BG: "OGNUSDT", HL: "OGN"}, + {Name: "ORDI", BN: "", BG: "ORDIUSDT", HL: "ORDI"}, + {Name: "PAXG", BN: "", BG: "PAXGUSDT", HL: "PAXG"}, + {Name: "PENDLE", BN: "", BG: "PENDLEUSDT", HL: "PENDLE"}, + {Name: "PENGU", BN: "", BG: "PENGUUSDT", HL: "PENGU"}, + {Name: "PEOPLE", BN: "", BG: "PEOPLEUSDT", HL: "PEOPLE"}, + {Name: "PIXEL", BN: "", BG: "PIXELUSDT", HL: "PIXEL"}, + {Name: "PNUT", BN: "", BG: "PNUTUSDT", HL: "PNUT"}, + {Name: "POL", BN: "", BG: "POLUSDT", HL: "POL"}, + {Name: "POLYX", BN: "", BG: "POLYXUSDT", HL: "POLYX"}, + {Name: "POPCAT", BN: "", BG: "POPCATUSDT", HL: "POPCAT"}, + {Name: "PROVE", BN: "", BG: "PROVEUSDT", HL: "PROVE"}, + {Name: "PUMP", BN: "", BG: "PUMPUSDT", HL: "PUMP"}, + {Name: "PYTH", BN: "", BG: "PYTHUSDT", HL: "PYTH"}, + {Name: "RENDER", BN: "", BG: "RENDERUSDT", HL: "RENDER"}, + {Name: "RESOLV", BN: "", BG: "RESOLVUSDT", HL: "RESOLV"}, + {Name: "REZ", BN: "", BG: "REZUSDT", HL: "REZ"}, + {Name: "RSR", BN: "", BG: "RSRUSDT", HL: "RSR"}, + {Name: "RUNE", BN: "", BG: "RUNEUSDT", HL: "RUNE"}, + {Name: "S", BN: "", BG: "SUSDT", HL: "S"}, + {Name: "SAGA", BN: "", BG: "SAGAUSDT", HL: "SAGA"}, + {Name: "SAND", BN: "", BG: "SANDUSDT", HL: "SAND"}, + {Name: "SEI", BN: "", BG: "SEIUSDT", HL: "SEI"}, + {Name: "SKR", BN: "", BG: "SKRUSDT", HL: "SKR"}, + {Name: "SKY", BN: "", BG: "SKYUSDT", HL: "SKY"}, + {Name: "SNX", BN: "", BG: "SNXUSDT", HL: "SNX"}, + {Name: "SOL", BN: "", BG: "SOLUSDT", HL: "SOL"}, + {Name: "SOPH", BN: "", BG: "SOPHUSDT", HL: "SOPH"}, + {Name: "SPX", BN: "", BG: "SPXUSDT", HL: "SPX"}, + {Name: "STABLE", BN: "", BG: "STABLEUSDT", HL: "STABLE"}, + {Name: "STBL", BN: "", BG: "STBLUSDT", HL: "STBL"}, + {Name: "STG", BN: "", BG: "STGUSDT", HL: "STG"}, + {Name: "STRK", BN: "", BG: "STRKUSDT", HL: "STRK"}, + {Name: "STX", BN: "", BG: "STXUSDT", HL: "STX"}, + {Name: "SUI", BN: "", BG: "SUIUSDT", HL: "SUI"}, + {Name: "SUPER", BN: "", BG: "SUPERUSDT", HL: "SUPER"}, + {Name: "SUSHI", BN: "", BG: "SUSHIUSDT", HL: "SUSHI"}, + {Name: "SYRUP", BN: "", BG: "SYRUPUSDT", HL: "SYRUP"}, + {Name: "TAO", BN: "", BG: "TAOUSDT", HL: "TAO"}, + {Name: "TIA", BN: "", BG: "TIAUSDT", HL: "TIA"}, + {Name: "TNSR", BN: "", BG: "TNSRUSDT", HL: "TNSR"}, + {Name: "TON", BN: "", BG: "TONUSDT", HL: "TON"}, + {Name: "TRB", BN: "", BG: "TRBUSDT", HL: "TRB"}, + {Name: "TRUMP", BN: "", BG: "TRUMPUSDT", HL: "TRUMP"}, + {Name: "TRX", BN: "", BG: "TRXUSDT", HL: "TRX"}, + {Name: "TURBO", BN: "", BG: "TURBOUSDT", HL: "TURBO"}, + {Name: "UMA", BN: "", BG: "UMAUSDT", HL: "UMA"}, + {Name: "UNI", BN: "", BG: "UNIUSDT", HL: "UNI"}, + {Name: "USTC", BN: "", BG: "USTCUSDT", HL: "USTC"}, + {Name: "USUAL", BN: "", BG: "USUALUSDT", HL: "USUAL"}, + {Name: "VIRTUAL", BN: "", BG: "VIRTUALUSDT", HL: "VIRTUAL"}, + {Name: "VVV", BN: "", BG: "VVVUSDT", HL: "VVV"}, + {Name: "W", BN: "", BG: "WUSDT", HL: "W"}, + {Name: "WCT", BN: "", BG: "WCTUSDT", HL: "WCT"}, + {Name: "WLD", BN: "", BG: "WLDUSDT", HL: "WLD"}, + {Name: "WLFI", BN: "", BG: "WLFIUSDT", HL: "WLFI"}, + {Name: "XAI", BN: "", BG: "XAIUSDT", HL: "XAI"}, + {Name: "XLM", BN: "", BG: "XLMUSDT", HL: "XLM"}, + {Name: "XMR", BN: "", BG: "XMRUSDT", HL: "XMR"}, + {Name: "XPL", BN: "", BG: "XPLUSDT", HL: "XPL"}, + {Name: "XRP", BN: "", BG: "XRPUSDT", HL: "XRP"}, + {Name: "YGG", BN: "", BG: "YGGUSDT", HL: "YGG"}, + {Name: "ZEC", BN: "", BG: "ZECUSDT", HL: "ZEC"}, + {Name: "ZEN", BN: "", BG: "ZENUSDT", HL: "ZEN"}, + {Name: "ZETA", BN: "", BG: "ZETAUSDT", HL: "ZETA"}, + {Name: "ZK", BN: "", BG: "ZKUSDT", HL: "ZK"}, + {Name: "ZORA", BN: "", BG: "ZORAUSDT", HL: "ZORA"}, + {Name: "ZRO", BN: "", BG: "ZROUSDT", HL: "ZRO"}, } // netProfit calculates net profit % after fees for a complete round trip (entry + exit).