import * as dotenv from 'dotenv'; import path from 'path'; import { AlpacaConnector } from '../src/connectors/alpaca.js'; import { ExecutionManager } from '../src/services/executionManager.js'; import { SignalDirection } from '../src/strategies/rules/types.js'; async function testExitFlow() { console.log('--- Alpaca Exit Flow Test Start ---'); dotenv.config({ path: path.resolve(process.cwd(), '.env') }); const connector = new AlpacaConnector(); const manager = new ExecutionManager(connector); const symbol = 'BTC/USD'; const qty = 0.001; // Tiny amount for testing try { // 1. Place a fresh BUY order to ensure we have something to exit console.log(`Step 1: Placing initial BUY order for ${symbol}...`); const buyOrder = await connector.placeOrder(symbol, 'buy', qty, 'market'); if (!buyOrder || !buyOrder.id) { throw new Error('Failed to place initial buy order'); } console.log(`✅ Buy order placed: ${buyOrder.id}`); // 2. Mock the ExecutionManager state so it thinks it's in a trade console.log('Step 2: Syncing local ExecutionManager state...'); // We simulate the post-buy state (manager as any).activeTraders.set(symbol, { side: SignalDirection.BUY, entryPrice: 95000, // Dummy price size: qty, stopLoss: 94000, takeProfit: 97000 }); // 3. Trigger the EXIT logic (simulating a TP/SL hit) console.log('Step 3: Triggering automated EXIT logic (executeExit)...'); // We pass the current dummy price to simulate the exit await manager.executeExit(symbol, 97000, 'Test Take Profit Hit'); console.log('✅ EXIT logic completed successfully.'); } catch (error: any) { console.log(`❌ FAILED: ${error.message || error}`); } console.log('--- Alpaca Exit Flow Test End ---'); } testExitFlow().catch(console.error);