added rust engine and adapter pattern
This commit is contained in:
parent
a58072cf93
commit
0a4702d12a
6 changed files with 328 additions and 186 deletions
85
test-typescript-strategy.js
Normal file
85
test-typescript-strategy.js
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
#!/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);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue