Почему мы это построили PineForge.
Три развилки, которые мы не выбрали. Два года охоты за двумя кейсами на уверенном уровне parity. Один тезис: PineScript заслуживает настоящего runtime.
Почему офлайн-воспроизводимость
Большинство Pine-стратегий живут в TradingView, и не зря — мгновенная итерация прямо у графика, огромное сообщество, удобный шейринг. Чего там нет, так это офлайн-runtime: нельзя зафиксировать версию движка, нельзя прогнать бэктест в CI, нельзя побитово воспроизвести список сделок на другой машине.
Для пролистывания идей на графике это не важно. Для стратегии, за которой стоят реальные деньги, важно всё. Зазор между «я вижу цифру в браузере» и «у меня есть аудит-трейл» — это и есть то, что мы взялись закрыть, не уходя из языка Pine.
Почему не контрибьютили в PyneCore
PyneCore — самый амбициозный open-source движок PineScript. Мы сами используем его как «второе мнение». Думали об апстриминге всего, что построили. Не стали по двум причинам:
- Модель runtime. PyneCore интерпретирует Pine в Python. PineForge компилирует Pine в C++ и собирает в `.so`. Разные скорости, разные компромиссы по parity, разные сценарии дистрибуции. Ни один не «неправильный» — но прикрутить одно к другому, не переписав оба, не получится.
- Дистрибуция. Скомпилированный `.so` позволяет автору отгрузить стратегию покупателю, не показывая исходник. Это и есть тезис маркетплейса (спроектирован на 2027). В roadmap PyneCore этого нет — и не должно быть, это другой продукт.
Мы относимся к PyneCore как к second source. Каждый релиз PineForge гонит parity-проверку и против PyneCore, и против TradingView. Их excellent-rate настолько высок, что расхождения между двумя движками почти всегда означают баг — обычно у нас.
Почему не доразвить Backtrader
Backtrader — рабочая лошадка алготрейдинга на Python. Надёжный, любимый и не той формы под эту задачу. Это Python-нативный фреймворк бэктестинга, который умеет кастомные классы стратегий. Pine — другой язык с другой семантикой — никаким количеством Python не подделаешь lookahead в `request.security()`, внутрибаровую обработку ордеров или OCA-группы выходов через `oca_name`.
И снова: стратегия Backtrader — это Python-исходник, который и распространяется как Python-исходник. Маркетплейс на скомпилированных бинарниках требует шага транспиляции, на выходе которого появляется деплоимый артефакт. Поверхность Backtrader этого не даёт.
Гонка к 165/167
Начали с 9 стратегий и 76% строгого parity. Спустя два года — 167 стратегий, 165 строго. Зазор от 76 до 98,8% построен не количеством codegen, а охотой за расхождениями в четвёртом знаке после запятой — по одному, неделями каждое.
Большая часть тех недель ушла на то, чтобы подобрать те самые определения слов «exit», «fill», «trail», что используются в TradingView — документация Pine описывает API; точная семантика обработки ордеров проявляется только когда сравниваешь списки сделок бар за баром. Мы это и делали, продолжали спрашивать, почему наш и эталонный расходятся, и сглаживали отличия по одному.
Два кейса на уверенном уровне — самые интересные: corner case'ы, потребовавшие глубже всего копать и оставшиеся в roadmap'е. Мы относимся к ним как к research, а не как к стыду.
Что дальше
Q3 2026: Выходит интеграция с Optuna. Оптимизация любой стратегии по любой однострочной целевой функции — Sharpe, drawdown, profit factor, ваша Python-лямбда. Walk-forward встроен, out-of-sample — по умолчанию, а не как додумка постфактум.
Q4 2026: Запуск хостинга Studio. Workspace проекта, бэктест, оптимизация, сравнение, paper-trading — всё в браузере, всё на той же `.so`, что вы сегодня гоняете локально через CLI. Wave-1 доступ — сначала для листа раннего доступа.
2027: Открывается маркетплейс. Авторы публикуют скомпилированные `.so` с заданными ими лицензионными границами: время, машина, брокер, символ, диапазоны входов. Покупатели гоняют на своих данных и не видят исходника. Та же модель доставки, что сработала у MQL5 — только стратегии написаны на Pine, runtime открыт для аудита, а лицензии отзываются.
Тот 1%, что не пишется руками
Каждый parity-движок, о котором мы читали, был построен и брошен кем-то, кому стало скучно на 90%. Последние 10% — однообразная, трудозатратная, негламурная работа: её должны делать люди, которых искренне зажигает объяснять, почему два списка сделок расходятся на 0,0001%.
Это и есть команда. Это и есть дисциплина. Это и есть то, что делает runtime достойным ваших денег.