πŸ“Š Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ с Chart.js: ΠΏΠΎΠ»Π½ΠΎΠ΅ руководство для Ρ‚Ρ€Π΅ΠΉΠ΄Π΅Ρ€ΠΎΠ²


На Π³Π»Π°Π²Π½ΡƒΡŽ > Π‘Π»ΠΎΠ³ > ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ > πŸ“Š Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ с Chart.js: ΠΏΠΎΠ»Π½ΠΎΠ΅ руководство для Ρ‚Ρ€Π΅ΠΉΠ΄Π΅Ρ€ΠΎΠ²

chart_js

ВступлСниС: ΠΏΠΎΡ‡Π΅ΠΌΡƒ Chart.js β€” Π»ΡƒΡ‡ΡˆΠΈΠΉ Π²Ρ‹Π±ΠΎΡ€ для трСйдСрских Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ²

Π’Ρ‹ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½Π° свой сайт ΠΈΠ»ΠΈ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ красивый, ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊ ΠΊΠΎΡ‚ΠΈΡ€ΠΎΠ²ΠΎΠΊ? Или Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ бэктСстинга? Или просто ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΡƒ баланса Π·Π° мСсяц? Chart.js β€” это мощная, лёгкая ΠΈ бСсплатная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для создания Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² Π½Π° JavaScript. Она идСально ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для трСйдСрских ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ:

  • ⚑ Лёгкая ΠΈ быстрая β€” всСго ~60 ΠšΠ‘, Π½Π΅ Ρ‚ΠΎΡ€ΠΌΠΎΠ·ΠΈΡ‚ страницу.
  • πŸ“± Адаптивная β€” Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ автоматичСски ΠΏΠΎΠ΄ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ΄ Ρ€Π°Π·ΠΌΠ΅Ρ€ экрана (дСсктоп, ΠΏΠ»Π°Π½ΡˆΠ΅Ρ‚, Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½).
  • 🎨 ΠšΡ€Π°ΡΠΈΠ²Π°Ρ ΠΈ гибкая β€” 8 Ρ‚ΠΈΠΏΠΎΠ² Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ², Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ добавлСния собствСнных ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ².
  • πŸ“ˆ ΠŸΡ€ΠΎΡΡ‚Π°Ρ Π² освоСнии β€” JavaScript + HTML = Π³Ρ€Π°Ρ„ΠΈΠΊ Π·Π° 5 ΠΌΠΈΠ½ΡƒΡ‚.

Π’ этом руководствС я ΠΏΠΎΠΊΠ°ΠΆΡƒ всё: ΠΎΡ‚ установки Π΄ΠΎ создания свСчного Π³Ρ€Π°Ρ„ΠΈΠΊΠ° (OHLC) ΠΈ обновлСния Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’ ΠΊΠΎΠ½Ρ†Π΅ Π²Ρ‹ смоТСтС ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ трСйдСрский Π²ΠΈΠ΄ΠΆΠ΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обновляСт Ρ†Π΅Π½Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 5 сСкунд.

Β«Chart.js β€” это ΡˆΠ²Π΅ΠΉΡ†Π°Ρ€ΡΠΊΠΈΠΉ Π½ΠΎΠΆ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. НС самый Π½Π°Π²ΠΎΡ€ΠΎΡ‡Π΅Π½Π½Ρ‹ΠΉ, Π½ΠΎ для 90% Π·Π°Π΄Π°Ρ‡ Ρ‚Ρ€Π΅ΠΉΠ΄Π΅Ρ€Π° Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ достаточно».

1. Установка ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊ

Бпособы установки:

  • πŸ”— CDN (самый простой для тСстов): Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² HTML
    <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>.
  • πŸ“¦ npm (для ΡΠ΅Ρ€ΡŒΡ‘Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²): npm install chart.js.
  • πŸ“₯ Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ сайта.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊ: Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ (ΠΊΠΎΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ BTC)


<!DOCTYPE html>
<html>
<head>
    <title>Π“Ρ€Π°Ρ„ΠΈΠΊ BTC/USD</title>
    <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
</head>
<body>
    <canvas id="btcChart" width="800" height="400"></canvas>
    
    <script>
        const ctx = document.getElementById('btcChart').getContext('2d');
        new Chart(ctx, {
            type: 'line',
            data: {
                labels: ['Π―Π½Π²', 'Π€Π΅Π²', 'ΠœΠ°Ρ€', 'Апр', 'Май', 'Июн'],
                datasets: [{
                    label: 'BTC/USD',
                    data: [42000, 44000, 46000, 45000, 48000, 51000],
                    borderColor: 'rgb(75, 192, 192)',
                    backgroundColor: 'rgba(75, 192, 192, 0.2)',
                    tension: 0.1
                }]
            },
            options: {
                responsive: true,
                plugins: {
                    tooltip: {
                        callbacks: {
                            label: function(context) {
                                return `$${context.raw.toLocaleString()}`;
                            }
                        }
                    }
                }
            }
        });
    </script>
</body>
</html>
πŸ’‘ Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Chart:
  • type β€” Ρ‚ΠΈΠΏ Π³Ρ€Π°Ρ„ΠΈΠΊΠ° ('line', 'bar', 'candlestick' (Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ»Π°Π³ΠΈΠ½), 'bubble' ΠΈ Ρ‚.Π΄.).
  • data β€” ΠΌΠ΅Ρ‚ΠΊΠΈ (labels) ΠΈ Π½Π°Π±ΠΎΡ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… (datasets).
  • options β€” настройки (Ρ€Π΅ΡΠΏΠΎΠ½ΡΠΈΠ²Π½ΠΎΡΡ‚ΡŒ, Ρ‚ΡƒΠ»Ρ‚ΠΈΠΏΡ‹, подписи осСй).

2. Π’ΠΈΠΏΡ‹ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² для Ρ‚Ρ€Π΅ΠΉΠ΄Π΅Ρ€Π°

2.1. Π›ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊ (Line Chart) β€” Ρ‚Ρ€Π΅Π½Π΄Ρ‹

ИдСалСн для отобраТСния Ρ†Π΅Π½Ρ‹ закрытия, баланса счёта, ΡΠΊΠΎΠ»ΡŒΠ·ΡΡ‰ΠΈΡ… срСдних.

datasets: [{
    type: 'line',
    label: 'SMA 20',
    data: [44500, 45500, 46500, 47500, 48500],
    borderColor: 'red',
    borderWidth: 2,
    fill: false
}]

2.2. Π‘Π²Π΅Ρ‡Π½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊ (Candlestick Chart) β€” самый Π²Π°ΠΆΠ½Ρ‹ΠΉ

Chart.js Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ встроСнного свСчного Π³Ρ€Π°Ρ„ΠΈΠΊΠ°, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ»Π°Π³ΠΈΠ½ chartjs-chart-financial. Установка:

npm install chart.js chartjs-chart-financial

ИспользованиС в HTML:

<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-chart-financial@0.2.0/dist/chartjs-chart-financial.min.js"></script>

Код свСчного Π³Ρ€Π°Ρ„ΠΈΠΊΠ°:

new Chart(ctx, {
    type: 'candlestick',
    data: {
        datasets: [{
            label: 'BTC/USD',
            data: [
                { t: '2025-06-01', o: 67000, h: 67500, l: 66800, c: 67200 },
                { t: '2025-06-02', o: 67200, h: 68000, l: 67000, c: 67800 },
                { t: '2025-06-03', o: 67800, h: 67900, l: 66500, c: 66600 }
            ]
        }]
    },
    options: {
        responsive: true,
        plugins: {
            tooltip: {
                callbacks: {
                    label: function(context) {
                        const ohlc = context.raw;
                        return `O: ${ohlc.o} | H: ${ohlc.h} | L: ${ohlc.l} | C: ${ohlc.c}`;
                    }
                }
            }
        }
    }
});

2.3. Гистограмма (Bar Chart) β€” ΠΎΠ±ΡŠΡ‘ΠΌΡ‹


type: 'bar',
data: {
    labels: ['01.06', '02.06', '03.06'],
    datasets: [{
        label: 'ΠžΠ±ΡŠΡ‘ΠΌ (BTC)',
        data: [12500, 15800, 9800],
        backgroundColor: 'rgba(54, 162, 235, 0.5)'
    }]
}
πŸ“Š Π‘Π²Π΅Ρ‡Π½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊ β€” ΠΊΠ»ΡŽΡ‡ ΠΊ Π°Π½Π°Π»ΠΈΠ·Ρƒ: Π‘Π²Π΅Ρ‡ΠΈ Π΄Π°ΡŽΡ‚ большС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Ρ‡Π΅ΠΌ просто линия. Плагин chartjs-chart-financial обязатСлСн для ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ трСйдСрского Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°.

3. ОбновлСниС Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (WebSocket + Chart.js)

Π‘Π°ΠΌΡ‹ΠΉ Ρ†Π΅Π½Π½Ρ‹ΠΉ Π½Π°Π²Ρ‹ΠΊ β€” созданиС Π³Ρ€Π°Ρ„ΠΈΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обновляСтся Β«Π½Π° Π»Π΅Ρ‚ΡƒΒ» с Π±ΠΈΡ€ΠΆΠΈ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ WebSocket Binance ΠΈ динамичСскоС Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ….


// ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ WebSocket Binance
const ws = new WebSocket('wss://stream.binance.com:9443/ws/btcusdt@trade');

const ctx = document.getElementById('liveChart').getContext('2d');
const chart = new Chart(ctx, {
    type: 'line',
    data: {
        labels: [],
        datasets: [{
            label: 'BTC/USDT',
            data: [],
            borderColor: 'green',
            fill: false
        }]
    },
    options: {
        responsive: true,
        animation: false  // ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ для скорости
    }
});

ws.onmessage = (event) => {
    const trade = JSON.parse(event.data);
    const price = parseFloat(trade.p);
    const time = new Date(trade.T).toLocaleTimeString();
    
    // ДобавляСм Π½ΠΎΠ²ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ
    chart.data.labels.push(time);
    chart.data.datasets[0].data.push(price);
    
    // ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ количСство Ρ‚ΠΎΡ‡Π΅ΠΊ (послСдниС 50)
    if (chart.data.labels.length > 50) {
        chart.data.labels.shift();
        chart.data.datasets[0].data.shift();
    }
    
    chart.update();  // пСрСрисовка
};
⚠️ Π’Π°ΠΆΠ½ΠΎΠ΅ Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠŸΡ€ΠΈ частых обновлСниях (нСсколько Ρ‚ΠΈΠΊΠΎΠ² Π² сСкунду) Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ частоту пСрСрисовки, ΠΈΠ½Π°Ρ‡Π΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²ΠΈΡΠ½ΡƒΡ‚ΡŒ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ requestAnimationFrame ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для Ρ‚Ρ€ΠΎΡ‚Π»ΠΈΠ½Π³Π°.

4. Настройка внСшнСго Π²ΠΈΠ΄Π° для трСйдСрских Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ²

4.1. Π‘Ρ‚ΠΈΠ»ΠΈ осСй ΠΈ сСтки


options: {
    scales: {
        x: {
            title: { display: true, text: 'ВрСмя' },
            grid: { color: 'rgba(0,0,0,0.05)' }
        },
        y: {
            title: { display: true, text: 'Π¦Π΅Π½Π° (USD)' },
            grid: { color: 'rgba(0,0,0,0.1)' },
            ticks: {
                callback: function(value) {
                    return '$' + value.toLocaleString();
                }
            }
        }
    }
}

4.2. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π½Π°Π±ΠΎΡ€ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… (Ρ†Π΅Π½Π° + ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€)


datasets: [
    {
        label: 'Π¦Π΅Π½Π° закрытия',
        data: priceData,
        borderColor: 'blue',
        borderWidth: 2,
        fill: false
    },
    {
        label: 'SMA 20',
        data: smaData,
        borderColor: 'red',
        borderWidth: 1.5,
        borderDash: [5, 5],
        fill: false
    }
]

4.3. Π—Π°Π»ΠΈΠ²ΠΊΠ° области ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ†Π΅Π½ΠΎΠΉ ΠΈ SMA

{
    label: 'Π¦Π΅Π½Π°',
    data: priceData,
    backgroundColor: 'rgba(0,255,0,0.1)',
    fill: true
}

5. ΠŸΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ

5.1. Π‘ΠΌΠ΅ΡˆΠ°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² (свСчи + линия)

МоТно ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свСчи ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠΊΠΎΠ»ΡŒΠ·ΡΡ‰ΡƒΡŽ ΡΡ€Π΅Π΄Π½ΡŽΡŽ. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ массив datasets с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ:


datasets: [
    {
        type: 'candlestick',
        label: 'BTC/USD',
        data: ohlcData
    },
    {
        type: 'line',
        label: 'SMA 20',
        data: smaData,
        borderColor: 'orange',
        borderWidth: 2,
        fill: false
    }
]

5.2. Π—ΡƒΠΌ ΠΈ ΠΏΠ°Π½ΠΎΡ€Π°ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Chart.js Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ встроСнного Π·ΡƒΠΌΠ°, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½ chartjs-plugin-zoom.


<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-zoom@2.0.1/dist/chartjs-plugin-zoom.min.js"></script>
options: {
    plugins: {
        zoom: {
            pan: { enabled: true, mode: 'xy' },
            zoom: { wheel: { enabled: true }, mode: 'xy' }
        }
    }
}

5.3. Экспорт Π² PNG


const link = document.createElement('a');
link.download = 'chart.png';
link.href = chart.toBase64Image();
link.click();

6. ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΊΠΎΡ‚ΠΈΡ€ΠΎΠ²ΠΎΠΊ BTC/USD со свСчами, SMA ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ

Π‘ΠΎΠ±Π΅Ρ€Ρ‘ΠΌ всё вмСстС: Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° историчСских Π΄Π°Π½Π½Ρ‹Ρ…, свСчной Π³Ρ€Π°Ρ„ΠΈΠΊ, ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ SMA 20 ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (имитация).

<!DOCTYPE html>
<html>
<head>
    <title>ВрСйдСрский Π²ΠΈΠ΄ΠΆΠ΅Ρ‚</title>
    <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/chartjs-chart-financial@0.2.0/dist/chartjs-chart-financial.min.js"></script>
</head>
<body>
    <canvas id="tradingWidget" width="1000" height="500"></canvas>
    
    <script>
        // ГСнСрация тСстовых OHLC Π΄Π°Π½Π½Ρ‹Ρ… (Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ β€” с Π±ΠΈΡ€ΠΆΠΈ)
        function generateOHLC() {
            const data = [];
            let price = 67000;
            for (let i = 0; i < 100; i++) {
                const open = price;
                const close = price + (Math.random() - 0.5) * 500;
                const high = Math.max(open, close) + Math.random() * 200;
                const low = Math.min(open, close) - Math.random() * 200;
                data.push({ t: `2025-06-${Math.floor(i/3)+1}`, o: open, h: high, l: low, c: close });
                price = close;
            }
            return data;
        }
        
        const ohlcData = generateOHLC();
        
        // Расчёт SMA 20 (ΠΏΠΎ Ρ†Π΅Π½Π°ΠΌ закрытия)
        const closes = ohlcData.map(d => d.c);
        const sma20 = [];
        for (let i = 0; i < closes.length; i++) {
            if (i < 19) {
                sma20.push(null);
            } else {
                const sum = closes.slice(i-19, i+1).reduce((a,b) => a + b, 0);
                sma20.push(sum / 20);
            }
        }
        
        const ctx = document.getElementById('tradingWidget').getContext('2d');
        new Chart(ctx, {
            type: 'candlestick',
            data: {
                datasets: [
                    {
                        label: 'BTC/USD',
                        data: ohlcData,
                        borderColor: 'rgba(0,0,0,0.3)',
                        barPercentage: 0.8
                    },
                    {
                        type: 'line',
                        label: 'SMA 20',
                        data: sma20,
                        borderColor: 'orange',
                        borderWidth: 2,
                        fill: false,
                        pointRadius: 0
                    }
                ]
            },
            options: {
                responsive: true,
                plugins: {
                    tooltip: {
                        callbacks: {
                            label: (context) => {
                                if (context.dataset.label === 'BTC/USD') {
                                    const o = context.raw;
                                    return `O: ${o.o} | H: ${o.h} | L: ${o.l} | C: ${o.c}`;
                                }
                                return `SMA 20: ${context.raw}`;
                            }
                        }
                    }
                },
                scales: {
                    x: { title: { display: true, text: 'Π”Π°Ρ‚Π°' } },
                    y: { title: { display: true, text: 'Π¦Π΅Π½Π° (USD)' } }
                }
            }
        });
    </script>
</body>
</html>

7. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Chart.js с Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π°ΠΌΠΈ

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠŸΠ»ΡŽΡΡ‹ΠœΠΈΠ½ΡƒΡΡ‹
Chart.jsЛёгкая, бСсплатная, простая, адаптивная, свСчной Π³Ρ€Π°Ρ„ΠΈΠΊ Ρ‡Π΅Ρ€Π΅Π· плагинНСт встроСнных свСчСй, ограничСнная кастомизация для слоТных финансовых Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ²
TradingView Lightweight ChartsБвСрхбыстрая, ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ финансовый Π³Ρ€Π°Ρ„ΠΈΠΊ, Π·ΡƒΠΌ, тСхничСскиС ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹Π‘Π»ΠΎΠΆΠ½Π΅Π΅ Π² настройкС, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для финансовых Π΄Π°Π½Π½Ρ‹Ρ…
HighchartsΠžΡ‡Π΅Π½ΡŒ мощная, мноТСство Ρ‚ΠΈΠΏΠΎΠ² Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ², коммСрчСская ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ°ΠŸΠ»Π°Ρ‚Π½Π°Ρ (для коммСрчСских ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²)

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅: с Chart.js ваш трСйдСрский сайт Π·Π°ΠΈΠ³Ρ€Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΌΠΈ красками

Chart.js β€” это ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ инструмСнт для быстрого прототипирования трСйдСрских Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² ΠΈ Π΄Π°ΡˆΠ±ΠΎΡ€Π΄ΠΎΠ². Он Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ слоТной настройки, лСгковСсСн ΠΈ красиво выглядит. Π”Π°, для ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΎΡ€Π³ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° с ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π°ΠΌΠΈ Ρ‚ΠΎΡ‡Π΅ΠΊ Π΄Π°Π½Π½Ρ‹Ρ… Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ TradingView Lightweight Charts. Но для 90% Π·Π°Π΄Π°Ρ‡ β€” отобраТСния баланса, Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠΈ портфСля, простых ΠΊΠΎΡ‚ΠΈΡ€ΠΎΠ²ΠΎΠΊ β€” Chart.js Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ достаточСн.

НачнитС с ΠΌΠ°Π»ΠΎΠ³ΠΎ: создайтС простой Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊ Ρ†Π΅Π½Ρ‹. ΠŸΠΎΡ‚ΠΎΠΌ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ свСчной (ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΠΏΠ»Π°Π³ΠΈΠ½). ΠŸΠΎΡ‚ΠΎΠΌ β€” ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ SMA. А ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ‡Π΅Ρ€Π΅Π· WebSocket. Π—Π° ΠΎΠ΄ΠΈΠ½ Π²Π΅Ρ‡Π΅Ρ€ Π²Ρ‹ смоТСтС ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ настоящий трСйдСрский Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π».

И ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅: красивая визуализация β€” это ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° успСха трСйдСрского сСрвиса. ΠšΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Π΄ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ видят. А с Chart.js ваши Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ Π΄Π°ΠΆΠ΅ Π½Π° простой HTML-страницС.

Β«Chart.js β€” это ΠΊΠ°ΠΊ краски. Π₯олст Π΅ΡΡ‚ΡŒ, кисти Π΅ΡΡ‚ΡŒ. А Ρ‡Ρ‚ΠΎ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ β€” Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Ρ…ΡƒΠ΄ΠΎΠΆΠ½ΠΈΠΊ. Π’ нашСм случаС β€” Ρ‚Ρ€Π΅ΠΉΠ΄Π΅Ρ€-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΒ».

 

Π”Π°Ρ‚Π° размСщСния ΡΡ‚Π°Ρ‚ΡŒΠΈ: 03-06-2026 Π² 07:47:28