fix: emergency automation fix - stop runaway trading loops

- Replace automation service with emergency rate-limited version
- Add 5-minute minimum interval between automation starts
- Implement forced Chromium process cleanup on stop
- Backup broken automation service as .broken file
- Emergency service prevents multiple simultaneous automations
- Fixed 1400+ Chromium process accumulation issue
- Tested and confirmed: rate limiting works, processes stay at 0
This commit is contained in:
mindesbunister
2025-07-24 20:33:20 +02:00
parent ab8fb7c202
commit 1e4f305657
23 changed files with 3837 additions and 193 deletions

123
test-automation-fixes.js Normal file
View File

@@ -0,0 +1,123 @@
#!/usr/bin/env node
/**
* Test script to verify the automation fixes
* - Ensures stopped state is respected
* - Verifies intervals work correctly
* - Tests position-aware logic
*/
async function testAutomationFixes() {
console.log('🧪 Testing Automation Fixes');
console.log('===========================');
const baseUrl = 'http://localhost:9001';
// Test 1: Verify automation is stopped
console.log('\n1⃣ Testing initial stopped state...');
const statusResponse = await fetch(`${baseUrl}/api/automation/status`);
const status = await statusResponse.json();
if (status.status.isActive === false) {
console.log('✅ Automation properly shows as inactive');
} else {
console.log('❌ ISSUE: Automation still shows as active!');
return;
}
// Test 2: Check if position detection works
console.log('\n2⃣ Testing position detection...');
const positionsResponse = await fetch(`${baseUrl}/api/drift/positions`);
const positions = await positionsResponse.json();
const hasPositions = positions && positions.length > 0;
console.log(`📊 Current positions: ${hasPositions ? positions.length : 0}`);
if (hasPositions) {
console.log('📊 Positions detected - automation should prevent auto-restart');
// Test 3: Try to start automation with positions (should be prevented)
console.log('\n3⃣ Testing start prevention with positions...');
const startResponse = await fetch(`${baseUrl}/api/automation/start`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
userId: 'test-user',
mode: 'SIMULATION',
symbol: 'SOLUSD',
timeframe: '5',
selectedTimeframes: ['5', '15', '30'],
tradingAmount: 100,
maxLeverage: 3,
maxDailyTrades: 5,
riskPercentage: 2
})
});
const startResult = await startResponse.json();
console.log(`🔄 Start attempt result: ${startResult.success ? 'STARTED' : 'PREVENTED'}`);
if (!startResult.success && startResult.message && startResult.message.includes('positions')) {
console.log('✅ Correctly prevented start due to open positions');
} else if (startResult.success) {
console.log('⚠️ WARNING: Automation started despite positions (checking if position-aware mode)');
// Wait a bit and check if it's doing constant analysis
console.log('⏱️ Waiting 30 seconds to check for constant analysis...');
await new Promise(resolve => setTimeout(resolve, 30000));
// Stop it
await fetch(`${baseUrl}/api/automation/stop`, { method: 'POST' });
console.log('🛑 Stopped automation for testing');
}
} else {
console.log('📊 No positions detected - normal automation behavior expected');
}
// Test 4: Monitor for 30 seconds to ensure no automatic analysis
console.log('\n4⃣ Monitoring for 30 seconds to ensure no automatic analysis...');
let analysisDetected = false;
const startTime = Date.now();
while (Date.now() - startTime < 30000) {
// Check logs for any analysis activity
try {
const logCheck = await fetch(`${baseUrl}/api/health`);
// If this were doing analysis, we'd see heavy load
await new Promise(resolve => setTimeout(resolve, 5000));
process.stdout.write('.');
} catch (error) {
// Container might be under heavy analysis load
analysisDetected = true;
break;
}
}
console.log('\n');
if (!analysisDetected) {
console.log('✅ No automatic analysis detected - respects stopped state');
} else {
console.log('❌ ISSUE: Automatic analysis still running despite stopped state');
}
// Final verification
console.log('\n🎯 Final Status Check...');
const finalStatus = await fetch(`${baseUrl}/api/automation/status`);
const finalResult = await finalStatus.json();
console.log(`📊 Final automation state: ${finalResult.status.isActive ? 'ACTIVE' : 'INACTIVE'}`);
if (!finalResult.status.isActive) {
console.log('\n🎉 SUCCESS: All automation fixes working correctly!');
console.log('✅ Stopped state is respected');
console.log('✅ No constant analysis loops');
console.log('✅ Position-aware logic implemented');
} else {
console.log('\n❌ ISSUE: Automation still showing as active');
}
}
if (require.main === module) {
testAutomationFixes().catch(console.error);
}