полное техническое описание

Как устроен TakeProfit — целиком

Реверс терминала по полному графу кода + живой захват: архитектура, все виджеты, чарт-движок, данные, платформа, мобилка и дизайн — с verbatim-кодом и скринами.

📦 352 чанка + 6 воркеров + 46 CSS📚 99 страниц доков🧩 36 подсистем📅 12.06.2026

Архитектура

TakeProfit — браузерный торговый терминал на единой WebGL-сцене. График, стакан и пузыри — это GPU/Canvas-движки; данные идут бинарным Protobuf через стрим-воркеры; рабочее пространство — докинг-сетка.

Главный приём: весь workspace рисуется в один WebGL2-canvas на весь вьюпорт (как игровой движок), поверх — DOM-оверлеи виджетов (<section class="widget">) в докинг-сетке Lumino. Рендер on-demand — 0 draw-call в покое, замерено.

ℹ️

Проверено по полному графу: весь код — 352 JS-чанка / 12 МБ (замыкание импортов завершено) + 6 стрим-воркеров + 46 CSS. Во всём графе 0 ссылок на .wasm и нет WebAssembly.instantiate для расчётов → клиентского WASM нет; «WASM C/C++» из маркетинга — серверный рантайм Indie (R_WASM) либо преувеличение.

Живой workspace: Indie-редактор · Watchlist · ордер-панель · График (BB+RSI) · Screener — докинг-сетка Lumino поверх единого canvas
Живой workspace: Indie-редактор · Watchlist · ордер-панель · График (BB+RSI) · Screener — докинг-сетка Lumino поверх единого canvas

Технологический стек

Полный список библиотек, идентифицированных по сигнатурам (version-строки вырезаны минификатором). high

СлойТехнология
КаркасSvelteKit + Svelte 5 (runes)
График — модель/вводTradingView Lightweight Charts (форк)
График — рендерPixiJS v7 · WebGL2 (instancing, GLSL)
Виджеты/докингLumino (@lumino/widgets + @lumino/dragdrop)
RPC/данныеConnect-Web (@connectrpc) + protobuf-es (@bufbuild)
Воркеры/стримыComlink RPC в SharedWorker
HTTP-клиентky (REST: /api/*)
Server-state кэшTanStack Query
Стакан/пузырисобственный TxOrderBook на Canvas 2D
Скрипт-редакторCodeMirror 6 + грамматика Lezer-Python
Подсветка кода (доки)highlight.js
Notes/Feed редакторсобственный block-tree (не ProseMirror/Tiptap)
Хоткеиtinykeys + Lumino CommandRegistry
i18nParaglide JS (inlang), только en + нативный Intl
Валидация схемYup
БиллингStripe.js v3 + svelte-stripe-js
АналитикаPostHog 1.376.0 (self-proxy) + Sentry + GA4 + Reddit pixel
Согласие cookieTermly
AuthStytch (Google OAuth) + cookie-сессия
ЭмодзиPicMo; даты — dayjs

Система виджетов (Lumino)

Мозаика виджетов на Lumino DockPanel (быв. PhosphorJS) под кастомным LayoutManager. high

DEFAULT_EDGES={top:12,right:40,bottom:40,left:40}

Px-пороги root-зон drop.

case"root-top":...l=h.height*F.GOLDEN_RATIO;break;

Оверлей root-top = 0.618 высоты.

s.DRAG_THRESHOLD=5,s.DETACH_THRESHOLD=20

TabBar: старт drag 5px, отрыв ±20px.

resize до: чарт 362px
resize до: чарт 362px
resize после: чарт 618px (live)
resize после: чарт 618px (live)

Каталог виджетов

Хаб «Add Widgets» (drawer с превью). Все типы: high

ВиджетЛогика / источник
ChartLWC-модель + Pixi/WebGL2; свечи/бары/линия/area/baseline, индикаторы в пейнах, рисование, crosshair
WatchlistSvelte-store + localStorage; live QuoteApi/QuoteStream; builtIn + userDefined листы
ScreenerStockScreenerApi/Search + категории; фильтры/сортировка
FinancialsFundamentalApi (P/E, P/S, EV/EBITDA…), периоды Yr/QTR
Market Depthстакан + Order Flow Bubbles, Canvas2D «TxOrderBook»
Indie® Code EditorCodeMirror 6, DSL Indie, серверная компиляция
Strategy/Backtestingserver-driven отчёт (StrategyReportStylistApi), equity/drawdown
Feedлента комьюнити (TanStack Query + api/posts)
Notesblock-tree редактор; заметки по бумаге (api/publications/note)
Accountторговый счёт брокера (equity/PnL/margin), ключи бирж
Lime / J2T / Ilotcosброкерские order/portfolio — iframe (бэкенд Finam; J2T=MT5)
Widget Hub: карточки с живыми превью
Widget Hub: карточки с живыми превью

Watchlist · Feed · Notes

Watchlist high

Feed (комьюнити) high

Notes — block-tree редактор high

const e=t.closest("[data-node-id]"),i=e?this.core.render.getNodeById(e.dataset.nodeId):this.core.model;

DOM-узел ↔ модель по data-node-id.

getNextPageParam:r=>r.pagination.currentPage<r.pagination.totalPageAmount?...+1:null

Feed: постраничная инфинит-пагинация (TanStack Query).

Рендереры серий + скейлы

Форк Lightweight Charts (модель/оси/crosshair) + кастомный PixiJS v7 / WebGL2 рендерер. Каждая серия — свой GLSL-шейдер. high

e[r+n++]=i.time,e[r+n++]=-i.open,e[r+n++]=-i.high,...,e[r+n++]=i.color.r/255

setBarData: OHLC отрицательные (экран Y вниз).

#define SCALE_NORMAL 0  SCALE_LOG 1  SCALE_PERCENT 2  SCALE_INDEXED 3

4 режима скейла в вершинном шейдере.

График META 1h (Pixi/WebGL2)
График META 1h (Pixi/WebGL2)
Crosshair: ценовой+временной пиллы, OHLC
Crosshair: ценовой+временной пиллы, OHLC

Pan/Zoom · анимации · рендер

Pan / Zoom high

Анимации (3 слоя) high

On-demand рендер high

r.ticker.autoStart=!1,r.ticker.stop();const n=()=>{r?.scenes.some(a=>a.isNeedRedraw())&&r.ticker.update(),requestAnimationFrame(n)}

On-demand рендер.

getPosition(e){...return t.position+speed*(Math.pow(dumping,i)-1)/Math.log(dumping)}

Kinetic-инерция: эксп. затухание.

пан до
пан до
пан после: BB пересчитались в реальном времени
пан после: BB пересчитались в реальном времени

Настройки графика + сравнение

Декларативная панель настроек (контролы как объекты), схемы на Yup. 5 групп. high

hse={normal:"Regular",logarithmic:"Logarithmic",percentage:"Percent",indexedTo100:"Index to 100"}

Режимы скейла → LWC PriceScaleMode.

aD=["#B578FD","#FFEA2E","#60A5FA","#BBE319","#FB7185","#2EB844","#FF773D","#A3A3A3"]

Палитра серий сравнения (8 цветов).

showExtendedSessions?[PRE_MARKET,MAINSESSION,POST_MARKET]:[MAINSESSION]

Extended Hours = набор session-типов в запросе.

Таймфреймы: ticks/seconds/custom
Таймфреймы: ticks/seconds/custom
Типы: Candles/Line/Bars
Типы: Candles/Line/Bars

Инструменты рисования + слои

Проприетарный слой поверх LWC, рендер — Pixi. Точки в логических координатах {time, indexOffset, price}. high

const mm={time:NaN,indexOffset:0,price:NaN}

Точка = логическая координата.

getDrawingStoreBySyncSetting(t){return t==="global"?#t:t==="workspace"?#e:t==="channel"?#s:#r}

4-уровневая персистентность (вкл. per-channel).

Indie® DSL + индикаторы

Python-подобный DSL. Редактор — CodeMirror 6 + Lezer-Python. Компиляция/исполнение — на сервере; на клиенте только парсинг/линт/автокомплит. lang_version=5. high

Es=`# indie:lang_version = 5\nfrom indie import indicator\n@indicator('My Indie 1', overlay_main_pane=True)\ndef Main(self):\n    return self.close[0]`

Дефолтный шаблон индикатора.

makeEnum("...indicator.v2.Runtime",[{no:1,name:"R_PYTHON"},{no:2,name:"R_WASM"}])

Серверный исполнитель: Python или WASM.

Пикер индикаторов: built-in + Explore (маркетплейс) + создать свой
Пикер индикаторов: built-in + Explore (маркетплейс) + создать свой
Indie® Code Editor (CodeMirror 6, Python-подобный DSL)
Indie® Code Editor (CodeMirror 6, Python-подобный DSL)

Бэктест / отчёт стратегии

Отчёт строится сервером, server-driven layout (StrategyReportStylistApi); клиент только форматирует и красит. high

const Nc=5e3,Oc=2e4;function Ac(i){return i?Oc:Nc}  // count:-Ac(premiumAccess)

Lookback: 5000 Free / 20000 All-In.

[ee.GOOD]:()=>"tw-text-text-rise",[ee.BAD]:()=>"tw-text-text-fall",[ee.SIGN_DEPENDENT]:i=>i<0?...fall:...rise

Цвет ячейки по enum + знаку.

Market Depth + Order Flow Bubbles

Собственный движок «TxOrderBook» на чистом Canvas 2D (НЕ Pixi): 5 наложенных canvas-слоёв с DPR-масштабом. high

getOrderBookStream:{name:"GetOrderBookStream",kind:at.ServerStreaming}

Источник DOM — серверный gRPC-стрим.

i.arc(b,d,m+u,0,2*Math.PI),i.fill(),i.arc(b,d,m,0,2*Math.PI),i.fill()

Пузырь = два Canvas2D arc() (outline+fill).

Connect / Protobuf API

Connect-Web + protobuf-es, два протокола: gRPC-web (market-data) и Connect (trading), бинарный формат. ★ = server-streaming. high

Service (takeprofit.*)Методы
quote.v1.QuoteApiQuoteStream ★, ListQuotes
candle.v1.CandleOffsetApi / ExtrapolationApiQueryCandleOffsets / ListBars, GetBarTimestamp, GetBarsCount, ListOffsets
candle.v1.CandleStream (worker)CandleStream ★, CandleHistoryStream ★, GetCandleOffsets, ListCandles
trade.v1.TradeStreamExternalApiGetTradeStream ★
order_book.v1.OrderBookApiGetOrderBookStream ★
indicator.controller.v2.ControllerApiGetIndicatorStream ★, GetIndicatorHistory, GetIndicatorsInfo, GetStrategyOrdersAndTradesHistory
indicator.code_migrator.v1MigrateCode
indicator.strategy_report_stylist.v1GetStrategyReportLayout
trading.trading.v1.TradingApiPlaceOrder, CancelOrder, UpdateOrder, GetEventsStream ★, GetPlaceOrderDataStream ★, StoreApiKey/…, SetLeverage/MarginMode/PositionMode, ListAdaptors
alerts.tpi_alerts.v1.AlertsApiCreate/Get/Update/Delete/Start/Stop/ListAlerts, GetUserAlertLog, Mark/DeleteAlertLogs
alerts.tpi_notifications.v1TestUserWebhook
alerts.tpi_popup_sender.v1SendUserNotification, GetUserNotificationStream ★
reference.external.{exchange,industry,security}ListExchanges/ListAliases, GetIndustriesTree, ListSecurities
screener.external.v1.SearcherApi / v2Search, SearchWithGroups, ListProperties/Categories; StockScreenerApi/Search
fundamental.v2 / ratio.v2GetFundamentalCatalogue, ListFundamentals / GetRatioCatalogue
telegram_connector.v1GenerateAuthLink, CheckUserAuth, Disconnect, SendMessage

Транспорт и авторизация

Protobuf-сообщения (ключевые)

Поля ключевых сообщений (no:name:type), извлечённые из makeMessageType. high

Стрим-воркеры (reconnect)

Все 6 — SharedWorker (fallback DedicatedWorker) + Comlink RPC; Connect server-streaming client крутится внутри воркера. high

WorkerСтримит
CandleStreamManagerCandleStream / CandleHistoryStream (gRPC-web)
TradesStreamManagerGetTradeStream
OrderBookStreamManagerGetOrderBookStream
GrpcIndieStreamManagerGetIndicatorStream (профиль ∞/1s/exp)
TradingStreamWorkerGetEventsStream, GetPlaceOrderDataStream + StoreApiKey (Connect)
PlaceOrderDataStreamManagerGetEventsStream, GetPlaceOrderDataStream + ListAdaptors (Connect)
ZP=(t,e)=>Math.max(Math.random()*(e-t)+t,t)  // full jitter [s,3s); maxDelayMs=60000

Reconnect: тройной бэкофф с джиттером, кап 60с.

AT={maxAttempts:10,initialDelayMs:500,exponentialBackoff:!0,maxDelayMs:6e4}

Профиль reconnect по умолчанию.

Алерты

3 gRPC-сервиса, серверное вычисление условий, клиент конструирует payload и слушает поток попапов. high

makeEnum("Condition.Frequency",[{ONLY_ONCE},{ONCE_PER_BAR},{ONCE_PER_BAR_CLOSE},{ONCE_PER_MINUTE},{ON_EVERY_TRIGGER}])

6 режимов частоты, дефолт ONLY_ONCE.

NotificationChannel: popup|email|webhook|telegram (Discord = webhook URL)

4 канала доставки.

Трейдинг и ордера

Нативный тикет = Connect-RPC TradingApi; брокеры Lime/J2T/Ilotcos — iframe (Finam). Trading в Beta, только Bybit. high

{idempotencyToken:crypto.randomUUID(),order:{order:{case:"baseOrder",value:{side,quantity,orderType,stop,takeProfit,stopLoss,reduceOnly}}}}

PlaceOrder (oneof baseOrder).

takerFeeRate:55e-5,makerFeeRate:2e-4

Дефолтные комиссии (Bybit).

Авторизация (Stytch)

Stytch (self-hosted api.stytch.takeprofit.com) для OAuth + бэкенд /api/auth/*; HTTP — ky. high

const r=await ci.get("api/auth/token",{credentials:"include"});return i.data.accessToken

Refresh: cookie-сессия → accessToken.

Сохранение workspace

Раскладка и настройки — на сервере (REST /api/settings через ky), не в браузере. high

saveDataTreeThrottled=NL(this.saveDataTree,5000)

Throttle сохранения — раз в 5с.

hh.extend({prefixUrl:"/api/settings",retry:3})

REST-бэкенд настроек на ky.

Подписки и биллинг

Тарифы Free / All-In; биллинг — Stripe; фичефлаги — PostHog (remote). high

premiumAccess:t.data.session?.plan==="paid"

paid == доступ All-In.

const r=(e,d=!0)=>a.getFeatureFlag(e)===d  // PostHog flags

Фичефлаги — PostHog remote.

Аналитика и observability

4 системы + consent. high

AI-ассистент

Самописный клиент к бэкенду api/ai-chat/*; провайдер один — Anthropic (Claude). high

const vg=["anthropic"];function pg(n){return vg.includes(n)}

Единственный AI-провайдер — Anthropic.

switch(n.action){case"change_timeframe":...case"add_drawing":...case"delete_drawing":...}

Действия AI над графиком.

Мобильная версия

Юзабельно, но это responsive web/PWA десктопного терминала — не отдельный мобильный продукт и не нативное приложение. high

⚠️

Нативного приложения у takeprofit.com нет. Апы «Take Profit» на App Store / Google Play — это другие компании-однофамильцы (takeprofitapp.com; com.takeproft.trader от tprofit.io; «Take Profit – Smart AI Trading» от AlmazApp). Чарт-платформа = web/PWA, ссылок на сторы в бандлах нет.

Мобильный вид (390px): watchlist + график бок о бок, снизу — мобильный drawing-тулбар
Мобильный вид (390px): watchlist + график бок о бок, снизу — мобильный drawing-тулбар

Вердикт: на телефоне работает полноценный терминал с тач-рисованием и single-widget режимом — лучше «сжатого десктопа», но это pro-инструмент на малом экране; мульти-чарт неудобен, нативного приложения/оффлайна сверх SW нет.

Дизайн-система и темы

Собственная токен-система поверх Tailwind (префикс tw-). Цвета — wide-gamut display-p3 (5241 значение в CSS). high

Dark dark
Light light
Gold Rush dark
Wen Moon light
Arctic dark
Astro Trader dark
Dawn dark
Day One dark
Platinum dark
Profit Cowboy light
Red Dragon dark
Sahara light
Smoothie dark
VHS Noir dark
Wonderland dark

Свотчи — приблизительная sRGB-проекция из display-p3 (bg / rise / fall / accent). Gold Rush — монохромное золото; Wen Moon — светлая сине-голубая; Red Dragon — near-black/красный.

documentElement.setAttribute("data-theme",slug); setProperty(`--colors-${s}`,...)

Смена темы: data-theme + переменные.

color(display-p3 var(--colors-var-action-buy) / 16%)

Alpha из общего p3-триплета.

Тёмная тема: мультипейн цена+BB / объёмы / RSI — цвета из --colors-chart-* токенов
Тёмная тема: мультипейн цена+BB / объёмы / RSI — цвета из --colors-chart-* токенов

Рыночное покрытие

TakeProfit агрегирует данные внешних провайдеров (сам не брокер/не источник). high (docs)

КлассПокрытие / провайдер
Equities & Fundsтолько США: NYSE, Nasdaq, CBOE (sub-penny акции исключены)
CFD (forex/indices/commodities/bonds/equities)Pepperstone + Exness (EUR/USD, S&P500, Gold/WTI, US/EU Treasuries, AAPL/TSLA-CFD…)
Crypto70+ бирж (CEX+DEX): spot, derivatives, perpetual
DEXHyperliquid (~500 perp, on-chain ордербук) + Aster (~500 perp)

Тарифы и лимиты

Две ступени: Free (биллинг-имя «Freeroll») и All-In (он же Premium/Pro в доках). high (docs)

ФичаFreeAll-In
Workspaces2
Алерты1 (истечение до 3 мес)до 400 «вечных» cloud-алертов
Бэктест lookback5 000 свечей20 000 свечей
Tick-чарты1–49 тиков (все стримы)50–1000 тиков (Binance/Bybit/Pepperstone/Exness)
Custom timeframes / Indie / backtest
Триал30 дней All-In без карты (one-time)

Born to Earn (монетизация)

Единый Monetization Hub (/monetization), 5 потоков заработка; «TakeProfit не тратит на рекламу — инвестирует в креаторов». high (docs)

ПотокStandardMaxx Ambassador
Revenue share (рефералы платформы)25%50%
Indie Marketplace (автор получает)80% (платформа 20%)100% (0%)
WidgetHub commission30%0%
Premium-посты fee10%0%
Продажи своим рефералам100% всегда100% всегда

Сообщество и Feed

high (docs)

Торговля (Beta) — по докам

Прямая торговля с графика. Статус Beta, только деривативы. high (docs)

Алерты и доставка — по докам

high (docs)

Indie · AI · MCP — по докам

high (docs)

Indie (v5)

AI-ассистент

MCP-сервер (публичный)

Карта роутов

Публичные роуты SvelteKit (из node-манифеста). high

РоутНазначение
/platformтерминал (workspace)
/(media)/chart/[id]шаринг графика
/(media)/feed · /feed/[tag]лента сообщества
/(media)/indicatorsмаркетплейс индикаторов
/(media)/screens · /stock-screen/[slug]шаринг скринеров
/(media)/financials/[id]шаринг финансов
/(media)/u/[username]профиль автора
/(media)/posts/[slug]посты
/monetization/{build-indicators,craft-widgets,invite-friends,write-posts}хабы заработка
/born-to-earnBorn to Earn
/mcp/authorizeOAuth для MCP
/(embed)/embed/docs/indie/[slug] · /(media)/docs/indieдоки Indie / embed
/settings/{account,billing,notification,profile}настройки
/(landings)/features/charts · /(webflow)/betaлендинги (Webflow)
/(legal)/{privacy,terms,cookie,oss-disclosure}юридическое

Диаграммы потоков

Поток данных

backend.takeprofit.comGo · gRPC/Protobuf Connect server-streamgrpc-web / connect+proto SharedWorker ×6Comlink · reconnectcandle/quote/orderbook/trade/indie/trading Svelte storessnapshot+delta PixiJS WebGL2on-demand render

Поток авторизации

Stytch OAuthGoogle / email+pwd /api/auth/*httpOnly cookie token GET /api/auth/token→ accessToken (short) gRPC/ConnectBearer / accessToken 401 → refreshretry

Рендер-пайплайн / архитектура UI

ЕДИНЫЙ WebGL2-CANVAS (весь вьюпорт) Lumino DockPanel (DOM-оверлеи)split-area / tab-area · resize · DnDвиджеты = <section class=widget>на мобиле → single-document Chart = LWC-модель + Pixi-рендерсвечи instanced (68B) · 4 GLSL-скейлаcrosshair magnet · GPU-pickingpan/zoom · kinetic (touch) rAF-планировщик (on-demand)ticker.autoStart=falseupdate() только если isNeedRedraw()0 draw в покое · 120Гц

Пробелы и метод

Честные пробелы

Метод

Реверс публичных бандлов takeprofit.com/_app/immutable/: полное замыкание импортов — 352 JS-чанка / 12 МБ + 6 стрим-воркеров (2.8 МБ) + 46 CSS (1.1 МБ). Живой захват в демо-терминале (Playwright: клики/drag/инструментирование WebGL+rAF/перехват Connect-вызовов/мобильный вьюпорт). Параллельный разбор 30 подсистем агентами в 3 волны. Идентификация библиотек — по сигнатурам API/CSS/конфигов. Артефакты: ~/research/takeprofit-charts/ (bundles2/, workers/, css/, shots/, dumps/, extract/).