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:
46
app/api/drift/close-position/route.ts
Normal file
46
app/api/drift/close-position/route.ts
Normal 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 }
|
||||
)
|
||||
}
|
||||
}
|
||||
105
app/api/drift/trade/route.ts
Normal file
105
app/api/drift/trade/route.ts
Normal 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 }
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user