@senpi/trading-recipe 1.0.45 → 1.0.47
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/dist/cli/guide-commands.d.ts.map +1 -1
- package/dist/cli/guide-commands.js +6 -13
- package/dist/cli/guide-commands.js.map +1 -1
- package/dist/constants/dsl/index.d.ts +7 -0
- package/dist/constants/dsl/index.d.ts.map +1 -1
- package/dist/constants/dsl/index.js +7 -0
- package/dist/constants/dsl/index.js.map +1 -1
- package/dist/dsl/config/exit-block.d.ts +1 -3
- package/dist/dsl/config/exit-block.d.ts.map +1 -1
- package/dist/dsl/config/parse-phase.js +5 -5
- package/dist/dsl/config/parse-phase.js.map +1 -1
- package/dist/dsl/config/parse-plugin-config.d.ts.map +1 -1
- package/dist/dsl/config/parse-plugin-config.js +11 -41
- package/dist/dsl/config/parse-plugin-config.js.map +1 -1
- package/dist/dsl/config/parse-preset.js +5 -5
- package/dist/dsl/config/parse-preset.js.map +1 -1
- package/dist/dsl/config/parse-tiers.js +1 -1
- package/dist/dsl/config/parse-tiers.js.map +1 -1
- package/dist/dsl/config/parse-timeouts.d.ts +3 -3
- package/dist/dsl/config/parse-timeouts.d.ts.map +1 -1
- package/dist/dsl/config/parse-timeouts.js +55 -13
- package/dist/dsl/config/parse-timeouts.js.map +1 -1
- package/dist/dsl/config/unknown-keys.d.ts +1 -1
- package/dist/dsl/config/unknown-keys.d.ts.map +1 -1
- package/dist/dsl/config/unknown-keys.js +5 -58
- package/dist/dsl/config/unknown-keys.js.map +1 -1
- package/dist/dsl/config/validation.d.ts +1 -1
- package/dist/dsl/config/validation.d.ts.map +1 -1
- package/dist/dsl/config/validation.js.map +1 -1
- package/dist/runtime/load-trading-recipe.d.ts.map +1 -1
- package/dist/runtime/load-trading-recipe.js +25 -3
- package/dist/runtime/load-trading-recipe.js.map +1 -1
- package/dist/runtime/map-exit-config.d.ts +2 -3
- package/dist/runtime/map-exit-config.d.ts.map +1 -1
- package/dist/runtime/map-exit-config.js +6 -28
- package/dist/runtime/map-exit-config.js.map +1 -1
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +3 -1
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/trading-recipe-schema.d.ts +24 -19416
- package/dist/runtime/trading-recipe-schema.d.ts.map +1 -1
- package/dist/runtime/trading-recipe-schema.js +1 -39
- package/dist/runtime/trading-recipe-schema.js.map +1 -1
- package/examples/strategies/dsl-showcase.yaml +1 -1
- package/examples/strategies/wolf.yaml +1 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guide-commands.d.ts","sourceRoot":"","sources":["../../src/cli/guide-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"guide-commands.d.ts","sourceRoot":"","sources":["../../src/cli/guide-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAwUH,kFAAkF;AAClF,UAAU,gBAAgB;IACxB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACvD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC5C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC9D,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC;CACxF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,MAAM,GACd,IAAI,CA2CN"}
|
|
@@ -154,7 +154,9 @@ Phase 1: max_loss absolute floor + phase1 retrace from high-water; consecutive
|
|
|
154
154
|
breach counting applies only in phase 1. Phase 2: tier floors from lock_hw_pct
|
|
155
155
|
(% of current high-water ROE); phase 2 begins when price crosses the first
|
|
156
156
|
tier (no phase2_trigger_tier). Optional hard_timeout, weak_peak_cut, and
|
|
157
|
-
dead_weight_cut live on the preset (not nested under phase1).
|
|
157
|
+
dead_weight_cut live on the preset (not nested under phase1). When any of these
|
|
158
|
+
has enabled: true, interval_in_minutes is required (finite number > 0);
|
|
159
|
+
weak_peak_cut also requires min_value (finite ROE % > 0). hard_timeout
|
|
158
160
|
applies only in phase 1: entering phase 2 before the interval elapses cancels it;
|
|
159
161
|
same tick as first tier (phase 2) skips hard_timeout in favor of tier advance.
|
|
160
162
|
|
|
@@ -162,7 +164,6 @@ exit:
|
|
|
162
164
|
engine: dsl
|
|
163
165
|
interval_seconds: 30
|
|
164
166
|
|
|
165
|
-
# Recommended: one flat preset (no nested map name).
|
|
166
167
|
dsl_preset:
|
|
167
168
|
hard_timeout: ... # optional; same level as phase1 / phase2
|
|
168
169
|
weak_peak_cut: ...
|
|
@@ -170,12 +171,6 @@ exit:
|
|
|
170
171
|
phase1: ...
|
|
171
172
|
phase2: ...
|
|
172
173
|
|
|
173
|
-
# Alternative: multiple named presets (set exit.preset when 2+ keys).
|
|
174
|
-
# dsl_presets:
|
|
175
|
-
# dsl: { phase1: ..., phase2: ... }
|
|
176
|
-
# aggressive: { ... }
|
|
177
|
-
# preset: dsl
|
|
178
|
-
|
|
179
174
|
──────────────────────────────────────────────────────────────────────────────
|
|
180
175
|
Phase 1 — Fixed floor + high-water trailing
|
|
181
176
|
Floor = max(absolute_floor, trailing_floor). Absolute floor from max_loss_pct
|
|
@@ -270,16 +265,14 @@ actions[]
|
|
|
270
265
|
exit
|
|
271
266
|
engine string No dsl
|
|
272
267
|
interval_seconds number No Default 30; integer 5–3600 (Zod + DSL parse)
|
|
273
|
-
dsl_preset object No Single exit profile (
|
|
274
|
-
preset string No Required when dsl_presets has 2+ keys; with dsl_preset defaults to dsl
|
|
275
|
-
dsl_presets object No Named preset map (advanced; use exit.preset to choose)
|
|
276
|
-
dsl object No Legacy alias for dsl_presets
|
|
268
|
+
dsl_preset object No Single exit profile (required to start DslPlugin)
|
|
277
269
|
sm_flip any No Non-DSL exit hook data (allowed; ignored by DSL parse)
|
|
278
270
|
|
|
279
271
|
Preset: max_loss_pct (or phase1.max_loss_pct), phase1 (optional enabled;
|
|
280
272
|
max_loss_pct, retrace_threshold ROE %, consecutive_breaches_required),
|
|
281
273
|
phase2 (optional enabled; tiers only — trigger_pct, lock_hw_pct per row),
|
|
282
|
-
optional hard_timeout / weak_peak_cut / dead_weight_cut at preset root
|
|
274
|
+
optional hard_timeout / weak_peak_cut / dead_weight_cut at preset root
|
|
275
|
+
(when enabled: true, require interval_in_minutes; weak_peak_cut also min_value).
|
|
283
276
|
phase1.enabled and phase2.enabled cannot both be false. Each tier row:
|
|
284
277
|
lock_hw_pct [0,100]. Unknown keys under exit / presets / phase1 / phase2 / tiers throw
|
|
285
278
|
DslConfigValidationError (UNKNOWN_DSL_CONFIG_KEY) at load. DSL parse also
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guide-commands.js","sourceRoot":"","sources":["../../src/cli/guide-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,aAAa,GACjB,0EAA0E,CAAC;AAE7E,+EAA+E;AAE/E,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC;yBAClB,OAAO;;;;;;;;;;;;;;;;;;;CAmB/B,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwErB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCpB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,QAAQ,GAAG
|
|
1
|
+
{"version":3,"file":"guide-commands.js","sourceRoot":"","sources":["../../src/cli/guide-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,6 +23,13 @@ export declare const DSL_EVENTS: {
|
|
|
23
23
|
export declare const DEFAULT_STATE_DIR = ".dsl-state";
|
|
24
24
|
/** On-disk DSL state schema version (v1 = DSL engine v2; no migration from older files). */
|
|
25
25
|
export declare const DSL_STATE_VERSION = 1;
|
|
26
|
+
/**
|
|
27
|
+
* Recipe YAML uses a single `exit.dsl_preset` object; after parse it becomes this key in
|
|
28
|
+
* DslPluginConfig.presets. position.opened may set preset to override (must match this name).
|
|
29
|
+
*/
|
|
30
|
+
export declare const CANONICAL_DSL_PRESET_NAME = "default";
|
|
31
|
+
/** Validation / parse error paths for the lone recipe preset. */
|
|
32
|
+
export declare const EXIT_DSL_PRESET_PATH = "exit.dsl_preset";
|
|
26
33
|
/** Close reasons for DSL state (closeReason) and position.closed (reason). */
|
|
27
34
|
export declare const CLOSE_REASON: {
|
|
28
35
|
readonly MANUAL_CLOSE: "manual_close";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/constants/dsl/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,uBAAuB,EAAG,UAAmB,CAAC;AAE3D,uGAAuG;AACvG,eAAO,MAAM,MAAM;;;;;;CAMT,CAAC;AAEX,eAAO,MAAM,UAAU;;;;;;;;;CASb,CAAC;AAEX,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAC9C,4FAA4F;AAC5F,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,8EAA8E;AAC9E,eAAO,MAAM,YAAY;;;;;;;;;;;;;CAaf,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAC3E,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,OAAO,CAAC;AACzC,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAC1C,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,mFAAmF;AACnF,eAAO,MAAM,sCAAsC,IAAI,CAAC;AACxD,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,6DAA6D;AAC7D,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAC/C,eAAO,MAAM,eAAe,WAAW,CAAC;AACxC,eAAO,MAAM,cAAc,IAAI,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/constants/dsl/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,uBAAuB,EAAG,UAAmB,CAAC;AAE3D,uGAAuG;AACvG,eAAO,MAAM,MAAM;;;;;;CAMT,CAAC;AAEX,eAAO,MAAM,UAAU;;;;;;;;;CASb,CAAC;AAEX,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAC9C,4FAA4F;AAC5F,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC;;;GAGG;AACH,eAAO,MAAM,yBAAyB,YAAY,CAAC;AAEnD,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,oBAAoB,CAAC;AAEtD,8EAA8E;AAC9E,eAAO,MAAM,YAAY;;;;;;;;;;;;;CAaf,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAC3E,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,OAAO,CAAC;AACzC,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAC1C,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,mFAAmF;AACnF,eAAO,MAAM,sCAAsC,IAAI,CAAC;AACxD,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,6DAA6D;AAC7D,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAC/C,eAAO,MAAM,eAAe,WAAW,CAAC;AACxC,eAAO,MAAM,cAAc,IAAI,CAAC"}
|
|
@@ -24,6 +24,13 @@ export const DSL_EVENTS = {
|
|
|
24
24
|
export const DEFAULT_STATE_DIR = ".dsl-state";
|
|
25
25
|
/** On-disk DSL state schema version (v1 = DSL engine v2; no migration from older files). */
|
|
26
26
|
export const DSL_STATE_VERSION = 1;
|
|
27
|
+
/**
|
|
28
|
+
* Recipe YAML uses a single `exit.dsl_preset` object; after parse it becomes this key in
|
|
29
|
+
* DslPluginConfig.presets. position.opened may set preset to override (must match this name).
|
|
30
|
+
*/
|
|
31
|
+
export const CANONICAL_DSL_PRESET_NAME = "default";
|
|
32
|
+
/** Validation / parse error paths for the lone recipe preset. */
|
|
33
|
+
export const EXIT_DSL_PRESET_PATH = "exit.dsl_preset";
|
|
27
34
|
/** Close reasons for DSL state (closeReason) and position.closed (reason). */
|
|
28
35
|
export const CLOSE_REASON = {
|
|
29
36
|
MANUAL_CLOSE: "manual_close",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/constants/dsl/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAmB,CAAC;AAE3D,uGAAuG;AACvG,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,eAAe,EAAE,UAAU,CAAC,kBAAkB;IAC9C,eAAe,EAAE,UAAU,CAAC,kBAAkB;IAC9C,gBAAgB,EAAE,UAAU,CAAC,mBAAmB;IAChD,kBAAkB,EAAE,oBAAoB;IACxC,kBAAkB,EAAE,oBAAoB;CAChC,CAAC;AAEX,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,OAAO,EAAE,aAAa;IACtB,aAAa,EAAE,mBAAmB;IAClC,aAAa,EAAE,mBAAmB;IAClC,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,YAAY;IACpB,aAAa,EAAE,mBAAmB;IAClC,gBAAgB,EAAE,sBAAsB;IACxC,OAAO,EAAE,aAAa;CACd,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAC9C,4FAA4F;AAC5F,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,YAAY,EAAE,cAAc;IAC5B,iBAAiB,EAAE,mBAAmB;IACtC,eAAe,EAAE,iBAAiB;IAClC,UAAU,EAAE,YAAY;IACxB,OAAO,EAAE,SAAS;IAClB,qBAAqB,EAAE,uBAAuB;IAC9C,YAAY,EAAE,cAAc;IAC5B,aAAa,EAAE,eAAe;IAC9B,eAAe,EAAE,iBAAiB;IAClC,kBAAkB,EAAE,oBAAoB;IACxC,kBAAkB,EAAE,oBAAoB;IACxC,WAAW,EAAE,aAAa;CAClB,CAAC;AAGX,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,iEAAiE;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AACzC,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAC1C,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAChD,mFAAmF;AACnF,MAAM,CAAC,MAAM,sCAAsC,GAAG,CAAC,CAAC;AACxD,kFAAkF;AAClF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAC/C,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC;AACxC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/constants/dsl/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAmB,CAAC;AAE3D,uGAAuG;AACvG,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,eAAe,EAAE,UAAU,CAAC,kBAAkB;IAC9C,eAAe,EAAE,UAAU,CAAC,kBAAkB;IAC9C,gBAAgB,EAAE,UAAU,CAAC,mBAAmB;IAChD,kBAAkB,EAAE,oBAAoB;IACxC,kBAAkB,EAAE,oBAAoB;CAChC,CAAC;AAEX,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,OAAO,EAAE,aAAa;IACtB,aAAa,EAAE,mBAAmB;IAClC,aAAa,EAAE,mBAAmB;IAClC,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,YAAY;IACpB,aAAa,EAAE,mBAAmB;IAClC,gBAAgB,EAAE,sBAAsB;IACxC,OAAO,EAAE,aAAa;CACd,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAC9C,4FAA4F;AAC5F,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,SAAS,CAAC;AAEnD,iEAAiE;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAEtD,8EAA8E;AAC9E,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,YAAY,EAAE,cAAc;IAC5B,iBAAiB,EAAE,mBAAmB;IACtC,eAAe,EAAE,iBAAiB;IAClC,UAAU,EAAE,YAAY;IACxB,OAAO,EAAE,SAAS;IAClB,qBAAqB,EAAE,uBAAuB;IAC9C,YAAY,EAAE,cAAc;IAC5B,aAAa,EAAE,eAAe;IAC9B,eAAe,EAAE,iBAAiB;IAClC,kBAAkB,EAAE,oBAAoB;IACxC,kBAAkB,EAAE,oBAAoB;IACxC,WAAW,EAAE,aAAa;CAClB,CAAC;AAGX,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,iEAAiE;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AACzC,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAC1C,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAChD,mFAAmF;AACnF,MAAM,CAAC,MAAM,sCAAsC,GAAG,CAAC,CAAC;AACxD,kFAAkF;AAClF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAC/C,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC;AACxC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC"}
|
|
@@ -5,9 +5,7 @@ import type { RawPreset } from "./raw-types.js";
|
|
|
5
5
|
export interface ExitBlockConfig {
|
|
6
6
|
engine?: string;
|
|
7
7
|
interval_seconds?: number;
|
|
8
|
-
|
|
9
|
-
/** Single preset; normalized to dsl_presets.dsl before parse (mutually exclusive with non-empty dsl_presets). */
|
|
8
|
+
/** Single DSL exit profile (required when starting DslPlugin). */
|
|
10
9
|
dsl_preset?: RawPreset;
|
|
11
|
-
dsl_presets?: Record<string, RawPreset>;
|
|
12
10
|
}
|
|
13
11
|
//# sourceMappingURL=exit-block.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exit-block.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/exit-block.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,
|
|
1
|
+
{"version":3,"file":"exit-block.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/exit-block.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kEAAkE;IAClE,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB"}
|
|
@@ -13,7 +13,7 @@ export function readPhase1(presetName, phase1, presetMaxLossPct) {
|
|
|
13
13
|
throw new DslConfigValidationError([
|
|
14
14
|
dslValidationIssue("INVALID_MAX_LOSS_PCT", !(maxLossPct > 0)
|
|
15
15
|
? "max_loss_pct must be > 0 when phase1.enabled is false"
|
|
16
|
-
: "max_loss_pct must be <= 100",
|
|
16
|
+
: "max_loss_pct must be <= 100", `${presetName}.phase1.max_loss_pct`),
|
|
17
17
|
]);
|
|
18
18
|
}
|
|
19
19
|
return {
|
|
@@ -28,19 +28,19 @@ export function readPhase1(presetName, phase1, presetMaxLossPct) {
|
|
|
28
28
|
throw new DslConfigValidationError([
|
|
29
29
|
dslValidationIssue("INVALID_MAX_LOSS_PCT", !(maxLossPct > 0)
|
|
30
30
|
? "phase1.max_loss_pct is required and must be > 0 (or set preset max_loss_pct)"
|
|
31
|
-
: "phase1.max_loss_pct must be <= 100",
|
|
31
|
+
: "phase1.max_loss_pct must be <= 100", `${presetName}.phase1.max_loss_pct`),
|
|
32
32
|
]);
|
|
33
33
|
}
|
|
34
34
|
const retraceThreshold = Number(phase1.retrace_threshold ?? phase1.retraceThreshold);
|
|
35
35
|
if (!(retraceThreshold > 0)) {
|
|
36
36
|
throw new DslConfigValidationError([
|
|
37
|
-
dslValidationIssue("INVALID_RETRACE_THRESHOLD", "phase1.retrace_threshold is required and must be > 0 (ROE %)",
|
|
37
|
+
dslValidationIssue("INVALID_RETRACE_THRESHOLD", "phase1.retrace_threshold is required and must be > 0 (ROE %)", `${presetName}.phase1.retrace_threshold`),
|
|
38
38
|
]);
|
|
39
39
|
}
|
|
40
40
|
const phase1Breaches = Number(phase1.consecutive_breaches_required ?? phase1.consecutiveBreachesRequired);
|
|
41
41
|
if (!Number.isFinite(phase1Breaches) || phase1Breaches < 1 || !Number.isInteger(phase1Breaches)) {
|
|
42
42
|
throw new DslConfigValidationError([
|
|
43
|
-
dslValidationIssue("INVALID_CONSECUTIVE_BREACHES", "phase1.consecutive_breaches_required must be an integer >= 1",
|
|
43
|
+
dslValidationIssue("INVALID_CONSECUTIVE_BREACHES", "phase1.consecutive_breaches_required must be an integer >= 1", `${presetName}.phase1.consecutive_breaches_required`),
|
|
44
44
|
]);
|
|
45
45
|
}
|
|
46
46
|
return { maxLossPct, retraceThreshold, phase1Breaches, phase1Enabled: true };
|
|
@@ -60,7 +60,7 @@ export function readPhase2Scalars(presetName, phase2, requireTiersArray) {
|
|
|
60
60
|
for (const k of legacyKeys) {
|
|
61
61
|
if (phase2[k] != null) {
|
|
62
62
|
throw new DslConfigValidationError([
|
|
63
|
-
dslValidationIssue("LEGACY_PHASE2_FIELD", `phase2.${k} is no longer supported (phase 2 is exchange-SL driven; remove retrace and breach fields)`,
|
|
63
|
+
dslValidationIssue("LEGACY_PHASE2_FIELD", `phase2.${k} is no longer supported (phase 2 is exchange-SL driven; remove retrace and breach fields)`, `${presetName}.phase2.${k}`),
|
|
64
64
|
]);
|
|
65
65
|
}
|
|
66
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-phase.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-phase.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG/E,MAAM,UAAU,UAAU,CACxB,UAAkB,EAClB,MAA6B,EAC7B,gBAAoC;IAEpC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,WAAW,UAAU,2FAA2F,CACjH,CAAC;IACJ,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC;IAC/C,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,IAAI,gBAAgB,IAAI,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;YAC1C,MAAM,IAAI,wBAAwB,CAAC;gBACjC,kBAAkB,CAChB,sBAAsB,EACtB,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;oBACf,CAAC,CAAC,uDAAuD;oBACzD,CAAC,CAAC,6BAA6B,EACjC,
|
|
1
|
+
{"version":3,"file":"parse-phase.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-phase.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG/E,MAAM,UAAU,UAAU,CACxB,UAAkB,EAClB,MAA6B,EAC7B,gBAAoC;IAEpC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,WAAW,UAAU,2FAA2F,CACjH,CAAC;IACJ,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC;IAC/C,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,IAAI,gBAAgB,IAAI,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;YAC1C,MAAM,IAAI,wBAAwB,CAAC;gBACjC,kBAAkB,CAChB,sBAAsB,EACtB,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;oBACf,CAAC,CAAC,uDAAuD;oBACzD,CAAC,CAAC,6BAA6B,EACjC,GAAG,UAAU,sBAAsB,CACpC;aACF,CAAC,CAAC;QACL,CAAC;QACD,OAAO;YACL,UAAU;YACV,gBAAgB,EAAE,CAAC;YACnB,cAAc,EAAE,CAAC;YACjB,aAAa,EAAE,KAAK;SACrB,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,IAAI,gBAAgB,CAAC,CAAC;IACnE,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;QAC1C,MAAM,IAAI,wBAAwB,CAAC;YACjC,kBAAkB,CAChB,sBAAsB,EACtB,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;gBACf,CAAC,CAAC,8EAA8E;gBAChF,CAAC,CAAC,oCAAoC,EACxC,GAAG,UAAU,sBAAsB,CACpC;SACF,CAAC,CAAC;IACL,CAAC;IACD,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,IAAI,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACrF,IAAI,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,wBAAwB,CAAC;YACjC,kBAAkB,CAChB,2BAA2B,EAC3B,8DAA8D,EAC9D,GAAG,UAAU,2BAA2B,CACzC;SACF,CAAC,CAAC;IACL,CAAC;IACD,MAAM,cAAc,GAAG,MAAM,CAC3B,MAAM,CAAC,6BAA6B,IAAI,MAAM,CAAC,2BAA2B,CAC3E,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC;QAChG,MAAM,IAAI,wBAAwB,CAAC;YACjC,kBAAkB,CAChB,8BAA8B,EAC9B,8DAA8D,EAC9D,GAAG,UAAU,uCAAuC,CACrD;SACF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,UAAkB,EAClB,MAA6B,EAC7B,iBAA0B;IAE1B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,WAAW,UAAU,uBAAuB,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC;IAC/C,MAAM,UAAU,GAAG;QACjB,mBAAmB;QACnB,kBAAkB;QAClB,iBAAiB;QACjB,+BAA+B;QAC/B,6BAA6B;KACrB,CAAC;IACX,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAK,MAAkC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;YACnD,MAAM,IAAI,wBAAwB,CAAC;gBACjC,kBAAkB,CAChB,qBAAqB,EACrB,UAAU,CAAC,2FAA2F,EACtG,GAAG,UAAU,WAAW,CAAC,EAAE,CAC5B;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,IAAI,iBAAiB,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACrF,MAAM,IAAI,KAAK,CAAC,WAAW,UAAU,2CAA2C,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,EAAE,aAAa,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-plugin-config.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/parse-plugin-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"parse-plugin-config.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/parse-plugin-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,0BAA0B,CAAC;AASjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAIvD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,eAAe,GAAG,eAAe,CAiB1E;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C"}
|
|
@@ -1,55 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Parse full exit block into runtime DslPluginConfig.
|
|
3
3
|
*/
|
|
4
|
-
import { MIN_INTERVAL_SECONDS, MAX_INTERVAL_SECONDS, DEFAULT_INTERVAL_MS, } from "../../constants/dsl/index.js";
|
|
4
|
+
import { MIN_INTERVAL_SECONDS, MAX_INTERVAL_SECONDS, DEFAULT_INTERVAL_MS, CANONICAL_DSL_PRESET_NAME, EXIT_DSL_PRESET_PATH, } from "../../constants/dsl/index.js";
|
|
5
5
|
import { validateIntervalSeconds } from "./validation.js";
|
|
6
6
|
import { parsePreset } from "./parse-preset.js";
|
|
7
7
|
import { validateExitBlockConfigUnknownKeys } from "./unknown-keys.js";
|
|
8
|
-
function normalizeExitBlockConfig(raw) {
|
|
9
|
-
const r = raw;
|
|
10
|
-
const single = r.dsl_preset;
|
|
11
|
-
const map = r.dsl_presets;
|
|
12
|
-
if (single != null && typeof single === "object" && !Array.isArray(single)) {
|
|
13
|
-
if (map != null && typeof map === "object" && Object.keys(map).length > 0) {
|
|
14
|
-
throw new Error("exit.dsl_preset and exit.dsl_presets cannot both be set; use one or the other");
|
|
15
|
-
}
|
|
16
|
-
const presetName = typeof raw.preset === "string" && raw.preset.length > 0 ? raw.preset : "dsl";
|
|
17
|
-
const out = {
|
|
18
|
-
...raw,
|
|
19
|
-
dsl_presets: { [presetName]: single },
|
|
20
|
-
preset: presetName,
|
|
21
|
-
};
|
|
22
|
-
delete out.dsl_preset;
|
|
23
|
-
return out;
|
|
24
|
-
}
|
|
25
|
-
return raw;
|
|
26
|
-
}
|
|
27
8
|
export function parseDslPluginConfig(raw) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const intervalSeconds = normalized.interval_seconds ?? 30;
|
|
9
|
+
validateExitBlockConfigUnknownKeys(raw);
|
|
10
|
+
const intervalSeconds = raw.interval_seconds ?? 30;
|
|
31
11
|
validateIntervalSeconds(intervalSeconds, MIN_INTERVAL_SECONDS, MAX_INTERVAL_SECONDS);
|
|
32
12
|
const intervalMs = intervalSeconds * 1000;
|
|
33
13
|
const minIntervalMinutes = intervalMs / 60_000;
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
if (p && typeof p === "object")
|
|
38
|
-
presets[name] = parsePreset(name, p, minIntervalMinutes);
|
|
39
|
-
}
|
|
40
|
-
const presetKeys = Object.keys(presets);
|
|
41
|
-
if (presetKeys.length === 0) {
|
|
42
|
-
throw new Error("At least one dsl_presets entry is required");
|
|
43
|
-
}
|
|
44
|
-
if (presetKeys.length > 1 && typeof normalized.preset !== "string") {
|
|
45
|
-
throw new Error(`exit.preset is required when dsl_presets has more than one entry (keys: ${presetKeys.join(", ")}). ` +
|
|
46
|
-
`Set preset: "<name>" to select one, or use a single canonical preset key (recommended: dsl).`);
|
|
47
|
-
}
|
|
48
|
-
const preset = typeof normalized.preset === "string" ? normalized.preset : presetKeys[0];
|
|
49
|
-
if (!presets[preset]) {
|
|
50
|
-
throw new Error(`Preset "${preset}" not found in dsl_presets`);
|
|
14
|
+
const single = raw.dsl_preset;
|
|
15
|
+
if (single == null || typeof single !== "object" || Array.isArray(single)) {
|
|
16
|
+
throw new Error("exit.dsl_preset is required and must be an object when configuring DSL");
|
|
51
17
|
}
|
|
52
|
-
|
|
18
|
+
const parsed = parsePreset(EXIT_DSL_PRESET_PATH, single, minIntervalMinutes);
|
|
19
|
+
const presets = {
|
|
20
|
+
[CANONICAL_DSL_PRESET_NAME]: parsed,
|
|
21
|
+
};
|
|
22
|
+
return { intervalMs, preset: CANONICAL_DSL_PRESET_NAME, presets };
|
|
53
23
|
}
|
|
54
24
|
export function getDefaultIntervalMs() {
|
|
55
25
|
return DEFAULT_INTERVAL_MS;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-plugin-config.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-plugin-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"parse-plugin-config.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-plugin-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,kCAAkC,EAAE,MAAM,mBAAmB,CAAC;AAEvE,MAAM,UAAU,oBAAoB,CAAC,GAAoB;IACvD,kCAAkC,CAAC,GAA8B,CAAC,CAAC;IACnE,MAAM,eAAe,GAAG,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC;IACnD,uBAAuB,CAAC,eAAe,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;IACrF,MAAM,UAAU,GAAG,eAAe,GAAG,IAAI,CAAC;IAC1C,MAAM,kBAAkB,GAAG,UAAU,GAAG,MAAM,CAAC;IAE/C,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC;IAC9B,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,oBAAoB,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAoC;QAC/C,CAAC,yBAAyB,CAAC,EAAE,MAAM;KACpC,CAAC;IACF,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,yBAAyB,EAAE,OAAO,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,mBAAmB,CAAC;AAC7B,CAAC"}
|
|
@@ -8,7 +8,7 @@ import { parseTier } from "./parse-tiers.js";
|
|
|
8
8
|
function assertNoLegacyPresetKeys(presetName, raw) {
|
|
9
9
|
if (raw.phase2_trigger_tier != null) {
|
|
10
10
|
throw new DslConfigValidationError([
|
|
11
|
-
dslValidationIssue("LEGACY_PRESET_FIELD", "phase2_trigger_tier was removed; phase 2 starts at tier 0 (first tier)",
|
|
11
|
+
dslValidationIssue("LEGACY_PRESET_FIELD", "phase2_trigger_tier was removed; phase 2 starts at tier 0 (first tier)", `${presetName}.phase2_trigger_tier`),
|
|
12
12
|
]);
|
|
13
13
|
}
|
|
14
14
|
const p1 = raw.phase1;
|
|
@@ -16,16 +16,16 @@ function assertNoLegacyPresetKeys(presetName, raw) {
|
|
|
16
16
|
for (const k of ["hard_timeout", "weak_peak_cut", "dead_weight_cut"]) {
|
|
17
17
|
if (p1[k] != null) {
|
|
18
18
|
throw new DslConfigValidationError([
|
|
19
|
-
dslValidationIssue("LEGACY_PHASE1_FIELD", `phase1.${k} was removed; define ${k} at the preset root (same shape)`,
|
|
19
|
+
dslValidationIssue("LEGACY_PHASE1_FIELD", `phase1.${k} was removed; define ${k} at the preset root (same shape)`, `${presetName}.phase1.${k}`),
|
|
20
20
|
]);
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
function parseGlobalCuts(presetName, raw, minIntervalMinutes) {
|
|
26
|
-
const hardTimeout = parseHardTimeout(raw.hard_timeout, minIntervalMinutes);
|
|
27
|
-
const weakPeakCut = parseWeakPeakCut(raw.weak_peak_cut, minIntervalMinutes);
|
|
28
|
-
const deadWeightCut = parseDeadWeightCut(raw.dead_weight_cut, minIntervalMinutes);
|
|
26
|
+
const hardTimeout = parseHardTimeout(presetName, raw.hard_timeout, minIntervalMinutes);
|
|
27
|
+
const weakPeakCut = parseWeakPeakCut(presetName, raw.weak_peak_cut, minIntervalMinutes);
|
|
28
|
+
const deadWeightCut = parseDeadWeightCut(presetName, raw.dead_weight_cut, minIntervalMinutes);
|
|
29
29
|
return {
|
|
30
30
|
...(hardTimeout && { hardTimeout }),
|
|
31
31
|
...(weakPeakCut && { weakPeakCut }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-preset.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-preset.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C,SAAS,wBAAwB,CAAC,UAAkB,EAAE,GAAc;IAClE,IAAI,GAAG,CAAC,mBAAmB,IAAI,IAAI,EAAE,CAAC;QACpC,MAAM,IAAI,wBAAwB,CAAC;YACjC,kBAAkB,CAChB,qBAAqB,EACrB,wEAAwE,EACxE,
|
|
1
|
+
{"version":3,"file":"parse-preset.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-preset.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { DslConfigValidationError, dslValidationIssue } from "./validation.js";
|
|
5
5
|
export function parseTier(presetName, raw, tierIndex, tiersPathForErrors) {
|
|
6
|
-
const path = (field) =>
|
|
6
|
+
const path = (field) => `${presetName}.${tiersPathForErrors}[${tierIndex}].${field}`;
|
|
7
7
|
if (raw.breaches != null) {
|
|
8
8
|
throw new DslConfigValidationError([
|
|
9
9
|
dslValidationIssue("LEGACY_TIER_FIELD", 'tier.breaches is no longer supported (phase 2 breach counting removed)', path("breaches")),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-tiers.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-tiers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG/E,MAAM,UAAU,SAAS,CACvB,UAAkB,EAClB,GAAY,EACZ,SAAiB,EACjB,kBAA0B;IAE1B,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,EAAE,CAC7B,
|
|
1
|
+
{"version":3,"file":"parse-tiers.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-tiers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG/E,MAAM,UAAU,SAAS,CACvB,UAAkB,EAClB,GAAY,EACZ,SAAiB,EACjB,kBAA0B;IAE1B,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,EAAE,CAC7B,GAAG,UAAU,IAAI,kBAAkB,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;IAC/D,IAAI,GAAG,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,IAAI,wBAAwB,CAAC;YACjC,kBAAkB,CAChB,mBAAmB,EACnB,wEAAwE,EACxE,IAAI,CAAC,UAAU,CAAC,CACjB;SACF,CAAC,CAAC;IACL,CAAC;IACD,IAAI,GAAG,CAAC,OAAO,IAAI,IAAI,IAAK,GAA+B,CAAC,aAAa,IAAI,IAAI,EAAE,CAAC;QAClF,MAAM,IAAI,wBAAwB,CAAC;YACjC,kBAAkB,CAChB,mBAAmB,EACnB,qCAAqC,EACrC,IAAI,CAAC,SAAS,CAAC,CAChB;SACF,CAAC,CAAC;IACL,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAC3D,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;QAC1C,MAAM,IAAI,wBAAwB,CAAC;YACjC,kBAAkB,CAChB,qBAAqB,EACrB,oCAAoC,EACpC,IAAI,CAAC,aAAa,CAAC,CACpB;SACF,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,GAAG,EAAE,CAAC;QACpE,MAAM,IAAI,wBAAwB,CAAC;YACjC,kBAAkB,CAChB,qBAAqB,EACrB,iDAAiD,EACjD,IAAI,CAAC,aAAa,CAAC,CACpB;SACF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -9,8 +9,8 @@ type RawTimeoutBlock = {
|
|
|
9
9
|
} | undefined;
|
|
10
10
|
/** Clamp interval to at least minIntervalMinutes (cron run interval). */
|
|
11
11
|
export declare function clampInterval(intervalInMinutes: number, minIntervalMinutes: number): number;
|
|
12
|
-
export declare function parseHardTimeout(raw: RawTimeoutBlock, minIntervalMinutes: number): HardTimeout | undefined;
|
|
13
|
-
export declare function parseWeakPeakCut(raw: RawTimeoutBlock, minIntervalMinutes: number): WeakPeakCut | undefined;
|
|
14
|
-
export declare function parseDeadWeightCut(raw: RawTimeoutBlock, minIntervalMinutes: number): DeadWeightCut | undefined;
|
|
12
|
+
export declare function parseHardTimeout(presetPath: string, raw: RawTimeoutBlock, minIntervalMinutes: number): HardTimeout | undefined;
|
|
13
|
+
export declare function parseWeakPeakCut(presetPath: string, raw: RawTimeoutBlock, minIntervalMinutes: number): WeakPeakCut | undefined;
|
|
14
|
+
export declare function parseDeadWeightCut(presetPath: string, raw: RawTimeoutBlock, minIntervalMinutes: number): DeadWeightCut | undefined;
|
|
15
15
|
export {};
|
|
16
16
|
//# sourceMappingURL=parse-timeouts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-timeouts.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/parse-timeouts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"parse-timeouts.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/parse-timeouts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGxF,KAAK,eAAe,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC;AAE3G,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,iBAAiB,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,MAAM,CAE3F;AAkDD,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,eAAe,EACpB,kBAAkB,EAAE,MAAM,GACzB,WAAW,GAAG,SAAS,CAezB;AAED,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,eAAe,EACpB,kBAAkB,EAAE,MAAM,GACzB,WAAW,GAAG,SAAS,CAgBzB;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,eAAe,EACpB,kBAAkB,EAAE,MAAM,GACzB,aAAa,GAAG,SAAS,CAe3B"}
|
|
@@ -1,33 +1,75 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Time-based cut fields: parse raw YAML into normalized preset fields.
|
|
3
3
|
*/
|
|
4
|
+
import { DslConfigValidationError, dslValidationIssue } from "./validation.js";
|
|
4
5
|
/** Clamp interval to at least minIntervalMinutes (cron run interval). */
|
|
5
6
|
export function clampInterval(intervalInMinutes, minIntervalMinutes) {
|
|
6
7
|
return Math.max(intervalInMinutes, minIntervalMinutes);
|
|
7
8
|
}
|
|
8
|
-
|
|
9
|
+
function requirePositiveInterval(basePath, cutLabel, rawInterval) {
|
|
10
|
+
if (rawInterval === undefined || rawInterval === null) {
|
|
11
|
+
throw new DslConfigValidationError([
|
|
12
|
+
dslValidationIssue("INVALID_TIME_CUT_INTERVAL", `${cutLabel}: when enabled is true, interval_in_minutes is required`, `${basePath}.interval_in_minutes`),
|
|
13
|
+
]);
|
|
14
|
+
}
|
|
15
|
+
if (typeof rawInterval !== "number" || !Number.isFinite(rawInterval) || rawInterval <= 0) {
|
|
16
|
+
throw new DslConfigValidationError([
|
|
17
|
+
dslValidationIssue("INVALID_TIME_CUT_INTERVAL", `${cutLabel}: interval_in_minutes must be a finite number > 0`, `${basePath}.interval_in_minutes`),
|
|
18
|
+
]);
|
|
19
|
+
}
|
|
20
|
+
return rawInterval;
|
|
21
|
+
}
|
|
22
|
+
function requireWeakPeakMinValue(basePath, rawMin) {
|
|
23
|
+
if (rawMin === undefined || rawMin === null) {
|
|
24
|
+
throw new DslConfigValidationError([
|
|
25
|
+
dslValidationIssue("INVALID_WEAK_PEAK_MIN_VALUE", "weak_peak_cut: when enabled is true, min_value is required (ROE % threshold)", `${basePath}.min_value`),
|
|
26
|
+
]);
|
|
27
|
+
}
|
|
28
|
+
if (typeof rawMin !== "number" || !Number.isFinite(rawMin) || rawMin <= 0) {
|
|
29
|
+
throw new DslConfigValidationError([
|
|
30
|
+
dslValidationIssue("INVALID_WEAK_PEAK_MIN_VALUE", "weak_peak_cut: min_value must be a finite number > 0", `${basePath}.min_value`),
|
|
31
|
+
]);
|
|
32
|
+
}
|
|
33
|
+
return rawMin;
|
|
34
|
+
}
|
|
35
|
+
export function parseHardTimeout(presetPath, raw, minIntervalMinutes) {
|
|
9
36
|
if (!raw?.enabled)
|
|
10
37
|
return undefined;
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
38
|
+
const basePath = `${presetPath}.hard_timeout`;
|
|
39
|
+
const iv = requirePositiveInterval(basePath, "hard_timeout", raw.interval_in_minutes);
|
|
40
|
+
const intervalInMinutes = clampInterval(iv, minIntervalMinutes);
|
|
41
|
+
if (!(intervalInMinutes > 0)) {
|
|
42
|
+
throw new DslConfigValidationError([
|
|
43
|
+
dslValidationIssue("INVALID_TIME_CUT_INTERVAL", "hard_timeout: effective interval_in_minutes must be > 0 after clamping to exit poll interval", `${basePath}.interval_in_minutes`),
|
|
44
|
+
]);
|
|
45
|
+
}
|
|
14
46
|
return { enabled: true, intervalInMinutes };
|
|
15
47
|
}
|
|
16
|
-
export function parseWeakPeakCut(raw, minIntervalMinutes) {
|
|
48
|
+
export function parseWeakPeakCut(presetPath, raw, minIntervalMinutes) {
|
|
17
49
|
if (!raw?.enabled)
|
|
18
50
|
return undefined;
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const
|
|
51
|
+
const basePath = `${presetPath}.weak_peak_cut`;
|
|
52
|
+
const iv = requirePositiveInterval(basePath, "weak_peak_cut", raw.interval_in_minutes);
|
|
53
|
+
const minValue = requireWeakPeakMinValue(basePath, raw.min_value);
|
|
54
|
+
const intervalInMinutes = clampInterval(iv, minIntervalMinutes);
|
|
55
|
+
if (!(intervalInMinutes > 0)) {
|
|
56
|
+
throw new DslConfigValidationError([
|
|
57
|
+
dslValidationIssue("INVALID_TIME_CUT_INTERVAL", "weak_peak_cut: effective interval_in_minutes must be > 0 after clamping to exit poll interval", `${basePath}.interval_in_minutes`),
|
|
58
|
+
]);
|
|
59
|
+
}
|
|
23
60
|
return { enabled: true, intervalInMinutes, minValue };
|
|
24
61
|
}
|
|
25
|
-
export function parseDeadWeightCut(raw, minIntervalMinutes) {
|
|
62
|
+
export function parseDeadWeightCut(presetPath, raw, minIntervalMinutes) {
|
|
26
63
|
if (!raw?.enabled)
|
|
27
64
|
return undefined;
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
65
|
+
const basePath = `${presetPath}.dead_weight_cut`;
|
|
66
|
+
const iv = requirePositiveInterval(basePath, "dead_weight_cut", raw.interval_in_minutes);
|
|
67
|
+
const intervalInMinutes = clampInterval(iv, minIntervalMinutes);
|
|
68
|
+
if (!(intervalInMinutes > 0)) {
|
|
69
|
+
throw new DslConfigValidationError([
|
|
70
|
+
dslValidationIssue("INVALID_TIME_CUT_INTERVAL", "dead_weight_cut: effective interval_in_minutes must be > 0 after clamping to exit poll interval", `${basePath}.interval_in_minutes`),
|
|
71
|
+
]);
|
|
72
|
+
}
|
|
31
73
|
return { enabled: true, intervalInMinutes };
|
|
32
74
|
}
|
|
33
75
|
//# sourceMappingURL=parse-timeouts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-timeouts.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-timeouts.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"parse-timeouts.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-timeouts.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
* Reject unknown keys in exit / DSL YAML so typos are not silently ignored.
|
|
3
3
|
*/
|
|
4
4
|
export declare function validateRawExitBlockAndPresetsUnknownKeys(exit: Record<string, unknown>): void;
|
|
5
|
-
/** Validate ExitBlockConfig for parseDslPluginConfig
|
|
5
|
+
/** Validate ExitBlockConfig for parseDslPluginConfig. */
|
|
6
6
|
export declare function validateExitBlockConfigUnknownKeys(raw: Record<string, unknown>): void;
|
|
7
7
|
//# sourceMappingURL=unknown-keys.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unknown-keys.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/unknown-keys.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"unknown-keys.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/unknown-keys.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuIH,wBAAgB,yCAAyC,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAW7F;AAED,yDAAyD;AACzD,wBAAgB,kCAAkC,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAWrF"}
|
|
@@ -6,21 +6,11 @@ import { DslConfigValidationError, dslValidationIssue, } from "./validation.js";
|
|
|
6
6
|
const EXIT_RECIPE_KEYS = new Set([
|
|
7
7
|
"engine",
|
|
8
8
|
"interval_seconds",
|
|
9
|
-
"preset",
|
|
10
|
-
/** Single preset object (sugar for dsl_presets.dsl + preset dsl). */
|
|
11
9
|
"dsl_preset",
|
|
12
|
-
"dsl_presets",
|
|
13
|
-
"dsl",
|
|
14
10
|
"sm_flip",
|
|
15
11
|
]);
|
|
16
|
-
/** Keys allowed on ExitBlockConfig passed to parseDslPluginConfig
|
|
17
|
-
const EXIT_BLOCK_CONFIG_KEYS = new Set([
|
|
18
|
-
"engine",
|
|
19
|
-
"interval_seconds",
|
|
20
|
-
"preset",
|
|
21
|
-
"dsl_preset",
|
|
22
|
-
"dsl_presets",
|
|
23
|
-
]);
|
|
12
|
+
/** Keys allowed on ExitBlockConfig passed to parseDslPluginConfig. */
|
|
13
|
+
const EXIT_BLOCK_CONFIG_KEYS = new Set(["engine", "interval_seconds", "dsl_preset"]);
|
|
24
14
|
const PRESET_KEYS = new Set([
|
|
25
15
|
"tiers",
|
|
26
16
|
"max_loss_pct",
|
|
@@ -105,66 +95,23 @@ function validatePresetObject(presetPath, raw, issues) {
|
|
|
105
95
|
});
|
|
106
96
|
}
|
|
107
97
|
}
|
|
108
|
-
/**
|
|
109
|
-
* Validate raw `exit:` from the trading recipe (before map strips keys).
|
|
110
|
-
* Validates every preset map present (`dsl_presets` and/or `dsl`) so typos are caught even when one block is shadowed by the other at runtime.
|
|
111
|
-
*/
|
|
112
|
-
function presetMapNonEmpty(v) {
|
|
113
|
-
return isPlainObject(v) && Object.keys(v).length > 0;
|
|
114
|
-
}
|
|
115
98
|
export function validateRawExitBlockAndPresetsUnknownKeys(exit) {
|
|
116
99
|
const issues = [];
|
|
117
100
|
addUnknownKeyIssues(issues, unknownKeyList(exit, EXIT_RECIPE_KEYS), "exit");
|
|
118
|
-
|
|
119
|
-
const hasPresetsMap = presetMapNonEmpty(exit.dsl_presets);
|
|
120
|
-
const hasDslAliasMap = presetMapNonEmpty(exit.dsl);
|
|
121
|
-
if (hasDslPreset && (hasPresetsMap || hasDslAliasMap)) {
|
|
122
|
-
issues.push(dslValidationIssue("DSL_PRESET_SOURCE_CONFLICT", "use only one of exit.dsl_preset (single preset) or exit.dsl_presets / exit.dsl (named map), not both", "exit"));
|
|
123
|
-
}
|
|
124
|
-
if (hasDslPreset && !hasPresetsMap && !hasDslAliasMap) {
|
|
101
|
+
if (exit.dsl_preset != null && isPlainObject(exit.dsl_preset)) {
|
|
125
102
|
validatePresetObject("exit.dsl_preset", exit.dsl_preset, issues);
|
|
126
103
|
}
|
|
127
|
-
if (exit.dsl_presets != null && isPlainObject(exit.dsl_presets)) {
|
|
128
|
-
for (const name of Object.keys(exit.dsl_presets)) {
|
|
129
|
-
const p = exit.dsl_presets[name];
|
|
130
|
-
if (!isPlainObject(p))
|
|
131
|
-
continue;
|
|
132
|
-
validatePresetObject(`exit.dsl_presets.${name}`, p, issues);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
if (exit.dsl != null && isPlainObject(exit.dsl)) {
|
|
136
|
-
for (const name of Object.keys(exit.dsl)) {
|
|
137
|
-
const p = exit.dsl[name];
|
|
138
|
-
if (!isPlainObject(p))
|
|
139
|
-
continue;
|
|
140
|
-
validatePresetObject(`exit.dsl.${name}`, p, issues);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
104
|
if (issues.length > 0) {
|
|
144
105
|
throw new DslConfigValidationError(issues);
|
|
145
106
|
}
|
|
146
107
|
}
|
|
147
|
-
/** Validate ExitBlockConfig for parseDslPluginConfig
|
|
108
|
+
/** Validate ExitBlockConfig for parseDslPluginConfig. */
|
|
148
109
|
export function validateExitBlockConfigUnknownKeys(raw) {
|
|
149
110
|
const issues = [];
|
|
150
111
|
addUnknownKeyIssues(issues, unknownKeyList(raw, EXIT_BLOCK_CONFIG_KEYS), "exit");
|
|
151
|
-
|
|
152
|
-
const hasPresetsMap = presetMapNonEmpty(raw.dsl_presets);
|
|
153
|
-
if (hasDslPreset && hasPresetsMap) {
|
|
154
|
-
issues.push(dslValidationIssue("DSL_PRESET_SOURCE_CONFLICT", "use only one of exit.dsl_preset or exit.dsl_presets, not both", "exit"));
|
|
155
|
-
}
|
|
156
|
-
if (hasDslPreset && !hasPresetsMap) {
|
|
112
|
+
if (raw.dsl_preset != null && isPlainObject(raw.dsl_preset)) {
|
|
157
113
|
validatePresetObject("exit.dsl_preset", raw.dsl_preset, issues);
|
|
158
114
|
}
|
|
159
|
-
const presets = raw.dsl_presets;
|
|
160
|
-
if (presets != null && isPlainObject(presets)) {
|
|
161
|
-
for (const name of Object.keys(presets)) {
|
|
162
|
-
const p = presets[name];
|
|
163
|
-
if (!isPlainObject(p))
|
|
164
|
-
continue;
|
|
165
|
-
validatePresetObject(`exit.dsl_presets.${name}`, p, issues);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
115
|
if (issues.length > 0) {
|
|
169
116
|
throw new DslConfigValidationError(issues);
|
|
170
117
|
}
|