Files
trading_bot_v3/lib/trading-system-integration.js
mindesbunister 81bf9f40fc 🧹 Integrate orphaned order cleanup into position monitoring
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!
2025-07-26 13:01:21 +02:00

167 lines
5.1 KiB
JavaScript

/**
* Integration patch for main trading system
* Adds automated Drift order cleanup to trading workflow
*/
const { driftOrderCleanupService } = require('./lib/drift-order-cleanup-service.js')
class TradingSystemIntegration {
static initialized = false
/**
* Initialize the cleanup service with the trading system
*/
static async initializeCleanupService() {
if (this.initialized) {
console.log('🔄 Drift cleanup service already initialized')
return
}
console.log('🚀 Initializing Drift order cleanup service...')
try {
// Start the automated monitoring
driftOrderCleanupService.start(45000) // Check every 45 seconds
// Set up cleanup triggers for position changes
this.setupPositionMonitoring()
this.initialized = true
console.log('✅ Drift order cleanup service initialized successfully')
} catch (error) {
console.error('❌ Failed to initialize cleanup service:', error)
throw error
}
}
/**
* Set up monitoring for position changes that might require cleanup
*/
static setupPositionMonitoring() {
// Monitor for position closures that might leave orphaned orders
const originalMonitorPosition = global.monitorPosition || (() => {})
global.monitorPosition = async (...args) => {
const result = await originalMonitorPosition(...args)
// Trigger cleanup after position monitoring
setTimeout(async () => {
try {
console.log('🧹 Triggering cleanup after position monitoring...')
await driftOrderCleanupService.checkAndCleanupOrders()
} catch (error) {
console.error('❌ Cleanup after position monitoring failed:', error)
}
}, 5000) // Wait 5 seconds after position monitoring
return result
}
console.log('📊 Position monitoring integration set up')
}
/**
* Cleanup orders after a specific trade action
*/
static async cleanupAfterTrade(tradeInfo = {}) {
console.log('🧹 Cleaning up orders after trade action:', tradeInfo)
try {
// Wait a moment for the trade to settle
await new Promise(resolve => setTimeout(resolve, 3000))
// Force cleanup
const result = await driftOrderCleanupService.forceCleanup()
console.log(`✅ Post-trade cleanup completed: ${result.summary.totalCanceled} orders canceled`)
return result
} catch (error) {
console.error('❌ Post-trade cleanup failed:', error)
return { success: false, error: error.message }
}
}
/**
* Enhanced position monitoring with automatic cleanup
*/
static async monitorPositionWithCleanup(marketSymbol, maxChecks = 30) {
console.log(`📊 Monitoring position for ${marketSymbol} with automatic cleanup...`)
let lastPositionState = null
for (let i = 0; i < maxChecks; i++) {
try {
// Check current position
const response = await fetch('http://localhost:9001/api/drift/positions')
if (response.ok) {
const data = await response.json()
const position = data.positions?.find(p => p.symbol === marketSymbol)
// Detect position closure
if (lastPositionState && lastPositionState.size !== 0 && (!position || position.size === 0)) {
console.log(`🎯 Position closure detected for ${marketSymbol} - triggering cleanup`)
// Wait a moment then cleanup
setTimeout(async () => {
try {
await this.cleanupAfterTrade({ symbol: marketSymbol, action: 'position_closed' })
} catch (error) {
console.error('❌ Cleanup after position closure failed:', error)
}
}, 5000)
}
lastPositionState = position
}
// Wait before next check
await new Promise(resolve => setTimeout(resolve, 10000))
} catch (error) {
console.error(`❌ Error monitoring position ${marketSymbol}:`, error)
}
}
console.log(`📊 Position monitoring completed for ${marketSymbol}`)
}
/**
* Get cleanup service status
*/
static getCleanupStatus() {
return {
initialized: this.initialized,
serviceStatus: driftOrderCleanupService.getStatus()
}
}
/**
* Stop the cleanup service
*/
static stopCleanupService() {
if (!this.initialized) {
console.log('⚠️ Cleanup service not initialized')
return
}
driftOrderCleanupService.stop()
this.initialized = false
console.log('🛑 Drift order cleanup service stopped')
}
}
// Auto-initialize if running in main trading environment
if (typeof global !== 'undefined' && global.process?.title?.includes('node')) {
// Wait a moment to let other systems initialize
setTimeout(() => {
TradingSystemIntegration.initializeCleanupService().catch(error => {
console.error('❌ Auto-initialization failed:', error)
})
}, 10000) // Wait 10 seconds
}
module.exports = { TradingSystemIntegration, driftOrderCleanupService }