@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/README.md ADDED
@@ -0,0 +1,1504 @@
1
+ # πŸ“Š Pipsend Charts
2
+
3
+ [![npm version](https://img.shields.io/npm/v/@pipsend/charts.svg?style=flat-square)](https://www.npmjs.com/package/@pipsend/charts)
4
+ [![npm downloads](https://img.shields.io/npm/dm/@pipsend/charts.svg?style=flat-square)](https://www.npmjs.com/package/@pipsend/charts)
5
+ [![License](https://img.shields.io/badge/License-Dual%20License-blue.svg?style=flat-square)](LICENSE)
6
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.5-blue?style=flat-square&logo=typescript)](https://www.typescriptlang.org/)
7
+ [![Bundle Size](https://img.shields.io/bundlephobia/minzip/@pipsend/charts?style=flat-square)](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>