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,80 @@
1
+ import type { CTraderConnection } from "../connection.js";
2
+ import { OrderTriggerMethod, TimeInForce, TradeSide } from "../enums.js";
3
+ import type { ExecutionEvent, OrderErrorEvent, TrailingSLChangedEvent } from "../types.js";
4
+ export interface NewOrderParams {
5
+ symbolId: number;
6
+ tradeSide: TradeSide;
7
+ volume: number;
8
+ label?: string;
9
+ comment?: string;
10
+ clientOrderId?: string;
11
+ positionId?: number;
12
+ stopLoss?: number;
13
+ takeProfit?: number;
14
+ relativeStopLoss?: number;
15
+ relativeTakeProfit?: number;
16
+ guaranteedStopLoss?: boolean;
17
+ trailingStopLoss?: boolean;
18
+ stopTriggerMethod?: OrderTriggerMethod;
19
+ }
20
+ export interface LimitOrderParams extends NewOrderParams {
21
+ limitPrice: number;
22
+ timeInForce?: TimeInForce;
23
+ expirationTimestamp?: number;
24
+ }
25
+ export interface StopOrderParams extends NewOrderParams {
26
+ stopPrice: number;
27
+ timeInForce?: TimeInForce;
28
+ expirationTimestamp?: number;
29
+ }
30
+ export interface MarketRangeOrderParams extends NewOrderParams {
31
+ baseSlippagePrice: number;
32
+ slippageInPoints: number;
33
+ }
34
+ export interface StopLimitOrderParams extends NewOrderParams {
35
+ stopPrice: number;
36
+ slippageInPoints: number;
37
+ timeInForce?: TimeInForce;
38
+ expirationTimestamp?: number;
39
+ }
40
+ export interface AmendOrderParams {
41
+ volume?: number;
42
+ limitPrice?: number;
43
+ stopPrice?: number;
44
+ expirationTimestamp?: number;
45
+ stopLoss?: number;
46
+ takeProfit?: number;
47
+ slippageInPoints?: number;
48
+ relativeStopLoss?: number;
49
+ relativeTakeProfit?: number;
50
+ guaranteedStopLoss?: boolean;
51
+ trailingStopLoss?: boolean;
52
+ stopTriggerMethod?: OrderTriggerMethod;
53
+ }
54
+ export interface AmendSltpParams {
55
+ stopLoss?: number;
56
+ takeProfit?: number;
57
+ guaranteedStopLoss?: boolean;
58
+ trailingStopLoss?: boolean;
59
+ stopLossTriggerMethod?: OrderTriggerMethod;
60
+ }
61
+ export declare class CTraderTrading {
62
+ private readonly connection;
63
+ private accountId;
64
+ constructor(connection: CTraderConnection, accountId: number);
65
+ setAccountId(accountId: number): void;
66
+ marketOrder(params: NewOrderParams): Promise<ExecutionEvent>;
67
+ limitOrder(params: LimitOrderParams): Promise<ExecutionEvent>;
68
+ stopOrder(params: StopOrderParams): Promise<ExecutionEvent>;
69
+ stopLimitOrder(params: StopLimitOrderParams): Promise<ExecutionEvent>;
70
+ marketRangeOrder(params: MarketRangeOrderParams): Promise<ExecutionEvent>;
71
+ closePosition(positionId: number, volume: number): Promise<ExecutionEvent>;
72
+ amendPositionSltp(positionId: number, params: AmendSltpParams): Promise<void>;
73
+ amendOrder(orderId: number, params: AmendOrderParams): Promise<void>;
74
+ cancelOrder(orderId: number): Promise<void>;
75
+ onExecution(handler: (event: ExecutionEvent) => void): () => void;
76
+ onOrderError(handler: (event: OrderErrorEvent) => void): () => void;
77
+ onTrailingSLChanged(handler: (event: TrailingSLChangedEvent) => void): () => void;
78
+ private sendNewOrder;
79
+ }
80
+ //# sourceMappingURL=trading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trading.d.ts","sourceRoot":"","sources":["../../../src/modules/trading.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ import { OrderType, PayloadType } from "../enums.js";
2
+ export class CTraderTrading {
3
+ connection;
4
+ accountId;
5
+ constructor(connection, accountId) {
6
+ this.connection = connection;
7
+ this.accountId = accountId;
8
+ }
9
+ setAccountId(accountId) {
10
+ this.accountId = accountId;
11
+ }
12
+ async marketOrder(params) {
13
+ return this.sendNewOrder({ ...params, orderType: OrderType.MARKET });
14
+ }
15
+ async limitOrder(params) {
16
+ return this.sendNewOrder({ ...params, orderType: OrderType.LIMIT });
17
+ }
18
+ async stopOrder(params) {
19
+ return this.sendNewOrder({ ...params, orderType: OrderType.STOP });
20
+ }
21
+ async stopLimitOrder(params) {
22
+ return this.sendNewOrder({ ...params, orderType: OrderType.STOP_LIMIT });
23
+ }
24
+ async marketRangeOrder(params) {
25
+ return this.sendNewOrder({ ...params, orderType: OrderType.MARKET_RANGE });
26
+ }
27
+ async closePosition(positionId, volume) {
28
+ const res = await this.connection.request(PayloadType.CLOSE_POSITION_REQ, {
29
+ ctidTraderAccountId: this.accountId,
30
+ positionId,
31
+ volume,
32
+ });
33
+ return res;
34
+ }
35
+ async amendPositionSltp(positionId, params) {
36
+ const payload = {
37
+ ctidTraderAccountId: this.accountId,
38
+ positionId,
39
+ };
40
+ if (params.stopLoss !== undefined)
41
+ payload["stopLoss"] = params.stopLoss;
42
+ if (params.takeProfit !== undefined)
43
+ payload["takeProfit"] = params.takeProfit;
44
+ if (params.guaranteedStopLoss !== undefined)
45
+ payload["guaranteedStopLoss"] = params.guaranteedStopLoss;
46
+ if (params.trailingStopLoss !== undefined)
47
+ payload["trailingStopLoss"] = params.trailingStopLoss;
48
+ if (params.stopLossTriggerMethod !== undefined)
49
+ payload["stopLossTriggerMethod"] = params.stopLossTriggerMethod;
50
+ await this.connection.request(PayloadType.AMEND_POSITION_SLTP_REQ, payload);
51
+ }
52
+ async amendOrder(orderId, params) {
53
+ const payload = {
54
+ ctidTraderAccountId: this.accountId,
55
+ orderId,
56
+ };
57
+ if (params.volume !== undefined)
58
+ payload["volume"] = params.volume;
59
+ if (params.limitPrice !== undefined)
60
+ payload["limitPrice"] = params.limitPrice;
61
+ if (params.stopPrice !== undefined)
62
+ payload["stopPrice"] = params.stopPrice;
63
+ if (params.expirationTimestamp !== undefined)
64
+ payload["expirationTimestamp"] = params.expirationTimestamp;
65
+ if (params.stopLoss !== undefined)
66
+ payload["stopLoss"] = params.stopLoss;
67
+ if (params.takeProfit !== undefined)
68
+ payload["takeProfit"] = params.takeProfit;
69
+ if (params.slippageInPoints !== undefined)
70
+ payload["slippageInPoints"] = params.slippageInPoints;
71
+ if (params.relativeStopLoss !== undefined)
72
+ payload["relativeStopLoss"] = params.relativeStopLoss;
73
+ if (params.relativeTakeProfit !== undefined)
74
+ payload["relativeTakeProfit"] = params.relativeTakeProfit;
75
+ if (params.guaranteedStopLoss !== undefined)
76
+ payload["guaranteedStopLoss"] = params.guaranteedStopLoss;
77
+ if (params.trailingStopLoss !== undefined)
78
+ payload["trailingStopLoss"] = params.trailingStopLoss;
79
+ if (params.stopTriggerMethod !== undefined)
80
+ payload["stopTriggerMethod"] = params.stopTriggerMethod;
81
+ await this.connection.request(PayloadType.AMEND_ORDER_REQ, payload);
82
+ }
83
+ async cancelOrder(orderId) {
84
+ await this.connection.request(PayloadType.CANCEL_ORDER_REQ, {
85
+ ctidTraderAccountId: this.accountId,
86
+ orderId,
87
+ });
88
+ }
89
+ onExecution(handler) {
90
+ return this.connection.on(PayloadType.EXECUTION_EVENT, (payload) => {
91
+ handler(payload);
92
+ });
93
+ }
94
+ onOrderError(handler) {
95
+ return this.connection.on(PayloadType.ORDER_ERROR_EVENT, (payload) => {
96
+ handler(payload);
97
+ });
98
+ }
99
+ onTrailingSLChanged(handler) {
100
+ return this.connection.on(PayloadType.TRAILING_SL_CHANGED_EVENT, (payload) => {
101
+ handler(payload);
102
+ });
103
+ }
104
+ async sendNewOrder(params) {
105
+ const payload = {
106
+ ctidTraderAccountId: this.accountId,
107
+ symbolId: params.symbolId,
108
+ orderType: params.orderType,
109
+ tradeSide: params.tradeSide,
110
+ volume: params.volume,
111
+ };
112
+ if ("limitPrice" in params && params.limitPrice !== undefined)
113
+ payload["limitPrice"] = params.limitPrice;
114
+ if ("stopPrice" in params && params.stopPrice !== undefined)
115
+ payload["stopPrice"] = params.stopPrice;
116
+ if ("baseSlippagePrice" in params && params.baseSlippagePrice !== undefined)
117
+ payload["baseSlippagePrice"] = params.baseSlippagePrice;
118
+ if ("slippageInPoints" in params && params.slippageInPoints !== undefined)
119
+ payload["slippageInPoints"] = params.slippageInPoints;
120
+ if ("timeInForce" in params && params.timeInForce !== undefined)
121
+ payload["timeInForce"] = params.timeInForce;
122
+ if ("expirationTimestamp" in params && params.expirationTimestamp !== undefined)
123
+ payload["expirationTimestamp"] = params.expirationTimestamp;
124
+ if (params.stopLoss !== undefined)
125
+ payload["stopLoss"] = params.stopLoss;
126
+ if (params.takeProfit !== undefined)
127
+ payload["takeProfit"] = params.takeProfit;
128
+ if (params.relativeStopLoss !== undefined)
129
+ payload["relativeStopLoss"] = params.relativeStopLoss;
130
+ if (params.relativeTakeProfit !== undefined)
131
+ payload["relativeTakeProfit"] = params.relativeTakeProfit;
132
+ if (params.guaranteedStopLoss !== undefined)
133
+ payload["guaranteedStopLoss"] = params.guaranteedStopLoss;
134
+ if (params.trailingStopLoss !== undefined)
135
+ payload["trailingStopLoss"] = params.trailingStopLoss;
136
+ if (params.stopTriggerMethod !== undefined)
137
+ payload["stopTriggerMethod"] = params.stopTriggerMethod;
138
+ if (params.label !== undefined)
139
+ payload["label"] = params.label;
140
+ if (params.comment !== undefined)
141
+ payload["comment"] = params.comment;
142
+ if (params.clientOrderId !== undefined)
143
+ payload["clientOrderId"] = params.clientOrderId;
144
+ if (params.positionId !== undefined)
145
+ payload["positionId"] = params.positionId;
146
+ const res = await this.connection.request(PayloadType.NEW_ORDER_REQ, payload);
147
+ return res;
148
+ }
149
+ }
150
+ //# sourceMappingURL=trading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trading.js","sourceRoot":"","sources":["../../../src/modules/trading.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { CTraderMarket } from "./modules/market.js";
2
+ import type { LightSymbol } from "./types.js";
3
+ export declare class SymbolCache {
4
+ private readonly market;
5
+ private nameToId;
6
+ private idToSymbol;
7
+ constructor(market: CTraderMarket);
8
+ resolveId(symbolOrId: string | number): Promise<number>;
9
+ getSymbol(symbolOrId: string | number): Promise<LightSymbol>;
10
+ refresh(): Promise<void>;
11
+ private getNameToId;
12
+ private getIdToSymbol;
13
+ }
14
+ //# sourceMappingURL=symbol-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-cache.d.ts","sourceRoot":"","sources":["../../src/symbol-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,qBAAa,WAAW;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,UAAU,CAAyC;gBAE/C,MAAM,EAAE,aAAa;IAI3B,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQvD,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAQ5D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAMhB,WAAW;YAKX,aAAa;CAI3B"}
@@ -0,0 +1,41 @@
1
+ export class SymbolCache {
2
+ market;
3
+ nameToId = null;
4
+ idToSymbol = null;
5
+ constructor(market) {
6
+ this.market = market;
7
+ }
8
+ async resolveId(symbolOrId) {
9
+ if (typeof symbolOrId === "number")
10
+ return symbolOrId;
11
+ const map = await this.getNameToId();
12
+ const id = map.get(symbolOrId.toUpperCase());
13
+ if (id === undefined)
14
+ throw new Error(`Symbol not found: "${symbolOrId}". Call client.refreshSymbols() to update the cache.`);
15
+ return id;
16
+ }
17
+ async getSymbol(symbolOrId) {
18
+ const id = await this.resolveId(symbolOrId);
19
+ const map = await this.getIdToSymbol();
20
+ const sym = map.get(id);
21
+ if (sym === undefined)
22
+ throw new Error(`Symbol id ${id} not found in cache.`);
23
+ return sym;
24
+ }
25
+ async refresh() {
26
+ const { symbols } = await this.market.getSymbols();
27
+ this.nameToId = new Map(symbols.map((s) => [s.symbolName?.toUpperCase() ?? "", s.symbolId]));
28
+ this.idToSymbol = new Map(symbols.map((s) => [s.symbolId, s]));
29
+ }
30
+ async getNameToId() {
31
+ if (this.nameToId === null)
32
+ await this.refresh();
33
+ return this.nameToId;
34
+ }
35
+ async getIdToSymbol() {
36
+ if (this.idToSymbol === null)
37
+ await this.refresh();
38
+ return this.idToSymbol;
39
+ }
40
+ }
41
+ //# sourceMappingURL=symbol-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-cache.js","sourceRoot":"","sources":["../../src/symbol-cache.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,WAAW;IACN,MAAM,CAAgB;IAC/B,QAAQ,GAA+B,IAAI,CAAC;IAC5C,UAAU,GAAoC,IAAI,CAAC;IAE3D,YAAY,MAAqB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,UAA2B;QAC1C,IAAI,OAAO,UAAU,KAAK,QAAQ;YAAE,OAAO,UAAU,CAAC;QACtD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7C,IAAI,EAAE,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,UAAU,sDAAsD,CAAC,CAAC;QAC9H,OAAO,EAAE,CAAC;IACX,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,UAA2B;QAC1C,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,GAAG,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;QAC9E,OAAO,GAAG,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,OAAO;QACZ,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACnD,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC7F,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;IAEO,KAAK,CAAC,WAAW;QACxB,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;YAAE,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC,QAAS,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,aAAa;QAC1B,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;YAAE,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC,UAAW,CAAC;IACzB,CAAC;CACD"}