added trade-tracking and example rust strats
This commit is contained in:
parent
0a4702d12a
commit
3a7557c8f4
15 changed files with 2108 additions and 29 deletions
101
apps/stock/orchestrator/test-trade-format.ts
Normal file
101
apps/stock/orchestrator/test-trade-format.ts
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
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);
|
||||
Loading…
Add table
Add a link
Reference in a new issue