/** * Calculate if runner system is viable for current position size * * Runner needs to be above Drift minimum order size after TP1 and TP2 close */ import { getMarketConfig } from '../../config/trading' export function canUseRunner( symbol: string, positionSizeUSD: number, currentPrice: number, tp1Percent: number = 75, tp2Percent: number = 80 ): { viable: boolean; runnerSizeUSD: number; runnerSizeBase: number; reason?: string } { const marketConfig = getMarketConfig(symbol) // Calculate runner size in USD const afterTp1 = positionSizeUSD * ((100 - tp1Percent) / 100) // 25% remaining const runnerSizeUSD = afterTp1 * ((100 - tp2Percent) / 100) // 20% of that = 5% total // Convert to base asset size const runnerSizeBase = runnerSizeUSD / currentPrice // Check if above minimum const minRequired = marketConfig.minOrderSize const viable = runnerSizeBase >= minRequired if (!viable) { return { viable: false, runnerSizeUSD, runnerSizeBase, reason: `Runner ${runnerSizeBase.toFixed(4)} < minimum ${minRequired} ${symbol.replace('-PERP', '')}` } } return { viable: true, runnerSizeUSD, runnerSizeBase } } /** * Calculate maximum TP2 close percent that leaves a viable runner * Returns adjusted TP2% that ensures runner >= minimum size */ export function getViableTP2Percent( symbol: string, positionSizeUSD: number, currentPrice: number, tp1Percent: number = 75 ): number { const marketConfig = getMarketConfig(symbol) const afterTp1SizeUSD = positionSizeUSD * ((100 - tp1Percent) / 100) // Calculate minimum runner size we need in USD const minRunnerBase = marketConfig.minOrderSize * 1.1 // Add 10% buffer const minRunnerUSD = minRunnerBase * currentPrice // Runner = afterTp1 * (100 - tp2%) / 100 // minRunnerUSD = afterTp1 * (100 - tp2%) / 100 // Solve for tp2%: // (100 - tp2%) = (minRunnerUSD / afterTp1) * 100 // tp2% = 100 - ((minRunnerUSD / afterTp1) * 100) const maxTP2Percent = 100 - ((minRunnerUSD / afterTp1SizeUSD) * 100) // Clamp between 0-95% (never close more than 95% at TP2) return Math.max(0, Math.min(95, Math.floor(maxTP2Percent))) }