iq-option-client 1.3.3 → 1.3.5
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 +4 -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/Test200Candles.d.ts +1 -0
- package/dist/bin/Test200Candles.js +212 -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 +144 -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 +5 -2
|
@@ -0,0 +1,212 @@
|
|
|
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 200 Últimos 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
|
+
// Configuração do teste
|
|
40
|
+
const market = Core.IQOptionMarket.EURUSD;
|
|
41
|
+
const time = Core.IQOptionTime.ONE_MINUTE;
|
|
42
|
+
const numberOfCandles = 200;
|
|
43
|
+
logger.info("📊 Configuração do teste:", {
|
|
44
|
+
metadata: {
|
|
45
|
+
market: market,
|
|
46
|
+
time: time,
|
|
47
|
+
numberOfCandles: numberOfCandles,
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
// Iniciar stream para obter um candle atual e pegar o ID
|
|
51
|
+
logger.info("🔄 Iniciando stream para obter ID do candle atual...");
|
|
52
|
+
const candleStream = new Core.IQOptionStreamCandleGenerated(api.getIQOptionWs(), market, time);
|
|
53
|
+
await candleStream.startStream();
|
|
54
|
+
logger.info("✅ Stream iniciado, aguardando candle atual...");
|
|
55
|
+
// Aguardar um candle para obter o ID atual
|
|
56
|
+
const currentCandle = await new Promise((resolve, reject) => {
|
|
57
|
+
const timeout = setTimeout(() => {
|
|
58
|
+
candleStream.destroy();
|
|
59
|
+
reject(new Error("Timeout aguardando candle atual"));
|
|
60
|
+
}, 30000);
|
|
61
|
+
candleStream.on("data", (candle) => {
|
|
62
|
+
clearTimeout(timeout);
|
|
63
|
+
candleStream.destroy();
|
|
64
|
+
resolve(candle);
|
|
65
|
+
});
|
|
66
|
+
candleStream.on("error", (error) => {
|
|
67
|
+
clearTimeout(timeout);
|
|
68
|
+
candleStream.destroy();
|
|
69
|
+
reject(error);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
logger.info("🕯️ Candle atual recebido:", {
|
|
73
|
+
metadata: {
|
|
74
|
+
id: currentCandle.id,
|
|
75
|
+
active_id: currentCandle.active_id,
|
|
76
|
+
size: currentCandle.size,
|
|
77
|
+
from: currentCandle.from,
|
|
78
|
+
to: currentCandle.to,
|
|
79
|
+
timestamp: new Date(currentCandle.from * 1000).toISOString(),
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
// Calcular range para buscar 200 candles anteriores
|
|
83
|
+
const toId = currentCandle.id;
|
|
84
|
+
const fromId = toId - numberOfCandles + 1; // +1 para incluir o candle atual
|
|
85
|
+
logger.info("📊 Buscando histórico de candles:", {
|
|
86
|
+
metadata: {
|
|
87
|
+
fromId: fromId,
|
|
88
|
+
toId: toId,
|
|
89
|
+
activeId: currentCandle.active_id,
|
|
90
|
+
size: currentCandle.size,
|
|
91
|
+
expectedCount: numberOfCandles,
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
try {
|
|
95
|
+
const startTime = Date.now();
|
|
96
|
+
const historicalCandles = await api.getCandles(currentCandle.active_id, currentCandle.size, fromId, toId, true, // split_normalization
|
|
97
|
+
true // only_closed
|
|
98
|
+
);
|
|
99
|
+
const endTime = Date.now();
|
|
100
|
+
const duration = endTime - startTime;
|
|
101
|
+
logger.info(`✅ Histórico recebido!`, {
|
|
102
|
+
metadata: {
|
|
103
|
+
count: historicalCandles.length,
|
|
104
|
+
expected: numberOfCandles,
|
|
105
|
+
duration: `${duration}ms`,
|
|
106
|
+
fromId: fromId,
|
|
107
|
+
toId: toId,
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
if (historicalCandles.length === 0) {
|
|
111
|
+
logger.warn("⚠️ Nenhum candle retornado. Verifique os IDs.");
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
// Validar se recebemos a quantidade esperada
|
|
115
|
+
if (historicalCandles.length < numberOfCandles) {
|
|
116
|
+
logger.warn(`⚠️ Recebidos ${historicalCandles.length} candles, esperados ${numberOfCandles}`, {
|
|
117
|
+
metadata: {
|
|
118
|
+
received: historicalCandles.length,
|
|
119
|
+
expected: numberOfCandles,
|
|
120
|
+
difference: numberOfCandles - historicalCandles.length,
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
logger.info(`✅ Recebidos ${historicalCandles.length} candles (esperados ${numberOfCandles})`);
|
|
126
|
+
}
|
|
127
|
+
// Mostrar estatísticas dos candles
|
|
128
|
+
const firstCandle = historicalCandles[0];
|
|
129
|
+
const lastCandle = historicalCandles[historicalCandles.length - 1];
|
|
130
|
+
logger.info("📈 Primeiro candle (mais antigo):", {
|
|
131
|
+
metadata: {
|
|
132
|
+
id: firstCandle.id,
|
|
133
|
+
timestamp: new Date(firstCandle.from * 1000).toISOString(),
|
|
134
|
+
open: firstCandle.open,
|
|
135
|
+
close: firstCandle.close,
|
|
136
|
+
high: firstCandle.max,
|
|
137
|
+
low: firstCandle.min,
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
logger.info("📈 Último candle (mais recente):", {
|
|
141
|
+
metadata: {
|
|
142
|
+
id: lastCandle.id,
|
|
143
|
+
timestamp: new Date(lastCandle.from * 1000).toISOString(),
|
|
144
|
+
open: lastCandle.open,
|
|
145
|
+
close: lastCandle.close,
|
|
146
|
+
high: lastCandle.max,
|
|
147
|
+
low: lastCandle.min,
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
// Calcular estatísticas
|
|
151
|
+
const prices = historicalCandles.map(c => c.close);
|
|
152
|
+
const minPrice = Math.min(...prices);
|
|
153
|
+
const maxPrice = Math.max(...prices);
|
|
154
|
+
const avgPrice = prices.reduce((a, b) => a + b, 0) / prices.length;
|
|
155
|
+
logger.info("📊 Estatísticas dos candles:", {
|
|
156
|
+
metadata: {
|
|
157
|
+
totalCandles: historicalCandles.length,
|
|
158
|
+
minPrice: minPrice,
|
|
159
|
+
maxPrice: maxPrice,
|
|
160
|
+
avgPrice: avgPrice.toFixed(5),
|
|
161
|
+
priceRange: (maxPrice - minPrice).toFixed(5),
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
// Validar estrutura dos candles
|
|
165
|
+
const invalidCandles = historicalCandles.filter(candle => {
|
|
166
|
+
return !(typeof candle.id === "number" &&
|
|
167
|
+
typeof candle.open === "number" &&
|
|
168
|
+
typeof candle.close === "number" &&
|
|
169
|
+
typeof candle.max === "number" &&
|
|
170
|
+
typeof candle.min === "number" &&
|
|
171
|
+
typeof candle.from === "number" &&
|
|
172
|
+
typeof candle.to === "number");
|
|
173
|
+
});
|
|
174
|
+
if (invalidCandles.length > 0) {
|
|
175
|
+
logger.warn(`⚠️ ${invalidCandles.length} candles com estrutura inválida`);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
logger.info("✅ Todos os candles têm estrutura válida");
|
|
179
|
+
}
|
|
180
|
+
// Mostrar alguns candles de exemplo (primeiro, meio, último)
|
|
181
|
+
const middleIndex = Math.floor(historicalCandles.length / 2);
|
|
182
|
+
const examples = [
|
|
183
|
+
{ label: "Primeiro", candle: firstCandle },
|
|
184
|
+
{ label: "Meio", candle: historicalCandles[middleIndex] },
|
|
185
|
+
{ label: "Último", candle: lastCandle },
|
|
186
|
+
];
|
|
187
|
+
logger.info("📋 Exemplos de candles:", {
|
|
188
|
+
metadata: {
|
|
189
|
+
examples: examples.map(ex => ({
|
|
190
|
+
label: ex.label,
|
|
191
|
+
id: ex.candle.id,
|
|
192
|
+
timestamp: new Date(ex.candle.from * 1000).toISOString(),
|
|
193
|
+
open: ex.candle.open,
|
|
194
|
+
close: ex.candle.close,
|
|
195
|
+
})),
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
logger.info("✅ Teste concluído com sucesso!");
|
|
199
|
+
process.exit(0);
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
203
|
+
logger.error("❌ Erro ao buscar histórico", {}, err);
|
|
204
|
+
process.exit(1);
|
|
205
|
+
}
|
|
206
|
+
})
|
|
207
|
+
.catch((e) => {
|
|
208
|
+
const error = e instanceof Error ? e : new Error(String(e));
|
|
209
|
+
logger.error("❌ Erro na aplicação", { operation: "main" }, error);
|
|
210
|
+
process.exit(1);
|
|
211
|
+
});
|
|
212
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVzdDIwMENhbmRsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluL1Rlc3QyMDBDYW5kbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7Ozs7R0FPRztBQUNILHlEQUF5RDtBQUN6RCxJQUFJLENBQUM7SUFDRCxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDL0IsQ0FBQztBQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDVCwwQ0FBMEM7QUFDOUMsQ0FBQztBQUVELCtCQUErQjtBQUMvQixpREFBcUQ7QUFFckQsNkNBQTZDO0FBQzdDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDO0FBQzFDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUM7QUFFaEQsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3RCLHNDQUFzQztJQUN0QyxPQUFPLENBQUMsS0FBSyxDQUFDLGtGQUFrRixDQUFDLENBQUM7SUFDbEcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixDQUFDO0FBRUQsTUFBTSxNQUFNLEdBQUcsc0JBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUMxQyxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBRWxELE1BQU0sQ0FBQyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQztBQUV6RCxHQUFHLENBQUMsWUFBWSxFQUFFO0tBQ2IsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNwQixNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFO1FBQ3BDLFFBQVEsRUFBRTtZQUNOLE1BQU0sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN2QixLQUFLLEVBQUUsT0FB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -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
|
+
}
|