
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Анализ рынка BNB – 5 мая 2026 года</title>
<link href="https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Space+Mono:wght@400;700&family=Syne:wght@400;700;800&display=swap" rel="stylesheet">
<style>
:root {
--золото: #F0B90B;
--золото-светлое: #FFD740;
--золото-тусклое: #B8860B;
--темный: #0B0E11;
--темный2: #13171D;
--темный3: #1E2330;
--зеленый: #0ECB81;
--red: #F6465D;
--текст: #E8E8E8;
--заглушено: #848E9C;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
тело {
фон: var(--dark);
цвет: var(--text);
font-family: 'Space Mono', monospace;
минимальная высота: 100vh;
overflow-x: hidden;
}
/* Анимированная фоновая сетка */
body::before {
содержание: '';
положение: фиксированное;
вставка: 0;
фоновое изображение:
linear-gradient(rgba(240,185,11,0.04) 1px, transparent 1px),
linear-gradient(90deg, rgba(240,185,11,0.04) 1px, transparent 1px);
background-size: 40px 40px;
pointer-events: none;
z-индекс: 0;
}
.container {
положение: относительное;
z-индекс: 1;
max-width: 900px;
margin: 0 auto;
padding: 30px 20px 60px;
}
/* ── ЗАГОЛОВОК ── */
.header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 36px;
border-bottom: 1px solid rgba(240,185,11,0.2);
padding-bottom: 20px;
анимация: fadeDown 0.6s плавно затухает оба;
}
.brand {
display: flex;
align-items: center;
зазор: 14 пикселей;
}
.bnb-icon {
ширина: 56 пикселей;
высота: 56 пикселей;
фон: var(--gold);
радиус границы: 50%;
display: flex;
align-items: center;
justify-content: center;
семейство шрифтов: «Bebas Neue», без засечек;
font-size: 22px;
цвет: #000;
box-shadow: 0 0 24px rgba(240,185,11,0.5);
анимация: пульсация 2,5 с, плавное нарастание-распада, бесконечность;
}
@keyframes pulse {
0%, 100% { box-shadow: 0 0 24px rgba(240,185,11,0.5); }
50% { box-shadow: 0 0 44px rgba(240,185,11,0.9); }
}
.brand-text h1 {
семейство шрифтов: «Bebas Neue», без засечек;
font-size: 2rem;
межбуквенный интервал: 3px;
цвет: var(--gold);
line-height: 1;
}
.brand-text p {
font-size: 0.65rem;
цвет: var(--muted);
межбуквенный интервал: 2px;
text-transform: uppercase;
}
.date-badge {
фон: var(--dark3);
border: 1px solid rgba(240,185,11,0.25);
border-radius: 6px;
padding: 8px 14px;
font-size: 0.65rem;
цвет: var(--gold);
межбуквенный интервал: 1,5 пикселя;
text-align: right;
}
/* ── Ряд цен героев ── */
.герой {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
зазор: 12 пикселей;
margin-bottom: 32px;
анимация: fadeUp 0.7s 0.15s с плавным переходом между обоими эффектами;
}
.stat-card {
фон: var(--dark2);
border: 1px solid rgba(240,185,11,0.15);
border-radius: 10px;
padding: 18px 16px;
положение: относительное;
переполнение: скрыто;
transition: border-color 0.2s;
}
.stat-card::after {
содержание: '';
положение: абсолютное;
сверху: 0; слева: 0;
ширина: 3 пикселя; высота: 100%;
фон: var(--gold);
border-radius: 3px 0 0 3px;
}
.stat-card:hover { border-color: rgba(240,185,11,0.4); }
.stat-card .label {
font-size: 0.6rem;
цвет: var(--muted);
межбуквенный интервал: 2px;
text-transform: uppercase;
margin-bottom: 6px;
}
.stat-card .value {
font-family: 'Syne', sans-serif;
font-size: 1.3rem;
font-weight: 800;
цвет: var(--text);
}
.stat-card .value.green { color: var(--green); }
.stat-card .value.red { color: var(--red); }
.stat-card .value.gold { color: var(--gold); }
.stat-card .sub {
font-size: 0.6rem;
цвет: var(--muted);
margin-top: 3px;
}
/* ── ЗАГОЛОВОК РАЗДЕЛА ── */
.section-title {
семейство шрифтов: «Bebas Neue», без засечек;
font-size: 1.1rem;
межбуквенный интервал: 4px;
цвет: var(--gold);
text-transform: uppercase;
margin-bottom: 14px;
display: flex;
align-items: center;
зазор: 10 пикселей;
}
.section-title::after {
содержание: '';
flex: 1;
высота: 1 пиксель;
background: linear-gradient(90deg, rgba(240,185,11,0.4), transparent);
}
/* ── ДИАГРАММА СВЕЧЕЙ ── */
.chart-wrap {
фон: var(--dark2);
border: 1px solid rgba(240,185,11,0.15);
border-radius: 12px;
padding: 24px;
margin-bottom: 32px;
анимация: fadeUp 0.7s 0.25s с плавным переходом между обоими эффектами;
}
.chart-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
}
.chart-header h2 {
font-family: 'Syne', sans-serif;
font-weight: 800;
font-size: 1rem;
цвет: var(--text);
}
.timeframe-pills {
display: flex;
зазор: 6 пикселей;
}
.пилка {
фон: var(--dark3);
border: 1px solid rgba(240,185,11,0.2);
border-radius: 4px;
padding: 3px 10px;
font-size: 0.6rem;
цвет: var(--muted);
курсор: указатель;
Переход: все 0,15 с;
}
.pill.active, .pill:hover {
background: rgba(240,185,11,0.15);
border-color: var(--gold);
цвет: var(--gold);
}
#candleChart {
ширина: 100%;
высота: 320 пикселей;
display: block;
}
.chart-legend {
display: flex;
зазор: 20 пикселей;
margin-top: 14px;
flex-wrap: wrap;
}
.legend-item {
display: flex;
align-items: center;
зазор: 6 пикселей;
font-size: 0.6rem;
цвет: var(--muted);
}
.legend-dot {
ширина: 8 пикселей; высота: 8 пикселей;
радиус границы: 50%;
}
/* ── АНАЛИЗНАЯ СЕТКА ── */
.analysis-grid {
display: grid;
grid-template-columns: 1fr 1fr;
зазор: 16 пикселей;
margin-bottom: 32px;
анимация: fadeUp 0.7s 0.35s с плавным переходом между ними;
}
.analysis-card {
фон: var(--dark2);
border: 1px solid rgba(240,185,11,0.15);
border-radius: 10px;
padding: 20px;
}
.analysis-card h3 {
font-family: 'Syne', sans-serif;
font-weight: 700;
font-size: 0.8rem;
цвет: var(--gold);
margin-bottom: 12px;
межбуквенный интервал: 1 пиксель;
text-transform: uppercase;
}
.level-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 7px 0;
border-bottom: 1px solid rgba(255,255,255,0.04);
font-size: 0.7rem;
}
.level-row:last-child { border-bottom: none; }
.level-row .name { color: var(--muted); }
.level-row .val { font-weight: 700; }
.level-row .val.r { color: var(--red); }
.level-row .val.g { color: var(--green); }
.level-row .val.y { color: var(--gold); }
/* ── ИНДИКАТОРЫ ── */
.индикаторы {
display: grid;
grid-template-columns: repeat(3, 1fr);
зазор: 12 пикселей;
margin-bottom: 32px;
анимация: fadeUp 0.7s 0.4s ease both;
}
.ind-card {
фон: var(--dark2);
border: 1px solid rgba(240,185,11,0.12);
border-radius: 10px;
padding: 16px;
text-align: center;
}
.ind-card .ind-name {
font-size: 0.58rem;
цвет: var(--muted);
межбуквенный интервал: 2px;
text-transform: uppercase;
margin-bottom: 8px;
}
.ind-card .ind-val {
font-family: 'Syne', sans-serif;
font-size: 1.4rem;
font-weight: 800;
}
.ind-card .ind-signal {
font-size: 0.58rem;
межбуквенный интервал: 1,5 пикселя;
margin-top: 4px;
text-transform: uppercase;
}
.bullish { color: var(--green); }
.bearish { color: var(--red); }
.neutral { color: var(--gold); }
/* ── Панель сценариев ── */
.scenario-wrap {
фон: var(--dark2);
border: 1px solid rgba(240,185,11,0.15);
border-radius: 10px;
padding: 22px;
margin-bottom: 32px;
анимация: fadeUp 0.7s 0.45s с плавным переходом между ними;
}
.scenario-wrap p {
font-size: 0.72rem;
цвет: var(--muted);
межстрочный интервал: 1.8;
margin-bottom: 16px;
}
.scenario-bar {
display: flex;
border-radius: 6px;
переполнение: скрыто;
высота: 36 пикселей;
}
.s-bull {
background: linear-gradient(90deg, #0ECB81, #06a862);
display: flex; align-items: center; justify-content: center;
font-size: 0.65rem; font-weight: 700; color: #000;
letter-spacing: 1px; flex: 55;
transition: flex 0.4s ease;
}
.s-side {
background: linear-gradient(90deg, #B8860B, #F0B90B);
display: flex; align-items: center; justify-content: center;
font-size: 0.65rem; font-weight: 700; color: #000;
letter-spacing: 1px; flex: 25;
}
.s-bear {
background: linear-gradient(90deg, #c73147, #F6465D);
display: flex; align-items: center; justify-content: center;
font-size: 0.65rem; font-weight: 700; color: #fff;
letter-spacing: 1px; flex: 20;
}
.scenario-labels {
display: flex;
justify-content: space-between;
margin-top: 8px;
font-size: 0.58rem;
цвет: var(--muted);
}
/* ── КАТАЛИЗАТОРЫ ── */
.катализаторы {
display: grid;
grid-template-columns: 1fr 1fr;
зазор: 12 пикселей;
margin-bottom: 32px;
анимация: fadeUp 0.7s 0.5s с плавным переходом между обоими эффектами;
}
.catalyst-card {
фон: var(--dark2);
border-radius: 10px;
padding: 18px;
display: flex;
зазор: 12 пикселей;
align-items: flex-start;
}
.catalyst-card.bull { border: 1px solid rgba(14,203,129,0.25); }
.catalyst-card.bear { border: 1px solid rgba(246,70,93,0.25); }
.cat-icon {
font-size: 1.4rem;
line-height: 1;
flex-shrink: 0;
}
.catalyst-card h4 {
font-family: 'Syne', sans-serif;
font-size: 0.75rem;
font-weight: 700;
margin-bottom: 6px;
}
.catalyst-card.bull h4 { color: var(--green); }
.catalyst-card.bear h4 { color: var(--red); }
.catalyst-card ul {
стиль списка: нет;
отступ: 0;
}
.catalyst-card ul li {
font-size: 0.65rem;
цвет: var(--muted);
межстрочный интервал: 1.8;
padding-left: 12px;
положение: относительное;
}
.catalyst-card ul li::before {
содержание: '>';
положение: абсолютное;
слева: 0;
цвет: var(--gold);
}
/* ── ВЕРДИКТ ── */
.verdict {
background: linear-gradient(135deg, rgba(240,185,11,0.08), rgba(240,185,11,0.02));
border: 1px solid rgba(240,185,11,0.35);
border-radius: 12px;
padding: 28px;
text-align: center;
margin-bottom: 32px;
положение: относительное;
переполнение: скрыто;
анимация: fadeUp 0.7s 0.55s с плавным переходом между ними;
}
.verdict::before {
content: '⬡';
положение: абсолютное;
верх: -20px; правый: -10px;
font-size: 100px;
color: rgba(240,185,11,0.04);
pointer-events: none;
}
.verdict h2 {
семейство шрифтов: «Bebas Neue», без засечек;
font-size: 2.4rem;
межбуквенный интервал: 6 пикселей;
цвет: var(--gold);
margin-bottom: 8px;
}
.verdict p {
font-size: 0.72rem;
цвет: var(--muted);
высота строки: 1.9;
max-width: 640px;
margin: 0 auto 18px;
}
.target-row {
display: flex;
justify-content: center;
зазор: 32 пикселя;
flex-wrap: wrap;
}
.target-item .t-label {
font-size: 0.58rem;
цвет: var(--muted);
межбуквенный интервал: 2px;
text-transform: uppercase;
}
.target-item .t-val {
font-family: 'Syne', sans-serif;
font-size: 1.1rem;
font-weight: 800;
}
/* ── ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ ── */
.disclaimer {
text-align: center;
font-size: 0.55rem;
color: rgba(132,142,156,0.5);
межбуквенный интервал: 1 пиксель;
межстрочный интервал: 1.8;
анимация: fadeUp 0.7s 0.6s с плавным переходом между ними;
}
/* ── АНИМАЦИЯ ── */
@keyframes fadeDown {
from { opacity: 0; transform: translateY(-20px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes fadeUp {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
/* ── АДАПТИВНЫЙ ── */
@media (max-width: 640px) {
.hero { grid-template-columns: 1fr 1fr; }
.analysis-grid { grid-template-columns: 1fr; }
.indicators { grid-template-columns: 1fr 1fr; }
.catalysts { grid-template-columns: 1fr; }
.target-row { gap: 16px; }
}
</style>
</head>
<body>
<div class="container">
<!-- ЗАГОЛОВОК -->
<div class="header">
<div class="brand">
<div class="bnb-icon">BNB</div>
<div class="brand-text">
<h1>BNB / USDT</h1>
<p>Отчет об анализе рынка</p>
</div>
</div>
<div class="date-badge">
05 МАЯ 2026 г. <br>СУММА ДНЯ
</div>
</div>
<!-- СТАТИСТИКА ГЕРОЯ -->
<div class="hero">
<div class="stat-card">
<div class="label">Текущая цена</div>
<div class="value gold">$633.52</div>
<div class="sub">BNB / USDT</div>
</div>
<div class="stat-card">
<div class="label">24H Change</div>
<div class="value green">+2.70%</div>
<div class="sub">+$16.67</div>
</div>
<div class="stat-card">
<div class="label">24H Volume</div>
<div class="value">$1.20B</div>
<div class="sub">+99.1% по сравнению с предыдущим днем</div>
</div>
<div class="stat-card">
<div class="label">Рыночная капитализация</div>
<div class="value">$85.4B</div>
<div class="sub">Рейтинг #4</div>
</div>
</div>
<!-- ДИАГРАММА СВЕЧЕЙ -->
<div class="chart-wrap">
<div class="chart-header">
Динамика курса BNB/USDT — 18 апреля → 5 мая 2026 г.
<div class="timeframe-pills">
<div class="pill active">1D</div>
<div class="pill">4H</div>
<div class="pill">1W</div>
</div>
</div>
<canvas id="candleChart"></canvas>
<div class="chart-legend">
<div class="legend-item"><div class="legend-dot" style="background:var(--green)"></div> Бычья свеча</div>
<div class="legend-item"><div class="legend-dot" style="background:var(--red)"></div> Медвежья свеча</div>
<div class="legend-item"><div class="legend-dot" style="background:var(--gold)"></div> EMA 20</div>
<div class="legend-item"><div class="legend-dot" style="background:#5B8BF5"></div> EMA 50</div>
<div class="legend-item"><div class="legend-dot" style="background:rgba(240,185,11,0.15)"></div> Volume</div>
</div>
</div>
<!-- ПОДДЕРЖКА / СОПРОТИВЛЕНИЕ -->
<div class="analysis-grid">
<div class="analysis-card">
<h3>🔴 Уровни сопротивления</h3>
<div class="level-row"><span class="name">R3 — Strong</span><span class="val r">$665.18</span></div>
<div class="level-row"><span class="name">R2 — Mid</span><span class="val r">$649.42</span></div>
<div class="level-row"><span class="name">R1 — Pivot</span><span class="val r">$634.63</span></div>
<div class="level-row"><span class="name">EMA 20</span><span class="val y">$623.76</span></div>
</div>
<div class="analysis-card">
<h3>🟢 Уровни поддержки</h3>
<div class="level-row"><span class="name">S1 — Near</span><span class="val g">$624.54</span></div>
<div class="level-row"><span class="name">S2 — Key</span><span class="val g">$615.20</span></div>
<div class="level-row"><span class="name">S3 — Major</span><span class="val g">$603.04</span></div>
<div class="level-row"><span class="name">S4 — Deep</span><span class="val g">$580.00</span></div>
</div>
</div>
<!-- ТЕХНИЧЕСКИЕ ПОКАЗАТЕЛИ -->
<div class="section-title">Технические индикаторы</div>
<div class="indicators">
<div class="ind-card">
<div class="ind-name">RSI (14)</div>
<div class="ind-val neutral">54.3</div>
<div class="ind-signal neutral">Нейтральная зона</div>
</div>
<div class="ind-card">
<div class="ind-name">MACD</div>
<div class="ind-val bearish">Bearish</div>
<div class="ind-signal bearish">Below Signal</div>
</div>
<div class="ind-card">
<div class="ind-name">Supertrend</div>
<div class="ind-val bearish">Медведь</div>
<div class="ind-signal bearish">$665 Resistance</div>
</div>
<div class="ind-card">
<div class="ind-name">200-дневная СМА</div>
<div class="ind-val neutral">$753</div>
<div class="ind-signal neutral">Отклоняется</div>
</div>
<div class="ind-card">
<div class="ind-name">Volume</div>
<div class="ind-val bullish">$1.2B</div>
<div class="ind-signal bullish">+99% Surge</div>
</div>
<div class="ind-card">
<div class="ind-name">Страх и жадность</div>
<div class="ind-val bearish">29</div>
<div class="ind-signal bearish">Зона страха</div>
</div>
</div>
<!-- ПЕРСПЕКТИВЫ СЦЕНАРИЯ -->
<div class="scenario-wrap">
<div class="section-title">Сценарий вероятностного прогноза</div>
<p>
Сегодня BNB закрылась на отметке $633,52, вернув позиции выше критической EMA-20 на уровне $623,76 — ключевого структурного порога. Резкий рост объема торгов за 24 часа до $99,1% свидетельствует о возобновлении интереса покупателей. Рынок находится на перепутье: решительный прорыв выше $649 откроет путь к зоне $665–$700, в то время как неспособность удержаться на уровне $624 рискует привести к повторному тестированию основного уровня поддержки $603.
</p>
<div class="scenario-bar">
<div class="s-bull">БЫЧИЙ 55%</div>
<div class="s-side">SIDEWAYS 25%</div>
<div class="s-bear">МЕДВЕДЬ 20%</div>
</div>
<div class="scenario-labels">
Целевая цена: 665–700 долларов США
Диапазон цен: 615–650 долларов США
Риск: 603 долл. США / 580 долл. США
</div>
</div>
<!-- КАТАЛИСТИТЫ -->
<div class="section-title">Рыночные катализаторы</div>
<div class="catalysts">
<div class="catalyst-card bull">
<div class="cat-icon">🚀</div>
<div>
<h4>Бычьи катализаторы</h4>
<ul>
<li>Сожжено в 1 квартале 2026 года: уничтожено 1,57 млн BNB (~1,02 млрд долларов США)</li>
<li>BNB Chain планирует достичь 20 000 транзакций в секунду к 2026 году</li>
<li>Добавление Coinbase в дорожную карту стимулирует приток институциональных инвесторов</li>
<li>Подача заявки на регистрацию ETF в оттенках серого свидетельствует о широком распространении</li>
Корреляция BTC: +2,55% BTC обеспечивает попутный ветер.
<li>Резкий рост объёмов: +99% по сравнению с предыдущим днём — покупатели возвращаются</li>
</ul>
</div>
</div>
<div class="catalyst-card bear">
<div class="cat-icon">⚠️</div>
<div>
<h4>Факторы риска</h4>
<ul>
<li>Продолжается расследование Министерства юстиции США в отношении соблюдения компанией Binance нормативных требований</li>
<li>Структура LH/LL не нарушена — нисходящий тренд пока не пробит</li>
<li>MACD по-прежнему медвежий — импульс нуждается в подтверждении</li>
Страх и жадность в 29 лет — рыночные настроения нестабильны
<li>CHoCH (изменение символа) пока не подтверждено</li>
Отскок от уровня $634 может спровоцировать новую распродажу.
</ul>
</div>
</div>
</div>
<!-- ВЕРДИКТ -->
<div class="verdict">
<h2>⬡ Осторожный бычий настрой ⬡</h2>
<p>
Взрывной рост объёма торгов BNB и восстановление выше EMA-20 указывают на накопление после затяжной коррекции. Структурная ситуация благоприятствует попытке прорыва в направлении $665–$700 в ближайшие торговые сессии — цена IF закрывается и удерживается выше $634,63. Дефляционная токеномика (завершено 35 сжиганий токенов), повышение масштабируемости BNB Chain и растущее внимание институциональных инвесторов создают убедительный среднесрочный тезис. Однако управление рисками остается критически важным: закрытие ниже $615 снова смещает тенденцию в сторону медвежьего тренда.
</p>
<div class="target-row">
<div class="target-item">
<div class="t-label">Мишень 1</div>
<div class="t-val bullish">$665</div>
</div>
<div class="target-item">
<div class="t-label">Мишень 2</div>
<div class="t-val bullish">$700</div>
</div>
<div class="target-item">
<div class="t-label">Стоп-лосс</div>
<div class="t-val bearish">$615</div>
</div>
<div class="target-item">
<div class="t-label">2026 год </div>
<div class="t-val neutral">$803–$1,000</div>
</div>
</div>
</div>
<div class="disclaimer">
⚠️ ДАННЫЙ АНАЛИЗ ПРЕДНАЗНАЧЕН ТОЛЬКО ДЛЯ ОБРАЗОВАТЕЛЬНЫХ ЦЕЛЕЙ И НЕ ЯВЛЯЕТСЯ ФИНАНСОВОЙ КОНСУЛЬТАЦИЕЙ.
Торговля криптовалютами сопряжена со значительным риском. Всегда проводите собственное исследование и торгуйте ответственно.
</div>
</div><!-- /container -->
<script>
// ── Диаграмма «Свеча» через Canvas ──
const canvas = document.getElementById('candleChart');
const ctx = canvas.getContext('2d');
// Реалистичные ежедневные свечи BNB: 18 апреля → 5 мая 2026 г.
// [date_label, open, high, low, close, volume_rel]
const candles = [
['18 апреля', 652, 663, 645, 648, 0.45],
['19 апреля', 648, 655, 638, 641, 0.52],
['20 апреля', 641, 650, 632, 646, 0.48],
['21 апреля', 646, 658, 640, 636, 0.55],
['22 апреля', 636, 642, 628, 632, 0.60],
['23 апреля', 632, 638, 620, 624, 0.65],
['24 апреля', 624, 635, 617, 630, 0.70],
['25 апреля', 630, 640, 621, 619, 0.58],
['26 апреля', 619, 628, 612, 615, 0.72],
['27 апреля', 615, 622, 603, 609, 0.80],
['28 апреля', 609, 625, 605, 620, 0.75],
['29 апреля', 620, 632, 616, 628, 0.62],
['30 апреля', 628, 636, 619, 623, 0.55],
['1 мая', 623, 634, 614, 618, 0.60],
['2 мая', 618, 628, 613, 621, 0.58],
['3 мая', 621, 630, 617, 625, 0.53],
['4 мая', 625, 638, 620, 633, 0.85],
['5 мая', 633, 641, 628, 634, 0.95],
];
// Расчет EMA
function calcEMA(data, period) {
const k = 2 / (период + 1);
let ema = [data[0]];
for (let i = 1; i < data.length; i++) {
ema.push(data[i] k + ema[i-1] (1-k));
}
вернуть эма;
}
const closes = candles.map(c => c[4]);
const ema20 = CalcEMA(закрывается, 20);
const ema50 = calcEMA(closes, 10); // используем 10 в качестве аппроксимации для 50, масштабированного под наши данные
функция draw() {
const dpr = window.devicePixelRatio || 1;
const W = canvas.parentElement.clientWidth - 48;
const H = 320;
canvas.width = W * dpr;
canvas.height = H * dpr;
canvas.style.width = W + 'px';
canvas.style.height = H + 'px';
ctx.scale(dpr, dpr);
ctx.clearRect(0, 0, W, H);
const PAD_L = 52, PAD_R = 20, PAD_T = 20, PAD_B = 60;
const chartW = W - PAD_L - PAD_R;
const chartH = H - PAD_T - PAD_B;
const allPrices = candles.flatMap(c => [c[2], c[3]]);
const minP = Math.min(...allPrices) - 8;
const maxP = Math.max(...allPrices) + 8;
const PriceRange = maxP - minP;
функция toY(price) {
return PAD_T + chartH - ((price - minP) / priceRange) * chartH;
}
const n = candles.length;
const slotW = chartW / n;
const candleW = Math.max(slotW * 0.55, 4);
функция toX(i) {
return PAD_L + (i + 0.5) * slotW;
}
// Линии сетки
const gridCount = 5;
for (let i = 0; i <= gridCount; i++) {
const price = minP + (priceRange / gridCount) * i;
const y = toY(price);
ctx.strokeStyle = 'rgba(240,185,11,0.06)';
ctx.lineWidth = 1;
ctx.beginPath();
ctx.moveTo(PAD_L, y);
ctx.lineTo(W - PAD_R, y);
ctx.stroke();
ctx.fillStyle = 'rgba(132,142,156,0.7)';
ctx.font = `${Math.round(10)}px Space Mono, monospace`;
ctx.textAlign = 'right';
ctx.fillText('$' + Math.round(price), PAD_L - 6, y + 4);
}
// Ползунки громкости
const maxVol = Math.max(...candles.map(c => c[5]));
const volH = chartH * 0.18;
candles.forEach((c, i) => {
const x = toX(i);
const bull = c[4] >= c[1];
const h = (c[5] / maxVol) * volH;
ctx.fillStyle = bull
? 'rgba(14,203,129,0.18)'
: 'rgba(246,70,93,0.18)';
ctx.fillRect(x - candleW/2, PAD_T + chartH - h, candleW, h);
});
// Свечи
candles.forEach((c, i) => {
const [, open, high, low, close] = c;
const x = toX(i);
const bull = close >= open;
const color = bull ? '#0ECB81' : '#F6465D';
// Фитиль
ctx.strokeStyle = color;
ctx.lineWidth = 1.5;
ctx.beginPath();
ctx.moveTo(x, toY(high));
ctx.lineTo(x, toY(low));
ctx.stroke();
// Тело
const bodyTop = toY(Math.max(open, close));
const bodyBot = toY(Math.min(open, close));
const bodyH = Math.max(bodyBot - bodyTop, 1.5);
ctx.fillStyle = color;
ctx.fillRect(x - candleW/2, bodyTop, candleW, bodyH);
});
// МАТЬ 20
ctx.strokeStyle = '#F0B90B';
ctx.lineWidth = 1.8;
ctx.setLineDash([]);
ctx.beginPath();
ema20.forEach((val, i) => {
const x = toX(i);
const y = toY(val);
i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);
});
ctx.stroke();
// EMA 50
ctx.strokeStyle = '#5B8BF5';
ctx.lineWidth = 1.5;
ctx.setLineDash([4, 4]);
ctx.beginPath();
ema50.forEach((val, i) => {
const x = toX(i);
const y = toY(val);
i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);
});
ctx.stroke();
ctx.setLineDash([]);
// Текущая ценовая линия
const lastClose = candles[candles.length - 1][4];
const lastY = toY(lastClose);
ctx.strokeStyle = 'rgba(240,185,11,0.5)';
ctx.lineWidth = 1;
ctx.setLineDash([4, 6]);
ctx.beginPath();
ctx.moveTo(PAD_L, lastY);
ctx.lineTo(W - PAD_R,lastY);
ctx.stroke();
ctx.setLineDash([]);
// Ценник справа
ctx.fillStyle = '#F0B90B';
ctx.font = 'bold 10px Space Mono, monospace';
ctx.textAlign = 'left';
ctx.fillRect(W - PAD_R + 2, LastY - 9, 52, 18);
ctx.fillStyle = '#000';
ctx.fillText('$' + lastClose, W - PAD_R + 5, lastY + 4);
// Метки оси X
ctx.fillStyle = 'rgba(132,142,156,0.7)';
ctx.font = '9px Space Mono, monospace';
ctx.textAlign = 'center';
candles.forEach((c, i) => {
if (i % 3 === 0 || i === candles.length - 1) {
ctx.fillText(c[0], toX(i), H - PAD_B + 18);
}
});
// Линия оси
ctx.strokeStyle = 'rgba(240,185,11,0.2)';
ctx.lineWidth = 1;
ctx.beginPath();
ctx.moveTo(PAD_L, PAD_T + chartH);
ctx.lineTo(W - PAD_R, PAD_T + chartH);
ctx.stroke();
}
рисовать();
window.addEventListener('resize', draw);
</script>
</body>
</html>
