AI-powered DCA manager with sophisticated reversal detection Multi-factor analysis: price movements, RSI, support/resistance, 24h trends Real example: SOL position analysis shows 5.2:1 risk/reward improvement lib/ai-dca-manager.ts - Complete DCA analysis engine with risk management Intelligent scaling: adds to positions when AI detects 50%+ reversal confidence Account-aware: uses up to 50% available balance with conservative 3x leverage Dynamic SL/TP: adjusts stop loss and take profit for new average position lib/automation-service-simple.ts - DCA monitoring in main trading cycle prisma/schema.prisma - DCARecord model for comprehensive tracking Checks DCA opportunities before new trade analysis (priority system) test-ai-dca-simple.js - Real SOL position test from screenshot data Entry: 85.98, Current: 83.87 (-1.13% underwater) AI recommendation: 1.08 SOL DCA → 4.91 profit potential Risk level: LOW with 407% liquidation safety margin LOGIC Price movement analysis: 1-10% against position optimal for DCA Market sentiment: 24h trends must align with DCA direction Technical indicators: RSI oversold (<35) for longs, overbought (>65) for shorts Support/resistance: proximity to key levels increases confidence Risk management: respects leverage limits and liquidation distances Complete error handling and fallback mechanisms Database persistence for DCA tracking and performance analysis Seamless integration with existing AI leverage calculator Real-time market data integration for accurate decision making
157 lines
7.4 KiB
JavaScript
157 lines
7.4 KiB
JavaScript
"use strict";
|
|
/**
|
|
* AI-Driven Dynamic Leverage Calculator
|
|
*
|
|
* Calculates optimal leverage to maximize profits while maintaining safe liquidation distance
|
|
* Strategy: Use maximum leverage possible without liquidation price being too close to stop loss
|
|
*/
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.AILeverageCalculator = void 0;
|
|
class AILeverageCalculator {
|
|
/**
|
|
* Calculate optimal leverage for maximum profit with safe liquidation distance
|
|
*/
|
|
static calculateOptimalLeverage(params) {
|
|
const { accountValue, availableBalance, entryPrice, stopLossPrice, side, maxLeverageAllowed, safetyBuffer = 0.10 // 10% safety buffer by default
|
|
} = params;
|
|
console.log('🧮 AI Leverage Calculation:', {
|
|
accountValue: accountValue.toFixed(2),
|
|
availableBalance: availableBalance.toFixed(2),
|
|
entryPrice,
|
|
stopLossPrice,
|
|
side,
|
|
maxLeverageAllowed
|
|
});
|
|
// Strategy 1: Under $1k - Use 100% of available balance
|
|
const useFullBalance = accountValue < 1000;
|
|
const baseAmount = useFullBalance ? availableBalance : availableBalance * 0.5; // 50% for accounts over $1k
|
|
console.log(`💰 Balance Strategy: ${useFullBalance ? 'AGGRESSIVE (100%)' : 'CONSERVATIVE (50%)'} - Using $${baseAmount.toFixed(2)}`);
|
|
// Calculate stop loss distance as percentage
|
|
const stopLossDistance = Math.abs(entryPrice - stopLossPrice) / entryPrice;
|
|
console.log(`📊 Stop Loss Distance: ${(stopLossDistance * 100).toFixed(2)}%`);
|
|
// Calculate maximum safe leverage based on liquidation distance
|
|
const maxSafeLeverage = this.calculateMaxSafeLeverage(entryPrice, stopLossPrice, side, safetyBuffer);
|
|
// Determine final leverage (limited by platform max and safety calculations)
|
|
const finalLeverage = Math.min(maxSafeLeverage, maxLeverageAllowed);
|
|
// Calculate position size and margin
|
|
const positionSize = baseAmount * finalLeverage;
|
|
const marginRequired = positionSize / finalLeverage;
|
|
// Calculate liquidation price for verification
|
|
const liquidationPrice = this.calculateLiquidationPrice(entryPrice, finalLeverage, side, marginRequired, positionSize);
|
|
// Risk assessment
|
|
const riskAssessment = this.assessRisk(finalLeverage, stopLossDistance, useFullBalance);
|
|
// Generate AI reasoning
|
|
const reasoning = this.generateLeverageReasoning(finalLeverage, maxSafeLeverage, maxLeverageAllowed, liquidationPrice, stopLossPrice, useFullBalance, side);
|
|
const result = {
|
|
recommendedLeverage: finalLeverage,
|
|
positionSize,
|
|
liquidationPrice,
|
|
marginRequired,
|
|
maxPossibleLeverage: maxSafeLeverage,
|
|
riskAssessment,
|
|
reasoning
|
|
};
|
|
console.log('🎯 AI Leverage Result:', {
|
|
recommendedLeverage: `${finalLeverage.toFixed(1)}x`,
|
|
positionSize: `$${positionSize.toFixed(2)}`,
|
|
liquidationPrice: `$${liquidationPrice.toFixed(4)}`,
|
|
riskAssessment,
|
|
reasoning
|
|
});
|
|
return result;
|
|
}
|
|
/**
|
|
* Calculate maximum safe leverage where liquidation price maintains safety buffer from stop loss
|
|
*/
|
|
static calculateMaxSafeLeverage(entryPrice, stopLossPrice, side, safetyBuffer) {
|
|
// Calculate where liquidation should be (beyond stop loss + safety buffer)
|
|
let maxLiquidationPrice;
|
|
if (side === 'long') {
|
|
// For longs: liquidation should be below stop loss
|
|
maxLiquidationPrice = stopLossPrice * (1 - safetyBuffer);
|
|
}
|
|
else {
|
|
// For shorts: liquidation should be above stop loss
|
|
maxLiquidationPrice = stopLossPrice * (1 + safetyBuffer);
|
|
}
|
|
console.log(`🛡️ Max Safe Liquidation Price: $${maxLiquidationPrice.toFixed(4)} (${side} position)`);
|
|
// Calculate max leverage that keeps liquidation at safe distance
|
|
// Simplified liquidation formula: For longs: liq = entry * (1 - 1/leverage)
|
|
let maxLeverage;
|
|
if (side === 'long') {
|
|
// entry * (1 - 1/leverage) = maxLiquidationPrice
|
|
// 1 - 1/leverage = maxLiquidationPrice / entry
|
|
// 1/leverage = 1 - maxLiquidationPrice / entry
|
|
// leverage = 1 / (1 - maxLiquidationPrice / entry)
|
|
maxLeverage = 1 / (1 - maxLiquidationPrice / entryPrice);
|
|
}
|
|
else {
|
|
// For shorts: liq = entry * (1 + 1/leverage)
|
|
// entry * (1 + 1/leverage) = maxLiquidationPrice
|
|
// 1 + 1/leverage = maxLiquidationPrice / entry
|
|
// 1/leverage = maxLiquidationPrice / entry - 1
|
|
// leverage = 1 / (maxLiquidationPrice / entry - 1)
|
|
maxLeverage = 1 / (maxLiquidationPrice / entryPrice - 1);
|
|
}
|
|
// Ensure reasonable bounds
|
|
maxLeverage = Math.max(1, Math.min(maxLeverage, 50)); // Between 1x and 50x
|
|
console.log(`⚖️ Max Safe Leverage: ${maxLeverage.toFixed(2)}x`);
|
|
return maxLeverage;
|
|
}
|
|
/**
|
|
* Calculate liquidation price for given position parameters
|
|
*/
|
|
static calculateLiquidationPrice(entryPrice, leverage, side, marginRequired, positionSize) {
|
|
// Simplified liquidation calculation
|
|
// In reality, this would need to account for fees, funding, etc.
|
|
if (side === 'long') {
|
|
// Long liquidation: entry * (1 - 1/leverage)
|
|
return entryPrice * (1 - 1 / leverage);
|
|
}
|
|
else {
|
|
// Short liquidation: entry * (1 + 1/leverage)
|
|
return entryPrice * (1 + 1 / leverage);
|
|
}
|
|
}
|
|
/**
|
|
* Assess risk level based on leverage and position parameters
|
|
*/
|
|
static assessRisk(leverage, stopLossDistance, useFullBalance) {
|
|
if (leverage <= 2 && stopLossDistance >= 0.05)
|
|
return 'LOW';
|
|
if (leverage <= 5 && stopLossDistance >= 0.03)
|
|
return 'MEDIUM';
|
|
if (leverage <= 10 && stopLossDistance >= 0.02)
|
|
return 'MEDIUM';
|
|
return 'HIGH';
|
|
}
|
|
/**
|
|
* Generate AI reasoning for leverage decision
|
|
*/
|
|
static generateLeverageReasoning(finalLeverage, maxSafeLeverage, maxPlatformLeverage, liquidationPrice, stopLossPrice, useFullBalance, side) {
|
|
const reasons = [];
|
|
// Balance strategy reasoning
|
|
if (useFullBalance) {
|
|
reasons.push("Account <$1k: Using 100% available balance for maximum growth");
|
|
}
|
|
else {
|
|
reasons.push("Account >$1k: Using 50% balance for controlled risk");
|
|
}
|
|
// Leverage limitation reasoning
|
|
if (finalLeverage === maxSafeLeverage) {
|
|
reasons.push(`Max safe leverage ${finalLeverage.toFixed(1)}x maintains liquidation safely beyond stop loss`);
|
|
}
|
|
else if (finalLeverage === maxPlatformLeverage) {
|
|
reasons.push(`Platform limit ${maxPlatformLeverage}x reached (could use ${maxSafeLeverage.toFixed(1)}x safely)`);
|
|
}
|
|
// Liquidation safety reasoning
|
|
const liquidationBuffer = side === 'long'
|
|
? (stopLossPrice - liquidationPrice) / stopLossPrice * 100
|
|
: (liquidationPrice - stopLossPrice) / stopLossPrice * 100;
|
|
reasons.push(`Liquidation $${liquidationPrice.toFixed(4)} is ${liquidationBuffer.toFixed(1)}% beyond stop loss`);
|
|
return reasons.join('. ');
|
|
}
|
|
}
|
|
exports.AILeverageCalculator = AILeverageCalculator;
|
|
exports.default = AILeverageCalculator;
|