Add comprehensive stop loss and take profit functionality

- Added stop loss and take profit parameters to TradeParams interface
- Implemented conditional order placement in executeTrade method
- Added ZERO import and closePosition method to DriftTradingService
- Enhanced trade API to handle stop loss/take profit parameters
- Added position fetching and closing functionality to AdvancedTradingPanel
- Added open positions display with close buttons
- Implemented risk management calculations and UI
- Added conditional order tracking in TradeResult interface
This commit is contained in:
mindesbunister
2025-07-13 01:31:07 +02:00
parent 8e0d7f0969
commit 71f7cd9084
5 changed files with 1053 additions and 13 deletions

View File

@@ -0,0 +1,46 @@
import { NextResponse } from 'next/server'
import { driftTradingService } from '../../../../lib/drift-trading'
export async function POST(request: Request) {
try {
const { symbol, amount } = await request.json()
console.log(`🔒 Close position request: ${amount || 'ALL'} ${symbol}`)
// Validate inputs
if (!symbol) {
return NextResponse.json(
{ success: false, error: 'Symbol is required' },
{ status: 400 }
)
}
// Execute position close
const result = await driftTradingService.closePosition(symbol, amount)
if (result.success) {
console.log(`✅ Position closed successfully: ${result.txId}`)
return NextResponse.json({
success: true,
txId: result.txId,
message: `Position in ${symbol} closed successfully`
})
} else {
console.error(`❌ Failed to close position: ${result.error}`)
return NextResponse.json(
{ success: false, error: result.error },
{ status: 500 }
)
}
} catch (error: any) {
console.error('❌ Close position API error:', error)
return NextResponse.json(
{
success: false,
error: error.message || 'Failed to close position'
},
{ status: 500 }
)
}
}

View File

@@ -0,0 +1,105 @@
import { NextResponse } from 'next/server'
import { driftTradingService } from '../../../../lib/drift-trading'
export async function POST(request: Request) {
try {
const {
symbol,
side,
amount,
leverage,
orderType,
price,
stopLoss,
takeProfit,
stopLossType,
takeProfitType
} = await request.json()
console.log(`🎯 Trade request: ${side} ${amount} ${symbol} at ${leverage}x leverage`)
if (stopLoss) console.log(`🛑 Stop Loss: $${stopLoss} (${stopLossType})`)
if (takeProfit) console.log(`🎯 Take Profit: $${takeProfit} (${takeProfitType})`)
// Validate inputs
if (!symbol || !side || !amount || !leverage) {
return NextResponse.json(
{ success: false, error: 'Missing required trade parameters' },
{ status: 400 }
)
}
if (amount <= 0 || leverage < 1 || leverage > 20) {
return NextResponse.json(
{ success: false, error: 'Invalid trade parameters' },
{ status: 400 }
)
}
// Validate stop loss and take profit if provided
if (stopLoss && stopLoss <= 0) {
return NextResponse.json(
{ success: false, error: 'Invalid stop loss price' },
{ status: 400 }
)
}
if (takeProfit && takeProfit <= 0) {
return NextResponse.json(
{ success: false, error: 'Invalid take profit price' },
{ status: 400 }
)
}
// Convert LONG/SHORT to BUY/SELL for the trading service
const tradeSide: 'BUY' | 'SELL' = side === 'LONG' ? 'BUY' : 'SELL'
// Execute trade
const tradeParams = {
symbol,
side: tradeSide,
amount, // Position size in tokens
orderType: orderType || 'MARKET',
price: orderType === 'LIMIT' ? price : undefined,
stopLoss,
takeProfit,
stopLossType,
takeProfitType
}
const result = await driftTradingService.executeTrade(tradeParams)
if (result.success) {
console.log(`✅ Trade executed successfully: ${result.txId}`)
const response: any = {
success: true,
txId: result.txId,
executedPrice: result.executedPrice,
executedAmount: result.executedAmount,
message: `${side} order for ${amount} ${symbol} executed successfully`
}
if (result.conditionalOrders && result.conditionalOrders.length > 0) {
response.conditionalOrders = result.conditionalOrders
response.message += ` with ${result.conditionalOrders.length} conditional order(s)`
}
return NextResponse.json(response)
} else {
console.error(`❌ Trade execution failed: ${result.error}`)
return NextResponse.json(
{ success: false, error: result.error },
{ status: 500 }
)
}
} catch (error: any) {
console.error('❌ Trade API error:', error)
return NextResponse.json(
{
success: false,
error: error.message || 'Trade execution failed'
},
{ status: 500 }
)
}
}