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 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] = data;
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
- if (this.values[key].symbol === symbol && this.values[key].period === period) return key;
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
- #resolved;
87
+
88
+ // #resolved;
67
89
  #token = null;
68
- maxSymbolKey = 0;
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: '', symbolKey: '', frame: '', i: '' } });
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) return 'exist';
176
-
177
- // console.log('addChartSymbol1', symbol, period, limit, key);
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, exist }) {
206
- let key = this.#charts.getBySymbolPeriod({ symbol: exist.symbol, period: exist.period });
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.log('updateChartSymbol', symbol, exist.symbol, data);
258
+ // console.warn('modules updateChartSymbol 1: ', symbol, period, limit, last, data);
210
259
 
211
- if (this.#resolved.has(symbol)) {
212
- data.symbolKey = this.#resolved.get(symbol).key;
213
- } else {
214
- data.symbolKey = 'sds_sym_' + ++this.maxSymbolKey;
215
- this.#ws.send(tv.resolveSymbol({ chartSession: key, symbolKey: data.symbolKey, symbol }));
216
- this.#resolved.set(symbol, { key: data.symbolKey });
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.log('undefined: ', raw.toString());
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
- const send = packet.data[1].v;
255
- const name = send.bid === undefined && send.ask === undefined ? 'data' : 'levelI';
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
- const send = {
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
  }
@@ -88,7 +88,7 @@ class TradingView {
88
88
  try {
89
89
  return JSON.parse(p);
90
90
  } catch (error) {
91
- console.warn('Cant parse', p);
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.log('resolveSymbol', chartSession, symbolKey, symbol);
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.log('createSeries', chartSession, frame, increment, symbolKey, interval, limit);
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.log('modify_series', chartSession, frame, increment, symbolKey, interval, limit);
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
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "market-data-tradingview-ws",
3
- "version": "0.0.9",
3
+ "version": "0.0.11",
4
4
  "description": "marketData from Tradingview ws",
5
5
  "main": "index.js",
6
6
  "scripts": {