@pipsend/charts 0.0.8
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 +126 -0
- package/README.md +1504 -0
- package/dist/pipsend-charts.development.mjs +16691 -0
- package/dist/pipsend-charts.production.mjs +8 -0
- package/dist/pipsend-charts.standalone.development.js +17144 -0
- package/dist/pipsend-charts.standalone.development.mjs +17084 -0
- package/dist/pipsend-charts.standalone.production.js +8 -0
- package/dist/pipsend-charts.standalone.production.mjs +8 -0
- package/dist/typings.d.ts +5086 -0
- package/package.json +142 -0
package/README.md
ADDED
|
@@ -0,0 +1,1504 @@
|
|
|
1
|
+
# π Pipsend Charts
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@pipsend/charts)
|
|
4
|
+
[](https://www.npmjs.com/package/@pipsend/charts)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
[](https://www.typescriptlang.org/)
|
|
7
|
+
[](https://bundlephobia.com/package/@pipsend/charts)
|
|
8
|
+
|
|
9
|
+
**Professional Financial Charting Library with 10+ Technical Indicators & Interactive Trading Tools**
|
|
10
|
+
|
|
11
|
+
Simple β’ Powerful β’ Framework-Agnostic β’ TypeScript
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## π Table of Contents
|
|
16
|
+
|
|
17
|
+
- [Why Pipsend Charts?](#-why-pipsend-charts)
|
|
18
|
+
- [Installation](#-installation)
|
|
19
|
+
- [Quick Start](#-quick-start)
|
|
20
|
+
- [Demo & Examples](#-demo--examples)
|
|
21
|
+
- [Available Technical Indicators](#-available-technical-indicators)
|
|
22
|
+
- [Interactive Trading Lines API](#-interactive-trading-lines-api)
|
|
23
|
+
- [Framework Integration Examples](#-framework-integration-examples)
|
|
24
|
+
- [Full API Reference](#-full-api-reference)
|
|
25
|
+
- [Real-World Example](#-real-world-example)
|
|
26
|
+
- [Customization](#-customization)
|
|
27
|
+
- [Browser Support](#-browser-support)
|
|
28
|
+
- [Performance](#-performance)
|
|
29
|
+
- [Troubleshooting](#-troubleshooting)
|
|
30
|
+
- [FAQ](#-faq)
|
|
31
|
+
- [Roadmap](#-roadmap)
|
|
32
|
+
- [Contributing](#-contributing)
|
|
33
|
+
- [Changelog](#-changelog)
|
|
34
|
+
- [License](#-license)
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## π Why Pipsend Charts?
|
|
39
|
+
|
|
40
|
+
**Pipsend Charts** is a high-performance financial charting library designed for professional trading applications. Built on TradingView's Lightweight Chartsβ’, enhanced with:
|
|
41
|
+
|
|
42
|
+
β
**10 Technical Indicators** - SMA, EMA, WMA, RSI, MACD, Stochastic, Bollinger Bands, ATR, Volume, OBV
|
|
43
|
+
β
**Interactive Trading Lines** - Draggable Stop Loss & Take Profit with click-to-create
|
|
44
|
+
β
**Functional API** - One function call per indicator, auto-updating
|
|
45
|
+
β
**Framework Agnostic** - Works with React, Vue, Angular, Svelte, or vanilla JS
|
|
46
|
+
β
**Lightweight** - ~49KB gzipped, minimal dependencies
|
|
47
|
+
β
**TypeScript Native** - Full type safety and autocomplete
|
|
48
|
+
β
**High Performance** - 60 FPS on thousands of data points
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## π¬ Demo & Examples
|
|
53
|
+
|
|
54
|
+
### Live Examples
|
|
55
|
+
|
|
56
|
+
Explore interactive examples to see Pipsend Charts in action:
|
|
57
|
+
|
|
58
|
+
- **[Basic Indicators Demo](./examples/indicators.html)** - See all 10 technical indicators working together
|
|
59
|
+
- **[Trading Lines Demo](./examples/trading-lines.html)** - Interactive Stop Loss & Take Profit lines
|
|
60
|
+
- **[Advanced Trading Lines](./examples/trading-lines-advanced.html)** - Click-to-create and advanced features
|
|
61
|
+
|
|
62
|
+
### Screenshots
|
|
63
|
+
|
|
64
|
+
> **Note:** Add screenshots of your charts here to showcase the visual capabilities
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
π Candlestick Chart with SMA & EMA
|
|
68
|
+
π RSI & MACD Oscillators
|
|
69
|
+
π― Interactive Trading Lines
|
|
70
|
+
π Dark & Light Themes
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Quick Preview
|
|
74
|
+
|
|
75
|
+
```javascript
|
|
76
|
+
// Create a professional trading chart in 3 lines
|
|
77
|
+
const chart = createChart(document.getElementById('chart'));
|
|
78
|
+
const series = chart.addSeries(CandlestickSeries);
|
|
79
|
+
applySMA(series, chart, { period: 20 }); // Add moving average
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## π¦ Installation
|
|
85
|
+
|
|
86
|
+
### Package Managers
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# npm
|
|
90
|
+
npm install @pipsend/charts
|
|
91
|
+
|
|
92
|
+
# yarn
|
|
93
|
+
yarn add @pipsend/charts
|
|
94
|
+
|
|
95
|
+
# pnpm
|
|
96
|
+
pnpm add @pipsend/charts
|
|
97
|
+
|
|
98
|
+
# bun
|
|
99
|
+
bun add @pipsend/charts
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### CDN
|
|
103
|
+
|
|
104
|
+
```html
|
|
105
|
+
<!-- Production (Minified) -->
|
|
106
|
+
<script src="https://unpkg.com/@pipsend/charts/dist/pipsend-charts.standalone.production.js"></script>
|
|
107
|
+
|
|
108
|
+
<!-- Development (with warnings) -->
|
|
109
|
+
<script src="https://unpkg.com/@pipsend/charts/dist/pipsend-charts.standalone.development.js"></script>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Requirements
|
|
113
|
+
|
|
114
|
+
- **Node.js**: >= 22.3 (for development)
|
|
115
|
+
- **Browsers**: Modern browsers with ES2015+ support (see [Browser Support](#-browser-support))
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## π― Quick Start
|
|
120
|
+
|
|
121
|
+
### Basic Candlestick Chart
|
|
122
|
+
|
|
123
|
+
```javascript
|
|
124
|
+
import { createChart, CandlestickSeries } from '@pipsend/charts';
|
|
125
|
+
|
|
126
|
+
const chart = createChart(document.getElementById('chart'), {
|
|
127
|
+
width: 800,
|
|
128
|
+
height: 600
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
const candleSeries = chart.addSeries(CandlestickSeries, {
|
|
132
|
+
upColor: '#26a69a',
|
|
133
|
+
downColor: '#ef5350'
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
candleSeries.setData([
|
|
137
|
+
{ time: '2024-01-01', open: 100, high: 105, low: 95, close: 102 },
|
|
138
|
+
{ time: '2024-01-02', open: 102, high: 108, low: 100, close: 106 },
|
|
139
|
+
]);
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Adding Technical Indicators
|
|
143
|
+
|
|
144
|
+
```javascript
|
|
145
|
+
import {
|
|
146
|
+
createChart,
|
|
147
|
+
CandlestickSeries,
|
|
148
|
+
applySMA,
|
|
149
|
+
applyRSI,
|
|
150
|
+
applyMACD
|
|
151
|
+
} from '@pipsend/charts';
|
|
152
|
+
|
|
153
|
+
const chart = createChart(document.getElementById('chart'));
|
|
154
|
+
const series = chart.addSeries(CandlestickSeries);
|
|
155
|
+
series.setData(historicalData);
|
|
156
|
+
|
|
157
|
+
// Add SMA (Simple Moving Average) - appears on main chart
|
|
158
|
+
applySMA(series, chart, { period: 20, color: '#2196F3' });
|
|
159
|
+
|
|
160
|
+
// Add RSI - appears in separate panel
|
|
161
|
+
applyRSI(series, chart, { period: 14, color: '#9C27B0' });
|
|
162
|
+
|
|
163
|
+
// Add MACD - appears in separate panel
|
|
164
|
+
applyMACD(series, chart, {
|
|
165
|
+
fastPeriod: 12,
|
|
166
|
+
slowPeriod: 26,
|
|
167
|
+
signalPeriod: 9
|
|
168
|
+
});
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Interactive Trading Lines (100% Configurable)
|
|
172
|
+
|
|
173
|
+
```javascript
|
|
174
|
+
import {
|
|
175
|
+
createTradingLine,
|
|
176
|
+
createInteractiveLineManager
|
|
177
|
+
} from '@pipsend/charts';
|
|
178
|
+
|
|
179
|
+
// Stop Loss (draggable by default)
|
|
180
|
+
const stopLoss = createTradingLine(series, chart, {
|
|
181
|
+
price: 95.00,
|
|
182
|
+
type: 'stop-loss',
|
|
183
|
+
onDragEnd: (price) => {
|
|
184
|
+
console.log('Stop Loss updated:', price);
|
|
185
|
+
// Update your order in backend
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
// Take Profit (draggable by default)
|
|
190
|
+
const takeProfit = createTradingLine(series, chart, {
|
|
191
|
+
price: 110.00,
|
|
192
|
+
type: 'take-profit',
|
|
193
|
+
onDragEnd: (price) => console.log('TP:', price)
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
// Price Alert - Fully customizable
|
|
197
|
+
const alert = createTradingLine(series, chart, {
|
|
198
|
+
price: 100.00,
|
|
199
|
+
title: 'Price Alert',
|
|
200
|
+
color: '#FFC107',
|
|
201
|
+
lineStyle: LineStyle.Dotted,
|
|
202
|
+
onDragEnd: (price) => api.updateAlert(price)
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
// Click-to-create: Create lines by clicking on chart
|
|
206
|
+
const manager = createInteractiveLineManager(chart, series);
|
|
207
|
+
|
|
208
|
+
// Create Stop Loss with click
|
|
209
|
+
document.getElementById('btnSL').onclick = async () => {
|
|
210
|
+
await manager.enableClickToCreate('stop-loss');
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
// Create custom Alert with click
|
|
214
|
+
document.getElementById('btnAlert').onclick = async () => {
|
|
215
|
+
await manager.enableClickToCreate('custom', {
|
|
216
|
+
title: 'Alert',
|
|
217
|
+
color: '#FFC107',
|
|
218
|
+
onDragEnd: (price) => api.createAlert(price)
|
|
219
|
+
});
|
|
220
|
+
};
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**All lines are draggable and fully configurable** - Use them for Stop Loss, Take Profit, Alerts, Targets, Resistance/Support, or anything you need!
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## π Available Technical Indicators
|
|
228
|
+
|
|
229
|
+
### Overlay Indicators (appear on main chart)
|
|
230
|
+
|
|
231
|
+
#### 1. SMA - Simple Moving Average
|
|
232
|
+
```javascript
|
|
233
|
+
import { applySMA } from '@pipsend/charts';
|
|
234
|
+
|
|
235
|
+
applySMA(series, chart, {
|
|
236
|
+
period: 20,
|
|
237
|
+
color: '#2196F3'
|
|
238
|
+
});
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
#### 2. EMA - Exponential Moving Average
|
|
242
|
+
```javascript
|
|
243
|
+
import { applyEMA } from '@pipsend/charts';
|
|
244
|
+
|
|
245
|
+
applyEMA(series, chart, {
|
|
246
|
+
period: 12,
|
|
247
|
+
color: '#FF9800'
|
|
248
|
+
});
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
#### 3. WMA - Weighted Moving Average
|
|
252
|
+
```javascript
|
|
253
|
+
import { applyWMA } from '@pipsend/charts';
|
|
254
|
+
|
|
255
|
+
applyWMA(series, chart, {
|
|
256
|
+
period: 20,
|
|
257
|
+
color: '#4CAF50'
|
|
258
|
+
});
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
#### 4. Bollinger Bands
|
|
262
|
+
```javascript
|
|
263
|
+
import { applyBollingerBands } from '@pipsend/charts';
|
|
264
|
+
|
|
265
|
+
applyBollingerBands(series, chart, {
|
|
266
|
+
period: 20,
|
|
267
|
+
stdDev: 2
|
|
268
|
+
});
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### Panel Indicators (appear in separate panels)
|
|
272
|
+
|
|
273
|
+
#### 5. RSI - Relative Strength Index
|
|
274
|
+
```javascript
|
|
275
|
+
import { applyRSI } from '@pipsend/charts';
|
|
276
|
+
|
|
277
|
+
applyRSI(series, chart, {
|
|
278
|
+
period: 14,
|
|
279
|
+
color: '#9C27B0'
|
|
280
|
+
});
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
#### 6. MACD - Moving Average Convergence Divergence
|
|
284
|
+
```javascript
|
|
285
|
+
import { applyMACD } from '@pipsend/charts';
|
|
286
|
+
|
|
287
|
+
applyMACD(series, chart, {
|
|
288
|
+
fastPeriod: 12,
|
|
289
|
+
slowPeriod: 26,
|
|
290
|
+
signalPeriod: 9
|
|
291
|
+
});
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
#### 7. Stochastic Oscillator
|
|
295
|
+
```javascript
|
|
296
|
+
import { applyStochastic } from '@pipsend/charts';
|
|
297
|
+
|
|
298
|
+
applyStochastic(series, chart, {
|
|
299
|
+
kPeriod: 14,
|
|
300
|
+
dPeriod: 3
|
|
301
|
+
});
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
#### 8. ATR - Average True Range
|
|
305
|
+
```javascript
|
|
306
|
+
import { applyATR } from '@pipsend/charts';
|
|
307
|
+
|
|
308
|
+
applyATR(series, chart, {
|
|
309
|
+
period: 14,
|
|
310
|
+
color: '#FF9800'
|
|
311
|
+
});
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
#### 9. Volume
|
|
315
|
+
```javascript
|
|
316
|
+
import { applyVolume, setVolumeData } from '@pipsend/charts';
|
|
317
|
+
|
|
318
|
+
// First, set volume data
|
|
319
|
+
setVolumeData(series, chartData);
|
|
320
|
+
|
|
321
|
+
// Then apply volume indicator
|
|
322
|
+
applyVolume(series, chart, {
|
|
323
|
+
colorUp: '#26a69a',
|
|
324
|
+
colorDown: '#ef5350'
|
|
325
|
+
});
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
#### 10. OBV - On-Balance Volume
|
|
329
|
+
```javascript
|
|
330
|
+
import { applyOBV, setOBVVolumeData } from '@pipsend/charts';
|
|
331
|
+
|
|
332
|
+
// First, set volume data
|
|
333
|
+
setOBVVolumeData(series, chartData);
|
|
334
|
+
|
|
335
|
+
// Then apply OBV indicator
|
|
336
|
+
applyOBV(series, chart, {
|
|
337
|
+
color: '#673AB7'
|
|
338
|
+
});
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## π― Interactive Trading Lines API
|
|
344
|
+
|
|
345
|
+
### Draggable Stop Loss / Take Profit
|
|
346
|
+
|
|
347
|
+
```javascript
|
|
348
|
+
import {
|
|
349
|
+
createTradingLine,
|
|
350
|
+
createInteractiveLineManager
|
|
351
|
+
} from '@pipsend/charts';
|
|
352
|
+
|
|
353
|
+
// 1. Stop Loss with preset
|
|
354
|
+
const stopLoss = createTradingLine(series, chart, {
|
|
355
|
+
price: 95.00,
|
|
356
|
+
type: 'stop-loss',
|
|
357
|
+
onDragStart: (price) => console.log('Drag started'),
|
|
358
|
+
onDragMove: (price) => console.log('Moving:', price),
|
|
359
|
+
onDragEnd: (price) => console.log('Final:', price)
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
// 2. Take Profit with preset
|
|
363
|
+
const takeProfit = createTradingLine(series, chart, {
|
|
364
|
+
price: 110.00,
|
|
365
|
+
type: 'take-profit',
|
|
366
|
+
onDragEnd: (price) => updateOrderInBackend(price)
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
// 3. Entry Line (non-draggable)
|
|
370
|
+
const entry = createTradingLine(series, chart, {
|
|
371
|
+
price: 100.00,
|
|
372
|
+
type: 'entry'
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
// 4. Custom line with full control
|
|
376
|
+
const customLine = createTradingLine(series, chart, {
|
|
377
|
+
price: 105.00,
|
|
378
|
+
title: 'Target 1',
|
|
379
|
+
color: '#FF9800',
|
|
380
|
+
lineStyle: LineStyle.Dashed,
|
|
381
|
+
lineWidth: 2,
|
|
382
|
+
draggable: true,
|
|
383
|
+
onDragEnd: (price) => console.log('Custom line:', price)
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
// 5. Interactive Click-to-Create
|
|
387
|
+
const manager = createInteractiveLineManager(chart, series);
|
|
388
|
+
|
|
389
|
+
// Button to activate click mode
|
|
390
|
+
document.getElementById('addStopLoss').onclick = async () => {
|
|
391
|
+
const line = await manager.enableClickToCreate('stop-loss');
|
|
392
|
+
// User clicks on chart, line is created at that price
|
|
393
|
+
};
|
|
394
|
+
|
|
395
|
+
document.getElementById('addTakeProfit').onclick = async () => {
|
|
396
|
+
await manager.enableClickToCreate('take-profit');
|
|
397
|
+
};
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
### Line Methods
|
|
401
|
+
|
|
402
|
+
```javascript
|
|
403
|
+
// Get current price
|
|
404
|
+
const currentPrice = stopLoss.getPrice();
|
|
405
|
+
|
|
406
|
+
// Update price programmatically
|
|
407
|
+
stopLoss.setPrice(93.00);
|
|
408
|
+
|
|
409
|
+
// Update options
|
|
410
|
+
stopLoss.applyOptions({
|
|
411
|
+
color: '#FF0000',
|
|
412
|
+
title: 'New Stop Loss'
|
|
413
|
+
});
|
|
414
|
+
|
|
415
|
+
// Remove line
|
|
416
|
+
stopLoss.remove();
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
---
|
|
420
|
+
|
|
421
|
+
## π Framework Integration Examples
|
|
422
|
+
|
|
423
|
+
### React
|
|
424
|
+
|
|
425
|
+
```tsx
|
|
426
|
+
import { useEffect, useRef } from 'react';
|
|
427
|
+
import { createChart, CandlestickSeries, applySMA, applyRSI } from '@pipsend/charts';
|
|
428
|
+
|
|
429
|
+
function TradingChart({ data }) {
|
|
430
|
+
const chartContainerRef = useRef<HTMLDivElement>(null);
|
|
431
|
+
const chartRef = useRef<any>(null);
|
|
432
|
+
const seriesRef = useRef<any>(null);
|
|
433
|
+
|
|
434
|
+
useEffect(() => {
|
|
435
|
+
if (!chartContainerRef.current) return;
|
|
436
|
+
|
|
437
|
+
// Create chart
|
|
438
|
+
chartRef.current = createChart(chartContainerRef.current, {
|
|
439
|
+
width: chartContainerRef.current.clientWidth,
|
|
440
|
+
height: 600
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
// Add series
|
|
444
|
+
seriesRef.current = chartRef.current.addSeries(CandlestickSeries);
|
|
445
|
+
seriesRef.current.setData(data);
|
|
446
|
+
|
|
447
|
+
// Add indicators
|
|
448
|
+
applySMA(seriesRef.current, chartRef.current, { period: 20 });
|
|
449
|
+
applyRSI(seriesRef.current, chartRef.current, { period: 14 });
|
|
450
|
+
|
|
451
|
+
// Cleanup
|
|
452
|
+
return () => {
|
|
453
|
+
if (chartRef.current) {
|
|
454
|
+
chartRef.current.remove();
|
|
455
|
+
}
|
|
456
|
+
};
|
|
457
|
+
}, []);
|
|
458
|
+
|
|
459
|
+
// Update data when it changes
|
|
460
|
+
useEffect(() => {
|
|
461
|
+
if (seriesRef.current && data) {
|
|
462
|
+
seriesRef.current.setData(data);
|
|
463
|
+
}
|
|
464
|
+
}, [data]);
|
|
465
|
+
|
|
466
|
+
return <div ref={chartContainerRef} />;
|
|
467
|
+
}
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
### Vue 3
|
|
471
|
+
|
|
472
|
+
```vue
|
|
473
|
+
<template>
|
|
474
|
+
<div ref="chartContainer"></div>
|
|
475
|
+
</template>
|
|
476
|
+
|
|
477
|
+
<script setup>
|
|
478
|
+
import { ref, onMounted, onUnmounted, watch } from 'vue';
|
|
479
|
+
import { createChart, CandlestickSeries, applyMACD } from '@pipsend/charts';
|
|
480
|
+
|
|
481
|
+
const props = defineProps(['data']);
|
|
482
|
+
const chartContainer = ref(null);
|
|
483
|
+
let chart = null;
|
|
484
|
+
let series = null;
|
|
485
|
+
|
|
486
|
+
onMounted(() => {
|
|
487
|
+
chart = createChart(chartContainer.value, {
|
|
488
|
+
width: chartContainer.value.clientWidth,
|
|
489
|
+
height: 600
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
series = chart.addSeries(CandlestickSeries);
|
|
493
|
+
series.setData(props.data);
|
|
494
|
+
|
|
495
|
+
// Add MACD
|
|
496
|
+
applyMACD(series, chart, {
|
|
497
|
+
fastPeriod: 12,
|
|
498
|
+
slowPeriod: 26,
|
|
499
|
+
signalPeriod: 9
|
|
500
|
+
});
|
|
501
|
+
});
|
|
502
|
+
|
|
503
|
+
watch(() => props.data, (newData) => {
|
|
504
|
+
if (series) {
|
|
505
|
+
series.setData(newData);
|
|
506
|
+
}
|
|
507
|
+
});
|
|
508
|
+
|
|
509
|
+
onUnmounted(() => {
|
|
510
|
+
if (chart) {
|
|
511
|
+
chart.remove();
|
|
512
|
+
}
|
|
513
|
+
});
|
|
514
|
+
</script>
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
### Angular
|
|
518
|
+
|
|
519
|
+
```typescript
|
|
520
|
+
import { Component, ElementRef, Input, OnInit, OnDestroy, ViewChild } from '@angular/core';
|
|
521
|
+
import { createChart, CandlestickSeries, applyBollingerBands } from '@pipsend/charts';
|
|
522
|
+
|
|
523
|
+
@Component({
|
|
524
|
+
selector: 'app-trading-chart',
|
|
525
|
+
template: '<div #chartContainer></div>'
|
|
526
|
+
})
|
|
527
|
+
export class TradingChartComponent implements OnInit, OnDestroy {
|
|
528
|
+
@ViewChild('chartContainer') chartContainer!: ElementRef;
|
|
529
|
+
@Input() data: any[];
|
|
530
|
+
|
|
531
|
+
private chart: any;
|
|
532
|
+
private series: any;
|
|
533
|
+
|
|
534
|
+
ngOnInit() {
|
|
535
|
+
this.chart = createChart(this.chartContainer.nativeElement, {
|
|
536
|
+
width: this.chartContainer.nativeElement.clientWidth,
|
|
537
|
+
height: 600
|
|
538
|
+
});
|
|
539
|
+
|
|
540
|
+
this.series = this.chart.addSeries(CandlestickSeries);
|
|
541
|
+
this.series.setData(this.data);
|
|
542
|
+
|
|
543
|
+
// Add Bollinger Bands
|
|
544
|
+
applyBollingerBands(this.series, this.chart, {
|
|
545
|
+
period: 20,
|
|
546
|
+
stdDev: 2
|
|
547
|
+
});
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
ngOnDestroy() {
|
|
551
|
+
if (this.chart) {
|
|
552
|
+
this.chart.remove();
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
### Svelte
|
|
559
|
+
|
|
560
|
+
```svelte
|
|
561
|
+
<script>
|
|
562
|
+
import { onMount, onDestroy } from 'svelte';
|
|
563
|
+
import { createChart, CandlestickSeries, applyStochastic } from '@pipsend/charts';
|
|
564
|
+
|
|
565
|
+
export let data;
|
|
566
|
+
|
|
567
|
+
let chartContainer;
|
|
568
|
+
let chart;
|
|
569
|
+
let series;
|
|
570
|
+
|
|
571
|
+
onMount(() => {
|
|
572
|
+
chart = createChart(chartContainer, {
|
|
573
|
+
width: chartContainer.clientWidth,
|
|
574
|
+
height: 600
|
|
575
|
+
});
|
|
576
|
+
|
|
577
|
+
series = chart.addSeries(CandlestickSeries);
|
|
578
|
+
series.setData(data);
|
|
579
|
+
|
|
580
|
+
// Add Stochastic
|
|
581
|
+
applyStochastic(series, chart, {
|
|
582
|
+
kPeriod: 14,
|
|
583
|
+
dPeriod: 3
|
|
584
|
+
});
|
|
585
|
+
});
|
|
586
|
+
|
|
587
|
+
$: if (series && data) {
|
|
588
|
+
series.setData(data);
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
onDestroy(() => {
|
|
592
|
+
if (chart) {
|
|
593
|
+
chart.remove();
|
|
594
|
+
}
|
|
595
|
+
});
|
|
596
|
+
</script>
|
|
597
|
+
|
|
598
|
+
<div bind:this={chartContainer}></div>
|
|
599
|
+
```
|
|
600
|
+
|
|
601
|
+
### Vanilla JavaScript
|
|
602
|
+
|
|
603
|
+
```javascript
|
|
604
|
+
import {
|
|
605
|
+
createChart,
|
|
606
|
+
CandlestickSeries,
|
|
607
|
+
applySMA,
|
|
608
|
+
applyRSI,
|
|
609
|
+
createTradingLine
|
|
610
|
+
} from '@pipsend/charts';
|
|
611
|
+
|
|
612
|
+
// Create chart
|
|
613
|
+
const chart = createChart(document.getElementById('chart'), {
|
|
614
|
+
width: 800,
|
|
615
|
+
height: 600
|
|
616
|
+
});
|
|
617
|
+
|
|
618
|
+
// Add candlestick series
|
|
619
|
+
const series = chart.addSeries(CandlestickSeries);
|
|
620
|
+
series.setData(historicalData);
|
|
621
|
+
|
|
622
|
+
// Add indicators
|
|
623
|
+
applySMA(series, chart, { period: 50, color: '#FF6D00' });
|
|
624
|
+
applyRSI(series, chart, { period: 14 });
|
|
625
|
+
|
|
626
|
+
// Add trading lines
|
|
627
|
+
const stopLoss = createTradingLine(series, chart, {
|
|
628
|
+
price: 95.00,
|
|
629
|
+
type: 'stop-loss',
|
|
630
|
+
onDragEnd: (price) => {
|
|
631
|
+
document.getElementById('slPrice').textContent = price.toFixed(2);
|
|
632
|
+
}
|
|
633
|
+
});
|
|
634
|
+
```
|
|
635
|
+
|
|
636
|
+
---
|
|
637
|
+
|
|
638
|
+
## π Full API Reference
|
|
639
|
+
|
|
640
|
+
### Chart Creation
|
|
641
|
+
|
|
642
|
+
```typescript
|
|
643
|
+
import { createChart } from '@pipsend/charts';
|
|
644
|
+
|
|
645
|
+
const chart = createChart(container: HTMLElement, options?: {
|
|
646
|
+
width?: number;
|
|
647
|
+
height?: number;
|
|
648
|
+
layout?: {
|
|
649
|
+
background?: { color: string };
|
|
650
|
+
textColor?: string;
|
|
651
|
+
};
|
|
652
|
+
grid?: {
|
|
653
|
+
vertLines?: { color: string };
|
|
654
|
+
horzLines?: { color: string };
|
|
655
|
+
};
|
|
656
|
+
// ... more options
|
|
657
|
+
});
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
### Indicator Options
|
|
661
|
+
|
|
662
|
+
All indicators support these common options:
|
|
663
|
+
|
|
664
|
+
```typescript
|
|
665
|
+
{
|
|
666
|
+
period?: number; // Calculation period
|
|
667
|
+
color?: string; // Line color
|
|
668
|
+
lineWidth?: number; // Line width
|
|
669
|
+
visible?: boolean; // Show/hide indicator
|
|
670
|
+
}
|
|
671
|
+
```
|
|
672
|
+
|
|
673
|
+
### Trading Line Options
|
|
674
|
+
|
|
675
|
+
```typescript
|
|
676
|
+
{
|
|
677
|
+
price: number; // Required: Line price
|
|
678
|
+
color?: string; // Line color
|
|
679
|
+
lineWidth?: number; // Line width (1-4)
|
|
680
|
+
lineStyle?: LineStyle; // Solid, Dashed, etc.
|
|
681
|
+
title?: string; // Label text
|
|
682
|
+
axisLabelVisible?: boolean; // Show price on axis
|
|
683
|
+
draggable?: boolean; // Enable dragging
|
|
684
|
+
onDragStart?: (price: number) => void; // Drag start callback
|
|
685
|
+
onDragMove?: (price: number) => void; // Drag move callback
|
|
686
|
+
onDragEnd?: (price: number) => void; // Drag end callback
|
|
687
|
+
}
|
|
688
|
+
```
|
|
689
|
+
|
|
690
|
+
---
|
|
691
|
+
|
|
692
|
+
## π₯ Real-World Example
|
|
693
|
+
|
|
694
|
+
```javascript
|
|
695
|
+
import {
|
|
696
|
+
createChart,
|
|
697
|
+
CandlestickSeries,
|
|
698
|
+
applySMA,
|
|
699
|
+
applyEMA,
|
|
700
|
+
applyBollingerBands,
|
|
701
|
+
applyRSI,
|
|
702
|
+
applyMACD,
|
|
703
|
+
applyVolume,
|
|
704
|
+
setVolumeData,
|
|
705
|
+
createTradingLine,
|
|
706
|
+
createInteractiveLineManager
|
|
707
|
+
} from '@pipsend/charts';
|
|
708
|
+
|
|
709
|
+
// Fetch data from your API
|
|
710
|
+
const response = await fetch('/api/ohlcv');
|
|
711
|
+
const data = await response.json();
|
|
712
|
+
|
|
713
|
+
// Create chart
|
|
714
|
+
const chart = createChart(document.getElementById('chart'), {
|
|
715
|
+
width: window.innerWidth,
|
|
716
|
+
height: 600,
|
|
717
|
+
layout: {
|
|
718
|
+
background: { color: '#1E222D' },
|
|
719
|
+
textColor: '#DDD',
|
|
720
|
+
},
|
|
721
|
+
});
|
|
722
|
+
|
|
723
|
+
// Add candlestick series
|
|
724
|
+
const series = chart.addSeries(CandlestickSeries, {
|
|
725
|
+
upColor: '#26a69a',
|
|
726
|
+
downColor: '#ef5350',
|
|
727
|
+
});
|
|
728
|
+
series.setData(data);
|
|
729
|
+
|
|
730
|
+
// Add moving averages
|
|
731
|
+
applySMA(series, chart, { period: 20, color: '#2196F3' });
|
|
732
|
+
applyEMA(series, chart, { period: 50, color: '#FF9800' });
|
|
733
|
+
|
|
734
|
+
// Add Bollinger Bands
|
|
735
|
+
applyBollingerBands(series, chart, { period: 20, stdDev: 2 });
|
|
736
|
+
|
|
737
|
+
// Add oscillators
|
|
738
|
+
applyRSI(series, chart, { period: 14, color: '#9C27B0' });
|
|
739
|
+
applyMACD(series, chart, { fastPeriod: 12, slowPeriod: 26, signalPeriod: 9 });
|
|
740
|
+
|
|
741
|
+
// Add volume
|
|
742
|
+
setVolumeData(series, data);
|
|
743
|
+
applyVolume(series, chart, { colorUp: '#26a69a', colorDown: '#ef5350' });
|
|
744
|
+
|
|
745
|
+
// Add trading lines
|
|
746
|
+
const currentPrice = data[data.length - 1].close;
|
|
747
|
+
|
|
748
|
+
const stopLoss = createTradingLine(series, chart, {
|
|
749
|
+
price: currentPrice * 0.98,
|
|
750
|
+
type: 'stop-loss',
|
|
751
|
+
onDragEnd: async (price) => {
|
|
752
|
+
await fetch('/api/orders/update', {
|
|
753
|
+
method: 'POST',
|
|
754
|
+
body: JSON.stringify({ stopLoss: price })
|
|
755
|
+
});
|
|
756
|
+
}
|
|
757
|
+
});
|
|
758
|
+
|
|
759
|
+
const takeProfit = createTradingLine(series, chart, {
|
|
760
|
+
price: currentPrice * 1.05,
|
|
761
|
+
type: 'take-profit',
|
|
762
|
+
onDragEnd: async (price) => {
|
|
763
|
+
await fetch('/api/orders/update', {
|
|
764
|
+
method: 'POST',
|
|
765
|
+
body: JSON.stringify({ takeProfit: price })
|
|
766
|
+
});
|
|
767
|
+
}
|
|
768
|
+
});
|
|
769
|
+
|
|
770
|
+
// Interactive line manager
|
|
771
|
+
const manager = createInteractiveLineManager(chart, series);
|
|
772
|
+
|
|
773
|
+
document.getElementById('addSL').onclick = async () => {
|
|
774
|
+
const line = await manager.enableClickToCreate('stop-loss', {
|
|
775
|
+
onDragEnd: (price) => console.log('SL:', price)
|
|
776
|
+
});
|
|
777
|
+
};
|
|
778
|
+
|
|
779
|
+
// Responsive
|
|
780
|
+
window.addEventListener('resize', () => {
|
|
781
|
+
chart.applyOptions({ width: window.innerWidth });
|
|
782
|
+
});
|
|
783
|
+
```
|
|
784
|
+
|
|
785
|
+
---
|
|
786
|
+
|
|
787
|
+
## π¨ Customization
|
|
788
|
+
|
|
789
|
+
### Chart Themes
|
|
790
|
+
|
|
791
|
+
```javascript
|
|
792
|
+
// Dark Theme
|
|
793
|
+
const chart = createChart(container, {
|
|
794
|
+
layout: {
|
|
795
|
+
background: { color: '#1E222D' },
|
|
796
|
+
textColor: '#D9D9D9',
|
|
797
|
+
},
|
|
798
|
+
grid: {
|
|
799
|
+
vertLines: { color: '#2B2B43' },
|
|
800
|
+
horzLines: { color: '#363C4E' },
|
|
801
|
+
},
|
|
802
|
+
});
|
|
803
|
+
|
|
804
|
+
// Light Theme
|
|
805
|
+
const chart = createChart(container, {
|
|
806
|
+
layout: {
|
|
807
|
+
background: { color: '#FFFFFF' },
|
|
808
|
+
textColor: '#191919',
|
|
809
|
+
},
|
|
810
|
+
grid: {
|
|
811
|
+
vertLines: { color: '#e1e1e1' },
|
|
812
|
+
horzLines: { color: '#e1e1e1' },
|
|
813
|
+
},
|
|
814
|
+
});
|
|
815
|
+
```
|
|
816
|
+
|
|
817
|
+
### Custom Indicator Colors
|
|
818
|
+
|
|
819
|
+
```javascript
|
|
820
|
+
applySMA(series, chart, {
|
|
821
|
+
period: 20,
|
|
822
|
+
color: '#FF6B6B',
|
|
823
|
+
lineWidth: 3
|
|
824
|
+
});
|
|
825
|
+
|
|
826
|
+
applyRSI(series, chart, {
|
|
827
|
+
period: 14,
|
|
828
|
+
color: '#4ECDC4',
|
|
829
|
+
lineWidth: 2
|
|
830
|
+
});
|
|
831
|
+
```
|
|
832
|
+
|
|
833
|
+
---
|
|
834
|
+
|
|
835
|
+
## π Browser Support
|
|
836
|
+
|
|
837
|
+
Pipsend Charts works in all modern browsers that support ES2015+ and Canvas API.
|
|
838
|
+
|
|
839
|
+
### Supported Browsers
|
|
840
|
+
|
|
841
|
+
| Browser | Minimum Version |
|
|
842
|
+
|---------|----------------|
|
|
843
|
+
| Chrome | 63+ |
|
|
844
|
+
| Firefox | 67+ |
|
|
845
|
+
| Safari | 11.1+ |
|
|
846
|
+
| Edge | 79+ |
|
|
847
|
+
| Opera | 50+ |
|
|
848
|
+
| iOS Safari | 11.3+ |
|
|
849
|
+
| Chrome Android | 63+ |
|
|
850
|
+
|
|
851
|
+
### Required Features
|
|
852
|
+
|
|
853
|
+
- **Canvas API** - For rendering charts
|
|
854
|
+
- **ES2015+ (ES6)** - Modern JavaScript features
|
|
855
|
+
- **ResizeObserver** - For responsive charts (polyfill included)
|
|
856
|
+
|
|
857
|
+
### Polyfills
|
|
858
|
+
|
|
859
|
+
For older browsers, you may need to include polyfills:
|
|
860
|
+
|
|
861
|
+
```html
|
|
862
|
+
<!-- For IE11 and older browsers -->
|
|
863
|
+
<script src="https://polyfill.io/v3/polyfill.min.js?features=es2015,ResizeObserver"></script>
|
|
864
|
+
```
|
|
865
|
+
|
|
866
|
+
---
|
|
867
|
+
|
|
868
|
+
## ποΈ Build Variants
|
|
869
|
+
|
|
870
|
+
| Dependencies | Mode | ES Module | IIFE |
|
|
871
|
+
|--------------|------|-----------|------|
|
|
872
|
+
| No | PROD | `pipsend-charts.production.mjs` | N/A |
|
|
873
|
+
| No | DEV | `pipsend-charts.development.mjs` | N/A |
|
|
874
|
+
| Yes | PROD | `pipsend-charts.standalone.production.mjs` | `pipsend-charts.standalone.production.js` |
|
|
875
|
+
| Yes | DEV | `pipsend-charts.standalone.development.mjs` | `pipsend-charts.standalone.development.js` |
|
|
876
|
+
|
|
877
|
+
---
|
|
878
|
+
|
|
879
|
+
## β‘ Performance
|
|
880
|
+
|
|
881
|
+
Pipsend Charts is built for speed and efficiency, capable of handling large datasets with smooth 60 FPS rendering.
|
|
882
|
+
|
|
883
|
+
### Benchmarks
|
|
884
|
+
|
|
885
|
+
| Metric | Value |
|
|
886
|
+
|--------|-------|
|
|
887
|
+
| **Bundle Size** | ~49KB gzipped |
|
|
888
|
+
| **Initial Load** | < 100ms |
|
|
889
|
+
| **Render 1,000 candles** | < 16ms (60 FPS) |
|
|
890
|
+
| **Render 10,000 candles** | < 33ms (30 FPS) |
|
|
891
|
+
| **Memory Usage** | ~15MB for 10K candles |
|
|
892
|
+
| **Indicator Calculation** | < 5ms per indicator |
|
|
893
|
+
|
|
894
|
+
### Performance Tips
|
|
895
|
+
|
|
896
|
+
1. **Use Time-based Data** - Time series data performs better than tick data
|
|
897
|
+
2. **Limit Visible Range** - Only render visible candles for best performance
|
|
898
|
+
3. **Debounce Updates** - Batch data updates instead of updating on every tick
|
|
899
|
+
4. **Lazy Load Indicators** - Add indicators only when needed
|
|
900
|
+
5. **Use Production Build** - Always use minified production build in production
|
|
901
|
+
|
|
902
|
+
### Example: Optimized Real-time Updates
|
|
903
|
+
|
|
904
|
+
```javascript
|
|
905
|
+
let updateQueue = [];
|
|
906
|
+
let updateTimer = null;
|
|
907
|
+
|
|
908
|
+
function queueUpdate(newCandle) {
|
|
909
|
+
updateQueue.push(newCandle);
|
|
910
|
+
|
|
911
|
+
if (!updateTimer) {
|
|
912
|
+
updateTimer = setTimeout(() => {
|
|
913
|
+
series.update(updateQueue[updateQueue.length - 1]);
|
|
914
|
+
updateQueue = [];
|
|
915
|
+
updateTimer = null;
|
|
916
|
+
}, 100); // Batch updates every 100ms
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
```
|
|
920
|
+
|
|
921
|
+
---
|
|
922
|
+
|
|
923
|
+
## π§ Development
|
|
924
|
+
|
|
925
|
+
### Building from Source
|
|
926
|
+
|
|
927
|
+
```bash
|
|
928
|
+
# Install dependencies
|
|
929
|
+
npm install
|
|
930
|
+
|
|
931
|
+
# Build production
|
|
932
|
+
npm run build:prod
|
|
933
|
+
|
|
934
|
+
# Build development
|
|
935
|
+
npm run build
|
|
936
|
+
```
|
|
937
|
+
|
|
938
|
+
---
|
|
939
|
+
|
|
940
|
+
## π§ Troubleshooting
|
|
941
|
+
|
|
942
|
+
### Common Issues
|
|
943
|
+
|
|
944
|
+
#### Chart Not Rendering
|
|
945
|
+
|
|
946
|
+
**Problem:** Chart container is empty or chart doesn't appear
|
|
947
|
+
|
|
948
|
+
**Solutions:**
|
|
949
|
+
```javascript
|
|
950
|
+
// 1. Ensure container has explicit dimensions
|
|
951
|
+
const container = document.getElementById('chart');
|
|
952
|
+
container.style.width = '800px';
|
|
953
|
+
container.style.height = '600px';
|
|
954
|
+
|
|
955
|
+
// 2. Wait for DOM to be ready
|
|
956
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
957
|
+
const chart = createChart(container);
|
|
958
|
+
});
|
|
959
|
+
|
|
960
|
+
// 3. Check if container exists
|
|
961
|
+
if (!container) {
|
|
962
|
+
console.error('Chart container not found!');
|
|
963
|
+
}
|
|
964
|
+
```
|
|
965
|
+
|
|
966
|
+
#### Indicators Not Showing
|
|
967
|
+
|
|
968
|
+
**Problem:** Technical indicators don't appear on chart
|
|
969
|
+
|
|
970
|
+
**Solutions:**
|
|
971
|
+
```javascript
|
|
972
|
+
// 1. Ensure you have data before applying indicators
|
|
973
|
+
series.setData(data);
|
|
974
|
+
applySMA(series, chart, { period: 20 }); // Apply AFTER setData
|
|
975
|
+
|
|
976
|
+
// 2. Check data format
|
|
977
|
+
const validData = [
|
|
978
|
+
{ time: '2024-01-01', open: 100, high: 105, low: 95, close: 102 },
|
|
979
|
+
// time must be string (YYYY-MM-DD) or timestamp
|
|
980
|
+
];
|
|
981
|
+
|
|
982
|
+
// 3. Verify indicator period is not larger than data length
|
|
983
|
+
// If you have 10 candles, period: 20 won't work
|
|
984
|
+
```
|
|
985
|
+
|
|
986
|
+
#### TypeScript Errors
|
|
987
|
+
|
|
988
|
+
**Problem:** Type errors when using the library
|
|
989
|
+
|
|
990
|
+
**Solutions:**
|
|
991
|
+
```typescript
|
|
992
|
+
// 1. Import types explicitly
|
|
993
|
+
import {
|
|
994
|
+
IChartApi,
|
|
995
|
+
ISeriesApi,
|
|
996
|
+
CandlestickData
|
|
997
|
+
} from '@pipsend/charts';
|
|
998
|
+
|
|
999
|
+
// 2. Use proper type annotations
|
|
1000
|
+
const chart: IChartApi = createChart(container);
|
|
1001
|
+
const series: ISeriesApi<"Candlestick"> = chart.addSeries(CandlestickSeries);
|
|
1002
|
+
```
|
|
1003
|
+
|
|
1004
|
+
#### Performance Issues
|
|
1005
|
+
|
|
1006
|
+
**Problem:** Chart is slow or laggy
|
|
1007
|
+
|
|
1008
|
+
**Solutions:**
|
|
1009
|
+
```javascript
|
|
1010
|
+
// 1. Limit visible data range
|
|
1011
|
+
chart.timeScale().setVisibleRange({
|
|
1012
|
+
from: startTime,
|
|
1013
|
+
to: endTime
|
|
1014
|
+
});
|
|
1015
|
+
|
|
1016
|
+
// 2. Use production build
|
|
1017
|
+
import { createChart } from 'pipsend-charts/dist/pipsend-charts.production.mjs';
|
|
1018
|
+
|
|
1019
|
+
// 3. Disable animations for large datasets
|
|
1020
|
+
chart.applyOptions({
|
|
1021
|
+
handleScroll: false,
|
|
1022
|
+
handleScale: false
|
|
1023
|
+
});
|
|
1024
|
+
```
|
|
1025
|
+
|
|
1026
|
+
#### Module Not Found Errors
|
|
1027
|
+
|
|
1028
|
+
**Problem:** `Cannot find module 'pipsend-charts'`
|
|
1029
|
+
|
|
1030
|
+
**Solutions:**
|
|
1031
|
+
```bash
|
|
1032
|
+
# 1. Clear node_modules and reinstall
|
|
1033
|
+
rm -rf node_modules package-lock.json
|
|
1034
|
+
npm install
|
|
1035
|
+
|
|
1036
|
+
# 2. Check package.json has the dependency
|
|
1037
|
+
npm list pipsend-charts
|
|
1038
|
+
|
|
1039
|
+
# 3. For TypeScript, ensure moduleResolution is set
|
|
1040
|
+
# tsconfig.json
|
|
1041
|
+
{
|
|
1042
|
+
"compilerOptions": {
|
|
1043
|
+
"moduleResolution": "node"
|
|
1044
|
+
}
|
|
1045
|
+
}
|
|
1046
|
+
```
|
|
1047
|
+
|
|
1048
|
+
### Getting Help
|
|
1049
|
+
|
|
1050
|
+
If you encounter issues not covered here:
|
|
1051
|
+
|
|
1052
|
+
1. **Check Examples** - Review the [examples](./examples) directory
|
|
1053
|
+
2. **Search Issues** - Look for similar issues on [GitHub Issues](https://github.com/ArcaTechCo/PipsendCharts/issues)
|
|
1054
|
+
3. **Ask Questions** - Open a new issue with:
|
|
1055
|
+
- Your code snippet
|
|
1056
|
+
- Expected vs actual behavior
|
|
1057
|
+
- Browser/Node version
|
|
1058
|
+
- Error messages
|
|
1059
|
+
|
|
1060
|
+
---
|
|
1061
|
+
|
|
1062
|
+
## β FAQ
|
|
1063
|
+
|
|
1064
|
+
### General Questions
|
|
1065
|
+
|
|
1066
|
+
**Q: Is Pipsend Charts free to use?**
|
|
1067
|
+
A: Yes! Pipsend Charts is FREE to use in both personal and commercial projects, as long as you use the unmodified version. If you want to modify and redistribute commercially, you'll need a commercial license.
|
|
1068
|
+
|
|
1069
|
+
**Q: What's the difference between Pipsend Charts and TradingView Lightweight Charts?**
|
|
1070
|
+
A: Pipsend Charts is built on top of TradingView's Lightweight Chartsβ’ and adds:
|
|
1071
|
+
- 10 pre-built technical indicators (SMA, EMA, RSI, MACD, etc.)
|
|
1072
|
+
- Interactive draggable trading lines (Stop Loss, Take Profit)
|
|
1073
|
+
- Simplified functional API for indicators
|
|
1074
|
+
- Click-to-create line tools
|
|
1075
|
+
|
|
1076
|
+
**Q: Can I use this in production?**
|
|
1077
|
+
A: Absolutely! Pipsend Charts is production-ready and optimized for performance. Make sure to use the production build.
|
|
1078
|
+
|
|
1079
|
+
**Q: Do I need a TradingView account?**
|
|
1080
|
+
A: No. Pipsend Charts is a standalone library that doesn't require any TradingView account or API keys.
|
|
1081
|
+
|
|
1082
|
+
### Technical Questions
|
|
1083
|
+
|
|
1084
|
+
**Q: Can I add custom indicators?**
|
|
1085
|
+
A: Yes! You can create custom indicators using the underlying TradingView Lightweight Charts API or by extending the existing indicator patterns.
|
|
1086
|
+
|
|
1087
|
+
**Q: How do I update data in real-time?**
|
|
1088
|
+
A: Use the `update()` method on your series:
|
|
1089
|
+
```javascript
|
|
1090
|
+
series.update({ time: Date.now() / 1000, open: 100, high: 105, low: 95, close: 102 });
|
|
1091
|
+
```
|
|
1092
|
+
|
|
1093
|
+
**Q: Can I use multiple timeframes?**
|
|
1094
|
+
A: Yes, but you need to create separate charts for each timeframe. You can switch data on the same chart by calling `setData()` with different timeframe data.
|
|
1095
|
+
|
|
1096
|
+
**Q: Does it work with cryptocurrency data?**
|
|
1097
|
+
A: Yes! Pipsend Charts works with any OHLC (Open, High, Low, Close) data - stocks, forex, crypto, commodities, etc.
|
|
1098
|
+
|
|
1099
|
+
**Q: Can I customize the colors and styles?**
|
|
1100
|
+
A: Absolutely! Every aspect of the chart is customizable - colors, line styles, fonts, backgrounds, etc. See the [Customization](#-customization) section.
|
|
1101
|
+
|
|
1102
|
+
**Q: How do I save/export charts?**
|
|
1103
|
+
A: You can export charts as images using the Canvas API:
|
|
1104
|
+
```javascript
|
|
1105
|
+
const canvas = document.querySelector('canvas');
|
|
1106
|
+
const image = canvas.toDataURL('image/png');
|
|
1107
|
+
```
|
|
1108
|
+
|
|
1109
|
+
**Q: Is server-side rendering (SSR) supported?**
|
|
1110
|
+
A: Pipsend Charts requires a browser environment (Canvas API). For SSR frameworks like Next.js, use dynamic imports:
|
|
1111
|
+
```javascript
|
|
1112
|
+
const Chart = dynamic(() => import('./Chart'), { ssr: false });
|
|
1113
|
+
```
|
|
1114
|
+
|
|
1115
|
+
**Q: What's the maximum number of data points?**
|
|
1116
|
+
A: The library can handle 10,000+ data points smoothly. Performance depends on your hardware and browser.
|
|
1117
|
+
|
|
1118
|
+
**Q: Can I use this with TypeScript?**
|
|
1119
|
+
A: Yes! Pipsend Charts is written in TypeScript and includes full type definitions.
|
|
1120
|
+
|
|
1121
|
+
**Q: How do I remove an indicator?**
|
|
1122
|
+
A: Indicators return a cleanup function:
|
|
1123
|
+
```javascript
|
|
1124
|
+
const cleanup = applySMA(series, chart, { period: 20 });
|
|
1125
|
+
cleanup(); // Removes the indicator
|
|
1126
|
+
```
|
|
1127
|
+
|
|
1128
|
+
### Licensing Questions
|
|
1129
|
+
|
|
1130
|
+
**Q: Can I use this in a commercial product?**
|
|
1131
|
+
A: Yes! You can use the unmodified library in commercial products for FREE. If you want to modify and redistribute commercially, you need a commercial license.
|
|
1132
|
+
|
|
1133
|
+
**Q: Do I need to credit Pipsend Charts?**
|
|
1134
|
+
A: Attribution is required as per the license terms. You must include the copyright notice and license in your distribution.
|
|
1135
|
+
|
|
1136
|
+
**Q: Can I modify the source code?**
|
|
1137
|
+
A: Yes, you can modify for your own internal use. To modify and redistribute commercially, you need a [commercial license](./LICENSE-COMMERCIAL.md).
|
|
1138
|
+
|
|
1139
|
+
**Q: How much does a commercial license cost?**
|
|
1140
|
+
A: Commercial licenses start at $499/year for startups. See [LICENSE-COMMERCIAL.md](./LICENSE-COMMERCIAL.md) for full pricing.
|
|
1141
|
+
|
|
1142
|
+
**Q: What if I'm a non-profit or educational institution?**
|
|
1143
|
+
A: Contact us at licensing@pipsend.com for special pricing and discounts for non-profits and educational institutions.
|
|
1144
|
+
|
|
1145
|
+
---
|
|
1146
|
+
|
|
1147
|
+
## πΊοΈ Roadmap
|
|
1148
|
+
|
|
1149
|
+
### Current Version (1.0.0)
|
|
1150
|
+
|
|
1151
|
+
β
10 Technical Indicators (SMA, EMA, WMA, RSI, MACD, Stochastic, Bollinger Bands, ATR, Volume, OBV)
|
|
1152
|
+
β
Interactive Trading Lines (Stop Loss, Take Profit, Custom Lines)
|
|
1153
|
+
β
Click-to-Create Line Tools
|
|
1154
|
+
β
Framework Integration Examples (React, Vue, Angular, Svelte)
|
|
1155
|
+
β
TypeScript Support
|
|
1156
|
+
β
Production-Ready Performance
|
|
1157
|
+
|
|
1158
|
+
### Planned Features
|
|
1159
|
+
|
|
1160
|
+
#### v1.1.0 (Q4 2025)
|
|
1161
|
+
- π **More Indicators**
|
|
1162
|
+
- Fibonacci Retracement
|
|
1163
|
+
- Ichimoku Cloud
|
|
1164
|
+
- Parabolic SAR
|
|
1165
|
+
- ADX (Average Directional Index)
|
|
1166
|
+
- π **Drawing Tools**
|
|
1167
|
+
- Trend Lines
|
|
1168
|
+
- Horizontal Lines
|
|
1169
|
+
- Rectangle/Box Drawing
|
|
1170
|
+
- More dynamic line tools
|
|
1171
|
+
- π¨ **Themes**
|
|
1172
|
+
- Pre-built Dark/Light themes
|
|
1173
|
+
- Theme switcher utility
|
|
1174
|
+
|
|
1175
|
+
#### v1.2.0 (Q1 2026)
|
|
1176
|
+
- π **Advanced Features**
|
|
1177
|
+
- Multi-chart synchronization
|
|
1178
|
+
- Chart comparison (overlay multiple symbols)
|
|
1179
|
+
- Volume Profile
|
|
1180
|
+
- Heatmap visualization
|
|
1181
|
+
- π **Alerts System**
|
|
1182
|
+
- Price alerts with notifications
|
|
1183
|
+
- Indicator-based alerts
|
|
1184
|
+
- Alert management API
|
|
1185
|
+
|
|
1186
|
+
#### v1.3.0 (Q2 2026)
|
|
1187
|
+
- π€ **AI/ML Integration**
|
|
1188
|
+
- Pattern recognition
|
|
1189
|
+
- Trend prediction helpers
|
|
1190
|
+
- Anomaly detection
|
|
1191
|
+
- π± **Mobile Optimization**
|
|
1192
|
+
- Touch gesture improvements
|
|
1193
|
+
- Mobile-specific UI components
|
|
1194
|
+
- Responsive chart layouts
|
|
1195
|
+
|
|
1196
|
+
#### Future Considerations
|
|
1197
|
+
- WebSocket integration examples
|
|
1198
|
+
- Chart templates/presets
|
|
1199
|
+
- Export to PDF/PNG
|
|
1200
|
+
- Replay mode (historical playback)
|
|
1201
|
+
- Custom indicator builder UI
|
|
1202
|
+
- Plugin system for community extensions
|
|
1203
|
+
|
|
1204
|
+
### Community Requests
|
|
1205
|
+
|
|
1206
|
+
Have a feature request? [Open an issue](https://github.com/ArcaTechCo/PipsendCharts/issues) with the `enhancement` label!
|
|
1207
|
+
|
|
1208
|
+
---
|
|
1209
|
+
|
|
1210
|
+
## π€ Contributing
|
|
1211
|
+
|
|
1212
|
+
We welcome contributions from the community! Whether it's bug fixes, new features, documentation improvements, or examples.
|
|
1213
|
+
|
|
1214
|
+
### How to Contribute
|
|
1215
|
+
|
|
1216
|
+
1. **Fork the Repository**
|
|
1217
|
+
```bash
|
|
1218
|
+
git clone https://github.com/ArcaTechCo/PipsendCharts.git
|
|
1219
|
+
cd pipsend-charts
|
|
1220
|
+
```
|
|
1221
|
+
|
|
1222
|
+
2. **Install Dependencies**
|
|
1223
|
+
```bash
|
|
1224
|
+
npm install
|
|
1225
|
+
```
|
|
1226
|
+
|
|
1227
|
+
3. **Create a Branch**
|
|
1228
|
+
```bash
|
|
1229
|
+
git checkout -b feature/your-feature-name
|
|
1230
|
+
# or
|
|
1231
|
+
git checkout -b fix/your-bug-fix
|
|
1232
|
+
```
|
|
1233
|
+
|
|
1234
|
+
4. **Make Your Changes**
|
|
1235
|
+
- Write clean, documented code
|
|
1236
|
+
- Follow existing code style
|
|
1237
|
+
- Add tests if applicable
|
|
1238
|
+
- Update documentation
|
|
1239
|
+
|
|
1240
|
+
5. **Test Your Changes**
|
|
1241
|
+
```bash
|
|
1242
|
+
# Run tests
|
|
1243
|
+
npm test
|
|
1244
|
+
|
|
1245
|
+
# Run linter
|
|
1246
|
+
npm run lint
|
|
1247
|
+
|
|
1248
|
+
# Build the project
|
|
1249
|
+
npm run build:prod
|
|
1250
|
+
```
|
|
1251
|
+
|
|
1252
|
+
6. **Commit Your Changes**
|
|
1253
|
+
```bash
|
|
1254
|
+
git add .
|
|
1255
|
+
git commit -m "feat: add new indicator XYZ"
|
|
1256
|
+
# or
|
|
1257
|
+
git commit -m "fix: resolve issue with chart rendering"
|
|
1258
|
+
```
|
|
1259
|
+
|
|
1260
|
+
**Commit Message Format:**
|
|
1261
|
+
- `feat:` - New feature
|
|
1262
|
+
- `fix:` - Bug fix
|
|
1263
|
+
- `docs:` - Documentation changes
|
|
1264
|
+
- `style:` - Code style changes (formatting)
|
|
1265
|
+
- `refactor:` - Code refactoring
|
|
1266
|
+
- `test:` - Adding or updating tests
|
|
1267
|
+
- `chore:` - Maintenance tasks
|
|
1268
|
+
|
|
1269
|
+
7. **Push and Create Pull Request**
|
|
1270
|
+
```bash
|
|
1271
|
+
git push origin feature/your-feature-name
|
|
1272
|
+
```
|
|
1273
|
+
Then open a Pull Request on GitHub.
|
|
1274
|
+
|
|
1275
|
+
### Development Guidelines
|
|
1276
|
+
|
|
1277
|
+
- **Code Style**: Follow the existing ESLint configuration
|
|
1278
|
+
- **TypeScript**: Maintain type safety, avoid `any` types
|
|
1279
|
+
- **Documentation**: Update README and add JSDoc comments
|
|
1280
|
+
- **Tests**: Add unit tests for new features
|
|
1281
|
+
- **Performance**: Ensure changes don't degrade performance
|
|
1282
|
+
- **Backwards Compatibility**: Avoid breaking changes when possible
|
|
1283
|
+
|
|
1284
|
+
### Areas We Need Help With
|
|
1285
|
+
|
|
1286
|
+
- π **Documentation** - Improve examples, tutorials, API docs
|
|
1287
|
+
- π **Bug Reports** - Find and report bugs
|
|
1288
|
+
- β¨ **New Indicators** - Implement additional technical indicators
|
|
1289
|
+
- π¨ **Themes** - Create beautiful chart themes
|
|
1290
|
+
- π **Translations** - Translate documentation
|
|
1291
|
+
- π **Examples** - Add framework-specific examples
|
|
1292
|
+
- π§ͺ **Testing** - Improve test coverage
|
|
1293
|
+
|
|
1294
|
+
### Reporting Bugs
|
|
1295
|
+
|
|
1296
|
+
When reporting bugs, please include:
|
|
1297
|
+
|
|
1298
|
+
1. **Description** - Clear description of the issue
|
|
1299
|
+
2. **Steps to Reproduce** - Minimal code to reproduce the bug
|
|
1300
|
+
3. **Expected Behavior** - What should happen
|
|
1301
|
+
4. **Actual Behavior** - What actually happens
|
|
1302
|
+
5. **Environment** - Browser, OS, library version
|
|
1303
|
+
6. **Screenshots** - If applicable
|
|
1304
|
+
|
|
1305
|
+
### Code of Conduct
|
|
1306
|
+
|
|
1307
|
+
- Be respectful and inclusive
|
|
1308
|
+
- Provide constructive feedback
|
|
1309
|
+
- Focus on the code, not the person
|
|
1310
|
+
- Help others learn and grow
|
|
1311
|
+
|
|
1312
|
+
### Questions?
|
|
1313
|
+
|
|
1314
|
+
- π¬ **Discussions** - Use [GitHub Discussions](https://github.com/ArcaTechCo/PipsendCharts/discussions) for questions
|
|
1315
|
+
- π **Issues** - Use [GitHub Issues](https://github.com/ArcaTechCo/PipsendCharts/issues) for bugs
|
|
1316
|
+
- π§ **Email** - Contact maintainers for private matters
|
|
1317
|
+
|
|
1318
|
+
Thank you for contributing to Pipsend Charts! π
|
|
1319
|
+
|
|
1320
|
+
---
|
|
1321
|
+
|
|
1322
|
+
## π Changelog
|
|
1323
|
+
|
|
1324
|
+
### [0.0.8] - 2025-10-24
|
|
1325
|
+
|
|
1326
|
+
#### π Initial Release
|
|
1327
|
+
|
|
1328
|
+
**Core Features**
|
|
1329
|
+
- β
Professional candlestick charting library
|
|
1330
|
+
- β
Built on TradingView's Lightweight Chartsβ’
|
|
1331
|
+
- β
Full TypeScript support with type definitions
|
|
1332
|
+
- β
Framework-agnostic (React, Vue, Angular, Svelte, Vanilla JS)
|
|
1333
|
+
|
|
1334
|
+
**Technical Indicators (10 Total)**
|
|
1335
|
+
|
|
1336
|
+
*Overlay Indicators:*
|
|
1337
|
+
- β
SMA (Simple Moving Average)
|
|
1338
|
+
- β
EMA (Exponential Moving Average)
|
|
1339
|
+
- β
WMA (Weighted Moving Average)
|
|
1340
|
+
- β
Bollinger Bands
|
|
1341
|
+
|
|
1342
|
+
*Panel Indicators:*
|
|
1343
|
+
- β
RSI (Relative Strength Index)
|
|
1344
|
+
- β
MACD (Moving Average Convergence Divergence)
|
|
1345
|
+
- β
Stochastic Oscillator
|
|
1346
|
+
- β
ATR (Average True Range)
|
|
1347
|
+
- β
Volume
|
|
1348
|
+
- β
OBV (On-Balance Volume)
|
|
1349
|
+
|
|
1350
|
+
**Interactive Trading Tools**
|
|
1351
|
+
- β
Draggable price lines (Stop Loss, Take Profit)
|
|
1352
|
+
- β
Click-to-create line functionality
|
|
1353
|
+
- β
Interactive line manager
|
|
1354
|
+
- β
Customizable line styles and colors
|
|
1355
|
+
- β
Drag event callbacks (onDragStart, onDragMove, onDragEnd)
|
|
1356
|
+
|
|
1357
|
+
**API & Developer Experience**
|
|
1358
|
+
- β
Functional API for indicators (one function call per indicator)
|
|
1359
|
+
- β
Auto-updating indicators when data changes
|
|
1360
|
+
- β
Comprehensive TypeScript types
|
|
1361
|
+
- β
Full API documentation
|
|
1362
|
+
- β
Framework integration examples
|
|
1363
|
+
|
|
1364
|
+
**Performance**
|
|
1365
|
+
- β
~49KB gzipped bundle size
|
|
1366
|
+
- β
60 FPS rendering for 1,000+ candles
|
|
1367
|
+
- β
Optimized for real-time data updates
|
|
1368
|
+
- β
Minimal dependencies
|
|
1369
|
+
|
|
1370
|
+
**Documentation**
|
|
1371
|
+
- β
Complete README with examples
|
|
1372
|
+
- β
API reference documentation
|
|
1373
|
+
- β
Framework integration guides
|
|
1374
|
+
- β
Live HTML examples
|
|
1375
|
+
|
|
1376
|
+
**Build System**
|
|
1377
|
+
- β
ES Module builds
|
|
1378
|
+
- β
IIFE builds for CDN usage
|
|
1379
|
+
- β
Development and production variants
|
|
1380
|
+
- β
Standalone and dependency-based builds
|
|
1381
|
+
|
|
1382
|
+
---
|
|
1383
|
+
|
|
1384
|
+
For detailed changes in future versions, see [GitHub Releases](https://github.com/ArcaTechCo/PipsendCharts/releases).
|
|
1385
|
+
|
|
1386
|
+
---
|
|
1387
|
+
|
|
1388
|
+
## π License
|
|
1389
|
+
|
|
1390
|
+
Pipsend Charts is available under a **Dual License** model.
|
|
1391
|
+
|
|
1392
|
+
### π Free License
|
|
1393
|
+
|
|
1394
|
+
**Use Pipsend Charts for FREE in your projects!**
|
|
1395
|
+
|
|
1396
|
+
β
**What You CAN Do (FREE):**
|
|
1397
|
+
- β
Use the **unmodified** library in personal projects
|
|
1398
|
+
- β
Use the **unmodified** library in commercial applications
|
|
1399
|
+
- β
Distribute the original, unmodified library
|
|
1400
|
+
- β
Include as a dependency in your projects
|
|
1401
|
+
- β
Make internal modifications for your own use (not for redistribution)
|
|
1402
|
+
|
|
1403
|
+
β **What You CANNOT Do (Without Commercial License):**
|
|
1404
|
+
- β Modify and redistribute commercially
|
|
1405
|
+
- β Sell modified versions
|
|
1406
|
+
- β Create derivative products for commercial distribution
|
|
1407
|
+
- β White-label or rebrand modified versions
|
|
1408
|
+
|
|
1409
|
+
### πΌ Commercial License
|
|
1410
|
+
|
|
1411
|
+
**Need to modify and redistribute?** Get a commercial license!
|
|
1412
|
+
|
|
1413
|
+
If you want to:
|
|
1414
|
+
- Modify the source code and sell it
|
|
1415
|
+
- Create derivative products for commercial distribution
|
|
1416
|
+
- Redistribute modified versions under your own brand
|
|
1417
|
+
- Build SaaS products with modified versions
|
|
1418
|
+
|
|
1419
|
+
**[View Commercial License Options β](./LICENSE-COMMERCIAL.md)**
|
|
1420
|
+
|
|
1421
|
+
Pricing starts at $499/year for startups. Enterprise licenses available.
|
|
1422
|
+
|
|
1423
|
+
### π Quick Comparison
|
|
1424
|
+
|
|
1425
|
+
| Feature | Free License | Commercial License |
|
|
1426
|
+
|---------|--------------|-------------------|
|
|
1427
|
+
| Use in personal projects | β
Free | β
Included |
|
|
1428
|
+
| Use in commercial apps (unmodified) | β
Free | β
Included |
|
|
1429
|
+
| Modify for internal use | β
Free | β
Included |
|
|
1430
|
+
| **Modify and redistribute commercially** | β Not allowed | β
**Allowed** |
|
|
1431
|
+
| **Sell modified versions** | β Not allowed | β
**Allowed** |
|
|
1432
|
+
| **White-label/rebrand** | β Not allowed | β
**Allowed** |
|
|
1433
|
+
| Priority support | β No | β
Yes |
|
|
1434
|
+
| Custom features | β No | β
Yes (Enterprise) |
|
|
1435
|
+
|
|
1436
|
+
### π€ Do I Need a Commercial License?
|
|
1437
|
+
|
|
1438
|
+
**You DON'T need a commercial license if:**
|
|
1439
|
+
- You're using the library as-is in your app (even commercial apps)
|
|
1440
|
+
- You're making internal modifications for your own use
|
|
1441
|
+
- You're using it for learning or personal projects
|
|
1442
|
+
|
|
1443
|
+
**You DO need a commercial license if:**
|
|
1444
|
+
- You want to sell a modified version of the library
|
|
1445
|
+
- You want to create a competing product based on this library
|
|
1446
|
+
- You want to redistribute modified versions commercially
|
|
1447
|
+
|
|
1448
|
+
### π Full License Text
|
|
1449
|
+
|
|
1450
|
+
See the [LICENSE](./LICENSE) file for complete terms and conditions.
|
|
1451
|
+
|
|
1452
|
+
### π¬ Questions About Licensing?
|
|
1453
|
+
|
|
1454
|
+
- π§ Email: licensing@pipsend.com
|
|
1455
|
+
- π¬ Discussions: [GitHub Discussions](https://github.com/ArcaTechCo/PipsendCharts/discussions)
|
|
1456
|
+
- π Commercial License Details: [LICENSE-COMMERCIAL.md](./LICENSE-COMMERCIAL.md)
|
|
1457
|
+
|
|
1458
|
+
### Attribution
|
|
1459
|
+
|
|
1460
|
+
Pipsend Charts is built on top of [TradingView's Lightweight Chartsβ’](https://github.com/tradingview/lightweight-charts), which is licensed under Apache 2.0.
|
|
1461
|
+
|
|
1462
|
+
**Copyright Notice:**
|
|
1463
|
+
```
|
|
1464
|
+
Copyright (c) 2025 Pipsend
|
|
1465
|
+
Based on TradingView's Lightweight Chartsβ’ (Copyright 2024 TradingView, Inc.)
|
|
1466
|
+
```
|
|
1467
|
+
|
|
1468
|
+
### Third-Party Components
|
|
1469
|
+
|
|
1470
|
+
This project includes code from:
|
|
1471
|
+
- **TradingView Lightweight Chartsβ’** - [Apache 2.0](https://github.com/tradingview/lightweight-charts/blob/master/LICENSE)
|
|
1472
|
+
- **fancy-canvas** - [ISC License](https://github.com/tradingview/fancy-canvas/blob/master/LICENSE)
|
|
1473
|
+
|
|
1474
|
+
These components retain their original licenses.
|
|
1475
|
+
|
|
1476
|
+
---
|
|
1477
|
+
|
|
1478
|
+
## π Acknowledgments
|
|
1479
|
+
|
|
1480
|
+
- **TradingView** - For creating the excellent Lightweight Charts library
|
|
1481
|
+
- **Contributors** - Everyone who has contributed to this project
|
|
1482
|
+
- **Community** - Users who provide feedback and report issues
|
|
1483
|
+
|
|
1484
|
+
---
|
|
1485
|
+
|
|
1486
|
+
## π Support & Contact
|
|
1487
|
+
|
|
1488
|
+
- **Documentation**: [README.md](./README.md)
|
|
1489
|
+
- **Examples**: [./examples](./examples)
|
|
1490
|
+
- **Issues**: [GitHub Issues](https://github.com/ArcaTechCo/PipsendCharts/issues)
|
|
1491
|
+
- **Discussions**: [GitHub Discussions](https://github.com/ArcaTechCo/PipsendCharts/discussions)
|
|
1492
|
+
- **Website**: [https://github.com/ArcaTechCo/PipsendCharts](https://github.com/ArcaTechCo/PipsendCharts)
|
|
1493
|
+
|
|
1494
|
+
---
|
|
1495
|
+
|
|
1496
|
+
<div align="center">
|
|
1497
|
+
|
|
1498
|
+
**Made with β€οΈ by the Pipsend Team**
|
|
1499
|
+
|
|
1500
|
+
β **Star us on GitHub** if you find this project useful!
|
|
1501
|
+
|
|
1502
|
+
[Report Bug](https://github.com/ArcaTechCo/PipsendCharts/issues) Β· [Request Feature](https://github.com/ArcaTechCo/PipsendCharts/issues) Β· [Documentation](https://github.com/ArcaTechCo/PipsendCharts)
|
|
1503
|
+
|
|
1504
|
+
</div>
|