/** * Simplified test for minimum percentages focusing on order validation * This test simulates order placement without requiring full Drift Protocol connection */ // Simulate the current minimum percentage validation from the trading API function validateOrderPercentages(stopLossPercent, takeProfitPercent, currentPrice = 200) { console.log(`\n๐Ÿงช Testing SL: ${stopLossPercent}% / TP: ${takeProfitPercent}%`); try { // Current minimums from app/api/drift/trade/route.js const currentMinimumSL = 0.03; // 3% const currentMinimumTP = 0.01; // 1% // Apply current minimum enforcement const stopLossPercentCalc = Math.max(stopLossPercent / 100, currentMinimumSL); const takeProfitPercentCalc = Math.max(takeProfitPercent / 100, currentMinimumTP); // Calculate prices const stopLossPrice = currentPrice * (1 - stopLossPercentCalc); const takeProfitPrice = currentPrice * (1 + takeProfitPercentCalc); console.log(` ๐Ÿ“Š Current price: $${currentPrice.toFixed(4)}`); console.log(` ๐Ÿ›‘ Stop Loss: $${stopLossPrice.toFixed(4)} (${(stopLossPercentCalc * 100).toFixed(2)}% below)`); console.log(` ๐Ÿ’ฐ Take Profit: $${takeProfitPrice.toFixed(4)} (${(takeProfitPercentCalc * 100).toFixed(2)}% above)`); // Price difference validation (minimum tick size simulation) const stopLossDiff = Math.abs(currentPrice - stopLossPrice); const takeProfitDiff = Math.abs(takeProfitPrice - currentPrice); console.log(` ๐Ÿ’น Price differences: SL: $${stopLossDiff.toFixed(4)}, TP: $${takeProfitDiff.toFixed(4)}`); // Simulate minimum price difference requirements const minimumPriceDiff = 0.01; // $0.01 minimum difference if (stopLossDiff < minimumPriceDiff) { throw new Error(`Stop loss too close to entry (${stopLossDiff.toFixed(4)} < ${minimumPriceDiff})`); } if (takeProfitDiff < minimumPriceDiff) { throw new Error(`Take profit too close to entry (${takeProfitDiff.toFixed(4)} < ${minimumPriceDiff})`); } // Check if minimums were enforced const slEnforced = stopLossPercentCalc > stopLossPercent / 100; const tpEnforced = takeProfitPercentCalc > takeProfitPercent / 100; if (slEnforced) { console.log(` โš ๏ธ Stop loss minimum enforced: ${stopLossPercent}% โ†’ ${(stopLossPercentCalc * 100).toFixed(1)}%`); } if (tpEnforced) { console.log(` โš ๏ธ Take profit minimum enforced: ${takeProfitPercent}% โ†’ ${(takeProfitPercentCalc * 100).toFixed(1)}%`); } if (!slEnforced && !tpEnforced) { console.log(` โœ… No minimums enforced - percentages accepted as-is`); } return { success: true, originalSL: stopLossPercent, originalTP: takeProfitPercent, enforcedSL: stopLossPercentCalc * 100, enforcedTP: takeProfitPercentCalc * 100, slEnforced, tpEnforced, stopLossPrice, takeProfitPrice }; } catch (error) { console.log(` โŒ FAILED: ${error.message}`); return { success: false, error: error.message, originalSL: stopLossPercent, originalTP: takeProfitPercent }; } } // Test various percentage combinations function runComprehensiveTest() { console.log('๐ŸŽฏ Drift Protocol Minimum Percentage Analysis'); console.log(' Simulating current API validation logic'); console.log(' Current minimums: 3% SL / 1% TP\n'); const testCases = [ // Scalping scenarios (what we want to achieve) { sl: 0.5, tp: 0.3, desc: 'Ultra-tight scalping' }, { sl: 0.8, tp: 0.5, desc: 'Tight scalping' }, { sl: 1.0, tp: 0.5, desc: 'Moderate scalping' }, { sl: 1.5, tp: 0.8, desc: 'Conservative scalping' }, // Current system minimums { sl: 3.0, tp: 1.0, desc: 'Current minimums' }, // Proposed new minimums for testing { sl: 2.0, tp: 0.8, desc: 'Proposed: 2%/0.8%' }, { sl: 1.5, tp: 0.6, desc: 'Proposed: 1.5%/0.6%' }, { sl: 1.0, tp: 0.5, desc: 'Proposed: 1%/0.5%' }, ]; const results = []; console.log('๐Ÿ“‹ Current System Behavior (3% SL / 1% TP minimums):'); console.log('=' .repeat(60)); for (const testCase of testCases) { console.log(`\n๐Ÿ“ ${testCase.desc}:`); const result = validateOrderPercentages(testCase.sl, testCase.tp); results.push(result); } // Generate recommendations console.log('\n\n๐Ÿ’ก ANALYSIS & RECOMMENDATIONS'); console.log('=' .repeat(60)); const scalpingTests = results.slice(0, 4); // First 4 are scalping tests const allEnforced = scalpingTests.every(r => r.slEnforced || r.tpEnforced); if (allEnforced) { console.log('โŒ Current minimums are TOO HIGH for scalping strategies'); console.log(' All scalping percentages get enforced to higher values'); console.log('\n๐ŸŽฏ RECOMMENDED ACTION:'); console.log(' Test lower minimums with real Drift orders:'); console.log(' - Start with 1.5% SL / 0.6% TP'); console.log(' - If successful, try 1% SL / 0.5% TP'); console.log(' - Monitor order rejection rates'); console.log('\n๐Ÿ“ CODE CHANGES NEEDED:'); console.log(' File: app/api/drift/trade/route.js'); console.log(' Lines 273-274:'); console.log(' // Test these progressively:'); console.log(' const stopLossPercentCalc = Math.max(stopLossPercent / 100, 0.015) // 1.5% minimum'); console.log(' const takeProfitPercentCalc = Math.max(takeProfitPercent / 100, 0.006) // 0.6% minimum'); } else { console.log('โœ… Some scalping percentages work with current minimums'); } // Show specific scalping impact console.log('\n๐Ÿ“Š SCALPING STRATEGY IMPACT:'); scalpingTests.forEach((result, index) => { const testCase = testCases[index]; if (result.success) { const slIncrease = result.enforcedSL - result.originalSL; const tpIncrease = result.enforcedTP - result.originalTP; if (slIncrease > 0 || tpIncrease > 0) { console.log(` ${testCase.desc}:`); if (slIncrease > 0) { console.log(` - Stop Loss forced from ${result.originalSL}% to ${result.enforcedSL.toFixed(1)}% (+${slIncrease.toFixed(1)}%)`); } if (tpIncrease > 0) { console.log(` - Take Profit forced from ${result.originalTP}% to ${result.enforcedTP.toFixed(1)}% (+${tpIncrease.toFixed(1)}%)`); } } } }); // Market context console.log('\n๐Ÿ“ˆ MARKET CONTEXT CONSIDERATIONS:'); console.log(' - SOL volatility: ~2-5% daily average'); console.log(' - Minimum tick size: 0.0001 (~$0.00002 at $200)'); console.log(' - Spread: typically 0.01-0.05%'); console.log(' - Slippage: 0.05-0.2% for small orders'); console.log('\n๐Ÿ”„ TESTING STRATEGY:'); console.log(' 1. Implement 1.5%/0.6% minimums in code'); console.log(' 2. Test with $1-5 positions first'); console.log(' 3. Monitor order acceptance rates'); console.log(' 4. Gradually reduce if successful'); console.log(' 5. Consider dynamic minimums based on volatility'); } // Risk analysis for different minimum levels function analyzeRiskLevels() { console.log('\n\nโš ๏ธ RISK ANALYSIS FOR REDUCED MINIMUMS'); console.log('=' .repeat(60)); const scenarios = [ { sl: 0.5, tp: 0.3, risk: 'EXTREME', desc: 'Very high noise sensitivity' }, { sl: 1.0, tp: 0.5, risk: 'HIGH', desc: 'High noise sensitivity, good for stable conditions' }, { sl: 1.5, tp: 0.6, risk: 'MODERATE', desc: 'Balanced for scalping, manageable risk' }, { sl: 2.0, tp: 0.8, risk: 'LOW', desc: 'Conservative scalping, lower noise impact' } ]; scenarios.forEach(scenario => { console.log(`\n${scenario.sl}% SL / ${scenario.tp}% TP - Risk: ${scenario.risk}`); console.log(` ${scenario.desc}`); // Calculate position sizing impact const accountBalance = 1000; // $1000 example const riskPerTrade = accountBalance * (scenario.sl / 100); const maxPositionSize = accountBalance * 0.02 / (scenario.sl / 100); // 2% account risk console.log(` - Risk per trade: $${riskPerTrade.toFixed(2)} (${scenario.sl}% of position)`); console.log(` - Max position size: $${maxPositionSize.toFixed(2)} (2% account risk)`); // Noise impact const noiseThreshold = scenario.sl * 0.3; // 30% of SL console.log(` - Noise threshold: ${noiseThreshold.toFixed(2)}% (stops at 30% of normal volatility)`); }); } // Main execution console.log('๐Ÿš€ Starting Drift Protocol Minimum Percentage Analysis\n'); runComprehensiveTest(); analyzeRiskLevels(); console.log('\n\n๐ŸŽฏ NEXT STEPS:'); console.log('1. Implement reduced minimums in app/api/drift/trade/route.js'); console.log('2. Test with small real positions'); console.log('3. Monitor execution success rates'); console.log('4. Document findings and adjust accordingly');