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 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() {
@@ -86,9 +109,9 @@ module.exports = class Client {
86
109
  return { charts: this.#charts.values };
87
110
  }
88
111
 
89
- getResolved() {
90
- return { resolved: this.#resolved };
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: '', symbolKey: '', frame: '', i: '' } });
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) return 'exist';
188
-
189
- // 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
+
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, exist }) {
218
- 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 });
219
256
  const data = this.#charts.get({ key });
220
257
 
221
- // console.log('updateChartSymbol', symbol, exist.symbol, data);
258
+ // console.warn('modules updateChartSymbol 1: ', symbol, period, limit, last, data);
222
259
 
223
- if (this.#resolved.has(symbol)) {
224
- data.symbolKey = this.#resolved.get(symbol).key;
225
- } else {
226
- data.symbolKey = 'sds_sym_' + ++this.maxSymbolKey;
227
- this.#ws.send(tv.resolveSymbol({ chartSession: key, symbolKey: data.symbolKey, symbol }));
228
- 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';
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.log('undefined: ', raw.toString());
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
- const send = packet.data[1].v;
267
- 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';
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
- const send = {
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
  }
@@ -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.10",
3
+ "version": "0.0.11",
4
4
  "description": "marketData from Tradingview ws",
5
5
  "main": "index.js",
6
6
  "scripts": {