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,507 @@
1
+ import { CTraderConnection } from "./connection.js";
2
+ import { CTraderAuth } from "./modules/auth.js";
3
+ import { CTraderTrading, } from "./modules/trading.js";
4
+ import { CTraderAccount } from "./modules/account.js";
5
+ import { CTraderMarket } from "./modules/market.js";
6
+ import { SymbolCache } from "./symbol-cache.js";
7
+ import { PayloadType, TradeSide } from "./enums.js";
8
+ import { resolveSlTp } from "./helpers.js";
9
+ export class CTrader {
10
+ /** Low-level WebSocket connection — use for raw events and advanced control */
11
+ connection;
12
+ /** Raw protocol modules — full access to every API parameter */
13
+ raw;
14
+ symbols;
15
+ constructor(config) {
16
+ const connConfig = { endpoint: config.endpoint };
17
+ if (config.maxReconnectAttempts !== undefined)
18
+ connConfig.maxReconnectAttempts = config.maxReconnectAttempts;
19
+ if (config.requestTimeoutMs !== undefined)
20
+ connConfig.requestTimeoutMs = config.requestTimeoutMs;
21
+ if (config.onReconnect !== undefined)
22
+ connConfig.onReconnect = config.onReconnect;
23
+ this.connection = new CTraderConnection(connConfig);
24
+ const auth = new CTraderAuth(this.connection);
25
+ const trading = new CTraderTrading(this.connection, config.accountId);
26
+ const account = new CTraderAccount(this.connection, config.accountId);
27
+ const market = new CTraderMarket(this.connection, config.accountId);
28
+ this.raw = { auth, trading, account, market };
29
+ this.symbols = new SymbolCache(market);
30
+ }
31
+ // ─── Connection ──────────────────────────────────────────────────────────
32
+ /** "connected" | "connecting" | "reconnecting" | "disconnected" */
33
+ get state() { return this.connection.state; }
34
+ /** True when the WebSocket is open and ready */
35
+ get isConnected() { return this.connection.isConnected; }
36
+ /**
37
+ * Switch to a different account without reconnecting.
38
+ * If the account needs separate auth call raw.auth.authenticateAccount() first.
39
+ */
40
+ setAccount(accountId) {
41
+ this.raw.trading.setAccountId(accountId);
42
+ this.raw.account.setAccountId(accountId);
43
+ this.raw.market.setAccountId(accountId);
44
+ }
45
+ /** Disconnect the WebSocket and stop reconnecting */
46
+ disconnect() { this.connection.disconnect(); }
47
+ // ─── Symbols ─────────────────────────────────────────────────────────────
48
+ /**
49
+ * All available symbols for the account. Result is cached.
50
+ * @param includeArchived - Include archived/delisted symbols. Default: false
51
+ */
52
+ async getSymbols(includeArchived = false) {
53
+ const { symbols } = await this.raw.market.getSymbols(includeArchived);
54
+ return symbols;
55
+ }
56
+ /**
57
+ * Full symbol details: spread, commission, swap rates, lot size, trading hours.
58
+ * @param symbolsOrIds - Symbol names ("EURUSD") or numeric IDs, or a mix
59
+ */
60
+ async getSymbolDetails(symbolsOrIds) {
61
+ const ids = await Promise.all(symbolsOrIds.map((s) => this.symbols.resolveId(s)));
62
+ return this.raw.market.getSymbolsById(ids);
63
+ }
64
+ /** Force-refresh the symbol name→ID cache. Call if the broker adds new symbols. */
65
+ async refreshSymbols() { await this.symbols.refresh(); }
66
+ // ─── Account ─────────────────────────────────────────────────────────────
67
+ /** Trader profile: balance, equity, margin, account type, access rights */
68
+ async getTrader() { return this.raw.account.getTrader(); }
69
+ /**
70
+ * All open positions and pending orders.
71
+ * @param returnProtectionOrders - Also return SL/TP as separate order objects
72
+ */
73
+ async getPositions(returnProtectionOrders = false) {
74
+ return this.raw.account.reconcile(returnProtectionOrders);
75
+ }
76
+ /**
77
+ * Call this first to understand the current account situation before making any trading decisions.
78
+ * Returns a complete snapshot: balance, equity, margin, P&L, all positions and orders.
79
+ */
80
+ async getState() {
81
+ const [trader, reconciled, pnlData] = await Promise.all([
82
+ this.raw.account.getTrader(),
83
+ this.raw.account.reconcile(),
84
+ this.raw.account.getPositionUnrealizedPnl(),
85
+ ]);
86
+ const moneyDigits = trader.moneyDigits ?? 2;
87
+ const divisor = Math.pow(10, moneyDigits);
88
+ const unrealizedPnl = pnlData.pnls.reduce((sum, p) => sum + p.netUnrealizedPnL, 0) / divisor;
89
+ const balance = trader.balance / divisor;
90
+ const equity = balance + unrealizedPnl;
91
+ const usedMargin = reconciled.positions.reduce((sum, p) => sum + (p.usedMargin ?? 0), 0) / divisor;
92
+ const freeMargin = equity - usedMargin;
93
+ const result = {
94
+ balance,
95
+ equity,
96
+ usedMargin,
97
+ freeMargin,
98
+ unrealizedPnl,
99
+ positions: reconciled.positions,
100
+ orders: reconciled.orders,
101
+ moneyDigits,
102
+ };
103
+ if (usedMargin > 0) {
104
+ result.marginLevel = (equity / usedMargin) * 100;
105
+ }
106
+ return result;
107
+ }
108
+ /**
109
+ * Deal (execution) history.
110
+ * @param from - Start Unix timestamp in ms
111
+ * @param to - End Unix timestamp in ms
112
+ * @param maxRows - Limit results (API max ~5000)
113
+ */
114
+ async getDeals(from, to, maxRows) {
115
+ const params = {};
116
+ if (from !== undefined)
117
+ params.fromTimestamp = from;
118
+ if (to !== undefined)
119
+ params.toTimestamp = to;
120
+ if (maxRows !== undefined)
121
+ params.maxRows = maxRows;
122
+ return this.raw.account.getDeals(params);
123
+ }
124
+ /** Deal history for a specific position */
125
+ async getDealsByPosition(positionId, from, to) {
126
+ const params = {};
127
+ if (from !== undefined)
128
+ params.fromTimestamp = from;
129
+ if (to !== undefined)
130
+ params.toTimestamp = to;
131
+ const { deals } = await this.raw.account.getDealsByPosition(positionId, params);
132
+ return deals;
133
+ }
134
+ /** Which deals closed (offsetBy) and were closed by (offsetting) a given deal */
135
+ async getDealOffsets(dealId) {
136
+ return this.raw.account.getDealOffsets(dealId);
137
+ }
138
+ /** Order history */
139
+ async getOrders(from, to) {
140
+ const params = {};
141
+ if (from !== undefined)
142
+ params.fromTimestamp = from;
143
+ if (to !== undefined)
144
+ params.toTimestamp = to;
145
+ return this.raw.account.getOrders(params);
146
+ }
147
+ /** Deposit/withdrawal history. Max range: 7 days */
148
+ async getCashFlow(from, to) {
149
+ return this.raw.account.getCashFlowHistory(from, to);
150
+ }
151
+ /**
152
+ * Estimate required margin before placing an order.
153
+ * @param symbol - Symbol name or ID
154
+ * @param volumesInLots - One or more volumes to estimate (e.g. [0.1, 0.5, 1.0])
155
+ */
156
+ async getExpectedMargin(symbol, volumesInLots) {
157
+ const id = await this.symbols.resolveId(symbol);
158
+ return this.raw.account.getExpectedMargin(id, volumesInLots.map(lotsToUnits));
159
+ }
160
+ /** Unrealised P&L for all open positions */
161
+ async getUnrealizedPnl() {
162
+ return this.raw.account.getPositionUnrealizedPnl();
163
+ }
164
+ /** Dynamic leverage tiers for a leverage profile (leverageId comes from symbol details) */
165
+ async getDynamicLeverage(leverageId) {
166
+ return this.raw.account.getDynamicLeverage(leverageId);
167
+ }
168
+ /** Margin call threshold levels (up to 3) */
169
+ async getMarginCalls() { return this.raw.account.getMarginCalls(); }
170
+ /** Update a margin call threshold level */
171
+ async updateMarginCall(marginCall) { return this.raw.account.updateMarginCall(marginCall); }
172
+ // ─── Trading ─────────────────────────────────────────────────────────────
173
+ /**
174
+ * Market BUY — executes immediately at best available price.
175
+ * Returns the opened Position directly (extracted from ExecutionEvent).
176
+ * SL/TP can be specified in pips, dollars, or equity fraction.
177
+ * @param symbol - "EURUSD", "XAUUSD", or numeric symbol ID
178
+ * @param opts - lots, sl?, tp?, label?, etc.
179
+ */
180
+ async buy(symbol, opts) {
181
+ return this.executeMarketOrder(symbol, TradeSide.BUY, opts);
182
+ }
183
+ /**
184
+ * Market SELL — executes immediately at best available price.
185
+ * Returns the opened Position directly (extracted from ExecutionEvent).
186
+ * SL/TP can be specified in pips, dollars, or equity fraction.
187
+ * @param symbol - "EURUSD", "XAUUSD", or numeric symbol ID
188
+ * @param opts - lots, sl?, tp?, label?, etc.
189
+ */
190
+ async sell(symbol, opts) {
191
+ return this.executeMarketOrder(symbol, TradeSide.SELL, opts);
192
+ }
193
+ /**
194
+ * Limit BUY — fills only when price drops to limitPrice or lower.
195
+ * @param symbol - Symbol name or ID
196
+ * @param opts - Must include limitPrice
197
+ */
198
+ async buyLimit(symbol, opts) {
199
+ return this.executeLimitOrder(symbol, TradeSide.BUY, opts);
200
+ }
201
+ /**
202
+ * Limit SELL — fills only when price rises to limitPrice or higher.
203
+ * @param symbol - Symbol name or ID
204
+ * @param opts - Must include limitPrice
205
+ */
206
+ async sellLimit(symbol, opts) {
207
+ return this.executeLimitOrder(symbol, TradeSide.SELL, opts);
208
+ }
209
+ /**
210
+ * Stop BUY — triggers when price rises to stopPrice (breakout entry).
211
+ * @param symbol - Symbol name or ID
212
+ * @param opts - Must include stopPrice
213
+ */
214
+ async buyStop(symbol, opts) {
215
+ return this.executeStopOrder(symbol, TradeSide.BUY, opts);
216
+ }
217
+ /**
218
+ * Stop SELL — triggers when price drops to stopPrice (breakout entry).
219
+ * @param symbol - Symbol name or ID
220
+ * @param opts - Must include stopPrice
221
+ */
222
+ async sellStop(symbol, opts) {
223
+ return this.executeStopOrder(symbol, TradeSide.SELL, opts);
224
+ }
225
+ /**
226
+ * Stop-limit order: when price hits stopPrice, a limit order is placed within slippageInPoints.
227
+ * @param symbol - Symbol name or ID
228
+ * @param tradeSide - TradeSide.BUY or TradeSide.SELL
229
+ * @param opts - Must include stopPrice and slippageInPoints
230
+ */
231
+ async stopLimit(symbol, tradeSide, opts) {
232
+ const id = await this.symbols.resolveId(symbol);
233
+ const volume = lotsToUnits(opts.lots);
234
+ const sltp = await resolveSlTp({ account: this.raw.account, market: this.raw.market, symbols: this.symbols, symbolId: id, volumeInUnits: volume }, opts.sl, opts.tp);
235
+ const p = {
236
+ symbolId: id,
237
+ tradeSide,
238
+ volume,
239
+ stopPrice: opts.stopPrice,
240
+ slippageInPoints: opts.slippageInPoints,
241
+ ...buildMarketOrderFields(opts),
242
+ ...sltp,
243
+ };
244
+ if (opts.expirationTimestamp !== undefined)
245
+ p.expirationTimestamp = opts.expirationTimestamp;
246
+ return this.raw.trading.stopLimitOrder(p);
247
+ }
248
+ /**
249
+ * Modify SL/TP on an open position using human-friendly specs (pips, dollars, equity).
250
+ * @param positionId - The cTrader position ID
251
+ * @param opts - New sl and/or tp
252
+ */
253
+ async modify(positionId, opts) {
254
+ const { positions } = await this.raw.account.reconcile();
255
+ const pos = positions.find((p) => p.positionId === positionId);
256
+ if (pos === undefined)
257
+ throw new Error(`Position ${positionId} not found`);
258
+ const volume = pos.tradeData.volume;
259
+ const symbolId = pos.tradeData.symbolId;
260
+ const sltp = await resolveSlTp({ account: this.raw.account, market: this.raw.market, symbols: this.symbols, symbolId, volumeInUnits: volume }, opts.sl, opts.tp);
261
+ // Convert relative SL/TP to absolute prices: entry ± distance
262
+ const amendParams = {};
263
+ if (sltp.relativeStopLoss !== undefined && pos.price !== undefined) {
264
+ const distance = sltp.relativeStopLoss / 100_000;
265
+ amendParams.stopLoss = pos.tradeData.tradeSide === TradeSide.BUY
266
+ ? pos.price - distance
267
+ : pos.price + distance;
268
+ }
269
+ if (sltp.relativeTakeProfit !== undefined && pos.price !== undefined) {
270
+ const distance = sltp.relativeTakeProfit / 100_000;
271
+ amendParams.takeProfit = pos.tradeData.tradeSide === TradeSide.BUY
272
+ ? pos.price + distance
273
+ : pos.price - distance;
274
+ }
275
+ await this.raw.trading.amendPositionSltp(positionId, amendParams);
276
+ }
277
+ /**
278
+ * Close a position by ID. Full close by default, or partial if lots is specified.
279
+ * @param positionId - The cTrader position ID
280
+ * @param opts - Optional: specify lots for partial close
281
+ */
282
+ async close(positionId, opts) {
283
+ if (opts?.lots !== undefined) {
284
+ return this.raw.trading.closePosition(positionId, lotsToUnits(opts.lots));
285
+ }
286
+ const { positions } = await this.raw.account.reconcile();
287
+ const pos = positions.find((p) => p.positionId === positionId);
288
+ if (pos === undefined)
289
+ throw new Error(`Position ${positionId} not found`);
290
+ return this.raw.trading.closePosition(positionId, pos.tradeData.volume);
291
+ }
292
+ /**
293
+ * Close all positions on a specific symbol.
294
+ * @param symbol - Symbol name ("EURUSD") or numeric ID
295
+ */
296
+ async closeSymbol(symbol) {
297
+ const symbolId = await this.symbols.resolveId(symbol);
298
+ const { positions } = await this.raw.account.reconcile();
299
+ const matching = positions.filter((p) => p.tradeData.symbolId === symbolId);
300
+ return Promise.all(matching.map((p) => this.raw.trading.closePosition(p.positionId, p.tradeData.volume)));
301
+ }
302
+ /** Close every open position on the account */
303
+ async closeAll() {
304
+ const { positions } = await this.raw.account.reconcile();
305
+ return Promise.all(positions.map((p) => this.raw.trading.closePosition(p.positionId, p.tradeData.volume)));
306
+ }
307
+ /**
308
+ * Modify a pending order (limit/stop/stop-limit).
309
+ * Pass only the fields you want to change.
310
+ */
311
+ async modifyOrder(orderId, params) {
312
+ return this.raw.trading.amendOrder(orderId, params);
313
+ }
314
+ /** Cancel a pending order. No-op if already filled or expired. */
315
+ async cancelOrder(orderId) {
316
+ return this.raw.trading.cancelOrder(orderId);
317
+ }
318
+ // ─── Market Data ─────────────────────────────────────────────────────────
319
+ /**
320
+ * Stream live bid/ask prices. Returns an async unsubscribe function.
321
+ * @example
322
+ * const stop = await client.watchSpots(["EURUSD"], (p) => console.log(p.bidDecimal, p.askDecimal));
323
+ * // later: await stop();
324
+ */
325
+ async watchSpots(symbolsOrIds, handler) {
326
+ const ids = await Promise.all(symbolsOrIds.map((s) => this.symbols.resolveId(s)));
327
+ const idToName = new Map(ids.map((id, i) => [id, typeof symbolsOrIds[i] === "string" ? symbolsOrIds[i] : String(symbolsOrIds[i])]));
328
+ await this.raw.market.subscribeSpots(ids);
329
+ const unsub = this.raw.market.onSpot((event) => {
330
+ if (!ids.includes(event.symbolId))
331
+ return;
332
+ const price = { symbol: idToName.get(event.symbolId) ?? String(event.symbolId), symbolId: event.symbolId };
333
+ if (event.bid !== undefined) {
334
+ price.bid = event.bid;
335
+ price.bidDecimal = event.bid / 100000;
336
+ }
337
+ if (event.ask !== undefined) {
338
+ price.ask = event.ask;
339
+ price.askDecimal = event.ask / 100000;
340
+ }
341
+ if (event.timestamp !== undefined)
342
+ price.timestamp = event.timestamp;
343
+ handler(price);
344
+ });
345
+ return async () => {
346
+ unsub();
347
+ await this.raw.market.unsubscribeSpots(ids);
348
+ };
349
+ }
350
+ /**
351
+ * Historical OHLCV candlestick bars.
352
+ * @param symbol - Symbol name or ID
353
+ * @param params - TrendbarPeriod (M1, H1, D1…), fromTimestamp, toTimestamp, count
354
+ */
355
+ async getTrendbars(symbol, params) {
356
+ const id = await this.symbols.resolveId(symbol);
357
+ return this.raw.market.getTrendbars({ ...params, symbolId: id });
358
+ }
359
+ /**
360
+ * Historical tick data (raw bid/ask ticks).
361
+ * @param symbol - Symbol name or ID
362
+ * @param params - QuoteType (BID or ASK), fromTimestamp, toTimestamp
363
+ */
364
+ async getTickData(symbol, params) {
365
+ const id = await this.symbols.resolveId(symbol);
366
+ return this.raw.market.getTickData({ ...params, symbolId: id });
367
+ }
368
+ // ─── Events ──────────────────────────────────────────────────────────────
369
+ /** Fires on every order fill, cancel, or modification. Returns unsubscribe fn */
370
+ onExecution(handler) {
371
+ return this.raw.trading.onExecution(handler);
372
+ }
373
+ /** Fires on order errors (rejected, insufficient margin). Returns unsubscribe fn */
374
+ onOrderError(handler) {
375
+ return this.raw.trading.onOrderError(handler);
376
+ }
377
+ /** Fires when trailing stop price moves. Returns unsubscribe fn */
378
+ onTrailingSLChanged(handler) {
379
+ return this.raw.trading.onTrailingSLChanged(handler);
380
+ }
381
+ /** Fires on balance/equity/settings changes. Returns unsubscribe fn */
382
+ onTraderUpdated(handler) {
383
+ return this.raw.account.onTraderUpdated(handler);
384
+ }
385
+ /** Fires when used margin changes on a position. Returns unsubscribe fn */
386
+ onMarginChanged(handler) {
387
+ return this.raw.account.onMarginChanged(handler);
388
+ }
389
+ /** Fires when margin level crosses a margin call threshold. Returns unsubscribe fn */
390
+ onMarginCallTrigger(handler) {
391
+ return this.raw.account.onMarginCallTrigger(handler);
392
+ }
393
+ /** Fires when broker updates symbol metadata. Returns unsubscribe fn */
394
+ onSymbolChanged(handler) {
395
+ return this.raw.market.onSymbolChanged(handler);
396
+ }
397
+ /** Fires on depth-of-market (order book) changes. Returns unsubscribe fn */
398
+ onDepth(handler) {
399
+ return this.raw.market.onDepth(handler);
400
+ }
401
+ /** Fires when the server disconnects this client (e.g. duplicate connection). Returns unsubscribe fn */
402
+ onClientDisconnect(handler) {
403
+ return this.connection.on(PayloadType.CLIENT_DISCONNECT_EVENT, (payload) => {
404
+ handler(payload);
405
+ });
406
+ }
407
+ /** Fires when the access token is invalidated for one or more accounts. Returns unsubscribe fn */
408
+ onTokenInvalidated(handler) {
409
+ return this.connection.on(PayloadType.ACCOUNTS_TOKEN_INVALIDATED_EVENT, (payload) => {
410
+ handler(payload);
411
+ });
412
+ }
413
+ /** Fires when a specific account is disconnected by the server. Returns unsubscribe fn */
414
+ onAccountDisconnect(handler) {
415
+ return this.connection.on(PayloadType.ACCOUNT_DISCONNECT_EVENT, (payload) => {
416
+ handler(payload);
417
+ });
418
+ }
419
+ // ─── Convenience ────────────────────────────────────────────────────────
420
+ async watchDepth(symbolsOrIds, handler) {
421
+ const ids = await Promise.all(symbolsOrIds.map((s) => this.symbols.resolveId(s)));
422
+ await this.raw.market.subscribeDepth(ids);
423
+ const unsub = this.raw.market.onDepth((event) => {
424
+ if (ids.includes(event.symbolId))
425
+ handler(event);
426
+ });
427
+ return async () => {
428
+ unsub();
429
+ await this.raw.market.unsubscribeDepth(ids);
430
+ };
431
+ }
432
+ // ─── Private helpers ────────────────────────────────────────────────────
433
+ async executeMarketOrder(symbol, tradeSide, opts) {
434
+ const id = await this.symbols.resolveId(symbol);
435
+ const volume = lotsToUnits(opts.lots);
436
+ const sltp = await resolveSlTp({ account: this.raw.account, market: this.raw.market, symbols: this.symbols, symbolId: id, volumeInUnits: volume }, opts.sl, opts.tp);
437
+ const event = await this.raw.trading.marketOrder({
438
+ symbolId: id,
439
+ tradeSide,
440
+ volume,
441
+ ...buildMarketOrderFields(opts),
442
+ ...sltp,
443
+ });
444
+ if (event.position === undefined) {
445
+ throw new Error(`Market order filled but no position returned. ` +
446
+ `ExecutionType: ${event.executionType}, errorCode: ${event.errorCode ?? "none"}`);
447
+ }
448
+ return event.position;
449
+ }
450
+ async executeLimitOrder(symbol, tradeSide, opts) {
451
+ const id = await this.symbols.resolveId(symbol);
452
+ const volume = lotsToUnits(opts.lots);
453
+ const sltp = await resolveSlTp({ account: this.raw.account, market: this.raw.market, symbols: this.symbols, symbolId: id, volumeInUnits: volume }, opts.sl, opts.tp);
454
+ const p = {
455
+ symbolId: id,
456
+ tradeSide,
457
+ volume,
458
+ limitPrice: opts.limitPrice,
459
+ ...buildMarketOrderFields(opts),
460
+ ...sltp,
461
+ };
462
+ if (opts.expirationTimestamp !== undefined)
463
+ p.expirationTimestamp = opts.expirationTimestamp;
464
+ return this.raw.trading.limitOrder(p);
465
+ }
466
+ async executeStopOrder(symbol, tradeSide, opts) {
467
+ const id = await this.symbols.resolveId(symbol);
468
+ const volume = lotsToUnits(opts.lots);
469
+ const sltp = await resolveSlTp({ account: this.raw.account, market: this.raw.market, symbols: this.symbols, symbolId: id, volumeInUnits: volume }, opts.sl, opts.tp);
470
+ const p = {
471
+ symbolId: id,
472
+ tradeSide,
473
+ volume,
474
+ stopPrice: opts.stopPrice,
475
+ ...buildMarketOrderFields(opts),
476
+ ...sltp,
477
+ };
478
+ if (opts.expirationTimestamp !== undefined)
479
+ p.expirationTimestamp = opts.expirationTimestamp;
480
+ return this.raw.trading.stopOrder(p);
481
+ }
482
+ }
483
+ // ─── Volume helpers ───────────────────────────────────────────────────────────
484
+ /** Convert lots (0.01, 0.1, 1.0) to protocol units (1000, 10000, 100000) */
485
+ export function lotsToUnits(lots) {
486
+ return Math.round(lots * 100000);
487
+ }
488
+ /** Convert protocol units back to lots */
489
+ export function unitsToLots(units) {
490
+ return units / 100000;
491
+ }
492
+ export { pipsToRelative } from "./helpers.js";
493
+ function buildMarketOrderFields(opts) {
494
+ const f = {};
495
+ if (opts.trailingStopLoss !== undefined)
496
+ f["trailingStopLoss"] = opts.trailingStopLoss;
497
+ if (opts.guaranteedStopLoss !== undefined)
498
+ f["guaranteedStopLoss"] = opts.guaranteedStopLoss;
499
+ if (opts.label !== undefined)
500
+ f["label"] = opts.label;
501
+ if (opts.comment !== undefined)
502
+ f["comment"] = opts.comment;
503
+ if (opts.clientOrderId !== undefined)
504
+ f["clientOrderId"] = opts.clientOrderId;
505
+ return f;
506
+ }
507
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export type Environment = "demo" | "live";
2
+ export interface CTraderConfig {
3
+ clientId: string;
4
+ clientSecret: string;
5
+ accessToken: string;
6
+ refreshToken?: string;
7
+ accountId: number;
8
+ environment: Environment;
9
+ }
10
+ export type PartialConfig = Partial<CTraderConfig>;
11
+ export declare const DEMO_ENDPOINT = "wss://demo.ctraderapi.com:5036";
12
+ export declare const LIVE_ENDPOINT = "wss://live.ctraderapi.com:5036";
13
+ export declare function endpointForEnvironment(environment: Environment): string;
14
+ export declare function loadStoredConfig(): PartialConfig;
15
+ export declare function saveConfig(config: CTraderConfig): void;
16
+ export declare function getConfigPath(): string;
17
+ export declare function resolveConfig(overrides?: PartialConfig): CTraderConfig;
18
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1C,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;CACzB;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAKnD,eAAO,MAAM,aAAa,mCAAmC,CAAC;AAC9D,eAAO,MAAM,aAAa,mCAAmC,CAAC;AAE9D,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAEvE;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAOhD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAGtD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAgBD,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,aAAa,GAAG,aAAa,CAmBtE"}
@@ -0,0 +1,70 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ const CONFIG_DIR = join(homedir(), ".config", "ctrader-ts");
5
+ const CONFIG_PATH = join(CONFIG_DIR, "config.json");
6
+ export const DEMO_ENDPOINT = "wss://demo.ctraderapi.com:5036";
7
+ export const LIVE_ENDPOINT = "wss://live.ctraderapi.com:5036";
8
+ export function endpointForEnvironment(environment) {
9
+ return environment === "live" ? LIVE_ENDPOINT : DEMO_ENDPOINT;
10
+ }
11
+ export function loadStoredConfig() {
12
+ if (!existsSync(CONFIG_PATH))
13
+ return {};
14
+ try {
15
+ return JSON.parse(readFileSync(CONFIG_PATH, "utf-8"));
16
+ }
17
+ catch {
18
+ return {};
19
+ }
20
+ }
21
+ export function saveConfig(config) {
22
+ if (!existsSync(CONFIG_DIR))
23
+ mkdirSync(CONFIG_DIR, { recursive: true });
24
+ writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));
25
+ }
26
+ export function getConfigPath() {
27
+ return CONFIG_PATH;
28
+ }
29
+ function fromEnv() {
30
+ const env = process.env;
31
+ const result = {};
32
+ if (env["CTRADER_CLIENT_ID"])
33
+ result.clientId = env["CTRADER_CLIENT_ID"];
34
+ if (env["CTRADER_CLIENT_SECRET"])
35
+ result.clientSecret = env["CTRADER_CLIENT_SECRET"];
36
+ if (env["CTRADER_ACCESS_TOKEN"])
37
+ result.accessToken = env["CTRADER_ACCESS_TOKEN"];
38
+ if (env["CTRADER_REFRESH_TOKEN"])
39
+ result.refreshToken = env["CTRADER_REFRESH_TOKEN"];
40
+ if (env["CTRADER_ACCOUNT_ID"])
41
+ result.accountId = Number(env["CTRADER_ACCOUNT_ID"]);
42
+ if (env["CTRADER_ENVIRONMENT"] === "live" || env["CTRADER_ENVIRONMENT"] === "demo") {
43
+ result.environment = env["CTRADER_ENVIRONMENT"];
44
+ }
45
+ return result;
46
+ }
47
+ export function resolveConfig(overrides) {
48
+ const stored = loadStoredConfig();
49
+ const env = fromEnv();
50
+ const merged = { ...stored, ...env, ...overrides };
51
+ if (!merged.clientId)
52
+ throw new Error("Missing clientId. Run `ctrader-ts auth` or set CTRADER_CLIENT_ID.");
53
+ if (!merged.clientSecret)
54
+ throw new Error("Missing clientSecret. Run `ctrader-ts auth` or set CTRADER_CLIENT_SECRET.");
55
+ if (!merged.accessToken)
56
+ throw new Error("Missing accessToken. Run `ctrader-ts auth` or set CTRADER_ACCESS_TOKEN.");
57
+ if (!merged.accountId)
58
+ throw new Error("Missing accountId. Run `ctrader-ts auth` or set CTRADER_ACCOUNT_ID.");
59
+ const result = {
60
+ clientId: merged.clientId,
61
+ clientSecret: merged.clientSecret,
62
+ accessToken: merged.accessToken,
63
+ accountId: merged.accountId,
64
+ environment: merged.environment ?? "demo",
65
+ };
66
+ if (merged.refreshToken)
67
+ result.refreshToken = merged.refreshToken;
68
+ return result;
69
+ }
70
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAejC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,MAAM,CAAC,MAAM,aAAa,GAAG,gCAAgC,CAAC;AAC9D,MAAM,CAAC,MAAM,aAAa,GAAG,gCAAgC,CAAC;AAE9D,MAAM,UAAU,sBAAsB,CAAC,WAAwB;IAC9D,OAAO,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC/B,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAkB,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAqB;IAC/C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,aAAa;IAC5B,OAAO,WAAW,CAAC;AACpB,CAAC;AAED,SAAS,OAAO;IACf,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,IAAI,GAAG,CAAC,mBAAmB,CAAC;QAAE,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACzE,IAAI,GAAG,CAAC,uBAAuB,CAAC;QAAE,MAAM,CAAC,YAAY,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrF,IAAI,GAAG,CAAC,sBAAsB,CAAC;QAAE,MAAM,CAAC,WAAW,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAClF,IAAI,GAAG,CAAC,uBAAuB,CAAC;QAAE,MAAM,CAAC,YAAY,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrF,IAAI,GAAG,CAAC,oBAAoB,CAAC;QAAE,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;IACpF,IAAI,GAAG,CAAC,qBAAqB,CAAC,KAAK,MAAM,IAAI,GAAG,CAAC,qBAAqB,CAAC,KAAK,MAAM,EAAE,CAAC;QACpF,MAAM,CAAC,WAAW,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAyB;IACtD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,MAAM,MAAM,GAAkB,EAAE,GAAG,MAAM,EAAE,GAAG,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;IAElE,IAAI,CAAC,MAAM,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IAC3G,IAAI,CAAC,MAAM,CAAC,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IACvH,IAAI,CAAC,MAAM,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IACpH,IAAI,CAAC,MAAM,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IAE9G,MAAM,MAAM,GAAkB;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,MAAM;KACzC,CAAC;IACF,IAAI,MAAM,CAAC,YAAY;QAAE,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IACnE,OAAO,MAAM,CAAC;AACf,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type PartialConfig, DEMO_ENDPOINT, LIVE_ENDPOINT } from "./config.js";
2
+ import { CTrader } from "./client.js";
3
+ export { DEMO_ENDPOINT, LIVE_ENDPOINT };
4
+ /**
5
+ * Connect to cTrader Open API and authenticate in one call.
6
+ *
7
+ * Reads credentials from ~/.config/ctrader-ts/config.json, then env vars
8
+ * (CTRADER_CLIENT_ID, CTRADER_CLIENT_SECRET, CTRADER_ACCESS_TOKEN,
9
+ * CTRADER_ACCOUNT_ID, CTRADER_ENVIRONMENT), then any overrides passed here.
10
+ *
11
+ * @example
12
+ * const ct = await connect();
13
+ * const pos = await ct.buy("EURUSD", { volume: 0.01 });
14
+ * await ct.close(pos.position!);
15
+ *
16
+ * @example
17
+ * const ct = await connect({ environment: "live" });
18
+ */
19
+ export declare function connect(overrides?: PartialConfig): Promise<CTrader>;
20
+ //# sourceMappingURL=connect.d.ts.map