REMOVED ARTIFICIAL CONSTRAINTS: - Eliminated 3% minimum stop loss requirement - Eliminated 1% minimum take profit requirement - AI can now choose ANY percentage based on market analysis - Updated app/api/drift/trade/route.js to use exact AI percentages - Removed Math.max() constraints that forced minimums - AI now has 0.1%+ to 50%+ percentage freedom - Modified AI_RISK_MANAGEMENT.md to reflect new freedom - Removed all references to artificial 3%/1% minimums - Added ultra-tight scalping examples (0.1%-1%) - Updated volatility guidelines for all trading styles PROVEN WITH REAL ORDERS: - Transaction: 35QmCqWFzwJ1X2nm5M8rgExKEMbWTRqxCa1GryEsR595zYwBLqCzDowUYm3J2u13WMvYR2PRoS3eAMSzXfGvEVbe - Confirmed: 0.5% SL / 0.25% TP working on Drift Protocol - Verified: Orders visible in Drift UI with correct trigger prices - Optimal risk management based on actual market conditions - Support for all trading styles: scalping to position trading - No more forced suboptimal stops due to artificial limits - Professional-grade percentage precision The AI can now freely optimize percentages for maximum trading effectiveness!
219 lines
8.7 KiB
JavaScript
219 lines
8.7 KiB
JavaScript
/**
|
||
* 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');
|