fix: async entry race condition — 'entering' status prevents premature exit
During async executeEntry goroutine, the 300ms sleep between legs
left the position vulnerable to checkExit() from the main loop.
Added intermediate Status='entering' that checkExit/checkScaleIn
skip ('entering' != 'open'), switched to 'open' only after both
legs are placed.
This commit is contained in:
@@ -47,7 +47,7 @@ type ArbPosition struct {
|
||||
LastScaleAt time.Time // when we last scaled in
|
||||
StartedAt time.Time
|
||||
ExitedAt time.Time
|
||||
Status string // "open", "closed"
|
||||
Status string // "entering", "open", "closed"
|
||||
RealizedPnl float64
|
||||
ErrorLog string
|
||||
|
||||
@@ -311,7 +311,7 @@ func (t *Trader) executeEntry(opp *ArbOpportunity, store *PriceStore, notifier *
|
||||
Coin: opp.Coin,
|
||||
AmountUSD: t.cfg.TradeAmountUSD,
|
||||
StartedAt: time.Now(),
|
||||
Status: "open",
|
||||
Status: "entering", // prevent checkExit/checkScaleIn during leg placement
|
||||
ScaleLevels: 0,
|
||||
}
|
||||
|
||||
@@ -361,6 +361,7 @@ func (t *Trader) executeEntry(opp *ArbOpportunity, store *PriceStore, notifier *
|
||||
}
|
||||
|
||||
pos.LastScaleAt = time.Now()
|
||||
pos.Status = "open" // both legs placed, ready for Tick/exit logic
|
||||
|
||||
log.Printf("[Trader] %s: Opened %s | Long %s @ %.2f Short %s @ %.2f | $%.0f",
|
||||
pos.Coin, pos.Direction, pos.LongLeg.Exchange, pos.LongLeg.EntryPrice,
|
||||
|
||||
Reference in New Issue
Block a user