From 16e0ed9e5f4ec40d333d031bf8611e3949c4179b Mon Sep 17 00:00:00 2001 From: mindesbunister Date: Mon, 28 Jul 2025 17:51:21 +0200 Subject: [PATCH] fix: resolve SL/TP order placement and orphaned cleanup issues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fixed Drift SDK initialization in place-order endpoint (NodeWallet vs Wallet) - Added 2% minimum trigger distance validation in execute-drift endpoint - Corrected orphaned order cleanup logic to cancel ALL orders when no position - Resolved issue where SL/TP orders were immediately canceled due to insufficient distance - Tested complete cycle: position entry → protective orders → orphaned cleanup Orders now maintain proper 2% distance from market price and stay active. Cleanup system correctly identifies and removes orphaned orders when positions close. --- app/api/drift/cleanup-orders/route.js | 10 +++----- app/api/drift/place-order/route.js | 16 ++++++------- app/api/trading/execute-drift/route.js | 31 +++++++++++++++++++++++++ prisma/prisma/dev.db | Bin 11694080 -> 11898880 bytes 4 files changed, 42 insertions(+), 15 deletions(-) diff --git a/app/api/drift/cleanup-orders/route.js b/app/api/drift/cleanup-orders/route.js index d37c979..524aa9c 100644 --- a/app/api/drift/cleanup-orders/route.js +++ b/app/api/drift/cleanup-orders/route.js @@ -99,13 +99,9 @@ export async function POST() { // Check if this order is for a market where we have no position const hasPosition = positionMarkets.has(order.marketIndex) - // CRITICAL FIX: Only cancel reduce-only orders if there's NO position - // Stop Loss and Take Profit orders are reduce-only but should EXIST when we have a position - const isReduceOnly = order.reduceOnly - - // Only cancel orders that are truly orphaned (no position for that market) - // Do NOT cancel reduce-only orders when we have a position (these are SL/TP!) - return !hasPosition && !isReduceOnly + // CORRECTED LOGIC: Cancel ALL orders when no position exists + // If we have no position, then ALL orders (including SL/TP) are orphaned + return !hasPosition }) // Additionally, find lingering SL/TP orders when position has changed significantly diff --git a/app/api/drift/place-order/route.js b/app/api/drift/place-order/route.js index bf33523..9c0df77 100644 --- a/app/api/drift/place-order/route.js +++ b/app/api/drift/place-order/route.js @@ -24,7 +24,7 @@ export async function POST(request) { }); // Import Drift SDK - const { DriftClient, initialize, MarketType, PositionDirection, OrderType, OrderTriggerCondition, Wallet, BN } = await import('@drift-labs/sdk'); + const { DriftClient, initialize, MarketType, PositionDirection, OrderType, OrderTriggerCondition, BN } = await import('@drift-labs/sdk'); const { Connection, Keypair } = await import('@solana/web3.js'); // Setup connection and wallet @@ -40,7 +40,10 @@ export async function POST(request) { const privateKeyArray = JSON.parse(process.env.SOLANA_PRIVATE_KEY); const keypair = Keypair.fromSecretKey(new Uint8Array(privateKeyArray)); - const wallet = new Wallet(keypair); + + // Use the correct Wallet class like in cleanup endpoint + const { default: NodeWallet } = await import('@coral-xyz/anchor/dist/cjs/nodewallet.js'); + const wallet = new NodeWallet(keypair); // Initialize Drift client const env = 'mainnet-beta'; @@ -49,12 +52,9 @@ export async function POST(request) { connection, wallet, programID: sdkConfig.DRIFT_PROGRAM_ID, - accountSubscription: { - type: 'polling', - accountLoader: { - commitment: 'confirmed' - } - } + opts: { + commitment: 'confirmed', + }, }); await driftClient.subscribe(); diff --git a/app/api/trading/execute-drift/route.js b/app/api/trading/execute-drift/route.js index 1aa54f8..8224d8a 100644 --- a/app/api/trading/execute-drift/route.js +++ b/app/api/trading/execute-drift/route.js @@ -216,11 +216,28 @@ export async function POST(request) { console.log('✅ Drift order placed:', txSig) + // Validate trigger distances before placing SL/TP orders + const MIN_TRIGGER_DISTANCE_PERCENT = 2.0; // Minimum 2% distance from current price + // Set up stop loss and take profit if specified let stopLossOrderId = null let takeProfitOrderId = null if (stopLoss) { + // Validate stop loss distance + const slDistance = Math.abs(stopLoss - currentPrice) / currentPrice * 100; + + if (slDistance < MIN_TRIGGER_DISTANCE_PERCENT) { + console.warn(`⚠️ Stop loss too close: ${slDistance.toFixed(2)}% < ${MIN_TRIGGER_DISTANCE_PERCENT}% minimum`); + // Adjust stop loss to minimum distance + if (direction === PositionDirection.LONG) { + stopLoss = currentPrice * (1 - MIN_TRIGGER_DISTANCE_PERCENT / 100); + } else { + stopLoss = currentPrice * (1 + MIN_TRIGGER_DISTANCE_PERCENT / 100); + } + console.log(`🔧 Adjusted stop loss to: $${stopLoss.toFixed(4)} (${MIN_TRIGGER_DISTANCE_PERCENT}% distance)`); + } + try { const stopLossParams = { orderType: OrderType.TRIGGER_LIMIT, @@ -243,6 +260,20 @@ export async function POST(request) { } if (takeProfit) { + // Validate take profit distance + const tpDistance = Math.abs(takeProfit - currentPrice) / currentPrice * 100; + + if (tpDistance < MIN_TRIGGER_DISTANCE_PERCENT) { + console.warn(`⚠️ Take profit too close: ${tpDistance.toFixed(2)}% < ${MIN_TRIGGER_DISTANCE_PERCENT}% minimum`); + // Adjust take profit to minimum distance + if (direction === PositionDirection.LONG) { + takeProfit = currentPrice * (1 + MIN_TRIGGER_DISTANCE_PERCENT / 100); + } else { + takeProfit = currentPrice * (1 - MIN_TRIGGER_DISTANCE_PERCENT / 100); + } + console.log(`🔧 Adjusted take profit to: $${takeProfit.toFixed(4)} (${MIN_TRIGGER_DISTANCE_PERCENT}% distance)`); + } + try { const takeProfitParams = { orderType: OrderType.TRIGGER_LIMIT, diff --git a/prisma/prisma/dev.db b/prisma/prisma/dev.db index 0da04d84ba142fe8f45abacefe5f5332082b425b..c51cca2aa5d696849d65461bc5c8602edfd68674 100644 GIT binary patch delta 39970 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 XD%|r$NV_4o1{SD) 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