Enhance trailing stop with ATR-based sizing

This commit is contained in:
mindesbunister
2025-11-05 15:28:12 +01:00
parent 149294084e
commit a100945864
8 changed files with 183 additions and 35 deletions

View File

@@ -25,6 +25,8 @@ export interface TestTradeResponse {
direction?: 'long' | 'short'
entryPrice?: number
positionSize?: number
requestedPositionSize?: number
fillCoveragePercent?: number
stopLoss?: number
takeProfit1?: number
takeProfit2?: number
@@ -94,19 +96,19 @@ export async function POST(request: NextRequest): Promise<NextResponse<TestTrade
}
// Calculate position size with leverage
const positionSizeUSD = positionSize * leverage
const requestedPositionSizeUSD = positionSize * leverage
console.log(`💰 Opening ${direction} position:`)
console.log(` Symbol: ${driftSymbol}`)
console.log(` Base size: $${positionSize}`)
console.log(` Leverage: ${leverage}x`)
console.log(` Total position: $${positionSizeUSD}`)
console.log(` Requested notional: $${requestedPositionSizeUSD}`)
// Open position
const openResult = await openPosition({
symbol: driftSymbol,
direction: direction,
sizeUSD: positionSizeUSD,
sizeUSD: requestedPositionSizeUSD,
slippageTolerance: config.slippageTolerance,
})
@@ -123,6 +125,20 @@ export async function POST(request: NextRequest): Promise<NextResponse<TestTrade
// Calculate stop loss and take profit prices
const entryPrice = openResult.fillPrice!
const actualPositionSizeUSD = openResult.fillNotionalUSD ?? requestedPositionSizeUSD
const filledBaseSize = openResult.fillSize !== undefined
? Math.abs(openResult.fillSize)
: (entryPrice > 0 ? actualPositionSizeUSD / entryPrice : 0)
const fillCoverage = requestedPositionSizeUSD > 0
? (actualPositionSizeUSD / requestedPositionSizeUSD) * 100
: 100
console.log('📏 Fill results:')
console.log(` Filled base size: ${filledBaseSize.toFixed(4)} ${driftSymbol.split('-')[0]}`)
console.log(` Filled notional: $${actualPositionSizeUSD.toFixed(2)}`)
if (fillCoverage < 99.5) {
console.log(` ⚠️ Partial fill: ${fillCoverage.toFixed(2)}% of requested size`)
}
const stopLossPrice = calculatePrice(
entryPrice,
@@ -183,13 +199,13 @@ export async function POST(request: NextRequest): Promise<NextResponse<TestTrade
direction: direction,
entryPrice,
entryTime: Date.now(),
positionSize: positionSizeUSD,
positionSize: actualPositionSizeUSD,
leverage: leverage,
stopLossPrice,
tp1Price,
tp2Price,
emergencyStopPrice,
currentSize: positionSizeUSD,
currentSize: actualPositionSizeUSD,
tp1Hit: false,
tp2Hit: false,
slMovedToBreakeven: false,
@@ -204,6 +220,8 @@ export async function POST(request: NextRequest): Promise<NextResponse<TestTrade
maxAdverseExcursion: 0,
maxFavorablePrice: entryPrice,
maxAdversePrice: entryPrice,
atrAtEntry: undefined,
runnerTrailingPercent: undefined,
priceCheckCount: 0,
lastPrice: entryPrice,
lastUpdateTime: Date.now(),
@@ -222,7 +240,9 @@ export async function POST(request: NextRequest): Promise<NextResponse<TestTrade
symbol: driftSymbol,
direction: direction,
entryPrice: entryPrice,
positionSize: positionSizeUSD,
positionSize: actualPositionSizeUSD,
requestedPositionSize: requestedPositionSizeUSD,
fillCoveragePercent: Number(fillCoverage.toFixed(2)),
stopLoss: stopLossPrice,
takeProfit1: tp1Price,
takeProfit2: tp2Price,
@@ -237,7 +257,7 @@ export async function POST(request: NextRequest): Promise<NextResponse<TestTrade
try {
const exitRes = await placeExitOrders({
symbol: driftSymbol,
positionSizeUSD: positionSizeUSD,
positionSizeUSD: actualPositionSizeUSD,
entryPrice: entryPrice,
tp1Price,
tp2Price,
@@ -274,7 +294,7 @@ export async function POST(request: NextRequest): Promise<NextResponse<TestTrade
symbol: driftSymbol,
direction: direction,
entryPrice,
positionSizeUSD: positionSizeUSD,
positionSizeUSD: actualPositionSizeUSD,
leverage: leverage,
stopLossPrice,
takeProfit1Price: tp1Price,
@@ -292,6 +312,8 @@ export async function POST(request: NextRequest): Promise<NextResponse<TestTrade
hardStopPrice,
signalStrength: 'test',
timeframe: 'manual',
expectedSizeUSD: requestedPositionSizeUSD,
actualSizeUSD: actualPositionSizeUSD,
})
console.log('💾 Trade saved to database')