iq-option-client 1.3.3 → 1.3.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.
Files changed (28) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +73 -2
  3. package/dist/bin/MultiMarketExample.d.ts +1 -0
  4. package/dist/bin/MultiMarketExample.js +204 -0
  5. package/dist/bin/QuickExample.d.ts +1 -0
  6. package/dist/bin/QuickExample.js +139 -0
  7. package/dist/bin/TestGetCandles.d.ts +1 -0
  8. package/dist/bin/TestGetCandles.js +211 -0
  9. package/dist/lib/Service/IQOptionService/Helper/CandleValidator.d.ts +21 -0
  10. package/dist/lib/Service/IQOptionService/Helper/CandleValidator.js +110 -0
  11. package/dist/lib/Service/IQOptionService/Helper/CurrencyValidator.d.ts +21 -0
  12. package/dist/lib/Service/IQOptionService/Helper/CurrencyValidator.js +127 -0
  13. package/dist/lib/Service/IQOptionService/Helper/index.d.ts +2 -0
  14. package/dist/lib/Service/IQOptionService/Helper/index.js +3 -1
  15. package/dist/lib/Service/IQOptionService/IQOptionApi.d.ts +12 -0
  16. package/dist/lib/Service/IQOptionService/IQOptionApi.js +84 -1
  17. package/dist/lib/Service/IQOptionService/IQOptionStreamCandleGenerated.js +13 -4
  18. package/dist/lib/Service/IQOptionService/IQOptionWs.js +2 -1
  19. package/dist/lib/Service/IQOptionService/Model/IQOptionAction.d.ts +4 -1
  20. package/dist/lib/Service/IQOptionService/Model/IQOptionAction.js +4 -1
  21. package/dist/lib/Service/IQOptionService/Model/IQOptionCurrencyUpdated.d.ts +77 -0
  22. package/dist/lib/Service/IQOptionService/Model/IQOptionCurrencyUpdated.js +11 -0
  23. package/dist/lib/Service/IQOptionService/Model/index.d.ts +1 -0
  24. package/dist/lib/Service/IQOptionService/Model/index.js +2 -1
  25. package/dist/lib/Service/IQOptionService/Repository/IQOptionRepository.d.ts +4 -0
  26. package/dist/lib/Service/IQOptionService/Repository/WebSocketRepository.d.ts +13 -0
  27. package/dist/lib/Service/IQOptionService/Repository/WebSocketRepository.js +40 -1
  28. package/package.json +4 -2
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /*
4
+ * Copyright (C) 2020 Wellington Rocha
5
+ * All Rights Reserved.
6
+ *
7
+ * Unauthorized copying of this file, via any medium is strictly prohibited.
8
+ *
9
+ * Proprietary and confidential.
10
+ */
11
+ // Load environment variables from .env file if it exists
12
+ try {
13
+ require("dotenv").config();
14
+ }
15
+ catch (e) {
16
+ // dotenv is optional, continue without it
17
+ }
18
+ const Core = require("../lib");
19
+ const Logger_1 = require("../lib/Helper/Logger");
20
+ // Get credentials from environment variables
21
+ const email = process.env.IQ_OPTION_EMAIL;
22
+ const password = process.env.IQ_OPTION_PASSWORD;
23
+ if (!email || !password) {
24
+ // eslint-disable-next-line no-console
25
+ console.error("Error: IQ_OPTION_EMAIL and IQ_OPTION_PASSWORD environment variables are required");
26
+ process.exit(1);
27
+ }
28
+ const logger = Logger_1.LoggerFactory.getDefault();
29
+ const api = new Core.IQOptionApi(email, password);
30
+ logger.info("=== Teste: Buscar Histórico de Candles ===");
31
+ api.connectAsync()
32
+ .then(async (profile) => {
33
+ logger.info("✅ Conectado com sucesso!", {
34
+ metadata: {
35
+ userId: profile.user_id,
36
+ email: profile.email,
37
+ },
38
+ });
39
+ // Teste 1: Buscar candles históricos para EURUSD
40
+ logger.info("📊 Teste 1: Buscar candles históricos para EURUSD (active_id: 1)");
41
+ try {
42
+ // Usar IDs de exemplo baseados nas mensagens que você mostrou
43
+ // Vamos buscar um range pequeno primeiro para testar
44
+ const candles1 = await api.getCandles(1, // EURUSD
45
+ 60, // 1 minuto (60 segundos)
46
+ 1000, // from_id (exemplo - você precisa usar IDs reais)
47
+ 1100, // to_id (exemplo - você precisa usar IDs reais)
48
+ true, // split_normalization
49
+ true // only_closed
50
+ );
51
+ logger.info(`✅ Teste 1: Recebidos ${candles1.length} candles`, {
52
+ metadata: {
53
+ count: candles1.length,
54
+ activeId: 1,
55
+ size: 60,
56
+ },
57
+ });
58
+ if (candles1.length > 0) {
59
+ logger.info("📈 Primeiro candle:", {
60
+ metadata: {
61
+ id: candles1[0].id,
62
+ open: candles1[0].open,
63
+ close: candles1[0].close,
64
+ high: candles1[0].max,
65
+ low: candles1[0].min,
66
+ from: candles1[0].from,
67
+ to: candles1[0].to,
68
+ },
69
+ });
70
+ logger.info("📈 Último candle:", {
71
+ metadata: {
72
+ id: candles1[candles1.length - 1].id,
73
+ open: candles1[candles1.length - 1].open,
74
+ close: candles1[candles1.length - 1].close,
75
+ high: candles1[candles1.length - 1].max,
76
+ low: candles1[candles1.length - 1].min,
77
+ },
78
+ });
79
+ // Validar estrutura dos candles
80
+ const isValid = candles1.every(candle => {
81
+ return (typeof candle.id === "number" &&
82
+ typeof candle.open === "number" &&
83
+ typeof candle.close === "number" &&
84
+ typeof candle.max === "number" &&
85
+ typeof candle.min === "number" &&
86
+ typeof candle.from === "number" &&
87
+ typeof candle.to === "number");
88
+ });
89
+ if (isValid) {
90
+ logger.info("✅ Validação: Todos os candles têm estrutura válida");
91
+ }
92
+ else {
93
+ logger.warn("⚠️ Validação: Alguns candles podem ter estrutura inválida");
94
+ }
95
+ }
96
+ else {
97
+ logger.warn("⚠️ Nenhum candle retornado. Pode ser que os IDs não existam ou o range esteja vazio.");
98
+ logger.info("💡 Dica: Você precisa usar IDs de candles reais. Tente obter IDs do stream de candles primeiro.");
99
+ }
100
+ }
101
+ catch (error) {
102
+ const err = error instanceof Error ? error : new Error(String(error));
103
+ logger.error("❌ Teste 1 falhou", {}, err);
104
+ }
105
+ // Teste 2: Buscar candles com diferentes tamanhos
106
+ logger.info("📊 Teste 2: Buscar candles de 2 minutos (120 segundos)");
107
+ try {
108
+ const candles2 = await api.getCandles(1, // EURUSD
109
+ 120, // 2 minutos (120 segundos)
110
+ 500, // from_id
111
+ 600, // to_id
112
+ true, true);
113
+ logger.info(`✅ Teste 2: Recebidos ${candles2.length} candles de 2 minutos`, {
114
+ metadata: {
115
+ count: candles2.length,
116
+ size: 120,
117
+ },
118
+ });
119
+ }
120
+ catch (error) {
121
+ const err = error instanceof Error ? error : new Error(String(error));
122
+ logger.error("❌ Teste 2 falhou", {}, err);
123
+ }
124
+ // Teste 3: Obter IDs reais do stream primeiro
125
+ logger.info("📊 Teste 3: Obter IDs reais do stream de candles");
126
+ try {
127
+ const market = Core.IQOptionMarket.EURUSD;
128
+ const time = Core.IQOptionTime.ONE_MINUTE;
129
+ const candleStream = new Core.IQOptionStreamCandleGenerated(api.getIQOptionWs(), market, time);
130
+ await candleStream.startStream();
131
+ logger.info("✅ Stream de candles iniciado, aguardando candles...");
132
+ // Aguardar alguns candles para obter IDs reais
133
+ const receivedCandles = [];
134
+ candleStream.on("data", async (candle) => {
135
+ receivedCandles.push(candle);
136
+ logger.info(`🕯️ Candle recebido do stream`, {
137
+ metadata: {
138
+ id: candle.id,
139
+ active_id: candle.active_id,
140
+ from: candle.from,
141
+ to: candle.to,
142
+ },
143
+ });
144
+ // Após receber 3 candles, tentar buscar histórico usando os IDs
145
+ if (receivedCandles.length >= 3) {
146
+ candleStream.destroy();
147
+ const firstCandle = receivedCandles[0];
148
+ const lastCandle = receivedCandles[receivedCandles.length - 1];
149
+ logger.info("📊 Teste 4: Buscar histórico usando IDs reais do stream");
150
+ logger.info("Usando IDs:", {
151
+ metadata: {
152
+ fromId: firstCandle.id,
153
+ toId: lastCandle.id,
154
+ activeId: firstCandle.active_id,
155
+ size: firstCandle.size,
156
+ },
157
+ });
158
+ try {
159
+ const historicalCandles = await api.getCandles(firstCandle.active_id, firstCandle.size, firstCandle.id - 10, // Buscar alguns candles antes
160
+ lastCandle.id + 10, // E alguns depois
161
+ true, true);
162
+ logger.info(`✅ Teste 4: Recebidos ${historicalCandles.length} candles históricos`, {
163
+ metadata: {
164
+ count: historicalCandles.length,
165
+ requestedRange: {
166
+ from: firstCandle.id - 10,
167
+ to: lastCandle.id + 10,
168
+ },
169
+ },
170
+ });
171
+ if (historicalCandles.length > 0) {
172
+ logger.info("📈 Exemplo de candle histórico:", {
173
+ metadata: {
174
+ id: historicalCandles[0].id,
175
+ open: historicalCandles[0].open,
176
+ close: historicalCandles[0].close,
177
+ high: historicalCandles[0].max,
178
+ low: historicalCandles[0].min,
179
+ timestamp: new Date(historicalCandles[0].from * 1000).toISOString(),
180
+ },
181
+ });
182
+ }
183
+ logger.info("✅ Todos os testes concluídos!");
184
+ process.exit(0);
185
+ }
186
+ catch (error) {
187
+ const err = error instanceof Error ? error : new Error(String(error));
188
+ logger.error("❌ Teste 4 falhou", {}, err);
189
+ process.exit(1);
190
+ }
191
+ }
192
+ });
193
+ // Timeout de segurança
194
+ setTimeout(() => {
195
+ logger.warn("⏱️ Timeout - encerrando teste");
196
+ candleStream.destroy();
197
+ process.exit(0);
198
+ }, 60000);
199
+ }
200
+ catch (error) {
201
+ const err = error instanceof Error ? error : new Error(String(error));
202
+ logger.error("❌ Teste 3 falhou", {}, err);
203
+ process.exit(1);
204
+ }
205
+ })
206
+ .catch((e) => {
207
+ const error = e instanceof Error ? e : new Error(String(e));
208
+ logger.error("❌ Erro na aplicação", { operation: "main" }, error);
209
+ process.exit(1);
210
+ });
211
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVzdEdldENhbmRsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluL1Rlc3RHZXRDYW5kbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7Ozs7R0FPRztBQUNILHlEQUF5RDtBQUN6RCxJQUFJLENBQUM7SUFDRCxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDL0IsQ0FBQztBQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDVCwwQ0FBMEM7QUFDOUMsQ0FBQztBQUVELCtCQUErQjtBQUMvQixpREFBcUQ7QUFFckQsNkNBQTZDO0FBQzdDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDO0FBQzFDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUM7QUFFaEQsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3RCLHNDQUFzQztJQUN0QyxPQUFPLENBQUMsS0FBSyxDQUFDLGtGQUFrRixDQUFDLENBQUM7SUFDbEcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixDQUFDO0FBRUQsTUFBTSxNQUFNLEdBQUcsc0JBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUMxQyxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBRWxELE1BQU0sQ0FBQyxJQUFJLENBQUMsNENBQTRDLENBQUMsQ0FBQztBQUUxRCxHQUFHLENBQUMsWUFBWSxFQUFFO0tBQ2IsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNwQixNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFO1FBQ3BDLFFBQVEsRUFBRTtZQUNOLE1BQU0sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN2QixLQUFLLEVBQUUsT0FB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QUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDZCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNiLE1BQU0sR0FBRyxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDdEUsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixDQUFDO0FBQ0wsQ0FBQyxDQUFDO0tBQ0QsS0FBSyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7SUFDZCxNQUFNLEtBQUssR0FBRyxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVELE1BQU0sQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixDQUFDLENBQUMsQ0FBQyJ9
@@ -0,0 +1,21 @@
1
+ import { IQOptionCandle } from "../Model/IQOptionCandle";
2
+ /**
3
+ * Validator for candle messages.
4
+ */
5
+ export declare class CandleValidator {
6
+ /**
7
+ * Validate candle data structure.
8
+ *
9
+ * @param candle Candle data to validate
10
+ * @throws {IQOptionError} If validation fails
11
+ */
12
+ static validate(candle: any): candle is IQOptionCandle;
13
+ /**
14
+ * Validate candle message structure (with name and microserviceName).
15
+ *
16
+ * @param message Full message object
17
+ * @returns Validated candle data
18
+ * @throws {IQOptionError} If validation fails
19
+ */
20
+ static validateMessage(message: any): IQOptionCandle;
21
+ }
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CandleValidator = void 0;
4
+ const IQOptionError_1 = require("../Error/IQOptionError");
5
+ /**
6
+ * Validator for candle messages.
7
+ */
8
+ class CandleValidator {
9
+ /**
10
+ * Validate candle data structure.
11
+ *
12
+ * @param candle Candle data to validate
13
+ * @throws {IQOptionError} If validation fails
14
+ */
15
+ static validate(candle) {
16
+ if (!candle || typeof candle !== "object") {
17
+ throw new IQOptionError_1.IQOptionError("Candle data is required and must be an object", "VALIDATION_ERROR");
18
+ }
19
+ const requiredFields = [
20
+ "active_id",
21
+ "size",
22
+ "at",
23
+ "from",
24
+ "to",
25
+ "id",
26
+ "open",
27
+ "close",
28
+ "min",
29
+ "max",
30
+ "ask",
31
+ "bid",
32
+ "volume",
33
+ "phase",
34
+ ];
35
+ // Check all required fields exist
36
+ for (const field of requiredFields) {
37
+ if (!(field in candle)) {
38
+ throw new IQOptionError_1.IQOptionError(`Missing required field: ${field}`, "VALIDATION_ERROR");
39
+ }
40
+ }
41
+ // Validate field types
42
+ if (typeof candle.active_id !== "number" || candle.active_id <= 0) {
43
+ throw new IQOptionError_1.IQOptionError("active_id must be a positive number", "VALIDATION_ERROR");
44
+ }
45
+ if (typeof candle.size !== "number" || candle.size <= 0) {
46
+ throw new IQOptionError_1.IQOptionError("size must be a positive number", "VALIDATION_ERROR");
47
+ }
48
+ if (typeof candle.at !== "number" || candle.at <= 0) {
49
+ throw new IQOptionError_1.IQOptionError("at must be a positive number (timestamp)", "VALIDATION_ERROR");
50
+ }
51
+ if (typeof candle.from !== "number" || candle.from <= 0) {
52
+ throw new IQOptionError_1.IQOptionError("from must be a positive number (timestamp)", "VALIDATION_ERROR");
53
+ }
54
+ if (typeof candle.to !== "number" || candle.to <= 0) {
55
+ throw new IQOptionError_1.IQOptionError("to must be a positive number (timestamp)", "VALIDATION_ERROR");
56
+ }
57
+ if (candle.from >= candle.to) {
58
+ throw new IQOptionError_1.IQOptionError("from timestamp must be less than to timestamp", "VALIDATION_ERROR");
59
+ }
60
+ if (typeof candle.id !== "number" || candle.id <= 0) {
61
+ throw new IQOptionError_1.IQOptionError("id must be a positive number", "VALIDATION_ERROR");
62
+ }
63
+ // Validate price fields
64
+ const priceFields = ["open", "close", "min", "max", "ask", "bid"];
65
+ for (const field of priceFields) {
66
+ if (typeof candle[field] !== "number" || candle[field] < 0) {
67
+ throw new IQOptionError_1.IQOptionError(`${field} must be a non-negative number`, "VALIDATION_ERROR");
68
+ }
69
+ }
70
+ // Validate OHLC relationships
71
+ if (candle.min > candle.max) {
72
+ throw new IQOptionError_1.IQOptionError("min must be less than or equal to max", "VALIDATION_ERROR");
73
+ }
74
+ if (candle.open < candle.min || candle.open > candle.max) {
75
+ throw new IQOptionError_1.IQOptionError("open must be between min and max", "VALIDATION_ERROR");
76
+ }
77
+ if (candle.close < candle.min || candle.close > candle.max) {
78
+ throw new IQOptionError_1.IQOptionError("close must be between min and max", "VALIDATION_ERROR");
79
+ }
80
+ if (typeof candle.volume !== "number" || candle.volume < 0) {
81
+ throw new IQOptionError_1.IQOptionError("volume must be a non-negative number", "VALIDATION_ERROR");
82
+ }
83
+ if (typeof candle.phase !== "string" || candle.phase.length === 0) {
84
+ throw new IQOptionError_1.IQOptionError("phase must be a non-empty string", "VALIDATION_ERROR");
85
+ }
86
+ return true;
87
+ }
88
+ /**
89
+ * Validate candle message structure (with name and microserviceName).
90
+ *
91
+ * @param message Full message object
92
+ * @returns Validated candle data
93
+ * @throws {IQOptionError} If validation fails
94
+ */
95
+ static validateMessage(message) {
96
+ if (!message || typeof message !== "object") {
97
+ throw new IQOptionError_1.IQOptionError("Message is required and must be an object", "VALIDATION_ERROR");
98
+ }
99
+ if (message.name !== "candle-generated") {
100
+ throw new IQOptionError_1.IQOptionError(`Invalid message name: expected "candle-generated", got "${message.name}"`, "VALIDATION_ERROR");
101
+ }
102
+ if (!message.msg || typeof message.msg !== "object") {
103
+ throw new IQOptionError_1.IQOptionError("Message must contain a 'msg' object with candle data", "VALIDATION_ERROR");
104
+ }
105
+ this.validate(message.msg);
106
+ return message.msg;
107
+ }
108
+ }
109
+ exports.CandleValidator = CandleValidator;
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FuZGxlVmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9TZXJ2aWNlL0lRT3B0aW9uU2VydmljZS9IZWxwZXIvQ2FuZGxlVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVNBLDBEQUF1RDtBQUV2RDs7R0FFRztBQUNILE1BQWEsZUFBZTtJQUN4Qjs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBVztRQUM5QixJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSw2QkFBYSxDQUFDLCtDQUErQyxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDakcsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFnQztZQUNoRCxXQUFXO1lBQ1gsTUFBTTtZQUNOLElBQUk7WUFDSixNQUFNO1lBQ04sSUFBSTtZQUNKLElBQUk7WUFDSixNQUFNO1lBQ04sT0FBTztZQUNQLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxRQUFRO1lBQ1IsT0FBTztTQUNWLENBQUM7UUFFRixrQ0FBa0M7UUFDbEMsS0FBSyxNQUFNLEtBQUssSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxJQUFJLDZCQUFhLENBQUMsMkJBQTJCLEtBQUssRUFBRSxFQUFFLGtCQUFrQixDQUFDLENBQUM7WUFDcEYsQ0FBQztRQUNMLENBQUM7UUFFRCx1QkFBdUI7UUFDdkIsSUFBSSxPQUFPLE1BQU0sQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDaEUsTUFBTSxJQUFJLDZCQUFhLENBQUMscUNBQXFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUN2RixDQUFD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
@@ -0,0 +1,21 @@
1
+ import { IQOptionCurrencyUpdated } from "../Model/IQOptionCurrencyUpdated";
2
+ /**
3
+ * Validator for currency update messages.
4
+ */
5
+ export declare class CurrencyValidator {
6
+ /**
7
+ * Validate currency data structure.
8
+ *
9
+ * @param currency Currency data to validate
10
+ * @throws {IQOptionError} If validation fails
11
+ */
12
+ static validate(currency: any): currency is IQOptionCurrencyUpdated;
13
+ /**
14
+ * Validate currency update message structure (with name and microserviceName).
15
+ *
16
+ * @param message Full message object
17
+ * @returns Validated currency data
18
+ * @throws {IQOptionError} If validation fails
19
+ */
20
+ static validateMessage(message: any): IQOptionCurrencyUpdated;
21
+ }
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CurrencyValidator = void 0;
4
+ const IQOptionError_1 = require("../Error/IQOptionError");
5
+ /**
6
+ * Validator for currency update messages.
7
+ */
8
+ class CurrencyValidator {
9
+ /**
10
+ * Validate currency data structure.
11
+ *
12
+ * @param currency Currency data to validate
13
+ * @throws {IQOptionError} If validation fails
14
+ */
15
+ static validate(currency) {
16
+ if (!currency || typeof currency !== "object") {
17
+ throw new IQOptionError_1.IQOptionError("Currency data is required and must be an object", "VALIDATION_ERROR");
18
+ }
19
+ const requiredFields = [
20
+ "id",
21
+ "name",
22
+ "description",
23
+ "symbol",
24
+ "mask",
25
+ "is_visible",
26
+ "is_tradable",
27
+ "code",
28
+ "unit",
29
+ "rate",
30
+ "rate_usd",
31
+ "min_deal_amount",
32
+ "max_deal_amount",
33
+ "minor_units",
34
+ "is_crypto",
35
+ "is_inout",
36
+ "interest_rate",
37
+ ];
38
+ // Check all required fields exist
39
+ for (const field of requiredFields) {
40
+ if (!(field in currency)) {
41
+ throw new IQOptionError_1.IQOptionError(`Missing required field: ${field}`, "VALIDATION_ERROR");
42
+ }
43
+ }
44
+ // Validate field types
45
+ if (typeof currency.id !== "number" || currency.id <= 0) {
46
+ throw new IQOptionError_1.IQOptionError("id must be a positive number", "VALIDATION_ERROR");
47
+ }
48
+ if (typeof currency.name !== "string" || currency.name.length === 0) {
49
+ throw new IQOptionError_1.IQOptionError("name must be a non-empty string", "VALIDATION_ERROR");
50
+ }
51
+ if (typeof currency.description !== "string") {
52
+ throw new IQOptionError_1.IQOptionError("description must be a string", "VALIDATION_ERROR");
53
+ }
54
+ if (typeof currency.symbol !== "string" || currency.symbol.length === 0) {
55
+ throw new IQOptionError_1.IQOptionError("symbol must be a non-empty string", "VALIDATION_ERROR");
56
+ }
57
+ if (typeof currency.mask !== "string") {
58
+ throw new IQOptionError_1.IQOptionError("mask must be a string", "VALIDATION_ERROR");
59
+ }
60
+ if (typeof currency.is_visible !== "boolean") {
61
+ throw new IQOptionError_1.IQOptionError("is_visible must be a boolean", "VALIDATION_ERROR");
62
+ }
63
+ if (typeof currency.is_tradable !== "boolean") {
64
+ throw new IQOptionError_1.IQOptionError("is_tradable must be a boolean", "VALIDATION_ERROR");
65
+ }
66
+ if (typeof currency.code !== "string") {
67
+ throw new IQOptionError_1.IQOptionError("code must be a string", "VALIDATION_ERROR");
68
+ }
69
+ if (typeof currency.unit !== "number" || currency.unit <= 0) {
70
+ throw new IQOptionError_1.IQOptionError("unit must be a positive number", "VALIDATION_ERROR");
71
+ }
72
+ if (typeof currency.rate !== "number" || currency.rate < 0) {
73
+ throw new IQOptionError_1.IQOptionError("rate must be a non-negative number", "VALIDATION_ERROR");
74
+ }
75
+ if (typeof currency.rate_usd !== "number" || currency.rate_usd < 0) {
76
+ throw new IQOptionError_1.IQOptionError("rate_usd must be a non-negative number", "VALIDATION_ERROR");
77
+ }
78
+ if (typeof currency.min_deal_amount !== "number" || currency.min_deal_amount < 0) {
79
+ throw new IQOptionError_1.IQOptionError("min_deal_amount must be a non-negative number", "VALIDATION_ERROR");
80
+ }
81
+ if (typeof currency.max_deal_amount !== "number" || currency.max_deal_amount < 0) {
82
+ throw new IQOptionError_1.IQOptionError("max_deal_amount must be a non-negative number", "VALIDATION_ERROR");
83
+ }
84
+ if (currency.min_deal_amount > currency.max_deal_amount) {
85
+ throw new IQOptionError_1.IQOptionError("min_deal_amount must be less than or equal to max_deal_amount", "VALIDATION_ERROR");
86
+ }
87
+ if (typeof currency.minor_units !== "number" || currency.minor_units < 0) {
88
+ throw new IQOptionError_1.IQOptionError("minor_units must be a non-negative number", "VALIDATION_ERROR");
89
+ }
90
+ // image can be null or string
91
+ if (currency.image !== null && typeof currency.image !== "string") {
92
+ throw new IQOptionError_1.IQOptionError("image must be null or a string", "VALIDATION_ERROR");
93
+ }
94
+ if (typeof currency.is_crypto !== "boolean") {
95
+ throw new IQOptionError_1.IQOptionError("is_crypto must be a boolean", "VALIDATION_ERROR");
96
+ }
97
+ if (typeof currency.is_inout !== "boolean") {
98
+ throw new IQOptionError_1.IQOptionError("is_inout must be a boolean", "VALIDATION_ERROR");
99
+ }
100
+ if (typeof currency.interest_rate !== "number" || currency.interest_rate < 0) {
101
+ throw new IQOptionError_1.IQOptionError("interest_rate must be a non-negative number", "VALIDATION_ERROR");
102
+ }
103
+ return true;
104
+ }
105
+ /**
106
+ * Validate currency update message structure (with name and microserviceName).
107
+ *
108
+ * @param message Full message object
109
+ * @returns Validated currency data
110
+ * @throws {IQOptionError} If validation fails
111
+ */
112
+ static validateMessage(message) {
113
+ if (!message || typeof message !== "object") {
114
+ throw new IQOptionError_1.IQOptionError("Message is required and must be an object", "VALIDATION_ERROR");
115
+ }
116
+ if (message.name !== "currency-updated") {
117
+ throw new IQOptionError_1.IQOptionError(`Invalid message name: expected "currency-updated", got "${message.name}"`, "VALIDATION_ERROR");
118
+ }
119
+ if (!message.msg || typeof message.msg !== "object") {
120
+ throw new IQOptionError_1.IQOptionError("Message must contain a 'msg' object with currency data", "VALIDATION_ERROR");
121
+ }
122
+ this.validate(message.msg);
123
+ return message.msg;
124
+ }
125
+ }
126
+ exports.CurrencyValidator = CurrencyValidator;
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3VycmVuY3lWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL1NlcnZpY2UvSVFPcHRpb25TZXJ2aWNlL0hlbHBlci9DdXJyZW5jeVZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFTQSwwREFBdUQ7QUFFdkQ7O0dBRUc7QUFDSCxNQUFhLGlCQUFpQjtJQUMxQjs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBYTtRQUNoQyxJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzVDLE1BQU0sSUFBSSw2QkFBYSxDQUFDLGlEQUFpRCxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDbkcsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUF5QztZQUN6RCxJQUFJO1lBQ0osTUFBTTtZQUNOLGFBQWE7WUFDYixRQUFRO1lBQ1IsTUFBTTtZQUNOLFlBQVk7WUFDWixhQUFhO1lBQ2IsTUFBTTtZQUNOLE1BQU07WUFDTixNQUFNO1lBQ04sVUFBVTtZQUNWLGlCQUFpQjtZQUNqQixpQkFBaUI7WUFDakIsYUFBYTtZQUNiLFdBQVc7WUFDWCxVQUFVO1lBQ1YsZUFBZTtTQUNsQixDQUFDO1FBRUYsa0NBQWtDO1FBQ2xDLEtBQUssTUFBTSxLQUFLLElBQUksY0FBYyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sSUFBSSw2QkFBYSxDQUFDLDJCQUEyQixLQUFLLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3BGLENBQUM7UUFDTCxDQUFDO1FBRUQsdUJBQXVCO1FBQ3ZCLElBQUksT0FBTyxRQUFRLENBQUMsRUFBRSxLQUFLLFFBQVEsSUFBSSxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3RELE1BQU0sSUFBSSw2QkFBYSxD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
@@ -1,2 +1,4 @@
1
1
  export * from "./RequestIdGenerator";
2
2
  export * from "./InputValidator";
3
+ export * from "./CandleValidator";
4
+ export * from "./CurrencyValidator";
@@ -24,4 +24,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
24
24
  */
25
25
  __exportStar(require("./RequestIdGenerator"), exports);
26
26
  __exportStar(require("./InputValidator"), exports);
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL1NlcnZpY2UvSVFPcHRpb25TZXJ2aWNlL0hlbHBlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7Ozs7R0FPRztBQUNILHVEQUFxQztBQUNyQyxtREFBaUMifQ==
27
+ __exportStar(require("./CandleValidator"), exports);
28
+ __exportStar(require("./CurrencyValidator"), exports);
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL1NlcnZpY2UvSVFPcHRpb25TZXJ2aWNlL0hlbHBlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7Ozs7R0FPRztBQUNILHVEQUFxQztBQUNyQyxtREFBaUM7QUFDakMsb0RBQWtDO0FBQ2xDLHNEQUFvQyJ9
@@ -88,6 +88,18 @@ export declare class IQOptionApi {
88
88
  * @returns
89
89
  */
90
90
  getDigitalOptionInstruments(market: Core.IQOptionMarket): Promise<Core.IQOptionInstruments>;
91
+ /**
92
+ * Get historical candles.
93
+ *
94
+ * @param activeId Market/Active ID
95
+ * @param size Candle size in seconds (e.g., 60 for 1 minute, 120 for 2 minutes)
96
+ * @param fromId Starting candle ID
97
+ * @param toId Ending candle ID
98
+ * @param splitNormalization Normalize split (default: true)
99
+ * @param onlyClosed Only get closed candles (default: true)
100
+ * @returns Array of historical candles
101
+ */
102
+ getCandles(activeId: number, size: number, fromId: number, toId: number, splitNormalization?: boolean, onlyClosed?: boolean): Promise<Core.IQOptionCandle[]>;
91
103
  /**
92
104
  * Get next request id.
93
105
  * @deprecated Use RequestIdGenerator.getNext() instead