101 lines
No EOL
2.9 KiB
TypeScript
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); |