market-data-tradingview-ws 0.0.10 → 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 +72 -31
- 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() {
|
|
@@ -86,9 +109,9 @@ module.exports = class Client {
|
|
|
86
109
|
return { charts: this.#charts.values };
|
|
87
110
|
}
|
|
88
111
|
|
|
89
|
-
getResolved() {
|
|
90
|
-
|
|
91
|
-
}
|
|
112
|
+
// getResolved() {
|
|
113
|
+
// return { resolved: this.#resolved };
|
|
114
|
+
// }
|
|
92
115
|
|
|
93
116
|
// getSessionKeys() {
|
|
94
117
|
// return this.#sessions.values.keys();
|
|
@@ -150,7 +173,7 @@ module.exports = class Client {
|
|
|
150
173
|
|
|
151
174
|
createChartSession() {
|
|
152
175
|
const key = tv.createSession({ startsWith: 'cs_' });
|
|
153
|
-
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 } });
|
|
154
177
|
this.#ws.send(tv.chartCreateSession({ chartSession: key }));
|
|
155
178
|
this.#ws.send(tv.switchTimezone({ chartSession: key, tz: 'Etc/UTC' }));
|
|
156
179
|
return key;
|
|
@@ -182,22 +205,34 @@ module.exports = class Client {
|
|
|
182
205
|
return 'delete';
|
|
183
206
|
}
|
|
184
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
|
+
|
|
185
214
|
addChartSymbol({ symbol, period, limit }) {
|
|
186
215
|
let key = this.#charts.getBySymbolPeriod({ symbol, period });
|
|
187
|
-
if (key)
|
|
188
|
-
|
|
189
|
-
|
|
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
|
+
|
|
190
225
|
key = this.createChartSession();
|
|
191
226
|
const data = this.#charts.get({ key });
|
|
192
227
|
|
|
228
|
+
data.symbolKey = this.resolveSymbol({ key, symbol });
|
|
193
229
|
data.symbol = symbol;
|
|
194
230
|
data.period = period;
|
|
195
|
-
data.symbolKey = 'sds_sym_' + ++this.maxSymbolKey;
|
|
196
231
|
data.frame = 'sds_' + Object.keys(this.#charts.values).length;
|
|
197
232
|
data.i = 's' + 1;
|
|
198
233
|
|
|
199
|
-
this.#ws.send(tv.resolveSymbol({ chartSession: key, symbolKey: data.symbolKey, symbol }));
|
|
200
|
-
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 });
|
|
201
236
|
this.#ws.send(
|
|
202
237
|
tv.createSeries({
|
|
203
238
|
chartSession: key,
|
|
@@ -214,20 +249,23 @@ module.exports = class Client {
|
|
|
214
249
|
return 'add';
|
|
215
250
|
}
|
|
216
251
|
|
|
217
|
-
updateChartSymbol({ symbol, period, limit,
|
|
218
|
-
|
|
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 });
|
|
219
256
|
const data = this.#charts.get({ key });
|
|
220
257
|
|
|
221
|
-
// console.
|
|
258
|
+
// console.warn('modules updateChartSymbol 1: ', symbol, period, limit, last, data);
|
|
222
259
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
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';
|
|
229
266
|
}
|
|
230
|
-
|
|
267
|
+
|
|
268
|
+
data.symbolKey = this.resolveSymbol({ key, symbol });
|
|
231
269
|
data.symbol = symbol;
|
|
232
270
|
data.period = period;
|
|
233
271
|
data.i = 's' + (parseInt(data.i.replace(/[^0-9]/g, '')) + 1);
|
|
@@ -252,8 +290,10 @@ module.exports = class Client {
|
|
|
252
290
|
// console.log('raw: ', JSON.stringify(raw.toString()));
|
|
253
291
|
let session = '';
|
|
254
292
|
tv.parsePacket({ str: raw }).forEach((packet) => {
|
|
293
|
+
let name = null;
|
|
294
|
+
let send = null;
|
|
255
295
|
if (packet === undefined) {
|
|
256
|
-
console.
|
|
296
|
+
console.warn('undefined: ', raw.toString());
|
|
257
297
|
} else {
|
|
258
298
|
// eslint-disable-next-line no-lonely-if
|
|
259
299
|
if (packet.type === 'ping') {
|
|
@@ -263,19 +303,18 @@ module.exports = class Client {
|
|
|
263
303
|
// console.warn('protocol_error', packet);
|
|
264
304
|
// this.close();
|
|
265
305
|
} else if (packet.type === 'qsd') {
|
|
266
|
-
|
|
267
|
-
|
|
306
|
+
send = packet.data[1].v;
|
|
307
|
+
name = send.bid === undefined && send.ask === undefined ? 'data' : 'levelI';
|
|
268
308
|
// console.log(packet.data[1].n);
|
|
269
309
|
// console.log(JSON.parse(packet.data[1].n.substring(1)).symbol);
|
|
270
|
-
// send.symbol = packet.data[1].n;
|
|
271
310
|
send.symbol = JSON.parse(packet.data[1].n.substring(1)).symbol;
|
|
272
311
|
result(name, send);
|
|
273
312
|
} else if (['du', 'timescale_update'].includes(packet.type)) {
|
|
274
313
|
session = this.#charts.get({ key: packet.data[0] });
|
|
275
314
|
if (packet.data[1][session.frame].s.length > 0) {
|
|
276
|
-
|
|
315
|
+
send = {
|
|
277
316
|
symbol: session.symbol,
|
|
278
|
-
period: session.period,
|
|
317
|
+
period: parseInt(session.period),
|
|
279
318
|
chart: [],
|
|
280
319
|
end: packet.data[1][session.frame].lbs.bar_close_time,
|
|
281
320
|
};
|
|
@@ -299,6 +338,8 @@ module.exports = class Client {
|
|
|
299
338
|
result('error', raw.toString())
|
|
300
339
|
}
|
|
301
340
|
}
|
|
341
|
+
name = null;
|
|
342
|
+
send = null;
|
|
302
343
|
});
|
|
303
344
|
});
|
|
304
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
|
});
|