market-data-tradingview-ws 0.0.9 → 0.0.11
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/lib/client.js +81 -28
- package/lib/tradingView.js +8 -4
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -21,15 +21,36 @@ module.exports = class Client {
|
|
|
21
21
|
values: {},
|
|
22
22
|
set({ key, data }) {
|
|
23
23
|
if (data) {
|
|
24
|
-
this.values[key] =
|
|
24
|
+
this.values[key] = {
|
|
25
|
+
id: data.id,
|
|
26
|
+
symbol: data.symbol,
|
|
27
|
+
period: parseInt(data.period),
|
|
28
|
+
symbolKey: data.symbolKey,
|
|
29
|
+
frame: data.frame,
|
|
30
|
+
i: data.i,
|
|
31
|
+
deleted: data.deleted || false,
|
|
32
|
+
};
|
|
25
33
|
}
|
|
26
34
|
},
|
|
35
|
+
delete({ key }) {
|
|
36
|
+
this.values[key].deleted = true;
|
|
37
|
+
},
|
|
27
38
|
get({ key }) {
|
|
28
39
|
return this.values[key];
|
|
29
40
|
},
|
|
41
|
+
getDeleted() {
|
|
42
|
+
for (let key of Object.keys(this.values)) {
|
|
43
|
+
if (this.values[key].deleted) {
|
|
44
|
+
this.values[key].deleted = false;
|
|
45
|
+
return this.get({ key });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
},
|
|
30
50
|
getBySymbolPeriod({ symbol, period }) {
|
|
31
51
|
for (let key of Object.keys(this.values)) {
|
|
32
|
-
|
|
52
|
+
// console.warn(symbol, period, key, this.values[key], this.values[key].symbol === symbol, this.values[key].period === period);
|
|
53
|
+
if (this.values[key].symbol === symbol && parseInt(this.values[key].period) === parseInt(period) && !this.values[key].deleted) return key;
|
|
33
54
|
}
|
|
34
55
|
return null;
|
|
35
56
|
},
|
|
@@ -63,11 +84,13 @@ module.exports = class Client {
|
|
|
63
84
|
if (index !== -1) arr.splice(index, 1);
|
|
64
85
|
},
|
|
65
86
|
};
|
|
66
|
-
|
|
87
|
+
|
|
88
|
+
// #resolved;
|
|
67
89
|
#token = null;
|
|
68
|
-
maxSymbolKey =
|
|
90
|
+
#maxSymbolKey = 1;
|
|
91
|
+
|
|
69
92
|
constructor() {
|
|
70
|
-
this.#resolved = new Map();
|
|
93
|
+
// this.#resolved = new Map();
|
|
71
94
|
}
|
|
72
95
|
|
|
73
96
|
close() {
|
|
@@ -78,6 +101,18 @@ module.exports = class Client {
|
|
|
78
101
|
return { quotes: this.#quotes.values, charts: this.#charts.values };
|
|
79
102
|
}
|
|
80
103
|
|
|
104
|
+
getQuotes() {
|
|
105
|
+
return { quotes: this.#quotes.values, symbols: Object.values(this.#quotes.values).map(each => each.symbols) };
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
getCharts() {
|
|
109
|
+
return { charts: this.#charts.values };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// getResolved() {
|
|
113
|
+
// return { resolved: this.#resolved };
|
|
114
|
+
// }
|
|
115
|
+
|
|
81
116
|
// getSessionKeys() {
|
|
82
117
|
// return this.#sessions.values.keys();
|
|
83
118
|
// }
|
|
@@ -138,7 +173,7 @@ module.exports = class Client {
|
|
|
138
173
|
|
|
139
174
|
createChartSession() {
|
|
140
175
|
const key = tv.createSession({ startsWith: 'cs_' });
|
|
141
|
-
this.#charts.set({ key, data: { id: key, symbol: '', period:
|
|
176
|
+
this.#charts.set({ key, data: { id: key, symbol: '', period: 0, symbolKey: '', frame: '', i: '', deleted: false } });
|
|
142
177
|
this.#ws.send(tv.chartCreateSession({ chartSession: key }));
|
|
143
178
|
this.#ws.send(tv.switchTimezone({ chartSession: key, tz: 'Etc/UTC' }));
|
|
144
179
|
return key;
|
|
@@ -170,22 +205,34 @@ module.exports = class Client {
|
|
|
170
205
|
return 'delete';
|
|
171
206
|
}
|
|
172
207
|
|
|
208
|
+
resolveSymbol({ key, symbol }) {
|
|
209
|
+
const symbolKey = 'sds_sym_' + this.#maxSymbolKey++;
|
|
210
|
+
this.#ws.send(tv.resolveSymbol({ chartSession: key, symbolKey, symbol }));
|
|
211
|
+
return symbolKey;
|
|
212
|
+
}
|
|
213
|
+
|
|
173
214
|
addChartSymbol({ symbol, period, limit }) {
|
|
174
215
|
let key = this.#charts.getBySymbolPeriod({ symbol, period });
|
|
175
|
-
if (key)
|
|
176
|
-
|
|
177
|
-
|
|
216
|
+
if (key) {
|
|
217
|
+
console.warn('addChartSymbol exist');
|
|
218
|
+
return 'exist';
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// console.warn('modules addChartSymbol1', symbol, period, limit, key);
|
|
222
|
+
const exist = this.#charts.getDeleted();
|
|
223
|
+
if (exist !== null) return this.updateChartSymbol({ symbol, period, limit, last: { symbol: exist.symbol, period: parseInt(exist.period) }});
|
|
224
|
+
|
|
178
225
|
key = this.createChartSession();
|
|
179
226
|
const data = this.#charts.get({ key });
|
|
180
227
|
|
|
228
|
+
data.symbolKey = this.resolveSymbol({ key, symbol });
|
|
181
229
|
data.symbol = symbol;
|
|
182
230
|
data.period = period;
|
|
183
|
-
data.symbolKey = 'sds_sym_' + ++this.maxSymbolKey;
|
|
184
231
|
data.frame = 'sds_' + Object.keys(this.#charts.values).length;
|
|
185
232
|
data.i = 's' + 1;
|
|
186
233
|
|
|
187
|
-
this.#ws.send(tv.resolveSymbol({ chartSession: key, symbolKey: data.symbolKey, symbol }));
|
|
188
|
-
this.#resolved.set(symbol, { key: data.symbolKey });
|
|
234
|
+
// this.#ws.send(tv.resolveSymbol({ chartSession: key, symbolKey: data.symbolKey, symbol }));
|
|
235
|
+
// this.#resolved.set(symbol, { key: data.symbolKey });
|
|
189
236
|
this.#ws.send(
|
|
190
237
|
tv.createSeries({
|
|
191
238
|
chartSession: key,
|
|
@@ -202,20 +249,23 @@ module.exports = class Client {
|
|
|
202
249
|
return 'add';
|
|
203
250
|
}
|
|
204
251
|
|
|
205
|
-
updateChartSymbol({ symbol, period, limit,
|
|
206
|
-
|
|
252
|
+
updateChartSymbol({ symbol, period, limit, last }) {
|
|
253
|
+
// period = parseInt(period);
|
|
254
|
+
// last.period = parseInt(last.period);
|
|
255
|
+
const key = this.#charts.getBySymbolPeriod({ symbol: last.symbol, period: last.period });
|
|
207
256
|
const data = this.#charts.get({ key });
|
|
208
257
|
|
|
209
|
-
// console.
|
|
258
|
+
// console.warn('modules updateChartSymbol 1: ', symbol, period, limit, last, data);
|
|
210
259
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
260
|
+
const alreadyKey = this.#charts.getBySymbolPeriod({ symbol, period })
|
|
261
|
+
if (alreadyKey) {
|
|
262
|
+
// console.warn('updateChartSymbol exist: ', alreadyKey);
|
|
263
|
+
this.#charts.delete({ key });
|
|
264
|
+
console.warn('updateChartSymbol exist');
|
|
265
|
+
return 'exist';
|
|
217
266
|
}
|
|
218
|
-
|
|
267
|
+
|
|
268
|
+
data.symbolKey = this.resolveSymbol({ key, symbol });
|
|
219
269
|
data.symbol = symbol;
|
|
220
270
|
data.period = period;
|
|
221
271
|
data.i = 's' + (parseInt(data.i.replace(/[^0-9]/g, '')) + 1);
|
|
@@ -240,8 +290,10 @@ module.exports = class Client {
|
|
|
240
290
|
// console.log('raw: ', JSON.stringify(raw.toString()));
|
|
241
291
|
let session = '';
|
|
242
292
|
tv.parsePacket({ str: raw }).forEach((packet) => {
|
|
293
|
+
let name = null;
|
|
294
|
+
let send = null;
|
|
243
295
|
if (packet === undefined) {
|
|
244
|
-
console.
|
|
296
|
+
console.warn('undefined: ', raw.toString());
|
|
245
297
|
} else {
|
|
246
298
|
// eslint-disable-next-line no-lonely-if
|
|
247
299
|
if (packet.type === 'ping') {
|
|
@@ -251,19 +303,18 @@ module.exports = class Client {
|
|
|
251
303
|
// console.warn('protocol_error', packet);
|
|
252
304
|
// this.close();
|
|
253
305
|
} else if (packet.type === 'qsd') {
|
|
254
|
-
|
|
255
|
-
|
|
306
|
+
send = packet.data[1].v;
|
|
307
|
+
name = send.bid === undefined && send.ask === undefined ? 'data' : 'levelI';
|
|
256
308
|
// console.log(packet.data[1].n);
|
|
257
309
|
// console.log(JSON.parse(packet.data[1].n.substring(1)).symbol);
|
|
258
|
-
// send.symbol = packet.data[1].n;
|
|
259
310
|
send.symbol = JSON.parse(packet.data[1].n.substring(1)).symbol;
|
|
260
311
|
result(name, send);
|
|
261
312
|
} else if (['du', 'timescale_update'].includes(packet.type)) {
|
|
262
313
|
session = this.#charts.get({ key: packet.data[0] });
|
|
263
314
|
if (packet.data[1][session.frame].s.length > 0) {
|
|
264
|
-
|
|
315
|
+
send = {
|
|
265
316
|
symbol: session.symbol,
|
|
266
|
-
period: session.period,
|
|
317
|
+
period: parseInt(session.period),
|
|
267
318
|
chart: [],
|
|
268
319
|
end: packet.data[1][session.frame].lbs.bar_close_time,
|
|
269
320
|
};
|
|
@@ -287,6 +338,8 @@ module.exports = class Client {
|
|
|
287
338
|
result('error', raw.toString())
|
|
288
339
|
}
|
|
289
340
|
}
|
|
341
|
+
name = null;
|
|
342
|
+
send = null;
|
|
290
343
|
});
|
|
291
344
|
});
|
|
292
345
|
}
|
package/lib/tradingView.js
CHANGED
|
@@ -88,7 +88,7 @@ class TradingView {
|
|
|
88
88
|
try {
|
|
89
89
|
return JSON.parse(p);
|
|
90
90
|
} catch (error) {
|
|
91
|
-
console.
|
|
91
|
+
console.error('Cant parse', p);
|
|
92
92
|
return false;
|
|
93
93
|
}
|
|
94
94
|
})
|
|
@@ -254,7 +254,7 @@ class TradingView {
|
|
|
254
254
|
}
|
|
255
255
|
|
|
256
256
|
resolveSymbol({ chartSession, symbolKey, symbol }) {
|
|
257
|
-
console.
|
|
257
|
+
// console.warn('resolveSymbol', chartSession, symbolKey, symbol);
|
|
258
258
|
return this.formatWSPacket({
|
|
259
259
|
packet: {
|
|
260
260
|
m: 'resolve_symbol',
|
|
@@ -267,7 +267,7 @@ class TradingView {
|
|
|
267
267
|
// frame - рамка или окно для данной серии
|
|
268
268
|
// increment - инкрементируемый номер изменений запрашиваемого графика в данном frame (таймефрейм)
|
|
269
269
|
createSeries({ chartSession, frame = 'sds_1', increment = 's1', symbolKey, interval = '60', limit = 1000 }) {
|
|
270
|
-
console.
|
|
270
|
+
// console.warn('createSeries', chartSession, frame, increment, symbolKey, interval, limit);
|
|
271
271
|
return this.formatWSPacket({
|
|
272
272
|
packet: { m: 'create_series', p: [chartSession, frame, increment, symbolKey, interval, limit] },
|
|
273
273
|
});
|
|
@@ -280,8 +280,12 @@ class TradingView {
|
|
|
280
280
|
});
|
|
281
281
|
}
|
|
282
282
|
|
|
283
|
+
chartRemoveSeries({ session, st }) {
|
|
284
|
+
return this.formatWSPacket({ packet: { m: 'remove_study', p: [ session, st ] } });
|
|
285
|
+
}
|
|
286
|
+
|
|
283
287
|
modifySeries({ chartSession, frame = 'sds_1', increment = 's1', symbolKey, interval = '60', limit = 1000 }) {
|
|
284
|
-
console.
|
|
288
|
+
// console.warn('modify_series', chartSession, frame, increment, symbolKey, interval, limit);
|
|
285
289
|
return this.formatWSPacket({
|
|
286
290
|
packet: { m: 'modify_series', p: [chartSession, frame, increment, symbolKey, interval] },
|
|
287
291
|
});
|