ctrader-ts 0.1.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 (68) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +301 -0
  3. package/assets/banner.png +0 -0
  4. package/dist/bin/auth.d.ts +3 -0
  5. package/dist/bin/auth.d.ts.map +1 -0
  6. package/dist/bin/auth.js +193 -0
  7. package/dist/bin/auth.js.map +1 -0
  8. package/dist/cli/index.d.ts +3 -0
  9. package/dist/cli/index.d.ts.map +1 -0
  10. package/dist/cli/index.js +359 -0
  11. package/dist/cli/index.js.map +1 -0
  12. package/dist/src/client.d.ts +310 -0
  13. package/dist/src/client.d.ts.map +1 -0
  14. package/dist/src/client.js +507 -0
  15. package/dist/src/client.js.map +1 -0
  16. package/dist/src/config.d.ts +18 -0
  17. package/dist/src/config.d.ts.map +1 -0
  18. package/dist/src/config.js +70 -0
  19. package/dist/src/config.js.map +1 -0
  20. package/dist/src/connect.d.ts +20 -0
  21. package/dist/src/connect.d.ts.map +1 -0
  22. package/dist/src/connect.js +36 -0
  23. package/dist/src/connect.js.map +1 -0
  24. package/dist/src/connection.d.ts +51 -0
  25. package/dist/src/connection.d.ts.map +1 -0
  26. package/dist/src/connection.js +292 -0
  27. package/dist/src/connection.js.map +1 -0
  28. package/dist/src/enums.d.ts +341 -0
  29. package/dist/src/enums.d.ts.map +1 -0
  30. package/dist/src/enums.js +369 -0
  31. package/dist/src/enums.js.map +1 -0
  32. package/dist/src/errors.d.ts +24 -0
  33. package/dist/src/errors.d.ts.map +1 -0
  34. package/dist/src/errors.js +47 -0
  35. package/dist/src/errors.js.map +1 -0
  36. package/dist/src/helpers.d.ts +28 -0
  37. package/dist/src/helpers.d.ts.map +1 -0
  38. package/dist/src/helpers.js +113 -0
  39. package/dist/src/helpers.js.map +1 -0
  40. package/dist/src/index.d.ts +12 -0
  41. package/dist/src/index.d.ts.map +1 -0
  42. package/dist/src/index.js +11 -0
  43. package/dist/src/index.js.map +1 -0
  44. package/dist/src/modules/account.d.ts +67 -0
  45. package/dist/src/modules/account.d.ts.map +1 -0
  46. package/dist/src/modules/account.js +168 -0
  47. package/dist/src/modules/account.js.map +1 -0
  48. package/dist/src/modules/auth.d.ts +20 -0
  49. package/dist/src/modules/auth.d.ts.map +1 -0
  50. package/dist/src/modules/auth.js +43 -0
  51. package/dist/src/modules/auth.js.map +1 -0
  52. package/dist/src/modules/market.d.ts +53 -0
  53. package/dist/src/modules/market.d.ts.map +1 -0
  54. package/dist/src/modules/market.js +192 -0
  55. package/dist/src/modules/market.js.map +1 -0
  56. package/dist/src/modules/trading.d.ts +80 -0
  57. package/dist/src/modules/trading.d.ts.map +1 -0
  58. package/dist/src/modules/trading.js +150 -0
  59. package/dist/src/modules/trading.js.map +1 -0
  60. package/dist/src/symbol-cache.d.ts +14 -0
  61. package/dist/src/symbol-cache.d.ts.map +1 -0
  62. package/dist/src/symbol-cache.js +41 -0
  63. package/dist/src/symbol-cache.js.map +1 -0
  64. package/dist/src/types.d.ts +413 -0
  65. package/dist/src/types.d.ts.map +1 -0
  66. package/dist/src/types.js +2 -0
  67. package/dist/src/types.js.map +1 -0
  68. package/package.json +61 -0
@@ -0,0 +1,359 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { connect } from "../src/connect.js";
4
+ import { TrendbarPeriod } from "../src/enums.js";
5
+ let cachedClient = null;
6
+ async function getClient() {
7
+ if (cachedClient === null) {
8
+ cachedClient = await connect();
9
+ }
10
+ return cachedClient;
11
+ }
12
+ function dump(data) {
13
+ process.stdout.write(JSON.stringify(data, null, 2) + "\n");
14
+ }
15
+ /**
16
+ * Parse "50p" / "$25" / "2%e" into SlTpSpec. Formats:
17
+ * - "50" or "50p" → { pips: 50 }
18
+ * - "$25" or "25d" → { dollars: 25 }
19
+ * - "0.02e" or "2%" → { equity: 0.02 }
20
+ */
21
+ function parseSlTp(raw) {
22
+ const s = raw.trim();
23
+ if (s.endsWith("%")) {
24
+ const n = Number(s.slice(0, -1));
25
+ if (Number.isNaN(n))
26
+ throw new Error(`Invalid equity spec: ${raw}`);
27
+ return { equity: n / 100 };
28
+ }
29
+ if (s.endsWith("e")) {
30
+ const n = Number(s.slice(0, -1));
31
+ if (Number.isNaN(n))
32
+ throw new Error(`Invalid equity spec: ${raw}`);
33
+ return { equity: n };
34
+ }
35
+ if (s.startsWith("$")) {
36
+ const n = Number(s.slice(1));
37
+ if (Number.isNaN(n))
38
+ throw new Error(`Invalid dollar spec: ${raw}`);
39
+ return { dollars: n };
40
+ }
41
+ if (s.endsWith("d")) {
42
+ const n = Number(s.slice(0, -1));
43
+ if (Number.isNaN(n))
44
+ throw new Error(`Invalid dollar spec: ${raw}`);
45
+ return { dollars: n };
46
+ }
47
+ if (s.endsWith("p")) {
48
+ const n = Number(s.slice(0, -1));
49
+ if (Number.isNaN(n))
50
+ throw new Error(`Invalid pips spec: ${raw}`);
51
+ return { pips: n };
52
+ }
53
+ const n = Number(s);
54
+ if (Number.isNaN(n))
55
+ throw new Error(`Invalid SL/TP spec: ${raw}`);
56
+ return { pips: n };
57
+ }
58
+ function buildMarketOpts(opts) {
59
+ const result = { lots: Number(opts.lots) };
60
+ if (opts.sl !== undefined)
61
+ result.sl = parseSlTp(opts.sl);
62
+ if (opts.tp !== undefined)
63
+ result.tp = parseSlTp(opts.tp);
64
+ if (opts.label !== undefined)
65
+ result.label = opts.label;
66
+ if (opts.comment !== undefined)
67
+ result.comment = opts.comment;
68
+ return result;
69
+ }
70
+ const periodMap = {
71
+ M1: TrendbarPeriod.M1, M2: TrendbarPeriod.M2, M3: TrendbarPeriod.M3,
72
+ M4: TrendbarPeriod.M4, M5: TrendbarPeriod.M5, M10: TrendbarPeriod.M10,
73
+ M15: TrendbarPeriod.M15, M30: TrendbarPeriod.M30, H1: TrendbarPeriod.H1,
74
+ H4: TrendbarPeriod.H4, H12: TrendbarPeriod.H12, D1: TrendbarPeriod.D1,
75
+ W1: TrendbarPeriod.W1, MN1: TrendbarPeriod.MN1,
76
+ };
77
+ const program = new Command();
78
+ program
79
+ .name("ctrader-cli")
80
+ .description("cTrader Open API CLI — trade, monitor, and analyze from the terminal")
81
+ .version("0.1.0");
82
+ // ─── auth ────────────────────────────────────────────────────────────────────
83
+ program
84
+ .command("auth")
85
+ .description("Run interactive OAuth setup (delegates to bin/auth.js)")
86
+ .action(async () => {
87
+ const { execFileSync } = await import("node:child_process");
88
+ execFileSync("node", [new URL("../bin/auth.js", import.meta.url).pathname], { stdio: "inherit" });
89
+ });
90
+ // ─── state ───────────────────────────────────────────────────────────────────
91
+ program
92
+ .command("state")
93
+ .description("Full account snapshot: balance, equity, margin, P&L, positions, orders")
94
+ .action(async () => {
95
+ const ct = await getClient();
96
+ const state = await ct.getState();
97
+ dump(state);
98
+ ct.disconnect();
99
+ });
100
+ // ─── positions ───────────────────────────────────────────────────────────────
101
+ program
102
+ .command("positions")
103
+ .description("List all open positions and pending orders")
104
+ .action(async () => {
105
+ const ct = await getClient();
106
+ const { positions, orders } = await ct.getPositions();
107
+ dump({ positions, orders });
108
+ ct.disconnect();
109
+ });
110
+ // ─── buy ─────────────────────────────────────────────────────────────────────
111
+ program
112
+ .command("buy")
113
+ .description("Market BUY — execute immediately at best price")
114
+ .argument("<symbol>", "Symbol name (e.g. EURUSD)")
115
+ .argument("<lots>", "Volume in lots (0.01 = micro)")
116
+ .option("--sl <spec>", "Stop loss: 50 (pips), $25 (dollars), 2% (equity)")
117
+ .option("--tp <spec>", "Take profit: 50 (pips), $25 (dollars), 2% (equity)")
118
+ .option("--label <label>", "Order label")
119
+ .option("--comment <comment>", "Order comment")
120
+ .action(async (symbol, lots, opts) => {
121
+ const ct = await getClient();
122
+ const pos = await ct.buy(symbol, buildMarketOpts({ lots, ...opts }));
123
+ dump(pos);
124
+ ct.disconnect();
125
+ });
126
+ // ─── sell ────────────────────────────────────────────────────────────────────
127
+ program
128
+ .command("sell")
129
+ .description("Market SELL — execute immediately at best price")
130
+ .argument("<symbol>", "Symbol name (e.g. EURUSD)")
131
+ .argument("<lots>", "Volume in lots")
132
+ .option("--sl <spec>", "Stop loss")
133
+ .option("--tp <spec>", "Take profit")
134
+ .option("--label <label>", "Order label")
135
+ .option("--comment <comment>", "Order comment")
136
+ .action(async (symbol, lots, opts) => {
137
+ const ct = await getClient();
138
+ const pos = await ct.sell(symbol, buildMarketOpts({ lots, ...opts }));
139
+ dump(pos);
140
+ ct.disconnect();
141
+ });
142
+ // ─── buy-limit ───────────────────────────────────────────────────────────────
143
+ program
144
+ .command("buy-limit")
145
+ .description("Place a limit BUY order — fills when price drops to limit price")
146
+ .argument("<symbol>", "Symbol name")
147
+ .argument("<lots>", "Volume in lots")
148
+ .argument("<limitPrice>", "Limit price")
149
+ .option("--sl <spec>", "Stop loss")
150
+ .option("--tp <spec>", "Take profit")
151
+ .option("--label <label>", "Order label")
152
+ .option("--expires <ms>", "Expiry Unix ms timestamp")
153
+ .action(async (symbol, lots, limitPrice, opts) => {
154
+ const ct = await getClient();
155
+ const base = buildMarketOpts({ lots, sl: opts.sl, tp: opts.tp, label: opts.label });
156
+ const orderOpts = { ...base, limitPrice: Number(limitPrice) };
157
+ if (opts.expires !== undefined)
158
+ orderOpts.expirationTimestamp = Number(opts.expires);
159
+ const event = await ct.buyLimit(symbol, orderOpts);
160
+ dump(event);
161
+ ct.disconnect();
162
+ });
163
+ // ─── sell-limit ──────────────────────────────────────────────────────────────
164
+ program
165
+ .command("sell-limit")
166
+ .description("Place a limit SELL order — fills when price rises to limit price")
167
+ .argument("<symbol>", "Symbol name")
168
+ .argument("<lots>", "Volume in lots")
169
+ .argument("<limitPrice>", "Limit price")
170
+ .option("--sl <spec>", "Stop loss")
171
+ .option("--tp <spec>", "Take profit")
172
+ .option("--label <label>", "Order label")
173
+ .option("--expires <ms>", "Expiry Unix ms timestamp")
174
+ .action(async (symbol, lots, limitPrice, opts) => {
175
+ const ct = await getClient();
176
+ const base = buildMarketOpts({ lots, sl: opts.sl, tp: opts.tp, label: opts.label });
177
+ const orderOpts = { ...base, limitPrice: Number(limitPrice) };
178
+ if (opts.expires !== undefined)
179
+ orderOpts.expirationTimestamp = Number(opts.expires);
180
+ const event = await ct.sellLimit(symbol, orderOpts);
181
+ dump(event);
182
+ ct.disconnect();
183
+ });
184
+ // ─── buy-stop ────────────────────────────────────────────────────────────────
185
+ program
186
+ .command("buy-stop")
187
+ .description("Place a stop BUY order — triggers on breakout above stop price")
188
+ .argument("<symbol>", "Symbol name")
189
+ .argument("<lots>", "Volume in lots")
190
+ .argument("<stopPrice>", "Stop trigger price")
191
+ .option("--sl <spec>", "Stop loss")
192
+ .option("--tp <spec>", "Take profit")
193
+ .option("--label <label>", "Order label")
194
+ .option("--expires <ms>", "Expiry Unix ms timestamp")
195
+ .action(async (symbol, lots, stopPrice, opts) => {
196
+ const ct = await getClient();
197
+ const base = buildMarketOpts({ lots, sl: opts.sl, tp: opts.tp, label: opts.label });
198
+ const orderOpts = { ...base, stopPrice: Number(stopPrice) };
199
+ if (opts.expires !== undefined)
200
+ orderOpts.expirationTimestamp = Number(opts.expires);
201
+ const event = await ct.buyStop(symbol, orderOpts);
202
+ dump(event);
203
+ ct.disconnect();
204
+ });
205
+ // ─── sell-stop ───────────────────────────────────────────────────────────────
206
+ program
207
+ .command("sell-stop")
208
+ .description("Place a stop SELL order — triggers on breakdown below stop price")
209
+ .argument("<symbol>", "Symbol name")
210
+ .argument("<lots>", "Volume in lots")
211
+ .argument("<stopPrice>", "Stop trigger price")
212
+ .option("--sl <spec>", "Stop loss")
213
+ .option("--tp <spec>", "Take profit")
214
+ .option("--label <label>", "Order label")
215
+ .option("--expires <ms>", "Expiry Unix ms timestamp")
216
+ .action(async (symbol, lots, stopPrice, opts) => {
217
+ const ct = await getClient();
218
+ const base = buildMarketOpts({ lots, sl: opts.sl, tp: opts.tp, label: opts.label });
219
+ const orderOpts = { ...base, stopPrice: Number(stopPrice) };
220
+ if (opts.expires !== undefined)
221
+ orderOpts.expirationTimestamp = Number(opts.expires);
222
+ const event = await ct.sellStop(symbol, orderOpts);
223
+ dump(event);
224
+ ct.disconnect();
225
+ });
226
+ // ─── close ───────────────────────────────────────────────────────────────────
227
+ program
228
+ .command("close")
229
+ .description("Close an open position by ID (full or partial)")
230
+ .argument("<positionId>", "Position ID")
231
+ .option("--lots <lots>", "Lots to close (omit for full close)")
232
+ .action(async (positionId, opts) => {
233
+ const ct = await getClient();
234
+ const closeOpts = opts.lots !== undefined ? { lots: Number(opts.lots) } : undefined;
235
+ const event = await ct.close(Number(positionId), closeOpts);
236
+ dump(event);
237
+ ct.disconnect();
238
+ });
239
+ // ─── close-all ───────────────────────────────────────────────────────────────
240
+ program
241
+ .command("close-all")
242
+ .description("Close ALL open positions on the account")
243
+ .action(async () => {
244
+ const ct = await getClient();
245
+ const events = await ct.closeAll();
246
+ dump({ closed: events.length });
247
+ ct.disconnect();
248
+ });
249
+ // ─── close-symbol ────────────────────────────────────────────────────────────
250
+ program
251
+ .command("close-symbol")
252
+ .description("Close all positions on a specific symbol")
253
+ .argument("<symbol>", "Symbol name")
254
+ .action(async (symbol) => {
255
+ const ct = await getClient();
256
+ const events = await ct.closeSymbol(symbol);
257
+ dump({ closed: events.length, symbol });
258
+ ct.disconnect();
259
+ });
260
+ // ─── modify ──────────────────────────────────────────────────────────────────
261
+ program
262
+ .command("modify")
263
+ .description("Modify SL/TP on an open position")
264
+ .argument("<positionId>", "Position ID")
265
+ .option("--sl <spec>", "New stop loss: 50 (pips), $25 (dollars), 2% (equity)")
266
+ .option("--tp <spec>", "New take profit: 50 (pips), $25 (dollars), 2% (equity)")
267
+ .action(async (positionId, opts) => {
268
+ const ct = await getClient();
269
+ const modOpts = {};
270
+ if (opts.sl !== undefined)
271
+ modOpts.sl = parseSlTp(opts.sl);
272
+ if (opts.tp !== undefined)
273
+ modOpts.tp = parseSlTp(opts.tp);
274
+ await ct.modify(Number(positionId), modOpts);
275
+ dump({ modified: Number(positionId) });
276
+ ct.disconnect();
277
+ });
278
+ // ─── cancel ──────────────────────────────────────────────────────────────────
279
+ program
280
+ .command("cancel")
281
+ .description("Cancel a pending order (limit/stop/stop-limit)")
282
+ .argument("<orderId>", "Pending order ID")
283
+ .action(async (orderId) => {
284
+ const ct = await getClient();
285
+ await ct.cancelOrder(Number(orderId));
286
+ dump({ cancelled: Number(orderId) });
287
+ ct.disconnect();
288
+ });
289
+ // ─── history ─────────────────────────────────────────────────────────────────
290
+ program
291
+ .command("history")
292
+ .description("Get trade execution history")
293
+ .option("--from <ms>", "Start Unix timestamp in ms")
294
+ .option("--to <ms>", "End Unix timestamp in ms")
295
+ .option("--max <rows>", "Max results")
296
+ .action(async (opts) => {
297
+ const ct = await getClient();
298
+ const from = opts.from !== undefined ? Number(opts.from) : undefined;
299
+ const to = opts.to !== undefined ? Number(opts.to) : undefined;
300
+ const maxRows = opts.max !== undefined ? Number(opts.max) : undefined;
301
+ const result = await ct.getDeals(from, to, maxRows);
302
+ dump(result);
303
+ ct.disconnect();
304
+ });
305
+ // ─── bars ────────────────────────────────────────────────────────────────────
306
+ program
307
+ .command("bars")
308
+ .description("Get historical OHLCV candlestick bars")
309
+ .argument("<symbol>", "Symbol name")
310
+ .argument("<period>", "Candle period: M1 M5 M15 M30 H1 H4 H12 D1 W1 MN1")
311
+ .argument("<from>", "Start Unix timestamp in ms")
312
+ .argument("<to>", "End Unix timestamp in ms")
313
+ .option("--count <n>", "Max number of bars")
314
+ .action(async (symbol, periodStr, from, to, opts) => {
315
+ const period = periodMap[periodStr];
316
+ if (period === undefined) {
317
+ process.stderr.write(`Invalid period: ${periodStr}. Valid: M1 M2 M3 M4 M5 M10 M15 M30 H1 H4 H12 D1 W1 MN1\n`);
318
+ process.exit(1);
319
+ }
320
+ const ct = await getClient();
321
+ const params = {
322
+ period,
323
+ fromTimestamp: Number(from),
324
+ toTimestamp: Number(to),
325
+ };
326
+ if (opts.count !== undefined)
327
+ params.count = Number(opts.count);
328
+ const result = await ct.getTrendbars(symbol, params);
329
+ dump(result);
330
+ ct.disconnect();
331
+ });
332
+ // ─── watch ───────────────────────────────────────────────────────────────────
333
+ program
334
+ .command("watch")
335
+ .description("Stream live bid/ask prices (Ctrl+C to stop)")
336
+ .argument("<symbols...>", "One or more symbol names (e.g. EURUSD XAUUSD)")
337
+ .action(async (symbols) => {
338
+ const ct = await getClient();
339
+ const stop = await ct.watchSpots(symbols, (price) => {
340
+ const line = [
341
+ price.symbol,
342
+ price.bidDecimal !== undefined ? `bid=${price.bidDecimal}` : "",
343
+ price.askDecimal !== undefined ? `ask=${price.askDecimal}` : "",
344
+ ].filter(Boolean).join(" ");
345
+ process.stdout.write(line + "\n");
346
+ });
347
+ const cleanup = async () => {
348
+ await stop();
349
+ ct.disconnect();
350
+ process.exit(0);
351
+ };
352
+ process.on("SIGINT", () => { void cleanup(); });
353
+ process.on("SIGTERM", () => { void cleanup(); });
354
+ });
355
+ program.parseAsync(process.argv).catch((err) => {
356
+ process.stderr.write(String(err) + "\n");
357
+ process.exit(1);
358
+ });
359
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../cli/index.ts"],"names":[],"mappings":"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"}