85 lines
No EOL
2.4 KiB
JavaScript
85 lines
No EOL
2.4 KiB
JavaScript
#!/usr/bin/env bun
|
|
|
|
import { BacktestEngine } from './apps/stock/core/index.js';
|
|
|
|
// Create a simple test configuration
|
|
const config = {
|
|
name: 'TypeScript Strategy Test',
|
|
symbols: ['AA', 'AAS'],
|
|
startDate: '2024-01-01T00:00:00Z',
|
|
endDate: '2024-01-15T00:00:00Z',
|
|
initialCapital: 100000,
|
|
commission: 0.001,
|
|
slippage: 0.0001,
|
|
dataFrequency: '1d',
|
|
};
|
|
|
|
// Create the Rust engine
|
|
const engine = new BacktestEngine(config);
|
|
|
|
// Add TypeScript strategy with callback
|
|
console.log('Adding TypeScript strategy with callback...');
|
|
engine.addTypescriptStrategy(
|
|
'SMA Crossover',
|
|
'strategy-test-1',
|
|
{ fastPeriod: 5, slowPeriod: 15 },
|
|
(callJson) => {
|
|
const call = JSON.parse(callJson);
|
|
console.log('TypeScript callback called:', call.method);
|
|
|
|
if (call.method === 'on_market_data') {
|
|
const data = call.data;
|
|
console.log(`Market data for ${data.symbol}: close=${data.data?.close}`);
|
|
return JSON.stringify({ signals: [] });
|
|
} else if (call.method === 'on_fill') {
|
|
console.log('Fill received:', call.data);
|
|
return JSON.stringify({ signals: [] });
|
|
}
|
|
|
|
return JSON.stringify({ signals: [] });
|
|
}
|
|
);
|
|
|
|
// Load some test market data
|
|
const testData = [];
|
|
const startDate = new Date('2024-01-01');
|
|
for (let i = 0; i < 20; i++) {
|
|
const date = new Date(startDate);
|
|
date.setDate(date.getDate() + i);
|
|
|
|
// Add data for both symbols
|
|
for (const symbol of ['AA', 'AAS']) {
|
|
const basePrice = symbol === 'AA' ? 100 : 50;
|
|
const price = basePrice + Math.sin(i / 3) * 5 + Math.random() * 2;
|
|
|
|
testData.push({
|
|
symbol,
|
|
timestamp: date.getTime(),
|
|
type: 'bar',
|
|
open: price - 0.5,
|
|
high: price + 0.5,
|
|
low: price - 1,
|
|
close: price,
|
|
volume: 1000000,
|
|
vwap: price,
|
|
});
|
|
}
|
|
}
|
|
|
|
console.log(`Loading ${testData.length} market data points...`);
|
|
engine.loadMarketData(testData);
|
|
|
|
// Run the backtest
|
|
console.log('Running backtest...');
|
|
try {
|
|
const resultJson = engine.run();
|
|
const result = JSON.parse(resultJson);
|
|
|
|
console.log('\nBacktest Results:');
|
|
console.log('Total trades:', result.trades?.length || 0);
|
|
console.log('Final equity:', result.equity_curve[result.equity_curve.length - 1]?.[1]);
|
|
console.log('Metrics:', result.metrics);
|
|
|
|
} catch (error) {
|
|
console.error('Backtest failed:', error);
|
|
} |