@gabriel3615/ta_analysis
Version:
stock ta analysis
42 lines (39 loc) • 1.45 kB
text/typescript
import { describe, it, expect } from 'vitest';
import type { Candle } from '../src/types.js';
import { Backtester } from '../src/analysis/backtest/Backtester.js';
import { TrendlineBreakoutStrategy } from '../src/analysis/backtest/strategies/TrendlineBreakoutStrategy.js';
function makeUpChannelBreakout(): Candle[] {
const out: Candle[] = [];
let price = 100;
let t = new Date('2024-01-01T00:00:00Z').getTime();
const day = 86400000; // milliseconds in a day
for (let i = 0; i < 250; i++) {
// mild uptrend channel
const drift = 0.05;
price += drift + (i % 10 === 0 ? -0.2 : 0.1);
const open = price - 0.2;
const close = price + 0.2;
out.push({
symbol: 'T',
open,
high: Math.max(open, close) + 0.3,
low: Math.min(open, close) - 0.3,
close,
volume: 1000 + (i % 20) * 10,
timestamp: new Date(t),
});
t += day;
}
return out;
}
describe('backtester + trendline strategy', () => {
it('runs without errors and produces metrics', async () => {
const data = makeUpChannelBreakout();
const bt = new Backtester({ initialCapital: 10000, positionSizing: 0.5 });
const strat = TrendlineBreakoutStrategy('T', 'daily');
const res = await bt.run(data, strat);
expect(res.metrics.tradeCount).toBeGreaterThanOrEqual(0);
expect(Number.isFinite(res.metrics.maxDrawdown)).toBe(true);
expect(Number.isFinite(res.metrics.sharpe)).toBe(true);
});
});