@vantagestack/mcp-server 0.1.2 → 0.1.4
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/client.d.ts +4 -0
- package/dist/client.js +52 -0
- package/dist/client.js.map +1 -1
- package/dist/index.js +336 -3
- package/dist/index.js.map +1 -1
- package/dist/tools/account.d.ts +9 -0
- package/dist/tools/account.js +198 -0
- package/dist/tools/account.js.map +1 -0
- package/dist/tools/account.test.d.ts +1 -0
- package/dist/tools/account.test.js +163 -0
- package/dist/tools/account.test.js.map +1 -0
- package/dist/tools/calendar.d.ts +4 -0
- package/dist/tools/calendar.js +85 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/calendar.test.d.ts +1 -0
- package/dist/tools/calendar.test.js +62 -0
- package/dist/tools/calendar.test.js.map +1 -0
- package/dist/tools/journal 2.d.ts +6 -0
- package/dist/tools/journal 2.js +108 -0
- package/dist/tools/journal 2.js.map +1 -0
- package/dist/tools/journal.d.ts +6 -0
- package/dist/tools/journal.js +108 -0
- package/dist/tools/journal.js.map +1 -0
- package/dist/tools/journal.test.d.ts +1 -0
- package/dist/tools/journal.test.js +100 -0
- package/dist/tools/journal.test.js.map +1 -0
- package/dist/tools/qc.d.ts +14 -0
- package/dist/tools/qc.js +287 -0
- package/dist/tools/qc.js.map +1 -0
- package/dist/tools/qc.test.d.ts +1 -0
- package/dist/tools/qc.test.js +218 -0
- package/dist/tools/qc.test.js.map +1 -0
- package/package.json +1 -1
package/dist/tools/qc.js
ADDED
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { makeErrorResult } from "../user.js";
|
|
2
|
+
function parseOrdersCsv(csv) {
|
|
3
|
+
const lines = csv.trim().split("\n");
|
|
4
|
+
if (lines.length <= 1)
|
|
5
|
+
return "No orders in export.";
|
|
6
|
+
const header = lines[0];
|
|
7
|
+
const cols = header.split(",").map((c) => c.trim());
|
|
8
|
+
const rows = lines.slice(1).map((l) => {
|
|
9
|
+
const vals = l.split(",");
|
|
10
|
+
return Object.fromEntries(cols.map((c, i) => [c, vals[i]?.trim() ?? ""]));
|
|
11
|
+
});
|
|
12
|
+
const summary = rows
|
|
13
|
+
.slice(0, 20)
|
|
14
|
+
.map((r) => {
|
|
15
|
+
const time = r["Time"] ?? r["Date"] ?? r["EntryTime"] ?? "?";
|
|
16
|
+
const sym = r["Symbol"] ?? r["Ticker"] ?? "?";
|
|
17
|
+
const dir = r["Direction"] ?? r["Action"] ?? "?";
|
|
18
|
+
const qty = r["Quantity"] ?? r["Qty"] ?? "?";
|
|
19
|
+
const price = r["FillPrice"] ?? r["Price"] ?? "?";
|
|
20
|
+
const pnl = r["PnL"] ?? r["NetProfit"] ?? "";
|
|
21
|
+
return `• [${time}] ${dir} ${sym} qty=${qty} @${price}${pnl ? ` pnl=${pnl}` : ""}`;
|
|
22
|
+
})
|
|
23
|
+
.join("\n");
|
|
24
|
+
const trailer = rows.length > 20 ? `\n… and ${rows.length - 20} more` : "";
|
|
25
|
+
return `${rows.length} order(s):\n${summary}${trailer}`;
|
|
26
|
+
}
|
|
27
|
+
export async function listQcAlgorithms(client, _resolver, _input) {
|
|
28
|
+
try {
|
|
29
|
+
const algos = await client.get("/api/qc-algorithms");
|
|
30
|
+
if (!algos.length) {
|
|
31
|
+
return { content: [{ type: "text", text: "No QC algorithms found. Use create_qc_algorithm to create one." }, { type: "text", text: "[]" }] };
|
|
32
|
+
}
|
|
33
|
+
const lines = algos.map((a) => `• id=${a.id} "${a.name ?? "?"}" (updated ${a.updatedAt ?? "?"})`);
|
|
34
|
+
return {
|
|
35
|
+
content: [
|
|
36
|
+
{ type: "text", text: `${algos.length} algorithm(s):\n${lines.join("\n")}` },
|
|
37
|
+
{ type: "text", text: JSON.stringify(algos, null, 2) },
|
|
38
|
+
],
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
return makeErrorResult(err);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export async function getQcAlgorithm(client, _resolver, input) {
|
|
46
|
+
const algorithmId = String(input.algorithmId ?? "");
|
|
47
|
+
if (!algorithmId)
|
|
48
|
+
return makeErrorResult(new Error("algorithmId is required"));
|
|
49
|
+
try {
|
|
50
|
+
const algo = await client.get(`/api/qc-algorithms/${algorithmId}`);
|
|
51
|
+
const files = algo.files ?? [];
|
|
52
|
+
const summary = `Algorithm "${algo.name ?? "?"}" (id=${algo.id}), ${files.length} file(s): ${files.join(", ")}`;
|
|
53
|
+
return {
|
|
54
|
+
content: [
|
|
55
|
+
{ type: "text", text: summary },
|
|
56
|
+
{ type: "text", text: JSON.stringify(algo, null, 2) },
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
return makeErrorResult(err);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export async function getAlgorithmFile(client, _resolver, input) {
|
|
65
|
+
const algorithmId = String(input.algorithmId ?? "");
|
|
66
|
+
const filename = String(input.filename ?? "");
|
|
67
|
+
if (!algorithmId || !filename)
|
|
68
|
+
return makeErrorResult(new Error("algorithmId and filename are required"));
|
|
69
|
+
try {
|
|
70
|
+
const content = await client.getText(`/api/qc-algorithms/${algorithmId}/files/${encodeURIComponent(filename)}`);
|
|
71
|
+
const lines = content.split("\n").length;
|
|
72
|
+
return {
|
|
73
|
+
content: [
|
|
74
|
+
{ type: "text", text: `${filename} (${lines} lines):` },
|
|
75
|
+
{ type: "text", text: content },
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
return makeErrorResult(err);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export async function createQcAlgorithm(client, _resolver, input) {
|
|
84
|
+
const name = String(input.name ?? "");
|
|
85
|
+
if (!name)
|
|
86
|
+
return makeErrorResult(new Error("name is required"));
|
|
87
|
+
const files = input.files;
|
|
88
|
+
try {
|
|
89
|
+
const algo = await client.post("/api/qc-algorithms", { name, files: files ?? [] });
|
|
90
|
+
return {
|
|
91
|
+
content: [
|
|
92
|
+
{ type: "text", text: `Algorithm "${name}" created with id=${algo.id}` },
|
|
93
|
+
{ type: "text", text: JSON.stringify(algo, null, 2) },
|
|
94
|
+
],
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
return makeErrorResult(err);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export async function updateQcAlgorithm(client, _resolver, input) {
|
|
102
|
+
const algorithmId = String(input.algorithmId ?? "");
|
|
103
|
+
if (!algorithmId)
|
|
104
|
+
return makeErrorResult(new Error("algorithmId is required"));
|
|
105
|
+
const files = input.files;
|
|
106
|
+
if (!files?.length)
|
|
107
|
+
return makeErrorResult(new Error("files array is required"));
|
|
108
|
+
try {
|
|
109
|
+
const algo = await client.patch(`/api/qc-algorithms/${algorithmId}`, { files });
|
|
110
|
+
const fileNames = files.map((f) => f.filename).join(", ");
|
|
111
|
+
return {
|
|
112
|
+
content: [
|
|
113
|
+
{ type: "text", text: `Algorithm ${algorithmId} updated — files: ${fileNames}` },
|
|
114
|
+
{ type: "text", text: JSON.stringify(algo, null, 2) },
|
|
115
|
+
],
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
return makeErrorResult(err);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
export async function listStrategyInstances(client, _resolver, input) {
|
|
123
|
+
try {
|
|
124
|
+
const params = new URLSearchParams();
|
|
125
|
+
if (input.status)
|
|
126
|
+
params.set("status", String(input.status));
|
|
127
|
+
const qs = params.toString() ? `?${params}` : "";
|
|
128
|
+
const instances = await client.get(`/api/strategy-instances${qs}`);
|
|
129
|
+
if (!instances.length) {
|
|
130
|
+
return { content: [{ type: "text", text: "No strategy instances found." }, { type: "text", text: "[]" }] };
|
|
131
|
+
}
|
|
132
|
+
const lines = instances.map((i) => `• id=${i.id} "${i.algorithmName ?? "?"}" [${i.status ?? "?"}] mode=${i.mode ?? "?"} created=${i.createdAt ?? "?"}`);
|
|
133
|
+
return {
|
|
134
|
+
content: [
|
|
135
|
+
{ type: "text", text: `${instances.length} instance(s):\n${lines.join("\n")}` },
|
|
136
|
+
{ type: "text", text: JSON.stringify(instances, null, 2) },
|
|
137
|
+
],
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
return makeErrorResult(err);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export async function getStrategyInstance(client, _resolver, input) {
|
|
145
|
+
const instanceId = String(input.instanceId ?? "");
|
|
146
|
+
if (!instanceId)
|
|
147
|
+
return makeErrorResult(new Error("instanceId is required"));
|
|
148
|
+
try {
|
|
149
|
+
const inst = await client.get(`/api/strategy-instances/${instanceId}`);
|
|
150
|
+
const progress = inst.progress != null ? ` (${(inst.progress * 100).toFixed(0)}%)` : "";
|
|
151
|
+
const errStr = inst.error ? ` ERROR: ${inst.error}` : "";
|
|
152
|
+
const summary = `Instance ${instanceId}: "${inst.algorithmName ?? "?"}" [${inst.status ?? "?"}]${progress} mode=${inst.mode ?? "?"}${errStr}`;
|
|
153
|
+
return {
|
|
154
|
+
content: [
|
|
155
|
+
{ type: "text", text: summary },
|
|
156
|
+
{ type: "text", text: JSON.stringify(inst, null, 2) },
|
|
157
|
+
],
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
return makeErrorResult(err);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
export async function launchStrategy(client, _resolver, input) {
|
|
165
|
+
const algorithmId = Number(input.algorithmId);
|
|
166
|
+
const connectionAccountId = Number(input.connectionAccountId);
|
|
167
|
+
const strategyName = String(input.strategyName ?? "");
|
|
168
|
+
if (!algorithmId)
|
|
169
|
+
return makeErrorResult(new Error("algorithmId is required"));
|
|
170
|
+
if (!connectionAccountId)
|
|
171
|
+
return makeErrorResult(new Error("connectionAccountId is required"));
|
|
172
|
+
if (!strategyName)
|
|
173
|
+
return makeErrorResult(new Error("strategyName is required"));
|
|
174
|
+
const body = { algorithmId, connectionAccountId, strategyName };
|
|
175
|
+
if (input.quickTestMode !== undefined)
|
|
176
|
+
body.quickTestMode = Boolean(input.quickTestMode);
|
|
177
|
+
if (input.replayStart)
|
|
178
|
+
body.replayStart = String(input.replayStart);
|
|
179
|
+
if (input.databentoApiKey)
|
|
180
|
+
body.databentoApiKey = String(input.databentoApiKey);
|
|
181
|
+
if (input.sessionStartTime)
|
|
182
|
+
body.sessionStartTime = String(input.sessionStartTime);
|
|
183
|
+
try {
|
|
184
|
+
const inst = await client.post("/api/strategy-instances", body);
|
|
185
|
+
const replayNote = input.replayStart ? ` replay from ${input.replayStart}` : " live";
|
|
186
|
+
const qtNote = input.quickTestMode ? " [quick test]" : "";
|
|
187
|
+
return {
|
|
188
|
+
content: [
|
|
189
|
+
{
|
|
190
|
+
type: "text",
|
|
191
|
+
text: `Strategy launched: instanceId=${inst.id}${replayNote}${qtNote}, status=${inst.status ?? "?"}. Use get_strategy_logs(instanceId: "${inst.id}") to monitor.`,
|
|
192
|
+
},
|
|
193
|
+
{ type: "text", text: JSON.stringify(inst, null, 2) },
|
|
194
|
+
],
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
return makeErrorResult(err);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
export async function stopStrategy(client, _resolver, input) {
|
|
202
|
+
const instanceId = String(input.instanceId ?? "");
|
|
203
|
+
if (!instanceId)
|
|
204
|
+
return makeErrorResult(new Error("instanceId is required"));
|
|
205
|
+
try {
|
|
206
|
+
await client.delete(`/api/strategy-instances/${instanceId}`);
|
|
207
|
+
return {
|
|
208
|
+
content: [{ type: "text", text: `Strategy instance ${instanceId} stopped.` }],
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
return makeErrorResult(err);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
export async function getStrategyLogs(client, _resolver, input) {
|
|
216
|
+
const instanceId = String(input.instanceId ?? "");
|
|
217
|
+
if (!instanceId)
|
|
218
|
+
return makeErrorResult(new Error("instanceId is required"));
|
|
219
|
+
const tail = input.tail ? Number(input.tail) : 100;
|
|
220
|
+
try {
|
|
221
|
+
const raw = await client.getText(`/api/strategy-instances/${instanceId}/logs`);
|
|
222
|
+
if (!raw.trim()) {
|
|
223
|
+
return { content: [{ type: "text", text: `No logs yet for instance ${instanceId}.` }] };
|
|
224
|
+
}
|
|
225
|
+
const lines = raw.trim().split("\n");
|
|
226
|
+
const slice = lines.slice(-tail);
|
|
227
|
+
const header = lines.length > tail ? `(showing last ${tail} of ${lines.length} lines)\n` : "";
|
|
228
|
+
return {
|
|
229
|
+
content: [{ type: "text", text: `${header}${slice.join("\n")}` }],
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
return makeErrorResult(err);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
export async function getStrategyStats(client, _resolver, input) {
|
|
237
|
+
const instanceId = String(input.instanceId ?? "");
|
|
238
|
+
if (!instanceId)
|
|
239
|
+
return makeErrorResult(new Error("instanceId is required"));
|
|
240
|
+
try {
|
|
241
|
+
const stats = await client.get(`/api/strategy-instances/${instanceId}/export/stats.json`);
|
|
242
|
+
const pnlStr = stats.netPnl != null ? `${stats.netPnl >= 0 ? "+" : ""}${stats.netPnl.toFixed(2)}` : "?";
|
|
243
|
+
const wrStr = stats.winRate != null ? `${(stats.winRate * 100).toFixed(1)}%` : "?";
|
|
244
|
+
const pfStr = stats.profitFactor != null ? stats.profitFactor.toFixed(2) : "?";
|
|
245
|
+
const shStr = stats.sharpe != null ? stats.sharpe.toFixed(2) : "?";
|
|
246
|
+
const ddStr = stats.maxDrawdown != null ? stats.maxDrawdown.toFixed(2) : "?";
|
|
247
|
+
const summary = [
|
|
248
|
+
`Net P&L: ${pnlStr}`,
|
|
249
|
+
`Trades: ${stats.totalTrades ?? "?"}`,
|
|
250
|
+
`Win rate: ${wrStr}`,
|
|
251
|
+
`Profit factor: ${pfStr}`,
|
|
252
|
+
`Sharpe: ${shStr}`,
|
|
253
|
+
`Max drawdown: ${ddStr}`,
|
|
254
|
+
].join(" | ");
|
|
255
|
+
return {
|
|
256
|
+
content: [
|
|
257
|
+
{ type: "text", text: summary },
|
|
258
|
+
{ type: "text", text: JSON.stringify(stats, null, 2) },
|
|
259
|
+
],
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
return makeErrorResult(err);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
export async function getStrategyOrders(client, _resolver, input) {
|
|
267
|
+
const instanceId = String(input.instanceId ?? "");
|
|
268
|
+
if (!instanceId)
|
|
269
|
+
return makeErrorResult(new Error("instanceId is required"));
|
|
270
|
+
try {
|
|
271
|
+
const csv = await client.getText(`/api/strategy-instances/${instanceId}/export/orders.csv`);
|
|
272
|
+
if (!csv.trim()) {
|
|
273
|
+
return { content: [{ type: "text", text: `No orders exported for instance ${instanceId}.` }] };
|
|
274
|
+
}
|
|
275
|
+
const summary = parseOrdersCsv(csv);
|
|
276
|
+
return {
|
|
277
|
+
content: [
|
|
278
|
+
{ type: "text", text: summary },
|
|
279
|
+
{ type: "text", text: csv },
|
|
280
|
+
],
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
catch (err) {
|
|
284
|
+
return makeErrorResult(err);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=qc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qc.js","sourceRoot":"","sources":["../../src/tools/qc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { listQcAlgorithms, getQcAlgorithm, getAlgorithmFile, createQcAlgorithm, updateQcAlgorithm, listStrategyInstances, getStrategyInstance, launchStrategy, stopStrategy, getStrategyLogs, getStrategyStats, getStrategyOrders, } from "./qc.js";
|
|
3
|
+
const makeClient = (overrides = {}) => ({
|
|
4
|
+
get: overrides.get ?? (() => Promise.resolve([])),
|
|
5
|
+
post: overrides.post ?? (() => Promise.resolve({ id: 99 })),
|
|
6
|
+
patch: overrides.patch ?? (() => Promise.resolve({ id: 1 })),
|
|
7
|
+
delete: overrides.delete ?? (() => Promise.resolve({})),
|
|
8
|
+
getText: overrides.getText ?? (() => Promise.resolve("")),
|
|
9
|
+
});
|
|
10
|
+
const resolver = {};
|
|
11
|
+
const ALGOS = [
|
|
12
|
+
{ id: 1, name: "LO1 Breakout", updatedAt: "2026-04-30T10:00:00Z", files: ["main.py"] },
|
|
13
|
+
{ id: 2, name: "PMT Algo", updatedAt: "2026-04-29T10:00:00Z", files: ["main.py", "config.json"] },
|
|
14
|
+
];
|
|
15
|
+
const INSTANCES = [
|
|
16
|
+
{ id: 10, algorithmId: 1, algorithmName: "LO1 Breakout", status: "completed", mode: "backtest", createdAt: "2026-04-30T10:00:00Z", progress: 1.0 },
|
|
17
|
+
{ id: 11, algorithmId: 1, algorithmName: "LO1 Breakout", status: "running", mode: "backtest", createdAt: "2026-04-30T11:00:00Z", progress: 0.45 },
|
|
18
|
+
];
|
|
19
|
+
// ─── listQcAlgorithms ──────────────────────────────────────────────────────
|
|
20
|
+
describe("listQcAlgorithms", () => {
|
|
21
|
+
it("returns algorithm list", async () => {
|
|
22
|
+
const result = await listQcAlgorithms(makeClient({ get: () => Promise.resolve(ALGOS) }), resolver, {});
|
|
23
|
+
expect(result.isError).toBeUndefined();
|
|
24
|
+
expect(result.content[0].text).toContain("2 algorithm(s)");
|
|
25
|
+
expect(result.content[0].text).toContain("LO1 Breakout");
|
|
26
|
+
});
|
|
27
|
+
it("returns helpful message when empty", async () => {
|
|
28
|
+
const result = await listQcAlgorithms(makeClient({ get: () => Promise.resolve([]) }), resolver, {});
|
|
29
|
+
expect(result.content[0].text).toContain("create_qc_algorithm");
|
|
30
|
+
});
|
|
31
|
+
it("returns isError on API failure", async () => {
|
|
32
|
+
const result = await listQcAlgorithms(makeClient({ get: () => Promise.reject(new Error("500")) }), resolver, {});
|
|
33
|
+
expect(result.isError).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
// ─── getQcAlgorithm ────────────────────────────────────────────────────────
|
|
37
|
+
describe("getQcAlgorithm", () => {
|
|
38
|
+
it("returns algorithm details", async () => {
|
|
39
|
+
const result = await getQcAlgorithm(makeClient({ get: () => Promise.resolve(ALGOS[0]) }), resolver, { algorithmId: "1" });
|
|
40
|
+
expect(result.isError).toBeUndefined();
|
|
41
|
+
expect(result.content[0].text).toContain("LO1 Breakout");
|
|
42
|
+
expect(result.content[0].text).toContain("1 file(s)");
|
|
43
|
+
});
|
|
44
|
+
it("returns isError when algorithmId missing", async () => {
|
|
45
|
+
const result = await getQcAlgorithm(makeClient(), resolver, {});
|
|
46
|
+
expect(result.isError).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
// ─── getAlgorithmFile ──────────────────────────────────────────────────────
|
|
50
|
+
describe("getAlgorithmFile", () => {
|
|
51
|
+
const CODE = "import numpy as np\n# LO1 breakout\nclass LO1(QCAlgorithm):\n pass\n";
|
|
52
|
+
it("returns file content with line count", async () => {
|
|
53
|
+
const result = await getAlgorithmFile(makeClient({ getText: () => Promise.resolve(CODE) }), resolver, { algorithmId: "1", filename: "main.py" });
|
|
54
|
+
expect(result.isError).toBeUndefined();
|
|
55
|
+
expect(result.content[0].text).toContain("main.py");
|
|
56
|
+
expect(result.content[0].text).toMatch(/\d+ lines/);
|
|
57
|
+
expect(result.content[1].text).toContain("LO1 breakout");
|
|
58
|
+
});
|
|
59
|
+
it("returns isError when params missing", async () => {
|
|
60
|
+
const result = await getAlgorithmFile(makeClient(), resolver, { algorithmId: "1" });
|
|
61
|
+
expect(result.isError).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
it("returns isError on API failure", async () => {
|
|
64
|
+
const result = await getAlgorithmFile(makeClient({ getText: () => Promise.reject(new Error("404")) }), resolver, { algorithmId: "1", filename: "main.py" });
|
|
65
|
+
expect(result.isError).toBe(true);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
// ─── createQcAlgorithm ─────────────────────────────────────────────────────
|
|
69
|
+
describe("createQcAlgorithm", () => {
|
|
70
|
+
it("creates algorithm and returns id", async () => {
|
|
71
|
+
const result = await createQcAlgorithm(makeClient({ post: () => Promise.resolve({ id: 5, name: "New Algo" }) }), resolver, { name: "New Algo", files: [{ filename: "main.py", content: "# code" }] });
|
|
72
|
+
expect(result.isError).toBeUndefined();
|
|
73
|
+
expect(result.content[0].text).toContain("id=5");
|
|
74
|
+
expect(result.content[0].text).toContain("New Algo");
|
|
75
|
+
});
|
|
76
|
+
it("returns isError when name missing", async () => {
|
|
77
|
+
const result = await createQcAlgorithm(makeClient(), resolver, {});
|
|
78
|
+
expect(result.isError).toBe(true);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
// ─── updateQcAlgorithm ─────────────────────────────────────────────────────
|
|
82
|
+
describe("updateQcAlgorithm", () => {
|
|
83
|
+
it("updates algorithm files", async () => {
|
|
84
|
+
const result = await updateQcAlgorithm(makeClient({ patch: () => Promise.resolve({ id: 1 }) }), resolver, { algorithmId: "1", files: [{ filename: "main.py", content: "# updated" }] });
|
|
85
|
+
expect(result.isError).toBeUndefined();
|
|
86
|
+
expect(result.content[0].text).toContain("main.py");
|
|
87
|
+
});
|
|
88
|
+
it("returns isError when algorithmId missing", async () => {
|
|
89
|
+
const result = await updateQcAlgorithm(makeClient(), resolver, { files: [{ filename: "main.py", content: "x" }] });
|
|
90
|
+
expect(result.isError).toBe(true);
|
|
91
|
+
});
|
|
92
|
+
it("returns isError when files empty", async () => {
|
|
93
|
+
const result = await updateQcAlgorithm(makeClient(), resolver, { algorithmId: "1", files: [] });
|
|
94
|
+
expect(result.isError).toBe(true);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
// ─── listStrategyInstances ─────────────────────────────────────────────────
|
|
98
|
+
describe("listStrategyInstances", () => {
|
|
99
|
+
it("returns instance list", async () => {
|
|
100
|
+
const result = await listStrategyInstances(makeClient({ get: () => Promise.resolve(INSTANCES) }), resolver, {});
|
|
101
|
+
expect(result.isError).toBeUndefined();
|
|
102
|
+
expect(result.content[0].text).toContain("2 instance(s)");
|
|
103
|
+
expect(result.content[0].text).toContain("completed");
|
|
104
|
+
expect(result.content[0].text).toContain("running");
|
|
105
|
+
});
|
|
106
|
+
it("returns empty message when none", async () => {
|
|
107
|
+
const result = await listStrategyInstances(makeClient({ get: () => Promise.resolve([]) }), resolver, {});
|
|
108
|
+
expect(result.content[0].text).toContain("No strategy instances");
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
// ─── getStrategyInstance ───────────────────────────────────────────────────
|
|
112
|
+
describe("getStrategyInstance", () => {
|
|
113
|
+
it("returns instance detail with progress", async () => {
|
|
114
|
+
const result = await getStrategyInstance(makeClient({ get: () => Promise.resolve(INSTANCES[1]) }), resolver, { instanceId: "11" });
|
|
115
|
+
expect(result.isError).toBeUndefined();
|
|
116
|
+
expect(result.content[0].text).toContain("45%");
|
|
117
|
+
expect(result.content[0].text).toContain("running");
|
|
118
|
+
});
|
|
119
|
+
it("returns isError when instanceId missing", async () => {
|
|
120
|
+
const result = await getStrategyInstance(makeClient(), resolver, {});
|
|
121
|
+
expect(result.isError).toBe(true);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
// ─── launchStrategy ────────────────────────────────────────────────────────
|
|
125
|
+
describe("launchStrategy", () => {
|
|
126
|
+
it("launches and returns instanceId with follow-up hint", async () => {
|
|
127
|
+
const result = await launchStrategy(makeClient({ post: () => Promise.resolve({ id: 20, status: "initializing" }) }), resolver, { algorithmId: "1", mode: "backtest", startDate: "2026-01-01", endDate: "2026-04-30" });
|
|
128
|
+
expect(result.isError).toBeUndefined();
|
|
129
|
+
expect(result.content[0].text).toContain("instanceId=20");
|
|
130
|
+
expect(result.content[0].text).toContain("get_strategy_logs");
|
|
131
|
+
});
|
|
132
|
+
it("returns isError when algorithmId missing", async () => {
|
|
133
|
+
const result = await launchStrategy(makeClient(), resolver, { mode: "backtest" });
|
|
134
|
+
expect(result.isError).toBe(true);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
// ─── stopStrategy ──────────────────────────────────────────────────────────
|
|
138
|
+
describe("stopStrategy", () => {
|
|
139
|
+
it("stops instance and confirms", async () => {
|
|
140
|
+
const result = await stopStrategy(makeClient({ delete: () => Promise.resolve({}) }), resolver, { instanceId: "11" });
|
|
141
|
+
expect(result.isError).toBeUndefined();
|
|
142
|
+
expect(result.content[0].text).toContain("11");
|
|
143
|
+
expect(result.content[0].text).toContain("stopped");
|
|
144
|
+
});
|
|
145
|
+
it("returns isError when instanceId missing", async () => {
|
|
146
|
+
const result = await stopStrategy(makeClient(), resolver, {});
|
|
147
|
+
expect(result.isError).toBe(true);
|
|
148
|
+
});
|
|
149
|
+
it("returns isError on API failure", async () => {
|
|
150
|
+
const result = await stopStrategy(makeClient({ delete: () => Promise.reject(new Error("404")) }), resolver, { instanceId: "11" });
|
|
151
|
+
expect(result.isError).toBe(true);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
// ─── getStrategyLogs ───────────────────────────────────────────────────────
|
|
155
|
+
describe("getStrategyLogs", () => {
|
|
156
|
+
it("returns last N lines", async () => {
|
|
157
|
+
const logs = Array.from({ length: 150 }, (_, i) => `2026-04-30 INFO Line ${i + 1}`).join("\n");
|
|
158
|
+
const result = await getStrategyLogs(makeClient({ getText: () => Promise.resolve(logs) }), resolver, { instanceId: "10", tail: 100 });
|
|
159
|
+
expect(result.isError).toBeUndefined();
|
|
160
|
+
expect(result.content[0].text).toContain("last 100 of 150");
|
|
161
|
+
expect(result.content[0].text).toContain("Line 150");
|
|
162
|
+
});
|
|
163
|
+
it("returns graceful message when no logs yet", async () => {
|
|
164
|
+
const result = await getStrategyLogs(makeClient({ getText: () => Promise.resolve("") }), resolver, { instanceId: "10" });
|
|
165
|
+
expect(result.content[0].text).toContain("No logs yet");
|
|
166
|
+
});
|
|
167
|
+
it("returns isError when instanceId missing", async () => {
|
|
168
|
+
const result = await getStrategyLogs(makeClient(), resolver, {});
|
|
169
|
+
expect(result.isError).toBe(true);
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
// ─── getStrategyStats ──────────────────────────────────────────────────────
|
|
173
|
+
describe("getStrategyStats", () => {
|
|
174
|
+
const STATS = { netPnl: 4250.5, totalTrades: 38, winRate: 0.632, profitFactor: 2.3, sharpe: 1.95, maxDrawdown: -1200 };
|
|
175
|
+
it("returns formatted stats summary", async () => {
|
|
176
|
+
const result = await getStrategyStats(makeClient({ get: () => Promise.resolve(STATS) }), resolver, { instanceId: "10" });
|
|
177
|
+
expect(result.isError).toBeUndefined();
|
|
178
|
+
expect(result.content[0].text).toContain("+4250.50");
|
|
179
|
+
expect(result.content[0].text).toContain("63.2%");
|
|
180
|
+
expect(result.content[0].text).toContain("2.30");
|
|
181
|
+
expect(result.content[0].text).toContain("1.95");
|
|
182
|
+
});
|
|
183
|
+
it("returns isError when instanceId missing", async () => {
|
|
184
|
+
const result = await getStrategyStats(makeClient(), resolver, {});
|
|
185
|
+
expect(result.isError).toBe(true);
|
|
186
|
+
});
|
|
187
|
+
it("returns isError on API failure", async () => {
|
|
188
|
+
const result = await getStrategyStats(makeClient({ get: () => Promise.reject(new Error("404")) }), resolver, { instanceId: "10" });
|
|
189
|
+
expect(result.isError).toBe(true);
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
// ─── getStrategyOrders ─────────────────────────────────────────────────────
|
|
193
|
+
describe("getStrategyOrders", () => {
|
|
194
|
+
const CSV = `Time,Symbol,Direction,Quantity,FillPrice,PnL
|
|
195
|
+
2026-01-15 09:31,MYMM6,Buy,1,49200,
|
|
196
|
+
2026-01-15 10:45,MYMM6,Sell,1,49350,150
|
|
197
|
+
2026-01-16 09:31,MYMM6,Sell,1,49500,
|
|
198
|
+
2026-01-16 11:00,MYMM6,Buy,1,49420,-80`;
|
|
199
|
+
it("returns parsed order summary", async () => {
|
|
200
|
+
const result = await getStrategyOrders(makeClient({ getText: () => Promise.resolve(CSV) }), resolver, { instanceId: "10" });
|
|
201
|
+
expect(result.isError).toBeUndefined();
|
|
202
|
+
expect(result.content[0].text).toContain("4 order(s)");
|
|
203
|
+
expect(result.content[0].text).toContain("MYMM6");
|
|
204
|
+
});
|
|
205
|
+
it("returns raw CSV in second block", async () => {
|
|
206
|
+
const result = await getStrategyOrders(makeClient({ getText: () => Promise.resolve(CSV) }), resolver, { instanceId: "10" });
|
|
207
|
+
expect(result.content[1].text).toContain("Time,Symbol");
|
|
208
|
+
});
|
|
209
|
+
it("returns graceful message for empty export", async () => {
|
|
210
|
+
const result = await getStrategyOrders(makeClient({ getText: () => Promise.resolve("") }), resolver, { instanceId: "10" });
|
|
211
|
+
expect(result.content[0].text).toContain("No orders exported");
|
|
212
|
+
});
|
|
213
|
+
it("returns isError when instanceId missing", async () => {
|
|
214
|
+
const result = await getStrategyOrders(makeClient(), resolver, {});
|
|
215
|
+
expect(result.isError).toBe(true);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
//# sourceMappingURL=qc.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qc.test.js","sourceRoot":"","sources":["../../src/tools/qc.test.ts"],"names":[],"mappings":"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"}
|