desic-okx-agent 0.2.0 → 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.
Files changed (237) hide show
  1. package/README.en.md +353 -0
  2. package/README.md +194 -190
  3. package/dist/account/private-websocket.js +4 -4
  4. package/dist/account/private-websocket.js.map +1 -1
  5. package/dist/account/service.d.ts +12 -1
  6. package/dist/account/service.js +18 -0
  7. package/dist/account/service.js.map +1 -1
  8. package/dist/bars/rate-limiter.d.ts +18 -0
  9. package/dist/bars/rate-limiter.js +84 -0
  10. package/dist/bars/rate-limiter.js.map +1 -0
  11. package/dist/bars/schema.d.ts +36 -0
  12. package/dist/bars/schema.js +134 -0
  13. package/dist/bars/schema.js.map +1 -0
  14. package/dist/bars/service.d.ts +60 -0
  15. package/dist/bars/service.js +120 -0
  16. package/dist/bars/service.js.map +1 -0
  17. package/dist/bars/store.d.ts +105 -0
  18. package/dist/bars/store.js +415 -0
  19. package/dist/bars/store.js.map +1 -0
  20. package/dist/bars/timeframe.d.ts +40 -0
  21. package/dist/bars/timeframe.js +146 -0
  22. package/dist/bars/timeframe.js.map +1 -0
  23. package/dist/bars/types.d.ts +68 -0
  24. package/dist/bars/types.js +13 -0
  25. package/dist/bars/types.js.map +1 -0
  26. package/dist/cli/data-render.d.ts +37 -0
  27. package/dist/cli/data-render.js +143 -0
  28. package/dist/cli/data-render.js.map +1 -0
  29. package/dist/cli/doctor.js +7 -3
  30. package/dist/cli/doctor.js.map +1 -1
  31. package/dist/cli/index.js +758 -27
  32. package/dist/cli/index.js.map +1 -1
  33. package/dist/cli/live-render.d.ts +24 -0
  34. package/dist/cli/live-render.js +85 -0
  35. package/dist/cli/live-render.js.map +1 -0
  36. package/dist/cli/range.d.ts +28 -0
  37. package/dist/cli/range.js +63 -0
  38. package/dist/cli/range.js.map +1 -0
  39. package/dist/cli/render.js +3 -0
  40. package/dist/cli/render.js.map +1 -1
  41. package/dist/cli/strategy-render.d.ts +36 -0
  42. package/dist/cli/strategy-render.js +391 -0
  43. package/dist/cli/strategy-render.js.map +1 -0
  44. package/dist/cli/width.d.ts +18 -0
  45. package/dist/cli/width.js +71 -0
  46. package/dist/cli/width.js.map +1 -0
  47. package/dist/config/loader.js +1 -1
  48. package/dist/config/schema.d.ts +7 -0
  49. package/dist/config/schema.js +24 -0
  50. package/dist/config/schema.js.map +1 -1
  51. package/dist/core/okx-client.d.ts +9 -1
  52. package/dist/core/okx-client.js +14 -5
  53. package/dist/core/okx-client.js.map +1 -1
  54. package/dist/i18n/locale.d.ts +24 -0
  55. package/dist/i18n/locale.js +65 -0
  56. package/dist/i18n/locale.js.map +1 -0
  57. package/dist/i18n/messages.d.ts +333 -0
  58. package/dist/i18n/messages.js +660 -0
  59. package/dist/i18n/messages.js.map +1 -0
  60. package/dist/live/account-snapshot.d.ts +30 -0
  61. package/dist/live/account-snapshot.js +130 -0
  62. package/dist/live/account-snapshot.js.map +1 -0
  63. package/dist/live/cutoff-queue.d.ts +42 -0
  64. package/dist/live/cutoff-queue.js +69 -0
  65. package/dist/live/cutoff-queue.js.map +1 -0
  66. package/dist/live/execution-key.d.ts +23 -0
  67. package/dist/live/execution-key.js +31 -0
  68. package/dist/live/execution-key.js.map +1 -0
  69. package/dist/live/failures.d.ts +37 -0
  70. package/dist/live/failures.js +57 -0
  71. package/dist/live/failures.js.map +1 -0
  72. package/dist/live/gates.d.ts +65 -0
  73. package/dist/live/gates.js +136 -0
  74. package/dist/live/gates.js.map +1 -0
  75. package/dist/live/loop.d.ts +56 -0
  76. package/dist/live/loop.js +197 -0
  77. package/dist/live/loop.js.map +1 -0
  78. package/dist/live/preconditions.d.ts +48 -0
  79. package/dist/live/preconditions.js +69 -0
  80. package/dist/live/preconditions.js.map +1 -0
  81. package/dist/live/reconcile.d.ts +46 -0
  82. package/dist/live/reconcile.js +104 -0
  83. package/dist/live/reconcile.js.map +1 -0
  84. package/dist/live/runner.d.ts +57 -0
  85. package/dist/live/runner.js +160 -0
  86. package/dist/live/runner.js.map +1 -0
  87. package/dist/live/schema.d.ts +18 -0
  88. package/dist/live/schema.js +91 -0
  89. package/dist/live/schema.js.map +1 -0
  90. package/dist/live/service.d.ts +144 -0
  91. package/dist/live/service.js +303 -0
  92. package/dist/live/service.js.map +1 -0
  93. package/dist/live/session.d.ts +85 -0
  94. package/dist/live/session.js +234 -0
  95. package/dist/live/session.js.map +1 -0
  96. package/dist/live/sizing.d.ts +62 -0
  97. package/dist/live/sizing.js +79 -0
  98. package/dist/live/sizing.js.map +1 -0
  99. package/dist/live/store.d.ts +123 -0
  100. package/dist/live/store.js +350 -0
  101. package/dist/live/store.js.map +1 -0
  102. package/dist/live/types.d.ts +82 -0
  103. package/dist/live/types.js +2 -0
  104. package/dist/live/types.js.map +1 -0
  105. package/dist/market/websocket.d.ts +16 -1
  106. package/dist/market/websocket.js +60 -5
  107. package/dist/market/websocket.js.map +1 -1
  108. package/dist/mcp/server.d.ts +1 -0
  109. package/dist/mcp/server.js +15 -1
  110. package/dist/mcp/server.js.map +1 -1
  111. package/dist/network/connectivity.d.ts +9 -1
  112. package/dist/network/connectivity.js +28 -1
  113. package/dist/network/connectivity.js.map +1 -1
  114. package/dist/report/chart-script.d.ts +12 -0
  115. package/dist/report/chart-script.js +146 -0
  116. package/dist/report/chart-script.js.map +1 -0
  117. package/dist/report/compare-html.d.ts +8 -0
  118. package/dist/report/compare-html.js +254 -0
  119. package/dist/report/compare-html.js.map +1 -0
  120. package/dist/report/compare-script.d.ts +12 -0
  121. package/dist/report/compare-script.js +109 -0
  122. package/dist/report/compare-script.js.map +1 -0
  123. package/dist/report/compare.d.ts +61 -0
  124. package/dist/report/compare.js +205 -0
  125. package/dist/report/compare.js.map +1 -0
  126. package/dist/report/fetch.d.ts +20 -0
  127. package/dist/report/fetch.js +56 -0
  128. package/dist/report/fetch.js.map +1 -0
  129. package/dist/report/html.d.ts +54 -0
  130. package/dist/report/html.js +641 -0
  131. package/dist/report/html.js.map +1 -0
  132. package/dist/report/open.d.ts +42 -0
  133. package/dist/report/open.js +114 -0
  134. package/dist/report/open.js.map +1 -0
  135. package/dist/runtime/server.d.ts +16 -1
  136. package/dist/runtime/server.js +112 -9
  137. package/dist/runtime/server.js.map +1 -1
  138. package/dist/setup/installer.d.ts +1 -0
  139. package/dist/setup/installer.js +8 -0
  140. package/dist/setup/installer.js.map +1 -1
  141. package/dist/setup/wizard.d.ts +3 -0
  142. package/dist/setup/wizard.js +131 -6
  143. package/dist/setup/wizard.js.map +1 -1
  144. package/dist/strategy/constants.d.ts +23 -0
  145. package/dist/strategy/constants.js +24 -0
  146. package/dist/strategy/constants.js.map +1 -0
  147. package/dist/strategy/environment.d.ts +52 -0
  148. package/dist/strategy/environment.js +187 -0
  149. package/dist/strategy/environment.js.map +1 -0
  150. package/dist/strategy/instrument.d.ts +29 -0
  151. package/dist/strategy/instrument.js +39 -0
  152. package/dist/strategy/instrument.js.map +1 -0
  153. package/dist/strategy/optimize.d.ts +73 -0
  154. package/dist/strategy/optimize.js +113 -0
  155. package/dist/strategy/optimize.js.map +1 -0
  156. package/dist/strategy/parameter-space.d.ts +59 -0
  157. package/dist/strategy/parameter-space.js +221 -0
  158. package/dist/strategy/parameter-space.js.map +1 -0
  159. package/dist/strategy/python-bridge.d.ts +24 -0
  160. package/dist/strategy/python-bridge.js +114 -0
  161. package/dist/strategy/python-bridge.js.map +1 -0
  162. package/dist/strategy/schema.d.ts +9 -0
  163. package/dist/strategy/schema.js +91 -0
  164. package/dist/strategy/schema.js.map +1 -0
  165. package/dist/strategy/service.d.ts +138 -0
  166. package/dist/strategy/service.js +745 -0
  167. package/dist/strategy/service.js.map +1 -0
  168. package/dist/strategy/settings.d.ts +162 -0
  169. package/dist/strategy/settings.js +243 -0
  170. package/dist/strategy/settings.js.map +1 -0
  171. package/dist/strategy/store.d.ts +96 -0
  172. package/dist/strategy/store.js +367 -0
  173. package/dist/strategy/store.js.map +1 -0
  174. package/dist/strategy/templates.d.ts +11 -0
  175. package/dist/strategy/templates.js +134 -0
  176. package/dist/strategy/templates.js.map +1 -0
  177. package/dist/strategy/types.d.ts +111 -0
  178. package/dist/strategy/types.js +2 -0
  179. package/dist/strategy/types.js.map +1 -0
  180. package/dist/tools/catalog.d.ts +16 -0
  181. package/dist/tools/catalog.js +118 -17
  182. package/dist/tools/catalog.js.map +1 -1
  183. package/dist/trade/service.d.ts +12 -0
  184. package/dist/trade/service.js +24 -7
  185. package/dist/trade/service.js.map +1 -1
  186. package/dist/tui/app.d.ts +23 -0
  187. package/dist/tui/app.js +322 -0
  188. package/dist/tui/app.js.map +1 -0
  189. package/dist/tui/commands.d.ts +70 -0
  190. package/dist/tui/commands.js +313 -0
  191. package/dist/tui/commands.js.map +1 -0
  192. package/dist/tui/entries.d.ts +17 -0
  193. package/dist/tui/entries.js +24 -0
  194. package/dist/tui/entries.js.map +1 -0
  195. package/dist/tui/execute.d.ts +26 -0
  196. package/dist/tui/execute.js +664 -0
  197. package/dist/tui/execute.js.map +1 -0
  198. package/dist/tui/history.d.ts +17 -0
  199. package/dist/tui/history.js +48 -0
  200. package/dist/tui/history.js.map +1 -0
  201. package/dist/tui/index.d.ts +8 -0
  202. package/dist/tui/index.js +48 -0
  203. package/dist/tui/index.js.map +1 -0
  204. package/dist/tui/line-editor.d.ts +44 -0
  205. package/dist/tui/line-editor.js +98 -0
  206. package/dist/tui/line-editor.js.map +1 -0
  207. package/dist/tui/progress.d.ts +23 -0
  208. package/dist/tui/progress.js +46 -0
  209. package/dist/tui/progress.js.map +1 -0
  210. package/dist/tui/settings-editor.d.ts +18 -0
  211. package/dist/tui/settings-editor.js +115 -0
  212. package/dist/tui/settings-editor.js.map +1 -0
  213. package/docs/live-trading.md +455 -0
  214. package/docs/strategy-research.md +597 -0
  215. package/package.json +11 -1
  216. package/python/desic_strategy/__init__.py +34 -0
  217. package/python/desic_strategy/actions.py +158 -0
  218. package/python/desic_strategy/context.py +164 -0
  219. package/python/desic_strategy/engine.py +614 -0
  220. package/python/desic_strategy/indicators.py +159 -0
  221. package/python/desic_strategy/live.py +253 -0
  222. package/python/desic_strategy/policy.py +193 -0
  223. package/python/desic_strategy/portfolio.py +152 -0
  224. package/python/desic_strategy/report.py +319 -0
  225. package/python/desic_strategy/runner.py +574 -0
  226. package/python/desic_strategy/timeframe.py +150 -0
  227. package/python/main.py +18 -0
  228. package/skills/okx-live-trading/SKILL.md +117 -0
  229. package/skills/okx-live-trading/agents/openai.yaml +9 -0
  230. package/skills/okx-live-trading/references/lifecycle.md +128 -0
  231. package/skills/okx-strategy-research/SKILL.md +113 -0
  232. package/skills/okx-strategy-research/agents/openai.yaml +9 -0
  233. package/skills/okx-strategy-research/references/execution-semantics.md +107 -0
  234. package/skills/okx-strategy-research/references/field-traps.md +142 -0
  235. package/skills/okx-strategy-research/references/python-api.md +121 -0
  236. package/skills/okx-strategy-research/references/tools-and-data.md +192 -0
  237. package/skills/okx-trading/SKILL.md +11 -10
@@ -1,9 +1,12 @@
1
1
  import * as prompts from "@clack/prompts";
2
+ import { detectAccountEnvironment } from "../account/service.js";
2
3
  import { loadStoredConfig, saveConfig } from "../config/loader.js";
3
4
  import { CONFIG_PATH } from "../config/paths.js";
4
- import { checkOkxConnectivity } from "../network/connectivity.js";
5
+ import { publicError } from "../core/errors.js";
6
+ import { OkxClient } from "../core/okx-client.js";
7
+ import { checkOkxConnectivity, OKX_REST_BASE_URL } from "../network/connectivity.js";
5
8
  import { displayProxy, normalizeProxyUrl, resolveProxy } from "../network/proxy.js";
6
- import { SETUP_TARGETS, SetupCancelledError, setupSucceeded, setupTargets } from "./installer.js";
9
+ import { bundledSkillCount, SETUP_TARGETS, SetupCancelledError, setupSucceeded, setupTargets } from "./installer.js";
7
10
  const TARGET_LABELS = {
8
11
  codex: "Codex",
9
12
  "claude-code": "Claude Code",
@@ -13,12 +16,13 @@ const TARGET_LABELS = {
13
16
  };
14
17
  export async function runSetupWizard(options = {}) {
15
18
  prompts.intro("Desic OKX Agent setup");
19
+ const skillHint = `MCP + ${bundledSkillCount()} Skills`;
16
20
  const selection = await prompts.multiselect({
17
21
  message: "Choose AI clients to configure",
18
22
  options: [
19
23
  { value: "all", label: "All supported clients", hint: "MCP for all clients; Skills where supported" },
20
- { value: "codex", label: "Codex", hint: "MCP + 7 Skills" },
21
- { value: "claude-code", label: "Claude Code", hint: "MCP + 7 Skills" },
24
+ { value: "codex", label: "Codex", hint: skillHint },
25
+ { value: "claude-code", label: "Claude Code", hint: skillHint },
22
26
  { value: "cursor", label: "Cursor", hint: "MCP" },
23
27
  { value: "vscode", label: "VS Code / GitHub Copilot", hint: "MCP" },
24
28
  { value: "cline", label: "Cline", hint: "MCP" }
@@ -93,11 +97,132 @@ export async function runSetupWizard(options = {}) {
93
97
  prompts.log.success(formatNetworkSuccess(network, proxy));
94
98
  if (networkSkipped)
95
99
  prompts.log.warn("Network check skipped. Public and trading tools may be unavailable.");
100
+ const account = await configureAccount(network?.ok === true, proxy);
96
101
  const succeeded = setupSucceeded(results) && (network?.ok || networkSkipped);
97
102
  prompts.outro(succeeded
98
- ? "Setup complete. Restart the selected AI clients."
103
+ ? formatSetupComplete(account)
99
104
  : "Setup finished with errors. Review the failed clients above.");
100
- return { targets, results, network, proxy, proxyChanged, networkSkipped };
105
+ return {
106
+ targets,
107
+ results,
108
+ network,
109
+ proxy,
110
+ proxyChanged,
111
+ networkSkipped,
112
+ accountChanged: account.changed,
113
+ accountSkipped: account.skipped,
114
+ accountName: account.name
115
+ };
116
+ }
117
+ async function configureAccount(networkAvailable, proxy) {
118
+ const stored = loadStoredConfig();
119
+ const existingNames = Object.keys(stored.accounts);
120
+ prompts.note([
121
+ "Public market and derivatives tools work without an API key.",
122
+ "An API key is required for account and trading tools.",
123
+ "Remote News and Smart Money also require a live-account API key; read-only permission is sufficient.",
124
+ "Create the key in the official OKX website or app. You can skip this step and run `desic-okx account add` later."
125
+ ].join("\n"), "OKX API account (optional)");
126
+ if (!networkAvailable) {
127
+ prompts.log.info("Account setup skipped because OKX connectivity was not verified. Configure it later with `desic-okx account add`.");
128
+ return { changed: false, skipped: true };
129
+ }
130
+ const action = await prompts.select({
131
+ message: existingNames.length
132
+ ? `${existingNames.length} OKX account(s) already configured. What would you like to do?`
133
+ : "Would you like to configure an OKX API account now?",
134
+ options: existingNames.length
135
+ ? [
136
+ { value: "keep", label: "Keep existing accounts", hint: "You can add or edit accounts later" },
137
+ { value: "add", label: "Add another account", hint: "Verify before saving" }
138
+ ]
139
+ : [
140
+ { value: "add", label: "Configure an account now", hint: "Verify before saving" },
141
+ { value: "keep", label: "Skip for now", hint: "Public tools remain available" }
142
+ ]
143
+ });
144
+ cancelIfNeeded(action);
145
+ if (action === "keep") {
146
+ prompts.log.info(existingNames.length
147
+ ? "Existing account configuration kept."
148
+ : "API account setup skipped. Run `desic-okx account add` whenever you need private tools.");
149
+ return { changed: false, skipped: true };
150
+ }
151
+ while (true) {
152
+ const nameValue = await prompts.text({
153
+ message: "Account alias",
154
+ placeholder: "default",
155
+ defaultValue: "default",
156
+ validate: (value) => {
157
+ const normalized = value?.trim() ?? "";
158
+ if (!normalized)
159
+ return "Account alias is required";
160
+ if (normalized.length > 64)
161
+ return "Account alias must be 64 characters or fewer";
162
+ if (existingNames.includes(normalized))
163
+ return `Account '${normalized}' already exists; use a different alias or run desic-okx account edit`;
164
+ return undefined;
165
+ }
166
+ });
167
+ cancelIfNeeded(nameValue);
168
+ const name = nameValue.trim();
169
+ const apiKey = await requiredPassword("API Key");
170
+ const secretKey = await requiredPassword("Secret Key");
171
+ const passphrase = await requiredPassword("Passphrase");
172
+ const spinner = prompts.spinner();
173
+ spinner.start(`Verifying '${name}' and detecting its OKX environment`);
174
+ try {
175
+ const client = new OkxClient(OKX_REST_BASE_URL, proxy.url);
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;
185
+ saveConfig(candidate);
186
+ spinner.stop(`Account '${name}' verified as ${detected.account.environment} and saved`);
187
+ prompts.note(formatAccountPermissions(detected.account.environment, detected.config), "OKX account");
188
+ return { changed: true, skipped: false, name };
189
+ }
190
+ catch (error) {
191
+ spinner.stop(`Could not verify account '${name}'`);
192
+ prompts.log.warn(String(publicError(error).message));
193
+ const next = await prompts.select({
194
+ message: "How should account setup continue?",
195
+ options: [
196
+ { value: "retry", label: "Try again", hint: "Re-enter the account and credentials" },
197
+ { value: "skip", label: "Skip for now", hint: "No credentials will be saved" }
198
+ ]
199
+ });
200
+ cancelIfNeeded(next);
201
+ if (next === "skip") {
202
+ prompts.log.info("No API credentials were saved. Run `desic-okx account add` later.");
203
+ return { changed: false, skipped: true };
204
+ }
205
+ }
206
+ }
207
+ }
208
+ async function requiredPassword(message) {
209
+ const value = await prompts.password({
210
+ message,
211
+ mask: "*",
212
+ validate: (input) => input?.trim() ? undefined : `${message} is required`
213
+ });
214
+ cancelIfNeeded(value);
215
+ return value.trim();
216
+ }
217
+ function formatAccountPermissions(environment, data) {
218
+ const permission = String(data.perm ?? data.permissions ?? "reported by OKX");
219
+ return `Saved to ${CONFIG_PATH}\nDetected environment: ${environment}\nAPI permissions: ${permission}`;
220
+ }
221
+ function formatSetupComplete(account) {
222
+ const accountMessage = account.changed
223
+ ? `OKX account '${account.name}' is ready.`
224
+ : "Public tools are ready. Configure an API account later when private tools are needed.";
225
+ return `Setup complete. ${accountMessage} Restart the selected AI clients, then run \`desic-okx doctor\`.`;
101
226
  }
102
227
  async function checkWithSpinner(proxy) {
103
228
  const spinner = prompts.spinner();
@@ -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"}