fix: Update on-chain SL to breakeven after TP1 hit (CRITICAL)
CRITICAL BUG: After TP1 filled, Position Manager updated internal stopLossPrice but NEVER updated the actual on-chain orders on Drift. Runner had NO real stop loss protection at breakeven. Fix: - After TP1 detection, call cancelAllOrders() to remove old orders - Then call placeExitOrders() with updated SL at breakeven - Place TP2 as new TP1 for runner (activates trailing at that level) - Logs: 'Cancelling old exit orders', 'Placing new exit orders' Impact: Runner now properly protected at breakeven on-chain, not just in Position Manager tracking. Found: User screenshot showed SL still at original levels (46.57) after TP1 hit, when it should have been at entry (42.89).
This commit is contained in:
@@ -494,6 +494,40 @@ export class PositionManager {
|
|||||||
trade.slMovedToBreakeven = true
|
trade.slMovedToBreakeven = true
|
||||||
console.log(`🛡️ Stop loss moved to breakeven: $${trade.stopLossPrice.toFixed(4)}`)
|
console.log(`🛡️ Stop loss moved to breakeven: $${trade.stopLossPrice.toFixed(4)}`)
|
||||||
|
|
||||||
|
// CRITICAL: Update on-chain orders to reflect new SL at breakeven
|
||||||
|
try {
|
||||||
|
const { cancelAllOrders, placeExitOrders } = await import('../drift/orders')
|
||||||
|
|
||||||
|
console.log(`🔄 Cancelling old exit orders...`)
|
||||||
|
const cancelResult = await cancelAllOrders(trade.symbol)
|
||||||
|
if (cancelResult.success) {
|
||||||
|
console.log(`✅ Cancelled ${cancelResult.cancelledCount} old orders`)
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`🛡️ Placing new exit orders with SL at breakeven...`)
|
||||||
|
const orderResult = await placeExitOrders({
|
||||||
|
symbol: trade.symbol,
|
||||||
|
direction: trade.direction,
|
||||||
|
entryPrice: trade.entryPrice,
|
||||||
|
positionSizeUSD: trade.currentSize, // Runner size
|
||||||
|
stopLossPrice: trade.stopLossPrice, // At breakeven now
|
||||||
|
tp1Price: trade.tp2Price, // TP2 becomes new TP1 for runner
|
||||||
|
tp2Price: 0, // No TP2 for runner
|
||||||
|
tp1SizePercent: 0, // Close 0% at TP2 (activates trailing)
|
||||||
|
tp2SizePercent: 0, // No TP2
|
||||||
|
softStopPrice: 0,
|
||||||
|
hardStopPrice: 0,
|
||||||
|
})
|
||||||
|
|
||||||
|
if (orderResult.success) {
|
||||||
|
console.log(`✅ Exit orders updated with SL at breakeven`)
|
||||||
|
} else {
|
||||||
|
console.error(`❌ Failed to update exit orders:`, orderResult.error)
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`❌ Failed to update on-chain orders after TP1:`, error)
|
||||||
|
}
|
||||||
|
|
||||||
await this.saveTradeState(trade)
|
await this.saveTradeState(trade)
|
||||||
|
|
||||||
} else if (trade.tp1Hit && !trade.tp2Hit && reductionPercent >= 85) {
|
} else if (trade.tp1Hit && !trade.tp2Hit && reductionPercent >= 85) {
|
||||||
|
|||||||
Reference in New Issue
Block a user