desic-okx-agent 0.2.1 → 0.3.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/README.en.md +90 -10
- package/README.md +76 -10
- package/dist/account/private-websocket.js +4 -4
- package/dist/account/private-websocket.js.map +1 -1
- package/dist/account/service.d.ts +12 -1
- package/dist/account/service.js +18 -0
- package/dist/account/service.js.map +1 -1
- package/dist/bars/rate-limiter.d.ts +18 -0
- package/dist/bars/rate-limiter.js +84 -0
- package/dist/bars/rate-limiter.js.map +1 -0
- package/dist/bars/schema.d.ts +36 -0
- package/dist/bars/schema.js +134 -0
- package/dist/bars/schema.js.map +1 -0
- package/dist/bars/service.d.ts +60 -0
- package/dist/bars/service.js +120 -0
- package/dist/bars/service.js.map +1 -0
- package/dist/bars/store.d.ts +105 -0
- package/dist/bars/store.js +415 -0
- package/dist/bars/store.js.map +1 -0
- package/dist/bars/timeframe.d.ts +40 -0
- package/dist/bars/timeframe.js +146 -0
- package/dist/bars/timeframe.js.map +1 -0
- package/dist/bars/types.d.ts +68 -0
- package/dist/bars/types.js +13 -0
- package/dist/bars/types.js.map +1 -0
- package/dist/cli/data-render.d.ts +37 -0
- package/dist/cli/data-render.js +143 -0
- package/dist/cli/data-render.js.map +1 -0
- package/dist/cli/doctor.js +7 -3
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.js +757 -26
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/live-render.d.ts +24 -0
- package/dist/cli/live-render.js +85 -0
- package/dist/cli/live-render.js.map +1 -0
- package/dist/cli/range.d.ts +28 -0
- package/dist/cli/range.js +63 -0
- package/dist/cli/range.js.map +1 -0
- package/dist/cli/render.js +3 -0
- package/dist/cli/render.js.map +1 -1
- package/dist/cli/strategy-render.d.ts +36 -0
- package/dist/cli/strategy-render.js +391 -0
- package/dist/cli/strategy-render.js.map +1 -0
- package/dist/cli/width.d.ts +18 -0
- package/dist/cli/width.js +71 -0
- package/dist/cli/width.js.map +1 -0
- package/dist/config/loader.js +1 -1
- package/dist/config/schema.d.ts +7 -0
- package/dist/config/schema.js +24 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/core/okx-client.d.ts +9 -1
- package/dist/core/okx-client.js +14 -5
- package/dist/core/okx-client.js.map +1 -1
- package/dist/i18n/locale.d.ts +24 -0
- package/dist/i18n/locale.js +65 -0
- package/dist/i18n/locale.js.map +1 -0
- package/dist/i18n/messages.d.ts +333 -0
- package/dist/i18n/messages.js +660 -0
- package/dist/i18n/messages.js.map +1 -0
- package/dist/live/account-snapshot.d.ts +30 -0
- package/dist/live/account-snapshot.js +130 -0
- package/dist/live/account-snapshot.js.map +1 -0
- package/dist/live/cutoff-queue.d.ts +42 -0
- package/dist/live/cutoff-queue.js +69 -0
- package/dist/live/cutoff-queue.js.map +1 -0
- package/dist/live/execution-key.d.ts +23 -0
- package/dist/live/execution-key.js +31 -0
- package/dist/live/execution-key.js.map +1 -0
- package/dist/live/failures.d.ts +37 -0
- package/dist/live/failures.js +57 -0
- package/dist/live/failures.js.map +1 -0
- package/dist/live/gates.d.ts +65 -0
- package/dist/live/gates.js +136 -0
- package/dist/live/gates.js.map +1 -0
- package/dist/live/loop.d.ts +56 -0
- package/dist/live/loop.js +197 -0
- package/dist/live/loop.js.map +1 -0
- package/dist/live/preconditions.d.ts +48 -0
- package/dist/live/preconditions.js +69 -0
- package/dist/live/preconditions.js.map +1 -0
- package/dist/live/reconcile.d.ts +46 -0
- package/dist/live/reconcile.js +104 -0
- package/dist/live/reconcile.js.map +1 -0
- package/dist/live/runner.d.ts +57 -0
- package/dist/live/runner.js +160 -0
- package/dist/live/runner.js.map +1 -0
- package/dist/live/schema.d.ts +18 -0
- package/dist/live/schema.js +91 -0
- package/dist/live/schema.js.map +1 -0
- package/dist/live/service.d.ts +144 -0
- package/dist/live/service.js +303 -0
- package/dist/live/service.js.map +1 -0
- package/dist/live/session.d.ts +85 -0
- package/dist/live/session.js +234 -0
- package/dist/live/session.js.map +1 -0
- package/dist/live/sizing.d.ts +62 -0
- package/dist/live/sizing.js +79 -0
- package/dist/live/sizing.js.map +1 -0
- package/dist/live/store.d.ts +123 -0
- package/dist/live/store.js +350 -0
- package/dist/live/store.js.map +1 -0
- package/dist/live/types.d.ts +82 -0
- package/dist/live/types.js +2 -0
- package/dist/live/types.js.map +1 -0
- package/dist/market/websocket.d.ts +16 -1
- package/dist/market/websocket.js +60 -5
- package/dist/market/websocket.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.js +15 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/network/connectivity.d.ts +9 -1
- package/dist/network/connectivity.js +28 -1
- package/dist/network/connectivity.js.map +1 -1
- package/dist/report/chart-script.d.ts +12 -0
- package/dist/report/chart-script.js +146 -0
- package/dist/report/chart-script.js.map +1 -0
- package/dist/report/compare-html.d.ts +8 -0
- package/dist/report/compare-html.js +254 -0
- package/dist/report/compare-html.js.map +1 -0
- package/dist/report/compare-script.d.ts +12 -0
- package/dist/report/compare-script.js +109 -0
- package/dist/report/compare-script.js.map +1 -0
- package/dist/report/compare.d.ts +61 -0
- package/dist/report/compare.js +205 -0
- package/dist/report/compare.js.map +1 -0
- package/dist/report/fetch.d.ts +20 -0
- package/dist/report/fetch.js +56 -0
- package/dist/report/fetch.js.map +1 -0
- package/dist/report/html.d.ts +54 -0
- package/dist/report/html.js +641 -0
- package/dist/report/html.js.map +1 -0
- package/dist/report/open.d.ts +42 -0
- package/dist/report/open.js +114 -0
- package/dist/report/open.js.map +1 -0
- package/dist/runtime/server.d.ts +16 -1
- package/dist/runtime/server.js +112 -9
- package/dist/runtime/server.js.map +1 -1
- package/dist/setup/installer.d.ts +1 -0
- package/dist/setup/installer.js +8 -0
- package/dist/setup/installer.js.map +1 -1
- package/dist/setup/wizard.js +19 -22
- package/dist/setup/wizard.js.map +1 -1
- package/dist/strategy/constants.d.ts +23 -0
- package/dist/strategy/constants.js +24 -0
- package/dist/strategy/constants.js.map +1 -0
- package/dist/strategy/environment.d.ts +52 -0
- package/dist/strategy/environment.js +187 -0
- package/dist/strategy/environment.js.map +1 -0
- package/dist/strategy/instrument.d.ts +29 -0
- package/dist/strategy/instrument.js +39 -0
- package/dist/strategy/instrument.js.map +1 -0
- package/dist/strategy/optimize.d.ts +73 -0
- package/dist/strategy/optimize.js +113 -0
- package/dist/strategy/optimize.js.map +1 -0
- package/dist/strategy/parameter-space.d.ts +59 -0
- package/dist/strategy/parameter-space.js +221 -0
- package/dist/strategy/parameter-space.js.map +1 -0
- package/dist/strategy/python-bridge.d.ts +24 -0
- package/dist/strategy/python-bridge.js +114 -0
- package/dist/strategy/python-bridge.js.map +1 -0
- package/dist/strategy/schema.d.ts +9 -0
- package/dist/strategy/schema.js +91 -0
- package/dist/strategy/schema.js.map +1 -0
- package/dist/strategy/service.d.ts +138 -0
- package/dist/strategy/service.js +745 -0
- package/dist/strategy/service.js.map +1 -0
- package/dist/strategy/settings.d.ts +162 -0
- package/dist/strategy/settings.js +243 -0
- package/dist/strategy/settings.js.map +1 -0
- package/dist/strategy/store.d.ts +96 -0
- package/dist/strategy/store.js +367 -0
- package/dist/strategy/store.js.map +1 -0
- package/dist/strategy/templates.d.ts +11 -0
- package/dist/strategy/templates.js +134 -0
- package/dist/strategy/templates.js.map +1 -0
- package/dist/strategy/types.d.ts +111 -0
- package/dist/strategy/types.js +2 -0
- package/dist/strategy/types.js.map +1 -0
- package/dist/tools/catalog.d.ts +16 -0
- package/dist/tools/catalog.js +118 -17
- package/dist/tools/catalog.js.map +1 -1
- package/dist/trade/service.d.ts +12 -0
- package/dist/trade/service.js +24 -7
- package/dist/trade/service.js.map +1 -1
- package/dist/tui/app.d.ts +23 -0
- package/dist/tui/app.js +322 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/commands.d.ts +70 -0
- package/dist/tui/commands.js +313 -0
- package/dist/tui/commands.js.map +1 -0
- package/dist/tui/entries.d.ts +17 -0
- package/dist/tui/entries.js +24 -0
- package/dist/tui/entries.js.map +1 -0
- package/dist/tui/execute.d.ts +26 -0
- package/dist/tui/execute.js +664 -0
- package/dist/tui/execute.js.map +1 -0
- package/dist/tui/history.d.ts +17 -0
- package/dist/tui/history.js +48 -0
- package/dist/tui/history.js.map +1 -0
- package/dist/tui/index.d.ts +8 -0
- package/dist/tui/index.js +48 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/line-editor.d.ts +44 -0
- package/dist/tui/line-editor.js +98 -0
- package/dist/tui/line-editor.js.map +1 -0
- package/dist/tui/progress.d.ts +23 -0
- package/dist/tui/progress.js +46 -0
- package/dist/tui/progress.js.map +1 -0
- package/dist/tui/settings-editor.d.ts +18 -0
- package/dist/tui/settings-editor.js +115 -0
- package/dist/tui/settings-editor.js.map +1 -0
- package/docs/live-trading.md +455 -0
- package/docs/strategy-research.md +597 -0
- package/package.json +10 -1
- package/python/desic_strategy/__init__.py +34 -0
- package/python/desic_strategy/actions.py +158 -0
- package/python/desic_strategy/context.py +164 -0
- package/python/desic_strategy/engine.py +614 -0
- package/python/desic_strategy/indicators.py +159 -0
- package/python/desic_strategy/live.py +253 -0
- package/python/desic_strategy/policy.py +193 -0
- package/python/desic_strategy/portfolio.py +152 -0
- package/python/desic_strategy/report.py +319 -0
- package/python/desic_strategy/runner.py +574 -0
- package/python/desic_strategy/timeframe.py +150 -0
- package/python/main.py +18 -0
- package/skills/okx-live-trading/SKILL.md +117 -0
- package/skills/okx-live-trading/agents/openai.yaml +9 -0
- package/skills/okx-live-trading/references/lifecycle.md +128 -0
- package/skills/okx-strategy-research/SKILL.md +113 -0
- package/skills/okx-strategy-research/agents/openai.yaml +9 -0
- package/skills/okx-strategy-research/references/execution-semantics.md +107 -0
- package/skills/okx-strategy-research/references/field-traps.md +142 -0
- package/skills/okx-strategy-research/references/python-api.md +121 -0
- package/skills/okx-strategy-research/references/tools-and-data.md +192 -0
- package/skills/okx-trading/SKILL.md +11 -10
package/dist/setup/wizard.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import * as prompts from "@clack/prompts";
|
|
2
|
-
import {
|
|
2
|
+
import { detectAccountEnvironment } from "../account/service.js";
|
|
3
3
|
import { loadStoredConfig, saveConfig } from "../config/loader.js";
|
|
4
4
|
import { CONFIG_PATH } from "../config/paths.js";
|
|
5
5
|
import { publicError } from "../core/errors.js";
|
|
6
6
|
import { OkxClient } from "../core/okx-client.js";
|
|
7
7
|
import { checkOkxConnectivity, OKX_REST_BASE_URL } from "../network/connectivity.js";
|
|
8
8
|
import { displayProxy, normalizeProxyUrl, resolveProxy } from "../network/proxy.js";
|
|
9
|
-
import { SETUP_TARGETS, SetupCancelledError, setupSucceeded, setupTargets } from "./installer.js";
|
|
9
|
+
import { bundledSkillCount, SETUP_TARGETS, SetupCancelledError, setupSucceeded, setupTargets } from "./installer.js";
|
|
10
10
|
const TARGET_LABELS = {
|
|
11
11
|
codex: "Codex",
|
|
12
12
|
"claude-code": "Claude Code",
|
|
@@ -16,12 +16,13 @@ const TARGET_LABELS = {
|
|
|
16
16
|
};
|
|
17
17
|
export async function runSetupWizard(options = {}) {
|
|
18
18
|
prompts.intro("Desic OKX Agent setup");
|
|
19
|
+
const skillHint = `MCP + ${bundledSkillCount()} Skills`;
|
|
19
20
|
const selection = await prompts.multiselect({
|
|
20
21
|
message: "Choose AI clients to configure",
|
|
21
22
|
options: [
|
|
22
23
|
{ value: "all", label: "All supported clients", hint: "MCP for all clients; Skills where supported" },
|
|
23
|
-
{ value: "codex", label: "Codex", hint:
|
|
24
|
-
{ value: "claude-code", label: "Claude Code", hint:
|
|
24
|
+
{ value: "codex", label: "Codex", hint: skillHint },
|
|
25
|
+
{ value: "claude-code", label: "Claude Code", hint: skillHint },
|
|
25
26
|
{ value: "cursor", label: "Cursor", hint: "MCP" },
|
|
26
27
|
{ value: "vscode", label: "VS Code / GitHub Copilot", hint: "MCP" },
|
|
27
28
|
{ value: "cline", label: "Cline", hint: "MCP" }
|
|
@@ -165,29 +166,25 @@ async function configureAccount(networkAvailable, proxy) {
|
|
|
165
166
|
});
|
|
166
167
|
cancelIfNeeded(nameValue);
|
|
167
168
|
const name = nameValue.trim();
|
|
168
|
-
const environmentValue = await prompts.select({
|
|
169
|
-
message: "OKX environment",
|
|
170
|
-
options: [
|
|
171
|
-
{ value: "live", label: "Live", hint: "Required for remote News and Smart Money" },
|
|
172
|
-
{ value: "demo", label: "Demo", hint: "Recommended for testing trading operations" }
|
|
173
|
-
]
|
|
174
|
-
});
|
|
175
|
-
cancelIfNeeded(environmentValue);
|
|
176
|
-
const environment = environmentValue;
|
|
177
169
|
const apiKey = await requiredPassword("API Key");
|
|
178
170
|
const secretKey = await requiredPassword("Secret Key");
|
|
179
171
|
const passphrase = await requiredPassword("Passphrase");
|
|
180
|
-
const candidate = loadStoredConfig();
|
|
181
|
-
candidate.accounts[name] = { environment, apiKey, secretKey, passphrase };
|
|
182
|
-
candidate.defaultAccount ??= name;
|
|
183
172
|
const spinner = prompts.spinner();
|
|
184
|
-
spinner.start(`Verifying '${name}'
|
|
173
|
+
spinner.start(`Verifying '${name}' and detecting its OKX environment`);
|
|
185
174
|
try {
|
|
186
175
|
const client = new OkxClient(OKX_REST_BASE_URL, proxy.url);
|
|
187
|
-
const
|
|
176
|
+
const detected = await detectAccountEnvironment(client, { name, apiKey, secretKey, passphrase });
|
|
177
|
+
const candidate = loadStoredConfig();
|
|
178
|
+
candidate.accounts[name] = {
|
|
179
|
+
environment: detected.account.environment,
|
|
180
|
+
apiKey,
|
|
181
|
+
secretKey,
|
|
182
|
+
passphrase
|
|
183
|
+
};
|
|
184
|
+
candidate.defaultAccount ??= name;
|
|
188
185
|
saveConfig(candidate);
|
|
189
|
-
spinner.stop(`Account '${name}' verified and saved`);
|
|
190
|
-
prompts.note(formatAccountPermissions(
|
|
186
|
+
spinner.stop(`Account '${name}' verified as ${detected.account.environment} and saved`);
|
|
187
|
+
prompts.note(formatAccountPermissions(detected.account.environment, detected.config), "OKX account");
|
|
191
188
|
return { changed: true, skipped: false, name };
|
|
192
189
|
}
|
|
193
190
|
catch (error) {
|
|
@@ -217,9 +214,9 @@ async function requiredPassword(message) {
|
|
|
217
214
|
cancelIfNeeded(value);
|
|
218
215
|
return value.trim();
|
|
219
216
|
}
|
|
220
|
-
function formatAccountPermissions(data) {
|
|
217
|
+
function formatAccountPermissions(environment, data) {
|
|
221
218
|
const permission = String(data.perm ?? data.permissions ?? "reported by OKX");
|
|
222
|
-
return `Saved to ${CONFIG_PATH}\
|
|
219
|
+
return `Saved to ${CONFIG_PATH}\nDetected environment: ${environment}\nAPI permissions: ${permission}`;
|
|
223
220
|
}
|
|
224
221
|
function formatSetupComplete(account) {
|
|
225
222
|
const accountMessage = account.changed
|
package/dist/setup/wizard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/setup/wizard.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/setup/wizard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Values shared with the Python engine.
|
|
3
|
+
*
|
|
4
|
+
* These must stay in step with `python/desic_strategy/report.py`; a test asserts
|
|
5
|
+
* the Python module still declares the same number.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Annualized return and Calmar are withheld below this window length.
|
|
9
|
+
*
|
|
10
|
+
* A five-day run extrapolates to five-digit percentages that read as precision
|
|
11
|
+
* but carry none, and any ratio built on them inherits that noise.
|
|
12
|
+
*/
|
|
13
|
+
export declare const MINIMUM_ANNUALIZATION_DAYS = 30;
|
|
14
|
+
/**
|
|
15
|
+
* Largest page a paged read will return, and therefore the largest `limit` the
|
|
16
|
+
* tools accept.
|
|
17
|
+
*
|
|
18
|
+
* One value shared by the tool schema, the store, and the paginating reader.
|
|
19
|
+
* When these drifted apart, a caller asking for 200,000 was rejected by the
|
|
20
|
+
* schema while a caller asking for exactly the store's cap silently received a
|
|
21
|
+
* prefix — two failure modes for the same mistake.
|
|
22
|
+
*/
|
|
23
|
+
export declare const MAX_PAGE_ROWS = 20000;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Values shared with the Python engine.
|
|
3
|
+
*
|
|
4
|
+
* These must stay in step with `python/desic_strategy/report.py`; a test asserts
|
|
5
|
+
* the Python module still declares the same number.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Annualized return and Calmar are withheld below this window length.
|
|
9
|
+
*
|
|
10
|
+
* A five-day run extrapolates to five-digit percentages that read as precision
|
|
11
|
+
* but carry none, and any ratio built on them inherits that noise.
|
|
12
|
+
*/
|
|
13
|
+
export const MINIMUM_ANNUALIZATION_DAYS = 30;
|
|
14
|
+
/**
|
|
15
|
+
* Largest page a paged read will return, and therefore the largest `limit` the
|
|
16
|
+
* tools accept.
|
|
17
|
+
*
|
|
18
|
+
* One value shared by the tool schema, the store, and the paginating reader.
|
|
19
|
+
* When these drifted apart, a caller asking for 200,000 was rejected by the
|
|
20
|
+
* schema while a caller asking for exactly the store's cap silently received a
|
|
21
|
+
* prefix — two failure modes for the same mistake.
|
|
22
|
+
*/
|
|
23
|
+
export const MAX_PAGE_ROWS = 20_000;
|
|
24
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/strategy/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAE7C;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export declare const PYTHON_ROOT: string;
|
|
2
|
+
export declare const VENV_DIR: string;
|
|
3
|
+
export declare const MINIMUM_PYTHON: readonly [3, 11];
|
|
4
|
+
export declare const REQUIRED_PACKAGES: readonly ["numpy", "pandas"];
|
|
5
|
+
/**
|
|
6
|
+
* Package index fallback chain.
|
|
7
|
+
*
|
|
8
|
+
* A single index is not enough in practice: a mirror that starts returning 403
|
|
9
|
+
* stalls setup completely, so each is tried in turn before failing.
|
|
10
|
+
*/
|
|
11
|
+
export declare const PACKAGE_INDEXES: readonly [{
|
|
12
|
+
readonly name: "tsinghua";
|
|
13
|
+
readonly url: "https://pypi.tuna.tsinghua.edu.cn/simple";
|
|
14
|
+
readonly host: "pypi.tuna.tsinghua.edu.cn";
|
|
15
|
+
}, {
|
|
16
|
+
readonly name: "aliyun";
|
|
17
|
+
readonly url: "https://mirrors.aliyun.com/pypi/simple";
|
|
18
|
+
readonly host: "mirrors.aliyun.com";
|
|
19
|
+
}, {
|
|
20
|
+
readonly name: "pypi";
|
|
21
|
+
readonly url: "https://pypi.org/simple";
|
|
22
|
+
readonly host: "pypi.org";
|
|
23
|
+
}];
|
|
24
|
+
export interface PythonStatus {
|
|
25
|
+
ready: boolean;
|
|
26
|
+
interpreter: string | null;
|
|
27
|
+
version: string | null;
|
|
28
|
+
venvPath: string;
|
|
29
|
+
packages: Record<string, boolean>;
|
|
30
|
+
engineRoot: string;
|
|
31
|
+
problems: string[];
|
|
32
|
+
}
|
|
33
|
+
/** Root of the bundled `desic_strategy` package and its `main.py` entry point. */
|
|
34
|
+
export declare function engineRoot(): string;
|
|
35
|
+
export declare function venvInterpreter(venvPath?: string): string;
|
|
36
|
+
/**
|
|
37
|
+
* Reports whether a usable interpreter exists, preferring the managed venv.
|
|
38
|
+
*
|
|
39
|
+
* The engine itself needs only the standard library, so a run is possible even
|
|
40
|
+
* when numpy and pandas are absent; they are reported so a strategy that
|
|
41
|
+
* imports them fails with a clear message instead of a traceback.
|
|
42
|
+
*/
|
|
43
|
+
export declare function pythonStatus(): Promise<PythonStatus>;
|
|
44
|
+
export interface SetupResult {
|
|
45
|
+
interpreter: string;
|
|
46
|
+
venvPath: string;
|
|
47
|
+
index: string | null;
|
|
48
|
+
installed: string[];
|
|
49
|
+
log: string[];
|
|
50
|
+
}
|
|
51
|
+
/** Creates the managed venv when absent and installs the pinned packages. */
|
|
52
|
+
export declare function setupPythonEnvironment(onLog?: (line: string) => void): Promise<SetupResult>;
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { promisify } from "node:util";
|
|
5
|
+
import { RuntimeError } from "../core/errors.js";
|
|
6
|
+
import { DATA_DIR } from "../config/paths.js";
|
|
7
|
+
const run = promisify(execFile);
|
|
8
|
+
export const PYTHON_ROOT = path.join(DATA_DIR, "python");
|
|
9
|
+
export const VENV_DIR = path.join(PYTHON_ROOT, "venv");
|
|
10
|
+
export const MINIMUM_PYTHON = [3, 11];
|
|
11
|
+
export const REQUIRED_PACKAGES = ["numpy", "pandas"];
|
|
12
|
+
/**
|
|
13
|
+
* Package index fallback chain.
|
|
14
|
+
*
|
|
15
|
+
* A single index is not enough in practice: a mirror that starts returning 403
|
|
16
|
+
* stalls setup completely, so each is tried in turn before failing.
|
|
17
|
+
*/
|
|
18
|
+
export const PACKAGE_INDEXES = [
|
|
19
|
+
{ name: "tsinghua", url: "https://pypi.tuna.tsinghua.edu.cn/simple", host: "pypi.tuna.tsinghua.edu.cn" },
|
|
20
|
+
{ name: "aliyun", url: "https://mirrors.aliyun.com/pypi/simple", host: "mirrors.aliyun.com" },
|
|
21
|
+
{ name: "pypi", url: "https://pypi.org/simple", host: "pypi.org" }
|
|
22
|
+
];
|
|
23
|
+
/** Root of the bundled `desic_strategy` package and its `main.py` entry point. */
|
|
24
|
+
export function engineRoot() {
|
|
25
|
+
// Resolved relative to this module so it works from `src` and from `dist`.
|
|
26
|
+
const fromDist = path.resolve(import.meta.dirname, "../../python");
|
|
27
|
+
if (fs.existsSync(path.join(fromDist, "main.py")))
|
|
28
|
+
return fromDist;
|
|
29
|
+
const fromSrc = path.resolve(import.meta.dirname, "../../../python");
|
|
30
|
+
if (fs.existsSync(path.join(fromSrc, "main.py")))
|
|
31
|
+
return fromSrc;
|
|
32
|
+
return fromDist;
|
|
33
|
+
}
|
|
34
|
+
export function venvInterpreter(venvPath = VENV_DIR) {
|
|
35
|
+
return process.platform === "win32"
|
|
36
|
+
? path.join(venvPath, "Scripts", "python.exe")
|
|
37
|
+
: path.join(venvPath, "bin", "python3");
|
|
38
|
+
}
|
|
39
|
+
/** Interpreters to consider, most specific first. */
|
|
40
|
+
function candidateInterpreters() {
|
|
41
|
+
const candidates = [venvInterpreter()];
|
|
42
|
+
for (let minor = 13; minor >= MINIMUM_PYTHON[1]; minor -= 1) {
|
|
43
|
+
candidates.push(`python3.${minor}`);
|
|
44
|
+
}
|
|
45
|
+
candidates.push("python3");
|
|
46
|
+
return candidates;
|
|
47
|
+
}
|
|
48
|
+
async function interpreterVersion(interpreter) {
|
|
49
|
+
try {
|
|
50
|
+
const { stdout } = await run(interpreter, ["-c", "import sys;print('%d.%d.%d' % sys.version_info[:3])"], {
|
|
51
|
+
timeout: 10_000
|
|
52
|
+
});
|
|
53
|
+
return stdout.trim() || null;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function versionIsSupported(version) {
|
|
60
|
+
const [major = 0, minor = 0] = version.split(".").map((part) => Number(part));
|
|
61
|
+
if (major !== MINIMUM_PYTHON[0])
|
|
62
|
+
return false;
|
|
63
|
+
return minor >= MINIMUM_PYTHON[1];
|
|
64
|
+
}
|
|
65
|
+
async function packagePresence(interpreter) {
|
|
66
|
+
const presence = {};
|
|
67
|
+
for (const name of REQUIRED_PACKAGES) {
|
|
68
|
+
try {
|
|
69
|
+
await run(interpreter, ["-c", `import ${name}`], { timeout: 20_000 });
|
|
70
|
+
presence[name] = true;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
presence[name] = false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return presence;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Reports whether a usable interpreter exists, preferring the managed venv.
|
|
80
|
+
*
|
|
81
|
+
* The engine itself needs only the standard library, so a run is possible even
|
|
82
|
+
* when numpy and pandas are absent; they are reported so a strategy that
|
|
83
|
+
* imports them fails with a clear message instead of a traceback.
|
|
84
|
+
*/
|
|
85
|
+
export async function pythonStatus() {
|
|
86
|
+
const root = engineRoot();
|
|
87
|
+
const problems = [];
|
|
88
|
+
if (!fs.existsSync(path.join(root, "main.py"))) {
|
|
89
|
+
problems.push(`The bundled strategy engine is missing from ${root}`);
|
|
90
|
+
}
|
|
91
|
+
for (const candidate of candidateInterpreters()) {
|
|
92
|
+
const version = await interpreterVersion(candidate);
|
|
93
|
+
if (!version)
|
|
94
|
+
continue;
|
|
95
|
+
if (!versionIsSupported(version)) {
|
|
96
|
+
problems.push(`${candidate} is Python ${version}; ${MINIMUM_PYTHON.join(".")}+ is required`);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const packages = await packagePresence(candidate);
|
|
100
|
+
const missing = Object.entries(packages)
|
|
101
|
+
.filter(([, present]) => !present)
|
|
102
|
+
.map(([name]) => name);
|
|
103
|
+
if (missing.length) {
|
|
104
|
+
problems.push(`Missing Python packages: ${missing.join(", ")}. Run 'desic-okx strategy env --setup' to install them.`);
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
ready: problems.length === 0,
|
|
108
|
+
interpreter: candidate,
|
|
109
|
+
version,
|
|
110
|
+
venvPath: VENV_DIR,
|
|
111
|
+
packages,
|
|
112
|
+
engineRoot: root,
|
|
113
|
+
problems
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
problems.push(`No Python ${MINIMUM_PYTHON.join(".")}+ interpreter was found. Install Python, then run 'desic-okx strategy env --setup'.`);
|
|
117
|
+
return {
|
|
118
|
+
ready: false,
|
|
119
|
+
interpreter: null,
|
|
120
|
+
version: null,
|
|
121
|
+
venvPath: VENV_DIR,
|
|
122
|
+
packages: {},
|
|
123
|
+
engineRoot: root,
|
|
124
|
+
problems
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/** Creates the managed venv when absent and installs the pinned packages. */
|
|
128
|
+
export async function setupPythonEnvironment(onLog) {
|
|
129
|
+
const log = [];
|
|
130
|
+
const note = (line) => {
|
|
131
|
+
log.push(line);
|
|
132
|
+
onLog?.(line);
|
|
133
|
+
};
|
|
134
|
+
let base = null;
|
|
135
|
+
for (const candidate of candidateInterpreters().slice(1)) {
|
|
136
|
+
const version = await interpreterVersion(candidate);
|
|
137
|
+
if (version && versionIsSupported(version)) {
|
|
138
|
+
base = candidate;
|
|
139
|
+
note(`Using ${candidate} (Python ${version}) to create the environment`);
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (!base) {
|
|
144
|
+
throw new RuntimeError("CAPABILITY_UNAVAILABLE", `No Python ${MINIMUM_PYTHON.join(".")}+ interpreter was found on PATH`);
|
|
145
|
+
}
|
|
146
|
+
fs.mkdirSync(PYTHON_ROOT, { recursive: true, mode: 0o700 });
|
|
147
|
+
const interpreter = venvInterpreter();
|
|
148
|
+
if (!fs.existsSync(interpreter)) {
|
|
149
|
+
note(`Creating a virtual environment at ${VENV_DIR}`);
|
|
150
|
+
await run(base, ["-m", "venv", VENV_DIR], { timeout: 180_000 });
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
note("Reusing the existing virtual environment");
|
|
154
|
+
}
|
|
155
|
+
let usedIndex = null;
|
|
156
|
+
let lastError;
|
|
157
|
+
for (const index of PACKAGE_INDEXES) {
|
|
158
|
+
try {
|
|
159
|
+
note(`Installing ${REQUIRED_PACKAGES.join(", ")} from ${index.name}`);
|
|
160
|
+
await run(interpreter, [
|
|
161
|
+
"-m",
|
|
162
|
+
"pip",
|
|
163
|
+
"install",
|
|
164
|
+
"--disable-pip-version-check",
|
|
165
|
+
"--no-input",
|
|
166
|
+
"--index-url",
|
|
167
|
+
index.url,
|
|
168
|
+
"--trusted-host",
|
|
169
|
+
index.host,
|
|
170
|
+
...REQUIRED_PACKAGES
|
|
171
|
+
], { timeout: 600_000 });
|
|
172
|
+
usedIndex = index.name;
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
lastError = error;
|
|
177
|
+
note(`${index.name} failed; trying the next index`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (!usedIndex) {
|
|
181
|
+
const detail = lastError instanceof Error ? lastError.message : "unknown error";
|
|
182
|
+
throw new RuntimeError("NETWORK", `Could not install Python packages from any index (${PACKAGE_INDEXES.map((item) => item.name).join(", ")}): ${detail}`, true);
|
|
183
|
+
}
|
|
184
|
+
note("Environment ready");
|
|
185
|
+
return { interpreter, venvPath: VENV_DIR, index: usedIndex, installed: [...REQUIRED_PACKAGES], log };
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/strategy/environment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { MarketService } from "../market/service.js";
|
|
2
|
+
/**
|
|
3
|
+
* Contract specification a backtest needs, as the exchange reports it.
|
|
4
|
+
*
|
|
5
|
+
* Sizing depends entirely on these: `contractValue * contractMultiplier` is how
|
|
6
|
+
* many base-currency units one contract represents, and `lotSize` / `minSize`
|
|
7
|
+
* decide what quantities are legal. Guessing them produces a run whose position
|
|
8
|
+
* sizes are wrong by whatever factor the guess was off, while every reported
|
|
9
|
+
* metric still looks plausible.
|
|
10
|
+
*/
|
|
11
|
+
export interface ContractSpec {
|
|
12
|
+
instId: string;
|
|
13
|
+
contractValue: number;
|
|
14
|
+
contractMultiplier: number;
|
|
15
|
+
lotSize: number;
|
|
16
|
+
minSize: number;
|
|
17
|
+
tickSize: number;
|
|
18
|
+
/** Base currency one contract is denominated in, for display. */
|
|
19
|
+
contractValueCurrency: string | null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Reads an instrument's specification from the market service.
|
|
23
|
+
*
|
|
24
|
+
* The values are cached by that service, so a repeated backtest on one
|
|
25
|
+
* instrument does not re-fetch. Every field is validated: a specification that
|
|
26
|
+
* arrived incomplete must stop the run rather than fall back to a default that
|
|
27
|
+
* silently changes what was simulated.
|
|
28
|
+
*/
|
|
29
|
+
export declare function loadContractSpec(market: MarketService, instId: string): Promise<ContractSpec>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { RuntimeError } from "../core/errors.js";
|
|
2
|
+
/**
|
|
3
|
+
* Reads an instrument's specification from the market service.
|
|
4
|
+
*
|
|
5
|
+
* The values are cached by that service, so a repeated backtest on one
|
|
6
|
+
* instrument does not re-fetch. Every field is validated: a specification that
|
|
7
|
+
* arrived incomplete must stop the run rather than fall back to a default that
|
|
8
|
+
* silently changes what was simulated.
|
|
9
|
+
*/
|
|
10
|
+
export async function loadContractSpec(market, instId) {
|
|
11
|
+
const result = await market.getInstrument(instId);
|
|
12
|
+
const row = result.data;
|
|
13
|
+
const contractValue = positive(row.ctVal, "ctVal", instId);
|
|
14
|
+
// OKX omits ctMult on some instruments; absent means one, but a present value
|
|
15
|
+
// that is unparseable is an error rather than something to assume away.
|
|
16
|
+
const contractMultiplier = row.ctMult === undefined || row.ctMult === null || row.ctMult === ""
|
|
17
|
+
? 1
|
|
18
|
+
: positive(row.ctMult, "ctMult", instId);
|
|
19
|
+
const lotSize = positive(row.lotSz, "lotSz", instId);
|
|
20
|
+
const minSize = positive(row.minSz, "minSz", instId);
|
|
21
|
+
const tickSize = positive(row.tickSz, "tickSz", instId);
|
|
22
|
+
return {
|
|
23
|
+
instId,
|
|
24
|
+
contractValue,
|
|
25
|
+
contractMultiplier,
|
|
26
|
+
lotSize,
|
|
27
|
+
minSize,
|
|
28
|
+
tickSize,
|
|
29
|
+
contractValueCurrency: typeof row.ctValCcy === "string" && row.ctValCcy ? row.ctValCcy : null
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function positive(value, field, instId) {
|
|
33
|
+
const parsed = Number(value);
|
|
34
|
+
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
35
|
+
throw new RuntimeError("STALE_DATA", `OKX did not report a usable ${field} for ${instId}; a backtest cannot size positions without it`, true, { instId, field, received: value === undefined ? null : String(value) });
|
|
36
|
+
}
|
|
37
|
+
return parsed;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=instrument.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrument.js","sourceRoot":"","sources":["../../src/strategy/instrument.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAuBjD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAqB,EAAE,MAAc;IAC1E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,CAAC,IAA+B,CAAC;IAEnD,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3D,8EAA8E;IAC9E,wEAAwE;IACxE,MAAM,kBAAkB,GAAG,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE;QAC7F,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAExD,OAAO;QACL,MAAM;QACN,aAAa;QACb,kBAAkB;QAClB,OAAO;QACP,OAAO;QACP,QAAQ;QACR,qBAAqB,EAAE,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;KAC9F,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc,EAAE,KAAa,EAAE,MAAc;IAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,YAAY,CACpB,YAAY,EACZ,+BAA+B,KAAK,QAAQ,MAAM,+CAA+C,EACjG,IAAI,EACJ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACxE,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Share of the window used to search. The rest is held back.
|
|
3
|
+
*
|
|
4
|
+
* Splitting is the whole point of the exercise rather than a refinement: the
|
|
5
|
+
* best parameters over any window are partly fitted to its noise, so a figure
|
|
6
|
+
* measured on the same bars that chose them is not evidence. 7:3 keeps enough
|
|
7
|
+
* bars to search over while leaving a segment long enough to disagree.
|
|
8
|
+
*/
|
|
9
|
+
export declare const TRAIN_FRACTION = 0.7;
|
|
10
|
+
/**
|
|
11
|
+
* Smallest segment worth evaluating, in bars.
|
|
12
|
+
*
|
|
13
|
+
* A one-day validation segment produces a return that a single trade decides,
|
|
14
|
+
* and ranking on that is ranking on coincidence.
|
|
15
|
+
*/
|
|
16
|
+
export declare const MINIMUM_SEGMENT_BARS = 1440;
|
|
17
|
+
export interface WindowSplit {
|
|
18
|
+
/** Inclusive first evaluation open of the training segment. */
|
|
19
|
+
trainStart: number;
|
|
20
|
+
/** Inclusive last evaluation open of the training segment. */
|
|
21
|
+
trainEnd: number;
|
|
22
|
+
validationStart: number;
|
|
23
|
+
validationEnd: number;
|
|
24
|
+
trainBars: number;
|
|
25
|
+
validationBars: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Splits an evaluation window into a training and a validation segment.
|
|
29
|
+
*
|
|
30
|
+
* The two are contiguous and disjoint: the validation segment begins on the
|
|
31
|
+
* minute after the training segment ends. Overlapping them by even one bar would
|
|
32
|
+
* let a candidate be credited for a bar it was chosen on.
|
|
33
|
+
*/
|
|
34
|
+
export declare function splitWindow(evaluationStart: number, evaluationEnd: number): WindowSplit;
|
|
35
|
+
/** Which ranking formula a score came from. Reported, never inferred. */
|
|
36
|
+
export type RankBasis = "calmar" | "return_over_drawdown" | "return";
|
|
37
|
+
export interface RankScore {
|
|
38
|
+
score: number;
|
|
39
|
+
basis: RankBasis;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Scores one candidate from its validation-segment metrics.
|
|
43
|
+
*
|
|
44
|
+
* Calmar is the intended measure, but it divides an annualized return by
|
|
45
|
+
* drawdown, and the engine withholds annualized figures below
|
|
46
|
+
* `MINIMUM_ANNUALIZATION_DAYS` because extrapolating a short window produces
|
|
47
|
+
* five-digit percentages that read as precision and carry none. Rather than fall
|
|
48
|
+
* back silently, the basis used travels with the score and is printed beside the
|
|
49
|
+
* table: a column headed "calmar" that is sometimes a different quantity is worse
|
|
50
|
+
* than an honest label.
|
|
51
|
+
*
|
|
52
|
+
* Every basis keeps the sign of the return, so a losing candidate can never
|
|
53
|
+
* outrank a profitable one through a small denominator.
|
|
54
|
+
*/
|
|
55
|
+
export declare function rankCandidate(metrics: Record<string, unknown> | null | undefined): RankScore;
|
|
56
|
+
/** Message-bundle-free description of a basis, for the report footer. */
|
|
57
|
+
export declare function describeRankBasis(basis: RankBasis, validationDays: number): string;
|
|
58
|
+
/**
|
|
59
|
+
* How a candidate's training result survived the held-back segment.
|
|
60
|
+
*
|
|
61
|
+
* `overfit` is the one worth reading: profitable while being chosen, unprofitable
|
|
62
|
+
* once it could no longer see the answer.
|
|
63
|
+
*
|
|
64
|
+
* `unexplained` is the mirror image and just as important. A candidate that lost
|
|
65
|
+
* money while being chosen and made money afterwards did not carry an edge across
|
|
66
|
+
* the split — there was none to carry. The validation profit came from what those
|
|
67
|
+
* particular bars did, which is exactly the reasoning the split exists to prevent.
|
|
68
|
+
* Calling that `holds` would credit a candidate for a segment it happened to land
|
|
69
|
+
* in. It stays rankable, because the score is the score, but it is not evidence
|
|
70
|
+
* that the parameters work.
|
|
71
|
+
*/
|
|
72
|
+
export type Verdict = "holds" | "overfit" | "weak" | "unexplained" | "failed";
|
|
73
|
+
export declare function verdictFor(train: Record<string, unknown> | null | undefined, validation: Record<string, unknown> | null | undefined): Verdict;
|