feat: Remove artificial percentage minimums - AI now has complete freedom
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!
This commit is contained in:
181
test-api-real-orders.js
Normal file
181
test-api-real-orders.js
Normal file
@@ -0,0 +1,181 @@
|
||||
// Direct API test to place REAL orders via the trading endpoint
|
||||
const https = require('https');
|
||||
const http = require('http');
|
||||
|
||||
async function testRealOrderViaAPI() {
|
||||
console.log('🚀 REAL DRIFT ORDER TEST VIA API');
|
||||
console.log('============================================================');
|
||||
console.log('⚠️ This will place a REAL $1 order using the trading API');
|
||||
console.log('📋 Order should appear in Drift Protocol interface');
|
||||
console.log('============================================================\n');
|
||||
|
||||
// Test different percentage levels
|
||||
const testCases = [
|
||||
{
|
||||
stopLossPercent: 1.5,
|
||||
takeProfitPercent: 1.0,
|
||||
name: 'Conservative Scalping (1.5%/1.0%)'
|
||||
},
|
||||
{
|
||||
stopLossPercent: 1.0,
|
||||
takeProfitPercent: 0.75,
|
||||
name: 'Moderate Scalping (1.0%/0.75%)'
|
||||
},
|
||||
{
|
||||
stopLossPercent: 0.5,
|
||||
takeProfitPercent: 0.25,
|
||||
name: 'Tight Scalping (0.5%/0.25%)'
|
||||
},
|
||||
{
|
||||
stopLossPercent: 0.25,
|
||||
takeProfitPercent: 0.1,
|
||||
name: 'Ultra-tight Scalping (0.25%/0.1%)'
|
||||
}
|
||||
];
|
||||
|
||||
const successfulTests = [];
|
||||
|
||||
for (const testCase of testCases) {
|
||||
console.log(`🔬 Testing: ${testCase.name}`);
|
||||
console.log(` Stop Loss: ${testCase.stopLossPercent}%`);
|
||||
console.log(` Take Profit: ${testCase.takeProfitPercent}%`);
|
||||
|
||||
try {
|
||||
const orderData = {
|
||||
symbol: 'SOL-PERP',
|
||||
side: 'buy',
|
||||
amount: 1, // $1 USD
|
||||
orderType: 'market',
|
||||
stopLoss: true,
|
||||
takeProfit: true,
|
||||
stopLossPercent: testCase.stopLossPercent,
|
||||
takeProfitPercent: testCase.takeProfitPercent,
|
||||
leverage: 1
|
||||
};
|
||||
|
||||
console.log(` 📤 Placing real order...`);
|
||||
|
||||
const response = await makeAPIRequest('POST', '/api/drift/trade', orderData);
|
||||
|
||||
if (response.success) {
|
||||
console.log(` ✅ SUCCESS: Order placed successfully!`);
|
||||
console.log(` 📋 Response:`, JSON.stringify(response, null, 2));
|
||||
|
||||
successfulTests.push({
|
||||
...testCase,
|
||||
response: response
|
||||
});
|
||||
|
||||
// Wait 5 seconds before closing the position
|
||||
console.log(` ⏳ Waiting 5 seconds before closing position...`);
|
||||
await new Promise(resolve => setTimeout(resolve, 5000));
|
||||
|
||||
// Close the position
|
||||
const closeData = {
|
||||
symbol: 'SOL-PERP',
|
||||
side: 'sell',
|
||||
amount: 1,
|
||||
orderType: 'market'
|
||||
};
|
||||
|
||||
const closeResponse = await makeAPIRequest('POST', '/api/drift/trade', closeData);
|
||||
|
||||
if (closeResponse.success) {
|
||||
console.log(` 🧹 Position closed successfully`);
|
||||
} else {
|
||||
console.log(` ⚠️ Warning: Could not close position automatically`);
|
||||
console.log(` 📋 Close response:`, JSON.stringify(closeResponse, null, 2));
|
||||
}
|
||||
|
||||
} else {
|
||||
console.log(` ❌ FAILED: ${response.error || 'Unknown error'}`);
|
||||
console.log(` 📋 Full response:`, JSON.stringify(response, null, 2));
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.log(` ❌ FAILED: ${error.message}`);
|
||||
}
|
||||
|
||||
console.log(''); // Empty line for readability
|
||||
|
||||
// Wait between tests to avoid rate limiting
|
||||
await new Promise(resolve => setTimeout(resolve, 3000));
|
||||
}
|
||||
|
||||
// Summary
|
||||
console.log('🎯 FINAL RESULTS:');
|
||||
console.log('============================================================');
|
||||
|
||||
if (successfulTests.length > 0) {
|
||||
console.log(`✅ Successfully placed ${successfulTests.length}/${testCases.length} orders`);
|
||||
|
||||
const tightestTest = successfulTests.reduce((tightest, current) => {
|
||||
return current.stopLossPercent < tightest.stopLossPercent ? current : tightest;
|
||||
});
|
||||
|
||||
console.log(`\n🏆 TIGHTEST SUCCESSFUL PERCENTAGES:`);
|
||||
console.log(` Stop Loss: ${tightestTest.stopLossPercent}%`);
|
||||
console.log(` Take Profit: ${tightestTest.takeProfitPercent}%`);
|
||||
console.log(` Test: ${tightestTest.name}`);
|
||||
|
||||
console.log(`\n💡 RECOMMENDED API UPDATE:`);
|
||||
console.log(` stopLossPercentCalc = Math.max(stopLossPercent / 100, ${(tightestTest.stopLossPercent / 100).toFixed(4)}) // ${tightestTest.stopLossPercent}%`);
|
||||
console.log(` takeProfitPercentCalc = Math.max(takeProfitPercent / 100, ${(tightestTest.takeProfitPercent / 100).toFixed(4)}) // ${tightestTest.takeProfitPercent}%`);
|
||||
|
||||
} else {
|
||||
console.log('❌ No orders were successfully placed');
|
||||
console.log(' Current minimum percentages appear to be necessary');
|
||||
}
|
||||
}
|
||||
|
||||
function makeAPIRequest(method, path, data) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const postData = JSON.stringify(data);
|
||||
|
||||
const options = {
|
||||
hostname: 'localhost',
|
||||
port: 3000,
|
||||
path: path,
|
||||
method: method,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Content-Length': Buffer.byteLength(postData)
|
||||
}
|
||||
};
|
||||
|
||||
const req = http.request(options, (res) => {
|
||||
let responseData = '';
|
||||
|
||||
res.on('data', (chunk) => {
|
||||
responseData += chunk;
|
||||
});
|
||||
|
||||
res.on('end', () => {
|
||||
try {
|
||||
const parsedData = JSON.parse(responseData);
|
||||
resolve(parsedData);
|
||||
} catch (e) {
|
||||
resolve({ success: false, error: 'Invalid JSON response', raw: responseData });
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
req.on('error', (error) => {
|
||||
reject(error);
|
||||
});
|
||||
|
||||
req.write(postData);
|
||||
req.end();
|
||||
});
|
||||
}
|
||||
|
||||
// Safety check
|
||||
if (process.argv.includes('--confirm')) {
|
||||
testRealOrderViaAPI().catch(console.error);
|
||||
} else {
|
||||
console.log('⚠️ SAFETY CONFIRMATION REQUIRED ⚠️');
|
||||
console.log('This test will place REAL $1 orders on Drift Protocol');
|
||||
console.log('Orders will be automatically closed after testing');
|
||||
console.log('');
|
||||
console.log('To proceed, run: node test-api-real-orders.js --confirm');
|
||||
}
|
||||
Reference in New Issue
Block a user