Skip to content

Commit e5de2ee

Browse files
committed
test RSI divergence frozen improvement matrix
1 parent f0fab3d commit e5de2ee

1 file changed

Lines changed: 41 additions & 0 deletions

File tree

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { describe, expect, it } from "vitest";
2+
import {
3+
CANDIDATES,
4+
RISK_VARIANTS,
5+
SIGNAL_VARIANTS,
6+
candidateScore,
7+
ema
8+
} from "../research/rsi-divergence-reversal/improvement-tools.mjs";
9+
10+
describe("RSI divergence improvement matrix", () => {
11+
it("freezes exactly 80 predeclared candidates", () => {
12+
expect(SIGNAL_VARIANTS).toHaveLength(10);
13+
expect(RISK_VARIANTS).toHaveLength(4);
14+
expect(CANDIDATES).toHaveLength(80);
15+
expect(new Set(CANDIDATES.map((candidate) => candidate.id)).size).toBe(80);
16+
expect(CANDIDATES.every((candidate) => Object.isFrozen(candidate))).toBe(true);
17+
});
18+
19+
it("contains both reverse and hold execution modes for every signal and risk pair", () => {
20+
for (const signal of SIGNAL_VARIANTS) {
21+
for (const risk of RISK_VARIANTS) {
22+
const prefix = `${signal.id}__${risk.id}__`;
23+
expect(CANDIDATES.some((candidate) => candidate.id === `${prefix}reverse`)).toBe(true);
24+
expect(CANDIDATES.some((candidate) => candidate.id === `${prefix}hold`)).toBe(true);
25+
}
26+
}
27+
});
28+
29+
it("calculates a deterministic EMA seed and continuation", () => {
30+
expect(ema([1, 2, 3, 4, 5], 3)).toEqual([null, null, 2, 3, 4]);
31+
});
32+
33+
it("rejects undersized samples during development ranking", () => {
34+
expect(candidateScore({
35+
closed_trades: 59,
36+
total_net_return_units: 10,
37+
profit_factor: 3,
38+
max_drawdown_return_units: 0.1
39+
})).toBe(Number.NEGATIVE_INFINITY);
40+
});
41+
});

0 commit comments

Comments
 (0)