fix: use taker fees (BG 0.06%, HL 0.045%) + threshold 0.25%
All IOC market orders incur taker fees, not maker fees. Previous makerFees (BG 0.02%, HL 0.015%) caused 0.10% threshold trades to actually lose 0.11% per round trip. Changes: - scanner.go: makerFees → takerFees (BG 0.060, HL 0.045) - dashboard.go: makerFees → takerFees - types.go: makerFees → takerFees - trader.go: makerFees → takerFees - config.json: trade_threshold 0.1 → 0.25
This commit is contained in:
+1
-1
@@ -3,7 +3,7 @@
|
|||||||
"trade_enabled": true,
|
"trade_enabled": true,
|
||||||
"arb_threshold": 0.03,
|
"arb_threshold": 0.03,
|
||||||
"scan_interval_ms": 200,
|
"scan_interval_ms": 200,
|
||||||
"trade_threshold": 0.1,
|
"trade_threshold": 0.25,
|
||||||
"trade_amount_usd": 5,
|
"trade_amount_usd": 5,
|
||||||
"trade_cooldown_ms": 30000,
|
"trade_cooldown_ms": 30000,
|
||||||
"alert_cooldown_sec": 300,
|
"alert_cooldown_sec": 300,
|
||||||
|
|||||||
+1
-1
@@ -379,7 +379,7 @@ func (d *Dashboard) broadcastLoop() {
|
|||||||
shortAvg := weightedAvgPrice(pos.ShortEntryPrices, pos.AmountUSD/float64(max(1, len(pos.ShortEntryPrices))))
|
shortAvg := weightedAvgPrice(pos.ShortEntryPrices, pos.AmountUSD/float64(max(1, len(pos.ShortEntryPrices))))
|
||||||
longPnl := (longCurrent - longAvg) / longAvg * 100
|
longPnl := (longCurrent - longAvg) / longAvg * 100
|
||||||
shortPnl := (shortAvg - shortCurrent) / shortAvg * 100
|
shortPnl := (shortAvg - shortCurrent) / shortAvg * 100
|
||||||
totalFees := 2 * (makerFees[ExBitget] + makerFees[ExHyperLiquid])
|
totalFees := 2 * (takerFees[ExBitget] + takerFees[ExHyperLiquid])
|
||||||
netPnl := longPnl + shortPnl - totalFees
|
netPnl := longPnl + shortPnl - totalFees
|
||||||
|
|
||||||
currentSpread := (hlP - bgP) / bgP * 100
|
currentSpread := (hlP - bgP) / bgP * 100
|
||||||
|
|||||||
+6
-6
@@ -10,10 +10,10 @@ const (
|
|||||||
ExBitget = "Bitget"
|
ExBitget = "Bitget"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Maker fee rates (%) — for limit orders on trading exchanges
|
// Taker fee rates (%) — for IOC market orders on trading exchanges
|
||||||
var makerFees = map[string]float64{
|
var takerFees = map[string]float64{
|
||||||
ExHyperLiquid: 0.015,
|
ExHyperLiquid: 0.045,
|
||||||
ExBitget: 0.020, // standard maker
|
ExBitget: 0.060,
|
||||||
}
|
}
|
||||||
|
|
||||||
// TickerCoins defines all coins we monitor.
|
// TickerCoins defines all coins we monitor.
|
||||||
@@ -59,9 +59,9 @@ func ScanBGHL(store *PriceStore) []*ArbOpportunity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// BG->HL: buy cheap at Bitget, sell expensive at HyperLiquid
|
// BG->HL: buy cheap at Bitget, sell expensive at HyperLiquid
|
||||||
profitBG := netProfit(bgP, hlP, makerFees[ExBitget], makerFees[ExHyperLiquid])
|
profitBG := netProfit(bgP, hlP, takerFees[ExBitget], takerFees[ExHyperLiquid])
|
||||||
// HL->BG: buy cheap at HyperLiquid, sell expensive at Bitget
|
// HL->BG: buy cheap at HyperLiquid, sell expensive at Bitget
|
||||||
profitHL := netProfit(hlP, bgP, makerFees[ExHyperLiquid], makerFees[ExBitget])
|
profitHL := netProfit(hlP, bgP, takerFees[ExHyperLiquid], takerFees[ExBitget])
|
||||||
|
|
||||||
grossBG := (hlP - bgP) / bgP * 100
|
grossBG := (hlP - bgP) / bgP * 100
|
||||||
grossHL := (bgP - hlP) / hlP * 100
|
grossHL := (bgP - hlP) / hlP * 100
|
||||||
|
|||||||
@@ -524,7 +524,7 @@ func (t *Trader) checkExit(pos *ArbPosition, bgP, hlP, diffPct float64, notifier
|
|||||||
|
|
||||||
longPnl := (longCurrent - longAvg) / longAvg * 100
|
longPnl := (longCurrent - longAvg) / longAvg * 100
|
||||||
shortPnl := (shortAvg - shortCurrent) / shortAvg * 100
|
shortPnl := (shortAvg - shortCurrent) / shortAvg * 100
|
||||||
totalFees := 2 * (makerFees[ExBitget] + makerFees[ExHyperLiquid]) // 开仓 + 平仓手续费
|
totalFees := 2 * (takerFees[ExBitget] + takerFees[ExHyperLiquid]) // 开仓 + 平仓手续费
|
||||||
netPnl := longPnl + shortPnl - totalFees
|
netPnl := longPnl + shortPnl - totalFees
|
||||||
|
|
||||||
// Convergence analysis
|
// Convergence analysis
|
||||||
|
|||||||
@@ -163,8 +163,8 @@ func (swt *SpreadWindowTracker) Tick(snap map[string]map[string]float64, thresho
|
|||||||
sellFee float64
|
sellFee float64
|
||||||
}
|
}
|
||||||
for _, dir := range []dirCheck{
|
for _, dir := range []dirCheck{
|
||||||
{"BG->HL", bgP, hlP, makerFees[ExBitget], makerFees[ExHyperLiquid]},
|
{"BG->HL", bgP, hlP, takerFees[ExBitget], takerFees[ExHyperLiquid]},
|
||||||
{"HL->BG", hlP, bgP, makerFees[ExHyperLiquid], makerFees[ExBitget]},
|
{"HL->BG", hlP, bgP, takerFees[ExHyperLiquid], takerFees[ExBitget]},
|
||||||
} {
|
} {
|
||||||
key := coin.Name + ":" + dir.name
|
key := coin.Name + ":" + dir.name
|
||||||
netSpr := netProfit(dir.buyPrice, dir.sellPrice, dir.buyFee, dir.sellFee)
|
netSpr := netProfit(dir.buyPrice, dir.sellPrice, dir.buyFee, dir.sellFee)
|
||||||
|
|||||||
Reference in New Issue
Block a user