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.
- package/LICENSE +1 -0
- package/README.md +73 -2
- package/dist/bin/MultiMarketExample.d.ts +1 -0
- package/dist/bin/MultiMarketExample.js +204 -0
- package/dist/bin/QuickExample.d.ts +1 -0
- package/dist/bin/QuickExample.js +139 -0
- package/dist/bin/TestGetCandles.d.ts +1 -0
- package/dist/bin/TestGetCandles.js +211 -0
- package/dist/lib/Service/IQOptionService/Helper/CandleValidator.d.ts +21 -0
- package/dist/lib/Service/IQOptionService/Helper/CandleValidator.js +110 -0
- package/dist/lib/Service/IQOptionService/Helper/CurrencyValidator.d.ts +21 -0
- package/dist/lib/Service/IQOptionService/Helper/CurrencyValidator.js +127 -0
- package/dist/lib/Service/IQOptionService/Helper/index.d.ts +2 -0
- package/dist/lib/Service/IQOptionService/Helper/index.js +3 -1
- package/dist/lib/Service/IQOptionService/IQOptionApi.d.ts +12 -0
- package/dist/lib/Service/IQOptionService/IQOptionApi.js +84 -1
- package/dist/lib/Service/IQOptionService/IQOptionStreamCandleGenerated.js +13 -4
- package/dist/lib/Service/IQOptionService/IQOptionWs.js +2 -1
- package/dist/lib/Service/IQOptionService/Model/IQOptionAction.d.ts +4 -1
- package/dist/lib/Service/IQOptionService/Model/IQOptionAction.js +4 -1
- package/dist/lib/Service/IQOptionService/Model/IQOptionCurrencyUpdated.d.ts +77 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionCurrencyUpdated.js +11 -0
- package/dist/lib/Service/IQOptionService/Model/index.d.ts +1 -0
- package/dist/lib/Service/IQOptionService/Model/index.js +2 -1
- package/dist/lib/Service/IQOptionService/Repository/IQOptionRepository.d.ts +4 -0
- package/dist/lib/Service/IQOptionService/Repository/WebSocketRepository.d.ts +13 -0
- package/dist/lib/Service/IQOptionService/Repository/WebSocketRepository.js +40 -1
- 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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
|
|
@@ -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
|
-
|
|
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
|