Из чего сделаны графики
трейдинг-платформ
Teardown того, как устроены чарт-движки у TradingView и его «метаков» — на живом коде, сети и публичных бандлах. Рендер на GPU, потоковый data-layer, встроенный AI и бизнес-модель вокруг графика. Часть 2 — про маркетплейсы, языки и стратегии.
TradingView и его «метаки»
Рынок графических терминалов вращается вокруг одной точки притяжения — TradingView. Все «метаки» (платформы, выросшие из той же идеи) переизобретают три вещи: рендер графика, язык расширений и маркетплейс. Эта часть — про первое. Вторая часть — про язык и маркетплейс.
TradingView
Эталон. Два движка: Lightweight Charts (free OSS, Canvas2D) как воронка и Charting Library (лицензионный, закрытый) для серьёзных терминалов. Язык — Pine Script.
TakeProfit главный кейс
Основан экс-CMO TradingView. Ставка — GPU-рендер на PixiJS/WebGL2, кастомный time-series движок, виджет-воркспейс и свой Python-подобный язык Indie®.
Свой движок (Walbi/zerox)
Внутренний ориентир: WebGL2-движок с нуля, datafeed-агностичный, 1M свечей @120fps. Цель — заменить лицензионный TV-виджет в проде.
Анатомия кейса: TakeProfit
Всё ниже извлечено из публичных SvelteKit-бандлов и сетевого трафика (Playwright). Живой торговый терминал — за логином (Stytch), поэтому chart-engine разбирался по JS-чанку, а не по работающему графику.
| Слой | Технология | Доказательство в коде | Класс |
|---|---|---|---|
| Фреймворк | SvelteKit (SSR + hashed immutable chunks) | /_app/immutable/…, __sveltekit_* | UI |
| WebGL-рендерер | PixiJS v7 (@pixi/core,math,unsafe-eval) | checkMaxIfStatementsInShader, drawElementsInstancedANGLE, литералы 7.0–7.2 | GPU |
| GL-контекст | WebGL2 (fallback на webgl) | getContext("webgl2") | GPU |
| Chart-движок | Кастомный, забандлен вместе с Pixi | API похож на lightweight-charts (series, priceScaleId), но рендер — Pixi/GPU | GPU |
| Техника рендера | WebGL2 instanced draw calls | instanceBuffer, instanceCount, drawArraysInstanced, VAO, interleaved buffers | GPU |
| Шейдеры | Инлайн GLSL | precision highp float; gl_Position в 3 чанках (свечи + Order-Flow Bubbles + Market Depth) | GPU |
| Транспорт | Connect-ES / gRPC-web over Protobuf | @bufbuild/protobuf, connect-web, useBinaryFormat | NET |
| Стриминг | SharedWorker (общий на вкладки) | OrderBookStreamManager.worker, snapshot+delta reconcile | NET |
| Редактор кода | CodeMirror 6 + язык Indie® | @codemirror/state, custom indieLang, oneDark | DSL |
| AI | In-app чат, BYO-key, провайдер Anthropic | ai_chat_api_key_provider_anthropic, MCP-интеграция | AI |
| Auth / analytics | Stytch + Google OAuth · PostHog self-proxy · Sentry | api.stytch.takeprofit.com, a.takeprofit.com | NET |
.wasm и нет WebAssembly.instantiate. Модуль может быть (а) серверным, (б) лениво-загружаемым внутри gated-терминала, либо (в) преувеличен. Не подтверждено.Три способа нарисовать свечу
Главная техническая развилка чарт-движка — чем рисовать. От этого зависит, сколько свечей держится в кадре на 60fps. Ниже — относительная ёмкость трёх подходов (порядок величины, не бенчмарк конкретного устройства).
Почему instancing решает
Вместо тысяч отдельных draw-вызовов (по одному на свечу) GPU получает одну геометрию свечи и буфер инстансов — массив (x, open, high, low, close, цвет) на каждую свечу. Один drawArraysInstanced рисует все свечи разом. CPU почти не участвует — отсюда «60fps под нагрузкой».
Что это даёт продукту
- Бесшовный зум/пан по миллионам баров
- Тиковые / секундные таймфреймы (1s, 3s, 5s) без лагов
- Тяжёлые оверлеи: Order-Flow Bubbles, Market Depth — те же шейдеры
- Экономия на сервере: меньше агрегации, больше сырых данных на клиент
Instanced-рендер свечей вживую
Не картинка — реальный WebGL2 instanced рендер прямо в этой странице, ровно по технике из teardown: одна геометрия свечи + буфер инстансов + один draw-вызов на кадр. Двигай ползунок до 200 000 свечей и смотри на FPS. Это и есть «секрет 60fps».
Не REST и не голый WebSocket
Под графиком — бинарный потоковый протокол. TakeProfit гоняет Connect-ES / gRPC-web поверх Protobuf, а стримы держит в SharedWorker, общем для всех вкладок: один сокет на браузер, снапшот+дельта-реконсиляция стакана, переподключение с политикой повтора.
Контракт: protobuf-сервисы (typeName из кода)
| Домен | Сервис | Назначение |
|---|---|---|
| market-data | candle.v1.CandleOffsetApi | бары/свечи, offset-пагинация (поля offsets, bars, candle) |
| market-data | candle.v1.ExtrapolationApi | достройка незакрытой свечи в реальном времени |
| market-data | quote.v1.QuoteApi | сырые котировки → из них генерятся свечи на лету |
| market-data | order_book.v1.OrderBookApi | стакан, snapshot+delta |
| market-data | fundamental.v2 · ratio.v2.CatalogueApi | фундаментал и мультипликаторы |
| reference | {exchange,industry,security}.v1.* | справочники инструментов/бирж |
| screener | v2.StockScreenerApi · v2.CategoryApi | скринер акций |
| trading | trading.v1.TradingApi | ордера / портфель |
| alerts | tpi_alerts · tpi_notifications · tpi_popup_sender | алерты и доставка (Telegram/Discord webhook) |
| indicator | code_migrator.v1.CodeMigratorApi | миграция версий Indie-кода |
Динамический time-series
Свечи строятся на лету из сырых quotes (CandleOffset + Extrapolation) → произвольные таймфреймы вплоть до секунд. «Собственный движок time-series».
Бинарный формат
useBinaryFormat — Protobuf по проводу вместо JSON: меньше байт, быстрее парс, типобезопасный контракт клиент↔сервер.
Один сокет на браузер
SharedWorker экономит соединения: 5 вкладок = 1 стрим. Реконсиляция стакана переживает реконнект (delta before snapshot → ресинк).
AI встроен в график, а не прикручен сбоку
AI-ассистент работает с контекстом виджетов: текущий тикер, биржа, таймфрейм, видимый диапазон графика, индикаторы, рисунки. Провайдер — Anthropic, ключ — пользовательский (BYO-key), плюс интеграция через MCP-сервер (Claude Code CLI / Cursor / VSCode).
- Анализ структуры графика, уровней, паттернов
- Бычьи/медвежьи сценарии (условные, без прямых «buy/sell»)
- Пишет, чинит и объясняет Indie®-скрипты
- Оценка размера позиции и риск-параметров
- Поиск по документации платформы
MCP как канал монетизации разработки
Тот же MCP-сервер, что обслуживает чат, открыт наружу — LLM пишут/конвертируют/валидируют Indie-код прямо в IDE разработчика. AI-кодген индикаторов → больше скриптов в маркетплейсе → подробнее в Части 2.
График — это воронка, а не продукт
Сам по себе график денег не приносит. Деньги — вокруг него: брокерские интеграции, подписки, маркетплейс и реферальная экономика. Разбор экономики маркетплейса целиком — в Части 2; здесь — рамка.
Откуда деньги
- Брокерские интеграции — встроенные iframe-виджеты (ордер + портфель):
lime.widget,j2t.widget,ilotcos.widget. Платформа = точка входа, брокер платит за поток. - Подписки / планы — платный доступ к фичам и данным.
- Маркетплейс индикаторов — комиссия с продаж скриптов.
- Реферальная сеть — 25% lifetime, evercookie-трекинг (Rewardful).
- DEX-фиды — заход в крипту без классического брокера.
Почему стек именно такой
Дорогой GPU-движок и бинарный протокол — это не инженерное тщеславие, а стоимость удержания. Чем плавнее график и чем больше на нём «залипательных» слоёв (order-flow, depth, секундные ТФ), тем выше retention, тем дороже стоит реклама брокера и тем больше LTV у реферала. Технология подчинена воронке.
Сравнение бизнесов: размеры и функционал
Конкурентная разведка по 8 платформам — TradingView, MetaTrader 4/5, thinkorswim, cTrader, NinjaTrader, TradeStation, MultiCharts. Кто стоит за продуктом, какого размера, как зарабатывает и что умеет график. Метод — 8 прогонов Deep Research по единой структуре (секции 1–9), сведено в матрицу. Запуск 2026-06-09.
Размеры компаний — переключи метрику
Кто за платформой стоит и насколько он большой. Бары нормированы к максимуму в каждой метрике (поэтому Schwab почти всегда «во всю ширину» — это конгломерат, для которого thinkorswim лишь побочный инструмент).
Кто за платформой стоит
| Компания | Продукт | Осн. | Владелец / оценка | Клиенты / юзеры | Ревеню | Штат |
|---|---|---|---|---|---|---|
| Charles Schwab | thinkorswim | 1971 | Публичная (NYSE: SCHW) | 38.5M счетов · $11.9T активов | $23.9B net rev FY2025 (+22%) | 33 000 FTE |
| TradingView | TradingView | 2011 | Частная · $3B (2021), unicorn | 100M+ рег · ~50M MAU · 1M+ платящих | ~$173M ARR (2023) | ~2 400–3 400 |
| NinjaTrader Group | NinjaTrader | 2003 | Куплен Kraken $1.5B (2025) | ~800k активных · ~2M сообщество | est ~$80M | ~440–515 |
| TradeStation | TradeStation | 1982 | Дочка Monex · куплена ~$402M (2011) | 151 081 счёт · $14.1B активов | est $100–500M | ~550–850 |
| MetaQuotes | MT4, MT5 | 2000 | Частная (Кипр) | MT4+MT5 ~83.8% платформ (2022) | не раскрыта · est $5–25M…«сотни млн» | ~200–220 |
| Spotware | cTrader | 2010 | Частная (Кипр) | 11M+ трейдеров · 300+ брокеров | не раскрыта | ~150+ |
| MultiCharts | MultiCharts | 2005 | Частная (MCT, Гибралтар) | 10k+ клиентов · 175 стран | ~$1.8M (est) | малый |
Единственный гигант
Schwab ($23.9B / 33k / 38.5M) — но thinkorswim для него побочный инструмент, не бизнес.
Единственный чистый чарт-игрок масштаба
TradingView (~$173M ARR, $3B, bootstrap→unicorn). Прямой ориентир по бизнес-модели.
Крипта заходит в TradFi-чарты ⚠️
Kraken купил NinjaTrader за $1.5B (2025). Сигнал: крипто-биржи скупают графические платформы.
Архетипы монетизации
| Архетип | Платформы | Кто платит | Механика |
|---|---|---|---|
| White-label B2B | MT4, MT5, cTrader | Брокеры | Лицензии/объём + маркетплейс 20–30% |
| Broker-funded (free) | thinkorswim, TradeStation | Трейдер косвенно | Комиссии / спред / PFOF |
| License + broker | NinjaTrader | Трейдер | Lifetime $1 499 / Lease $99 + комиссии |
| Freemium SaaS | TradingView | Трейдер | Подписка $0–199/мес + данные + реклама |
| Paid license | MultiCharts | Трейдер | Lifetime ~$1 497 + market data $49/мес |
Маркетплейс-комиссии: MetaQuotes 20%, Spotware 30%. thinkorswim/TradeStation — платформа бесплатна, доход с брокерского потока (PFOF/спред/проценты).
Ценообразование (детально)
| Платформа | Free | Платные тарифы (USD) | Биржевые данные | Маркетплейс | Итог трейдеру |
|---|---|---|---|---|---|
| MetaTrader 4 | платформа $0 | — (VPS $12.8–15/мес опц.) | от брокера, free | MQL5 20% | $0 + брокерский спред |
| MetaTrader 5 | платформа $0 | — (VPS $12.8–15/мес) | от брокера, free | MQL5 20% | $0 + брокерский спред |
| thinkorswim | $0 клиентам Schwab | — (нет подписки) | L1 free; L2 free при 120 сд/год, иначе платно | — (Sharing Center) | $0 + комиссии (акц $0 / опц $0.65 / фьюч $2.25) |
| TradingView | Basic $0 | $12.95 / $29.95 / $59.95 / $199.95 /мес | crypto/forex free; CME $7 non-pro vs $548 pro | community free | подписка $0–199.95/мес + данные |
| cTrader | платформа $0 | — | от брокера | Store 30%; Copy ≤30% | $0 + спред (~$3/сторона) |
| NinjaTrader | Free $0 | Lease $99/мес · Lifetime $1 499 · Order Flow+ $59/мес | CME L1 $12 / L2 $48/мес | Ecosystem (3rd) | $0–1 499 ПО + комиссии $0.09–1.29/контр |
| TradeStation | $0 брокерским | не-брокер $99.99/мес | base free; L2 доп (~$11/мес) | TradingApp Store | $0 брокерским + комиссии (акц $0 / фьюч $1.75→$0.50) |
| MultiCharts | Free (sim only) | ~$79–149/мес · Lifetime ~$1 497 | market data +$49/мес | нет встроенного | лицензия + $49/мес данные |
Кросс-платформенность (ОС)
Реально «везде» только TradingView и thinkorswim. MultiCharts — только Windows (нет mobile/web/Mac). NinjaTrader/TradeStation-classic — Windows-центричны.
| Платформа | Win | Mac | Linux | Web | iOS | Android |
|---|---|---|---|---|---|---|
| TradingView | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| thinkorswim | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| MetaTrader 4 | ✓ | Wine | Wine | ✓ | ✓ | ✓ |
| MetaTrader 5 | ✓ | Wine | Wine | ✓ | ✓ | ✓ |
| cTrader | ✓ | ✓ | CLI | ✓ | ✓ | ✓ |
| NinjaTrader | ✓ | ✗ | ✗ | ✓ | ✓ | ✓ |
| TradeStation | ✓ | TITAN X | ✗ | ✓ | ✓ | ✓ |
| MultiCharts | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ |
Графики · стакан · бэктест
| Платформа | Индик. | Draw | Макс граф. | DOM | Order flow | Backtest | WFA |
|---|---|---|---|---|---|---|---|
| MetaTrader 4 | 30 | 23 | ∞ | Limited | ✗ | Limited | ✗ |
| MetaTrader 5 | 38 | 44 | 100 | ✓ | ✗ | Tick | ✓ |
| TradingView | 400+ | 110+ | 16 | ✓ брокер | платн. | Bar | ✗ |
| cTrader | 58 | ~31 | ~42 | Advanced ×3 | ✗ | Tick | Partial |
| NinjaTrader | 100+ | 30+ | ∞ табы | Advanced | $59 add-on | Tick | ✓ |
| TradeStation | 150+ | — | ∞ TITANX | Advanced | add-on | Tick | ✓ |
| MultiCharts | 200+ | — | 100 | Advanced | ✓ | Tick | ✓ |
| thinkorswim | 400+ | ≤20 | разреш. | Advanced | Add-on | Limited | ✗ |
| walbi-chart (наш) | 17 | 9 | 1000 | ✗ | Vol Profile | replay | ✗ |
Под какой сценарий — какая платформа
Forex/CFD розница, дешёвая автоматизация
MT4/MT5 (экосистема MQL) или cTrader (C#/Python, честный DOM, sub-ms, cloud-боты).
Фьючерсы + order flow
NinjaTrader (Order Flow+, SuperDOM, низкая маржа) или TradeStation (Matrix).
Бэктест / портфель / кванты
MultiCharts (Portfolio Trader + WFA + agnostic) или TradeStation (Portfolio Maestro).
Анализ / мульти-ассет / соц / кросс-девайс
TradingView (чарт-движок, 3.5M инструментов, web+mobile).
Опционы
thinkorswim (Analyze / греки / Risk Profile / probability cone) или TradeStation.
Перф / стена графиков / кросс-DSL
walbi-chart + wlb-script — неперекрытая ниша: 1M свечей, 1000 графиков, скрипты из всех экосистем в одном движке.
Экосистема TradingView как фон
Чтобы оценить «метаков», нужен эталон. У TradingView — двухуровневая модель движков, и она же задаёт правила игры для всех остальных.
| Продукт TV | Что это | Рендер | Лицензия | Роль в воронке |
|---|---|---|---|---|
| Lightweight Charts | лёгкая OSS-либа графиков | Canvas2D | Apache-2.0, free | захват разработчиков, top-of-funnel |
| Charting Library | полный терминал-виджет | Canvas2D | бесплатно, но по заявке + лицензия | серьёзные клиенты (брокеры, биржи) |
| Pine Script | язык индикаторов/стратегий | — | MPL-2.0 + credit по умолчанию | контент и lock-in (см. Часть 2) |
| PineJS | JS-API кастом-индикаторов | — | в составе Charting Library | расширяемость для лицензиатов |
Что доказано, а что нет
✓ Подтверждено в коде
- SvelteKit, PixiJS v7, WebGL2-контекст
- Instanced draw calls + инлайн-GLSL
- Connect-ES / gRPC-web / Protobuf контракт
- SharedWorker-стриминг, реконсиляция стакана
- Indie® DSL + CodeMirror 6, CodeMigratorApi
- Anthropic-провайдер AI, MCP-интеграция
- Stytch auth, PostHog/Sentry, broker-iframes
✗ Не подтверждено / дыры
- WASM на клиенте не наблюдался — маркетинговое заявление неподтверждено
- FPS / draw-calls вживую не замерены — терминал за логином
- Order-Flow Bubbles не измерены в работе
- Раздельный
new WebSocketне найден → стриминг = Connect server-streaming (вероятно, но не на 100% по каждому фиду) - Бэкенд (Go/Bazel/gRPC) — со слов компании/прессы; в коде виден только клиентский protobuf-контракт
Источник:
~/research/takeprofit-charts · teardown 2026-06Образовательный teardown по публично доступным данным. Все товарные знаки принадлежат их владельцам. Indie® — TakeProfit. Цифры со слов компаний помечены в тексте.