oakscriptjs 0.13.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +53 -0
- package/README.md +1 -1
- package/bin/oakscript.mjs +5 -0
- package/dist/cjs/check/checks.d.ts +78 -0
- package/dist/cjs/check/checks.d.ts.map +1 -0
- package/dist/cjs/check/checks.js +109 -0
- package/dist/cjs/check/checks.js.map +7 -0
- package/dist/cjs/check/format.d.ts +26 -0
- package/dist/cjs/check/format.d.ts.map +1 -0
- package/dist/cjs/check/format.js +106 -0
- package/dist/cjs/check/format.js.map +7 -0
- package/dist/cjs/check/harness.d.ts +94 -0
- package/dist/cjs/check/harness.d.ts.map +1 -0
- package/dist/cjs/check/harness.js +302 -0
- package/dist/cjs/check/harness.js.map +7 -0
- package/dist/cjs/check/index.d.ts +253 -0
- package/dist/cjs/check/index.d.ts.map +1 -0
- package/dist/cjs/check/index.js +466 -0
- package/dist/cjs/check/index.js.map +7 -0
- package/dist/cjs/check/node.d.ts +53 -0
- package/dist/cjs/check/node.d.ts.map +1 -0
- package/dist/cjs/check/node.js +318 -0
- package/dist/cjs/check/node.js.map +7 -0
- package/dist/cjs/check/spec.d.ts +44 -0
- package/dist/cjs/check/spec.d.ts.map +1 -0
- package/dist/cjs/check/spec.js +199 -0
- package/dist/cjs/check/spec.js.map +7 -0
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/runtime/series.d.ts +6 -0
- package/dist/cjs/runtime/series.d.ts.map +1 -1
- package/dist/cjs/runtime/series.js +15 -0
- package/dist/cjs/runtime/series.js.map +2 -2
- package/dist/cjs/script/constants.d.ts +200 -0
- package/dist/cjs/script/constants.d.ts.map +1 -0
- package/dist/cjs/script/constants.js +217 -0
- package/dist/cjs/script/constants.js.map +7 -0
- package/dist/cjs/script/drawing-args.d.ts +25 -0
- package/dist/cjs/script/drawing-args.d.ts.map +1 -0
- package/dist/cjs/script/drawing-args.js +203 -0
- package/dist/cjs/script/drawing-args.js.map +7 -0
- package/dist/cjs/script/globals.d.ts +127 -0
- package/dist/cjs/script/globals.d.ts.map +1 -0
- package/dist/cjs/script/globals.js +17 -0
- package/dist/cjs/script/globals.js.map +7 -0
- package/dist/cjs/script/index.d.ts +499 -166
- package/dist/cjs/script/index.d.ts.map +1 -1
- package/dist/cjs/script/index.js +236 -96
- package/dist/cjs/script/index.js.map +3 -3
- package/dist/esm/check/checks.d.ts +78 -0
- package/dist/esm/check/checks.d.ts.map +1 -0
- package/dist/esm/check/checks.js +95 -0
- package/dist/esm/check/checks.js.map +1 -0
- package/dist/esm/check/format.d.ts +26 -0
- package/dist/esm/check/format.d.ts.map +1 -0
- package/dist/esm/check/format.js +105 -0
- package/dist/esm/check/format.js.map +1 -0
- package/dist/esm/check/harness.d.ts +94 -0
- package/dist/esm/check/harness.d.ts.map +1 -0
- package/dist/esm/check/harness.js +317 -0
- package/dist/esm/check/harness.js.map +1 -0
- package/dist/esm/check/index.d.ts +253 -0
- package/dist/esm/check/index.d.ts.map +1 -0
- package/dist/esm/check/index.js +470 -0
- package/dist/esm/check/index.js.map +1 -0
- package/dist/esm/check/node.d.ts +53 -0
- package/dist/esm/check/node.d.ts.map +1 -0
- package/dist/esm/check/node.js +347 -0
- package/dist/esm/check/node.js.map +1 -0
- package/dist/esm/check/spec.d.ts +44 -0
- package/dist/esm/check/spec.d.ts.map +1 -0
- package/dist/esm/check/spec.js +198 -0
- package/dist/esm/check/spec.js.map +1 -0
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/runtime/series.d.ts +6 -0
- package/dist/esm/runtime/series.d.ts.map +1 -1
- package/dist/esm/runtime/series.js +14 -0
- package/dist/esm/runtime/series.js.map +1 -1
- package/dist/esm/script/constants.d.ts +200 -0
- package/dist/esm/script/constants.d.ts.map +1 -0
- package/dist/esm/script/constants.js +151 -0
- package/dist/esm/script/constants.js.map +1 -0
- package/dist/esm/script/drawing-args.d.ts +25 -0
- package/dist/esm/script/drawing-args.d.ts.map +1 -0
- package/dist/esm/script/drawing-args.js +171 -0
- package/dist/esm/script/drawing-args.js.map +1 -0
- package/dist/esm/script/globals.d.ts +127 -0
- package/dist/esm/script/globals.d.ts.map +1 -0
- package/dist/esm/script/globals.js +28 -0
- package/dist/esm/script/globals.js.map +1 -0
- package/dist/esm/script/index.d.ts +499 -166
- package/dist/esm/script/index.d.ts.map +1 -1
- package/dist/esm/script/index.js +256 -83
- package/dist/esm/script/index.js.map +1 -1
- package/package.json +33 -1
- package/skills/oakscript/SKILL.md +198 -0
- package/skills/oakscript/examples/ma-cross-strategy.js +57 -0
- package/skills/oakscript/examples/ma-cross.js +34 -0
- package/skills/oakscript/examples/macd-oscillator.js +29 -0
- package/skills/oakscript/examples/mtf-trend-filter.js +46 -0
- package/skills/oakscript/reference/check.md +150 -0
- package/skills/oakscript/reference/errors.md +92 -0
- package/skills/oakscript/reference/pine-differences.md +85 -0
- package/skills/oakscript/reference/plotting.md +199 -0
- package/skills/oakscript/reference/script-structure.md +185 -0
- package/skills/oakscript/reference/strategies.md +140 -0
- package/skills/oakscript/reference/timeframes-symbols.md +97 -0
- package/skills/oakscript/spec.schema.json +199 -0
- package/src/check/checks.ts +175 -0
- package/src/check/format.ts +117 -0
- package/src/check/harness.ts +372 -0
- package/src/check/index.ts +708 -0
- package/src/check/node.ts +368 -0
- package/src/check/spec.ts +200 -0
- package/src/index.ts +1 -1
- package/src/runtime/series.ts +19 -0
- package/src/script/constants.ts +169 -0
- package/src/script/drawing-args.ts +179 -0
- package/src/script/globals.ts +129 -0
- package/src/script/index.ts +457 -81
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Behaviour checks of a script: the checks a spec cannot write as counts and ranges ("Buy only when the
|
|
3
|
+
* RSI is below 30", "the signal line stays under the MACD", "the value on bar 100 is X"). A check function gets `t`, the
|
|
4
|
+
* outputs of the run per bar, and records each check with `t.expect` / `t.everyBar`:
|
|
5
|
+
*
|
|
6
|
+
* ```js
|
|
7
|
+
* const rsi = t.plot("RSI");
|
|
8
|
+
* t.everyBar("RSI between 0 and 100", (i) => rsi.at(i) === null || (rsi.at(i) >= 0 && rsi.at(i) <= 100));
|
|
9
|
+
* t.expect("Buy only when the RSI is below 30", t.signal("Buy").bars.every((i) => rsi.at(i) < 30));
|
|
10
|
+
* ```
|
|
11
|
+
*
|
|
12
|
+
* @module check/checks
|
|
13
|
+
*/
|
|
14
|
+
import type { Bar } from '../types/index.js';
|
|
15
|
+
import type { ScriptRunResult, StrategyTrade } from '../script/index.js';
|
|
16
|
+
/** The bars of each signal output (shape, char, arrow, alert condition, background or bar colour). */
|
|
17
|
+
export interface SignalBars {
|
|
18
|
+
kind: 'shape' | 'char' | 'arrow' | 'alertcondition' | 'bgcolor' | 'barcolor';
|
|
19
|
+
id: string;
|
|
20
|
+
title: string;
|
|
21
|
+
/** Bar indexes with the signal, in order. */
|
|
22
|
+
bars: number[];
|
|
23
|
+
}
|
|
24
|
+
/** The bars of each signal output of a run. */
|
|
25
|
+
export declare function signalBars(run: ScriptRunResult, bars: readonly Bar[]): SignalBars[];
|
|
26
|
+
/** A plot of the run, per bar. */
|
|
27
|
+
export interface CheckPlot {
|
|
28
|
+
id: string;
|
|
29
|
+
title: string;
|
|
30
|
+
/** Value per bar (null: na). */
|
|
31
|
+
values: Array<number | null>;
|
|
32
|
+
/** Colour per bar when the plot has per-bar colours (undefined otherwise). */
|
|
33
|
+
colors?: Array<string | null>;
|
|
34
|
+
/** The value on bar `i` (null: na or no such bar). */
|
|
35
|
+
at(i: number): number | null;
|
|
36
|
+
}
|
|
37
|
+
/** A signal output of the run. */
|
|
38
|
+
export interface CheckSignal {
|
|
39
|
+
kind: SignalBars['kind'];
|
|
40
|
+
id: string;
|
|
41
|
+
title: string;
|
|
42
|
+
/** Bar indexes with the signal. */
|
|
43
|
+
bars: number[];
|
|
44
|
+
/** The signal is on bar `i`. */
|
|
45
|
+
on(i: number): boolean;
|
|
46
|
+
}
|
|
47
|
+
/** What a check function gets. */
|
|
48
|
+
export interface CheckContext {
|
|
49
|
+
bars: readonly Bar[];
|
|
50
|
+
/** Number of bars. */
|
|
51
|
+
n: number;
|
|
52
|
+
/** A plot by id or title; throws when there is none. */
|
|
53
|
+
plot(name: string): CheckPlot;
|
|
54
|
+
/** A signal (shape, char, arrow, alert condition, background or bar colour) by id or title; throws when there is none. */
|
|
55
|
+
signal(name: string): CheckSignal;
|
|
56
|
+
/** Closed trades of a strategy (empty for an indicator). */
|
|
57
|
+
trades: readonly StrategyTrade[];
|
|
58
|
+
/** The whole result of the run (labels, lines, boxes, tables, markers... as a host gets them). */
|
|
59
|
+
result: ScriptRunResult['result'];
|
|
60
|
+
/** The value of an input in the run, by id or title. */
|
|
61
|
+
input(name: string): unknown;
|
|
62
|
+
/** Records a check: `ok` false fails it; `detail` is shown when it fails. */
|
|
63
|
+
expect(check: string, ok: boolean, detail?: unknown): void;
|
|
64
|
+
/** Records a check true on every bar from `from` (default 0) to `to` (default the last bar); fails on the first bar where `predicate(i)` is false. */
|
|
65
|
+
everyBar(check: string, predicate: (i: number) => boolean, options?: {
|
|
66
|
+
from?: number;
|
|
67
|
+
to?: number;
|
|
68
|
+
}): void;
|
|
69
|
+
}
|
|
70
|
+
export interface CheckItem {
|
|
71
|
+
check: string;
|
|
72
|
+
ok: boolean;
|
|
73
|
+
expected?: unknown;
|
|
74
|
+
actual?: unknown;
|
|
75
|
+
}
|
|
76
|
+
/** Runs a check function on a run; returns its items (an exception is a failed item). */
|
|
77
|
+
export declare function runChecks(fn: (t: CheckContext) => void, run: ScriptRunResult, bars: readonly Bar[], inputs: Record<string, unknown>, trades: readonly StrategyTrade[], label?: string): CheckItem[];
|
|
78
|
+
//# sourceMappingURL=checks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../../src/check/checks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
const visible = (c) => !!c && c !== 'transparent' && !/^#[0-9a-f]{6}00$/i.test(c) && !/,\s*0\s*\)$/.test(c);
|
|
2
|
+
/** The bars of each signal output of a run. */
|
|
3
|
+
export function signalBars(run, bars) {
|
|
4
|
+
const index = new Map(bars.map((b, i) => [b.time, i]));
|
|
5
|
+
const of = (times) => [...new Set(times.map((t) => index.get(t)).filter((i) => i !== undefined))].sort((a, b) => a - b);
|
|
6
|
+
const r = run.result;
|
|
7
|
+
const out = [];
|
|
8
|
+
for (const s of run.shapeConfig) {
|
|
9
|
+
out.push({ kind: s.kind === 'char' ? 'char' : 'shape', id: s.id, title: s.title ?? s.id, bars: of((r.markers ?? []).filter((m) => m.id === s.id).map((m) => m.time)) });
|
|
10
|
+
}
|
|
11
|
+
for (const a of run.arrowConfig) {
|
|
12
|
+
const times = (r.arrows ?? []).filter((x) => x.id === a.id && x.value !== 0 && !Number.isNaN(x.value)).map((x) => x.time);
|
|
13
|
+
out.push({ kind: 'arrow', id: a.id, title: a.title ?? a.id, bars: of(times) });
|
|
14
|
+
}
|
|
15
|
+
for (const b of run.barColorConfig) {
|
|
16
|
+
const list = b.kind === 'bgcolor' ? (r.bgColors ?? []) : (r.barColors ?? []);
|
|
17
|
+
const times = list.filter((x) => (x.id === undefined || x.id === b.id) && visible(x.color)).map((x) => x.time);
|
|
18
|
+
out.push({ kind: b.kind, id: b.id, title: b.title ?? b.id, bars: of(times) });
|
|
19
|
+
}
|
|
20
|
+
for (const a of r.alerts ?? [])
|
|
21
|
+
out.push({ kind: 'alertcondition', id: a.id, title: a.title ?? a.id, bars: of(a.times) });
|
|
22
|
+
return out;
|
|
23
|
+
}
|
|
24
|
+
const lower = (s) => (s ?? '').trim().toLowerCase();
|
|
25
|
+
/** Runs a check function on a run; returns its items (an exception is a failed item). */
|
|
26
|
+
export function runChecks(fn, run, bars, inputs, trades, label = 'checks') {
|
|
27
|
+
const items = [];
|
|
28
|
+
const index = new Map(bars.map((b, i) => [b.time, i]));
|
|
29
|
+
const signals = signalBars(run, bars);
|
|
30
|
+
const plots = new Map();
|
|
31
|
+
const find = (list, name) => list.find((x) => lower(x.id) === lower(name)) ?? list.find((x) => lower(x.title) === lower(name));
|
|
32
|
+
const t = {
|
|
33
|
+
bars,
|
|
34
|
+
n: bars.length,
|
|
35
|
+
trades,
|
|
36
|
+
result: run.result,
|
|
37
|
+
plot(name) {
|
|
38
|
+
const p = find(run.plotConfig, name);
|
|
39
|
+
if (!p)
|
|
40
|
+
throw new Error(`t.plot("${name}"): no plot with this id or title (plots: ${run.plotConfig.map((x) => `"${x.title ?? x.id}"`).join(', ') || 'none'})`);
|
|
41
|
+
const cached = plots.get(p.id);
|
|
42
|
+
if (cached)
|
|
43
|
+
return cached;
|
|
44
|
+
const values = new Array(bars.length).fill(null);
|
|
45
|
+
let colors;
|
|
46
|
+
for (const pt of (run.result.plots[p.id] ?? [])) {
|
|
47
|
+
const i = index.get(pt.time);
|
|
48
|
+
if (i === undefined)
|
|
49
|
+
continue;
|
|
50
|
+
values[i] = pt.value;
|
|
51
|
+
if (pt.color !== undefined)
|
|
52
|
+
(colors ??= new Array(bars.length).fill(null))[i] = pt.color;
|
|
53
|
+
}
|
|
54
|
+
const plot = { id: p.id, title: p.title ?? p.id, values, ...(colors ? { colors } : {}), at: (i) => values[i] ?? null };
|
|
55
|
+
plots.set(p.id, plot);
|
|
56
|
+
return plot;
|
|
57
|
+
},
|
|
58
|
+
signal(name) {
|
|
59
|
+
const s = find(signals, name);
|
|
60
|
+
if (!s)
|
|
61
|
+
throw new Error(`t.signal("${name}"): no signal with this id or title (signals: ${signals.map((x) => `"${x.title}"`).join(', ') || 'none'})`);
|
|
62
|
+
const on = new Set(s.bars);
|
|
63
|
+
return { kind: s.kind, id: s.id, title: s.title, bars: s.bars, on: (i) => on.has(i) };
|
|
64
|
+
},
|
|
65
|
+
input(name) {
|
|
66
|
+
const i = find(run.inputConfig, name);
|
|
67
|
+
if (!i)
|
|
68
|
+
throw new Error(`t.input("${name}"): no input with this id or title`);
|
|
69
|
+
return i.id in inputs ? inputs[i.id] : i.defval;
|
|
70
|
+
},
|
|
71
|
+
expect(check, ok, detail) {
|
|
72
|
+
items.push({ check, ok: !!ok, ...(ok || detail === undefined ? {} : { actual: detail }) });
|
|
73
|
+
},
|
|
74
|
+
everyBar(check, predicate, options = {}) {
|
|
75
|
+
const from = Math.max(0, options.from ?? 0);
|
|
76
|
+
const to = Math.min(bars.length - 1, options.to ?? bars.length - 1);
|
|
77
|
+
for (let i = from; i <= to; i++) {
|
|
78
|
+
if (!predicate(i)) {
|
|
79
|
+
items.push({ check, ok: false, expected: 'true on every bar', actual: `false on bar ${i}` });
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
items.push({ check, ok: true });
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
try {
|
|
87
|
+
fn(t);
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
const m = e && typeof e === 'object' && 'message' in e ? String(e.message) : String(e);
|
|
91
|
+
items.push({ check: `${label} (stopped)`, ok: false, actual: m });
|
|
92
|
+
}
|
|
93
|
+
return items;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checks.js","sourceRoot":"","sources":["../../../src/check/checks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview The check report as text (the output of `oakscript check`) and {@link assertCheck}, which throws it
|
|
3
|
+
* from a test of any test runner.
|
|
4
|
+
*
|
|
5
|
+
* @module check/format
|
|
6
|
+
*/
|
|
7
|
+
import type { CheckReport } from './index.js';
|
|
8
|
+
/** The report as text, for a terminal or an agent. `file` and `typesSkipped` come from the command. */
|
|
9
|
+
export declare function formatReport(r: CheckReport & {
|
|
10
|
+
file?: string;
|
|
11
|
+
typesSkipped?: string;
|
|
12
|
+
}): string;
|
|
13
|
+
/**
|
|
14
|
+
* Throws the report as text when the check failed (an error, a failed spec item, check or reference column), or with
|
|
15
|
+
* `{ warnings: false }` when it has warnings. For the tests of a project:
|
|
16
|
+
*
|
|
17
|
+
* ```ts
|
|
18
|
+
* it('my indicator follows its spec', () => {
|
|
19
|
+
* assertCheck(checkScript(source, { spec, checks: (t) => { ... } }));
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare function assertCheck(report: CheckReport, options?: {
|
|
24
|
+
warnings?: boolean;
|
|
25
|
+
}): void;
|
|
26
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/check/format.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAO9C,uGAAuG;AACvG,wBAAgB,YAAY,CAAC,CAAC,EAAE,WAAW,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAoF9F;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,IAAI,CAM3F"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
const fmt = (v) => v === null || v === undefined ? 'na' : Number.isInteger(v) ? String(v) : Number(v.toPrecision(6)).toString();
|
|
2
|
+
const shown = (v) => (v === undefined ? 'nothing' : JSON.stringify(v));
|
|
3
|
+
/** The report as text, for a terminal or an agent. `file` and `typesSkipped` come from the command. */
|
|
4
|
+
export function formatReport(r) {
|
|
5
|
+
const file = r.file ?? 'script';
|
|
6
|
+
const out = [];
|
|
7
|
+
out.push(`oakscript check ${file}: ${r.bars.count} ${r.bars.synthetic ? 'synthetic ' : ''}bars, timeframe ${r.bars.timeframe}`);
|
|
8
|
+
const d = r.declaration;
|
|
9
|
+
if (d) {
|
|
10
|
+
out.push(`${d.kind} "${d.title}"${d.overlay ? ' (overlay)' : ' (own pane)'}`);
|
|
11
|
+
if (d.inputs.length) {
|
|
12
|
+
out.push('inputs:');
|
|
13
|
+
for (const i of d.inputs) {
|
|
14
|
+
const extra = [i.options ? `options ${i.options.join(' | ')}` : '', i.min !== undefined ? `min ${i.min}` : '', i.max !== undefined ? `max ${i.max}` : '']
|
|
15
|
+
.filter(Boolean)
|
|
16
|
+
.join(', ');
|
|
17
|
+
out.push(` ${i.id} (${i.type}) = ${JSON.stringify(i.defval)}${i.title ? ` "${i.title}"` : ''}${extra ? ` ${extra}` : ''}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (r.plots.length || r.signals.length)
|
|
22
|
+
out.push('outputs:');
|
|
23
|
+
for (const p of r.plots) {
|
|
24
|
+
out.push(p.values
|
|
25
|
+
? ` plot "${p.title}": ${p.values} values from bar ${p.firstBar}, ${fmt(p.min)} .. ${fmt(p.max)}, last ${p.last.map(fmt).join(' ')}${p.colours ? `, ${p.colours} colours` : ''}`
|
|
26
|
+
: ` plot "${p.title}": no value`);
|
|
27
|
+
}
|
|
28
|
+
for (const s of r.signals) {
|
|
29
|
+
out.push(` ${s.kind.padEnd(6)} "${s.title}": ${s.count} bars (${(s.share * 100).toFixed(1)} %)${s.count ? `, first ${s.firstBar}, last ${s.lastBar}` : ''}`);
|
|
30
|
+
}
|
|
31
|
+
const dr = Object.entries(r.drawings).filter(([, n]) => n > 0);
|
|
32
|
+
if (dr.length)
|
|
33
|
+
out.push(`drawings: ${dr.map(([k, n]) => `${n} ${k}`).join(', ')}`);
|
|
34
|
+
if (r.alertCalls)
|
|
35
|
+
out.push(`alert() calls: ${r.alertCalls}`);
|
|
36
|
+
if (r.strategy) {
|
|
37
|
+
const s = r.strategy;
|
|
38
|
+
out.push(`strategy: ${s.closedTrades} closed trades${s.openTrade ? ' + 1 open' : ''}, ${s.wins} wins, net profit ${fmt(s.netProfit)}`);
|
|
39
|
+
for (const t of s.first) {
|
|
40
|
+
out.push(` ${t.direction} "${t.entry}" bar ${t.entryBar} @ ${fmt(t.entryPrice)} -> bar ${t.exitBar ?? '-'} @ ${fmt(t.exitPrice)}: ${fmt(t.profit)}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (r.errors.length) {
|
|
44
|
+
out.push('errors:');
|
|
45
|
+
for (const e of r.errors) {
|
|
46
|
+
const at = e.line ? `${file}:${e.line}${e.column ? `:${e.column}` : ''} ` : '';
|
|
47
|
+
out.push(` ${at}[${e.stage}${e.code ? ` ${e.code}` : ''}] ${e.message}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (r.typesSkipped)
|
|
51
|
+
out.push(`types: not checked (${r.typesSkipped})`);
|
|
52
|
+
if (r.warnings.length) {
|
|
53
|
+
out.push('warnings:');
|
|
54
|
+
for (const w of r.warnings)
|
|
55
|
+
out.push(` [${w.code}] ${w.message}`);
|
|
56
|
+
}
|
|
57
|
+
if (r.spec) {
|
|
58
|
+
out.push(`spec and checks: ${r.spec.passed} passed, ${r.spec.failed} failed`);
|
|
59
|
+
for (const i of r.spec.items.filter((x) => !x.ok)) {
|
|
60
|
+
out.push(` FAIL ${i.check}${i.expected !== undefined ? `: expected ${shown(i.expected)}, got ${shown(i.actual)}` : i.actual !== undefined ? `: ${typeof i.actual === 'string' ? i.actual : shown(i.actual)}` : ''}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
for (const c of r.reference ?? []) {
|
|
64
|
+
const m = c.firstMismatch;
|
|
65
|
+
out.push(c.ignored
|
|
66
|
+
? `reference "${c.column}": ignored (no plot with this id or title)`
|
|
67
|
+
: c.output === undefined
|
|
68
|
+
? `reference "${c.column}": FAIL no plot with this id or title`
|
|
69
|
+
: `reference "${c.column}": ${c.equal} / ${c.total} bars equal${m ? `, first difference on bar ${m.bar}: expected ${fmt(m.expected)}, got ${fmt(m.actual)}` : ''}`);
|
|
70
|
+
}
|
|
71
|
+
if (r.scenarios) {
|
|
72
|
+
out.push('scenarios:');
|
|
73
|
+
for (const s of r.scenarios) {
|
|
74
|
+
const notes = [...s.errors.map((e) => `ERROR ${e.message}`), ...s.warnings.map((w) => `[${w.code}] ${w.message}`)];
|
|
75
|
+
out.push(` ${s.name} (${s.description}): ${notes.length ? '' : 'ok'}`);
|
|
76
|
+
for (const n of notes)
|
|
77
|
+
out.push(` ${n}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const failed = (r.spec?.failed ?? 0) + (r.reference ?? []).filter((c) => !c.ignored && (c.equal !== c.total || c.output === undefined)).length;
|
|
81
|
+
out.push(r.ok
|
|
82
|
+
? r.warnings.length
|
|
83
|
+
? `result: OK with ${r.warnings.length} warning(s)`
|
|
84
|
+
: 'result: OK'
|
|
85
|
+
: `result: FAIL (${r.errors.length} error(s), ${failed} failed check(s), ${r.warnings.length} warning(s))`);
|
|
86
|
+
return out.join('\n');
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Throws the report as text when the check failed (an error, a failed spec item, check or reference column), or with
|
|
90
|
+
* `{ warnings: false }` when it has warnings. For the tests of a project:
|
|
91
|
+
*
|
|
92
|
+
* ```ts
|
|
93
|
+
* it('my indicator follows its spec', () => {
|
|
94
|
+
* assertCheck(checkScript(source, { spec, checks: (t) => { ... } }));
|
|
95
|
+
* });
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
export function assertCheck(report, options = {}) {
|
|
99
|
+
if (!report.ok || (options.warnings === false && report.warnings.length > 0)) {
|
|
100
|
+
const error = new Error(formatReport(report));
|
|
101
|
+
error.name = 'CheckError';
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/check/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { type ChartContext, type ScriptRunResult, type StrategyCloseOptions, type StrategyDirection, type StrategyEngine, type StrategyEntryOptions, type StrategyExitOptions, type StrategyRiskRule, type StrategySetup, type StrategyTrade, type StrategyVariable } from '../script/index.js';
|
|
2
|
+
import type { Bar } from '../types/index.js';
|
|
3
|
+
/** The implicit globals of a script: every value export of the script API but the host entry. */
|
|
4
|
+
export declare const SCRIPT_GLOBALS: readonly string[];
|
|
5
|
+
/** Name of the parameter that receives the `oakscriptjs` module in a compiled script (its `import` statements). */
|
|
6
|
+
export declare const LIBRARY_PARAMETER = "__oakscriptjs";
|
|
7
|
+
/** The values of {@link SCRIPT_GLOBALS}, then the `oakscriptjs` module, in the order of the compiled parameters. */
|
|
8
|
+
export declare function scriptArguments(): unknown[];
|
|
9
|
+
/**
|
|
10
|
+
* Rewrites the `import { a, b as c } from "oakscriptjs"` statements of a script into `const { a, b: c } = ...` on the
|
|
11
|
+
* same lines (the line numbers of the source do not change). Throws on an import of another module: a script runs
|
|
12
|
+
* self-contained.
|
|
13
|
+
*/
|
|
14
|
+
export declare function rewriteImports(source: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Start and end of the function the script source is wrapped in. The globals are the parameters of an outer function
|
|
17
|
+
* and the source is the body of an inner one, so a script can declare a name of a global (`const size = 2`), as in an
|
|
18
|
+
* app that imports the globals at the top of a module. The start goes on the first line of the source.
|
|
19
|
+
*/
|
|
20
|
+
export declare const SCRIPT_PREFIX = "\"use strict\"; return (function () { ";
|
|
21
|
+
export declare const SCRIPT_SUFFIX = "\n})();";
|
|
22
|
+
/** The source of the function body of a compiled script (imports rewritten, lines kept). */
|
|
23
|
+
export declare function wrapSource(source: string): string;
|
|
24
|
+
/** Compiles a script source into a body for executeScript(); throws a SyntaxError on invalid code. */
|
|
25
|
+
export declare function compileScript(source: string): () => void;
|
|
26
|
+
/** Deterministic synthetic bars: two waves, a slow trend and seeded noise. `step`: seconds between bars. */
|
|
27
|
+
export declare function syntheticBars(count: number, step?: number, seed?: number): Bar[];
|
|
28
|
+
/** Seconds of a timeframe string ("1", "60", "240", "D", "1D", "W", "M"); NaN when it is not one. */
|
|
29
|
+
export declare function timeframeSeconds(timeframe: string): number;
|
|
30
|
+
/** The timeframe of bars from the most common spacing of their times ("60", "D", "W"...); "60" for fewer than 2 bars. */
|
|
31
|
+
export declare function inferTimeframe(bars: readonly Bar[]): string;
|
|
32
|
+
export interface TestChartOptions {
|
|
33
|
+
/** Chart timeframe (default "60"). */
|
|
34
|
+
timeframe?: string;
|
|
35
|
+
/** Chart ticker id (default "TEST:SYN"). */
|
|
36
|
+
tickerid?: string;
|
|
37
|
+
/** Time zone of the chart and of the other symbols (default "Etc/UTC"). */
|
|
38
|
+
timezone?: string;
|
|
39
|
+
/** Session of the chart and of the other symbols (default "24x7"). */
|
|
40
|
+
session?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Chart context of the test runs: a 24x7 symbol in UTC. Higher timeframes of the chart symbol are resampled from the
|
|
44
|
+
* chart bars by the library; other symbols get synthetic bars of their own (seeded by the symbol name).
|
|
45
|
+
*/
|
|
46
|
+
export declare function testChart(bars: Bar[], options?: TestChartOptions): ChartContext;
|
|
47
|
+
/**
|
|
48
|
+
* A small order engine for checks and tests (the library does not fill orders). Market entries and closes fill at the
|
|
49
|
+
* next bar open; `strategy.exit` stop / limit levels are checked inside each bar (stop first when both are hit).
|
|
50
|
+
* Entry limit / stop prices, pyramiding and process_orders_on_close are not simulated.
|
|
51
|
+
*/
|
|
52
|
+
export declare class TestEngine implements StrategyEngine {
|
|
53
|
+
readonly setup: StrategySetup;
|
|
54
|
+
readonly closed: StrategyTrade[];
|
|
55
|
+
private open;
|
|
56
|
+
private pendingEntry;
|
|
57
|
+
private pendingClose;
|
|
58
|
+
private exits;
|
|
59
|
+
private net;
|
|
60
|
+
private bar;
|
|
61
|
+
constructor(setup: StrategySetup);
|
|
62
|
+
private get bars();
|
|
63
|
+
private equity;
|
|
64
|
+
private openProfit;
|
|
65
|
+
private commission;
|
|
66
|
+
private closeAt;
|
|
67
|
+
/** The open trade, if any. */
|
|
68
|
+
get openTradeNow(): StrategyTrade | null;
|
|
69
|
+
processBar(bar: number): void;
|
|
70
|
+
processClose(): void;
|
|
71
|
+
entry(id: string, direction: StrategyDirection, options: StrategyEntryOptions): void;
|
|
72
|
+
order(id: string, direction: StrategyDirection, options: StrategyEntryOptions): void;
|
|
73
|
+
exit(id: string, options: StrategyExitOptions): void;
|
|
74
|
+
close(id: string, _options: StrategyCloseOptions): void;
|
|
75
|
+
close_all(): void;
|
|
76
|
+
cancel(id: string): void;
|
|
77
|
+
cancel_all(): void;
|
|
78
|
+
readonly rules: StrategyRiskRule[];
|
|
79
|
+
risk(rule: StrategyRiskRule): void;
|
|
80
|
+
get(variable: StrategyVariable): number | string | undefined;
|
|
81
|
+
openTrade(index: number): StrategyTrade | undefined;
|
|
82
|
+
closedTrade(index: number): StrategyTrade | undefined;
|
|
83
|
+
}
|
|
84
|
+
export interface ScriptRun {
|
|
85
|
+
run: ScriptRunResult;
|
|
86
|
+
engine?: TestEngine;
|
|
87
|
+
}
|
|
88
|
+
export interface RunScriptOptions extends TestChartOptions {
|
|
89
|
+
/** Compiles the source (default {@link compileScript}); the CLI compiles with file lines. */
|
|
90
|
+
compile?: (source: string) => () => void;
|
|
91
|
+
}
|
|
92
|
+
/** Runs a script source on `bars` with the test chart context and, for a strategy, the test engine. */
|
|
93
|
+
export declare function runScript(source: string, bars: Bar[], inputs?: Record<string, unknown>, options?: RunScriptOptions): ScriptRun;
|
|
94
|
+
//# sourceMappingURL=harness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../../src/check/harness.ts"],"names":[],"mappings":"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"}
|