FEATURES: - Position monitor now automatically detects orphaned orders when no positions - Triggers cleanup only when hasPosition: false to eliminate redundant polling - Provides detailed cleanup results in monitoring response - Leverages existing frequent position checks vs separate timers - Modified /app/api/automation/position-monitor/route.js to check for orphaned orders - Calls existing /api/drift/cleanup-orders endpoint when no positions detected - Returns cleanup status, success/failure, and summary in monitoring response - Handles cleanup errors gracefully with detailed error reporting - Eliminates need for separate 60-second cleanup polling - Uses existing position monitoring infrastructure - Only runs cleanup when positions close (triggered by hasPosition: false) - Automatic handling of orphaned orders after SL/TP execution - Added test-orphaned-cleanup-integration.js for verification - Tests both position monitor integration and direct cleanup API - Provides detailed feedback on cleanup operations This completes the automation enhancement requested - no more manual cleanup needed!
104 lines
3.4 KiB
JavaScript
104 lines
3.4 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
/**
|
|
* Test script for Drift order cleanup system
|
|
* Tests both manual and automated cleanup functionality
|
|
*/
|
|
|
|
const { driftOrderCleanupService } = require('./lib/drift-order-cleanup-service.js')
|
|
|
|
async function testCleanupSystem() {
|
|
console.log('🧪 Testing Drift Order Cleanup System')
|
|
console.log('=====================================\n')
|
|
|
|
try {
|
|
// Test 1: Check current status
|
|
console.log('📊 Test 1: Service Status Check')
|
|
const initialStatus = driftOrderCleanupService.getStatus()
|
|
console.log('Initial status:', initialStatus)
|
|
console.log()
|
|
|
|
// Test 2: Manual cleanup
|
|
console.log('🧹 Test 2: Manual Cleanup')
|
|
try {
|
|
const manualResult = await driftOrderCleanupService.forceCleanup()
|
|
console.log('Manual cleanup result:', manualResult.summary)
|
|
} catch (error) {
|
|
console.log('Manual cleanup error (expected if no orders):', error.message)
|
|
}
|
|
console.log()
|
|
|
|
// Test 3: Check positions and orders directly
|
|
console.log('📊 Test 3: Direct API Check')
|
|
|
|
try {
|
|
const [positionsRes, ordersRes] = await Promise.all([
|
|
fetch('http://localhost:9001/api/drift/positions'),
|
|
fetch('http://localhost:9001/api/drift/orders')
|
|
])
|
|
|
|
if (positionsRes.ok && ordersRes.ok) {
|
|
const positions = await positionsRes.json()
|
|
const orders = await ordersRes.json()
|
|
|
|
console.log(`Current positions: ${positions.positions?.length || 0}`)
|
|
console.log(`Current orders: ${orders.orders?.length || 0}`)
|
|
|
|
if (positions.positions?.length > 0) {
|
|
console.log('Active positions:')
|
|
positions.positions.forEach(pos => {
|
|
console.log(` - ${pos.symbol}: Size ${pos.size}, Value $${pos.value?.toFixed(2) || 'N/A'}`)
|
|
})
|
|
}
|
|
|
|
if (orders.orders?.length > 0) {
|
|
console.log('Active orders:')
|
|
orders.orders.forEach(order => {
|
|
console.log(` - ${order.symbol}: ${order.side} ${order.size} @ $${order.price} (${order.orderType})`)
|
|
})
|
|
}
|
|
} else {
|
|
console.log('❌ Failed to fetch positions/orders')
|
|
}
|
|
} catch (error) {
|
|
console.log('API check error:', error.message)
|
|
}
|
|
console.log()
|
|
|
|
// Test 4: Start automated monitoring (briefly)
|
|
console.log('🤖 Test 4: Automated Monitoring')
|
|
console.log('Starting automated cleanup service for 30 seconds...')
|
|
|
|
driftOrderCleanupService.start(10000) // Check every 10 seconds
|
|
|
|
// Let it run for 30 seconds
|
|
await new Promise(resolve => setTimeout(resolve, 30000))
|
|
|
|
console.log('Stopping automated service...')
|
|
driftOrderCleanupService.stop()
|
|
|
|
// Final status
|
|
const finalStatus = driftOrderCleanupService.getStatus()
|
|
console.log('Final status:', finalStatus)
|
|
|
|
console.log('\n✅ Test completed successfully!')
|
|
console.log('\nNext steps:')
|
|
console.log('1. The cleanup service is now available via driftOrderCleanupService')
|
|
console.log('2. Call .start() to begin automated monitoring')
|
|
console.log('3. Call .forceCleanup() for manual cleanup')
|
|
console.log('4. Call .stop() to stop monitoring')
|
|
console.log('5. Integration with main trading bot recommended')
|
|
|
|
} catch (error) {
|
|
console.error('❌ Test failed:', error)
|
|
process.exit(1)
|
|
}
|
|
}
|
|
|
|
// Run test if called directly
|
|
if (require.main === module) {
|
|
testCleanupSystem().catch(console.error)
|
|
}
|
|
|
|
module.exports = { testCleanupSystem }
|