stock-bot/apps/stock/orchestrator/test-trade-format.ts

101 lines
No EOL
2.9 KiB
TypeScript

import { RustBacktestAdapter } from './src/backtest/RustBacktestAdapter';
import { IServiceContainer } from '@stock-bot/di';
import { BacktestConfig } from './src/types';
// Mock container
const mockContainer: IServiceContainer = {
logger: {
info: console.log,
error: console.error,
warn: console.warn,
debug: console.log,
},
mongodb: {} as any,
postgres: {} as any,
redis: {} as any,
custom: {},
} as IServiceContainer;
// Mock storage service
class MockStorageService {
async getHistoricalBars(symbol: string, startDate: Date, endDate: Date, frequency: string) {
const bars = [];
const startTime = startDate.getTime();
const endTime = endDate.getTime();
const dayMs = 24 * 60 * 60 * 1000;
let time = startTime;
let dayIndex = 0;
// Simple oscillating price for testing
while (time <= endTime) {
const price = 100 + 10 * Math.sin(dayIndex * 0.2);
bars.push({
timestamp: new Date(time),
open: price * 0.99,
high: price * 1.01,
low: price * 0.98,
close: price,
volume: 1000000,
vwap: price,
});
time += dayMs;
dayIndex++;
}
return bars;
}
}
// Test the backtest
async function testTradeFormat() {
console.log('=== Testing Trade Format ===\n');
const adapter = new RustBacktestAdapter(mockContainer);
(adapter as any).storageService = new MockStorageService();
const config: BacktestConfig = {
name: 'Trade Format Test',
strategy: 'Simple Moving Average Crossover',
symbols: ['TEST'],
startDate: '2024-01-01T00:00:00Z',
endDate: '2024-03-01T00:00:00Z',
initialCapital: 100000,
commission: 0.001,
slippage: 0.0001,
dataFrequency: '1d',
config: {
fastPeriod: 5,
slowPeriod: 15,
},
};
try {
const result = await adapter.runBacktest(config);
console.log('\n=== Trade Format ===');
console.log('Number of trades:', result.trades.length);
console.log('\nFirst 3 trades:');
result.trades.slice(0, 3).forEach((trade, idx) => {
console.log(`\nTrade ${idx + 1}:`, JSON.stringify(trade, null, 2));
});
// Check what format the trades are in
if (result.trades.length > 0) {
const firstTrade = result.trades[0];
console.log('\n=== Trade Structure Analysis ===');
console.log('Keys:', Object.keys(firstTrade));
console.log('Has entryDate/exitDate?', 'entryDate' in firstTrade && 'exitDate' in firstTrade);
console.log('Has timestamp?', 'timestamp' in firstTrade);
console.log('Has side field?', 'side' in firstTrade);
console.log('Side value:', firstTrade.side);
}
} catch (error) {
console.error('Test failed:', error);
}
}
testTradeFormat().catch(console.error);