Приветствую! Я Никита, разработчик торговых стратегий и инструментов в международном криптовалютном фонде Wild Boar. Здесь пишу об алгоритмической торговле, делюсь опытом и помогаю внимательным читателям завладеть... всем) 

Потому что кто владеет информацией, тот владеет миром. А кто умеет её (информацию) собирать, анализировать, да еще и использовать – тот владеет всем: деньгами, возможностями, конкурентными преимуществами и конкурентами в целом. 

Это касается любой сферы: бизнеса, технологии, науки. Трейдинга – особенно. И в этом главная суть алгоритмической торговли. Потому что она как раз и строится на умении извлекать из потока данных сигналы, чтобы затем превращать их в решения. 

В предыдущих статьях я показывал, как создать простую торговую стратегию на Pine Script и протестировать её прямо в интерфейсе TradingView. Если пропустили, рекомендую к прочтению: 

Описанный мной способ позволяет быстро проверять идеи, видеть точки входа и выхода, оценивать прибыльность подхода. 

Но не все тесты можно провести внутри TradingView. Иногда нужно больше, чем просто увидеть результат на графике и посмотреть базовые коэффициенты эффективности. Например, чтобы глубже понять поведение стратегии или проанализировать рынок, трейдеру часто требуются «сырые» данные: 

  • исторические цены, 

  • значения индикаторов по свечам, 

  • результаты промежуточных расчетов,

  • и прочее. 

Именно эти данные позволяют строить внешнюю аналитику, использовать машинное обучение, делать бэктесты вне платформы и даже просто документировать поведение стратегии.

Вот только TradingView, как и большинство других коммерческих сервисов, не спешит открывать доступ ко всем своим функциям бесплатно. Экспорт исторических данных – будь то ценовые значения или результаты индикаторов – официально возможен, но только с платной подпиской.

Теперь представьте.

Вы разработали стратегию. Хотите проанализировать, как она работает в разных рыночных фазах, или просто сохранить значения индикатора на длинном временном промежутке. В идеале – экспортировать данные в CSV и работать с ними в Excel, Python или R. Но на бесплатном аккаунте это невозможно: экспорт заблокирован. Как быть, если платный доступ к платформе, в общем-то, не особо нужен? 

До недавнего времени существовала обходная альтернатива – оповещения (alerts). С их помощью можно было настроить автоматическую отправку сообщений при выполнении заданного условия, включая в текст алерта нужные значения: цену, индикатор, состояние сигнала. Эти уведомления можно было получать по почте, в Telegram, на webhook или прямо на телефон. Более того, через Pine Script поддерживалась возможность программно формировать содержимое алертов, что фактически превращало их в инструмент удаленной передачи данных.

Но в середине 2025 года лавочка прикрылась. Команда TradingView внесла изменения в политику использования Pine Script – теперь возможность создавать кастомные оповещения с использованием переменных через код доступна только на платных подписках. Для большинства пользователей это означает потерю последнего официального механизма выгрузки данных без подписки.

Если стандартные способы экспорта данных недоступны, а интерфейс графика не позволяет просто скопировать значения – какие остаются альтернативы? Как сохранить важную информацию с графика или индикатора и использовать её вне платформы?

Ответ кроется в возможностях самого Pine Script, а именно – в логах выполнения кода. Об этом мы сегодня и поговорим.

Логи Pine Script: нестандартный способ получения данных

В середине 2023 года команда TradingView представила специальный механизм логирования, позволяющий разработчикам скриптов отслеживать промежуточные значения прямо в процессе исполнения кода. Изначально это было сделано для отладки и диагностики. Но теперь log.info() стал настоящей палочкой-выручалочкой для тех, кто хочет вытащить данные без подписки.

Функция log.info() позволяет выводить значения переменных или формулировки в специальное окно «Логи Pine», расположенное в правой части интерфейса TradingView. На каждую свечу скрипт может выводить любое текстовое сообщение, включающее как обычный текст, так и динамические данные: цену, значение индикатора, торговый сигнал и прочее.

Синтаксис функции выглядит следующим образом:

log.info("Цена закрытия: {0}", close)

Здесь «Цена закрытия: {0}» – это форматирующая строка, в которой {0} заменяется на значение переменной close (цена закрытия текущей свечи). Если переменных несколько, можно добавлять и {1}, {2} и так далее, указывая их позиции в списке аргументов.

Таким образом, log.info():

  • работает как отладочный вывод,

  • не требует платной подписки,

  • позволяет сохранять любые данные по свечам,

  • главное – данные можно копировать вручную из окна логов и использовать за пределами TradingView.

Да, это не автоматическая выгрузка в CSV. Но, как показывает практика, даже такой простой способ уже открывает возможность собирать и анализировать нужные данные.

Выводим данные в Pine Script

Чтобы написать скрипт и через логи выгружать данные с графика на TradingView, переходим на сайт платформы. Затем выбираем нужный инструмент (более подробную инструкцию для выбора актива/инструмента см. ТУТ). 

После того, как мы попали на график выбранного инструмента, переходим в редактор Pine Script – нажимаем на кнопку «Редактор Pine», расположенную в левом нижнем углу.

Редактор Pine Script – в левом нижнем углу
Редактор Pine Script – в левом нижнем углу

В открывшемся окне пишем код, при этом обязательно сохранив //@version=6.

indicator('Статья 3', overlay = false, precision = 2, max_bars_back = 5000)

base_data = array.new_float()

cl = request.security("BINANCE:BTCUSDT", "D", close)
data = math.round(cl, 2)

plot(data)

for i = 30 to 0 by 1
    array.push(base_data, data[i])

if barstate.islast
    str = ""
    for i = 0 to array.size(base_data) - 1
        val = array.get(base_data, i)
        sep = i == array.size(base_data) - 1 ? "" : ", "
        str += "\"" + str.tostring(val) + "\"" + sep
    log.info("[" + str + "]")

В итоговом варианте код должен выглядеть таким образом:

Вот так должен выглядеть код
Вот так должен выглядеть код

Как устроен наш скрипт: 

  • Первая строка – вызов функции indicator, которая отвечает за создание пользовательского индикатора. Мы задаём название 'Статья 3'. Указываем параметр overlay = false (индикатор будет отображаться в отдельной панели под графиком, а не накладываться на свечи или бары). Также задаем precision = 2, чтобы округлять значения до двух знаков после запятой, и max_bars_back = 5000 – это сообщает скрипту, что он может обращаться к данным до 5 000 баров назад (важно для последующего этапа, когда мы будем забирать значения исторических цен).

  • Далее в коде создается пустой массив base_data, в который мы будем записывать данные. Тип массива – float, то есть он предназначен для хранения чисел с плавающей точкой. Позже мы добавим туда нужные нам значения – не все подряд, а конкретный диапазон.

  • Следующей строкой идёт ключевая часть. Мы используем функцию request.security, чтобы получить данные не с текущего графика, а с конкретного инструмента, в данном случае – пары BTC/USDT на Binance с дневного таймфрейма («D»). Это значит, что даже если мы применим скрипт к какому-то другому активу или на другом таймфрейме, всё равно будем получать данные по Bitcoin с дневного графика. Мы извлекаем цену закрытия (close) и сохраняем это значение в переменную cl.

Скрытый текст

Дополнительно можно добавить input.security, и передавать значение в request.security, чтобы не приходилось постоянно переходить в код и менять в нем название инструмента.

  • Мы не хотим работать с избыточной точностью, поэтому на следующем шаге округляем полученное значение с помощью math.round, задав точность до двух знаков после запятой. Сохраняем результат в переменной data.

Чтобы убедиться, что скрипт работает, используем функцию plot и отображаем наши данные в виде линии на панели – это полезно для визуального контроля. Особенно на первых этапах отладки.

Собираем данные

Теперь переходим к основному блоку, в котором начинается сбор данных. Мы запускаем цикл от 30 до 0, двигаясь в обратном порядке. Это сделано для того, чтобы сначала в массив попадали наиболее старые данные, а не последние. В каждую итерацию добавляем в массив base_data значение data[i], то есть значение цены закрытия i баров назад. Таким образом, мы вручную формируем массив последних 31-дневных значений закрытия – от самого старого к самому новому.

После того как массив заполнен, проверяем, является ли текущий бар последним на графике (с помощью условия if barstate.islast). Это нужно, чтобы наш следующий блок срабатывал только один раз – в конце текущего графика. Внутри блока мы собираем все значения из массива base_data в одну строку – в формате, удобном для копирования: каждое значение оборачивается в кавычки отделяется запятой, а в конце формируется полный список в квадратных скобках, например: ["67653.2", "67490.1", "67800.5", ...].

Готовую строку передаём в функцию log.info, которая отправляет сообщение в логи Pine Script.

Теперь, чтобы получить значения цен закрытия, необходимо добавить индикатор на график – нажимаем на кнопку «Добавить на график».

Шаг 1: не забывайте добавлять индикатор на график
Шаг 1: не забывайте добавлять индикатор на график

На новой панели появится линия цены закрытия:

Линия цены закрытия
Линия цены закрытия

Возвращаемся в редактор Pine: или через кнопку «Редактор Pine», или нажимаем на стрелку «Вверх» (расположена снизу справа). 

Шаг 2: переход в Редактор Pine
Шаг 2: переход в Редактор Pine

В правом углу, рядом с кнопкой «Опубликовать индикатор», находим три точки и нажимаем на них. 

Шаг 3: ищем Логи Pine
Шаг 3: ищем Логи Pine

Откроется окно, в котором нужно нажать на кнопку «Логи Pine»:

Шаг 4: находим Логи Pine
Шаг 4: находим Логи Pine

Справа откроется новая панель, где в квадратных скобках в кавычках – наши цены закрытия. 

Чтобы остановить логирование – нажмите на значок паузы (верхний левый угол)
Чтобы остановить логирование – нажмите на значок паузы (верхний левый угол)

Обратите внимание: логирование происходит постоянно.

Будет появляться все больше и больше данных, и это нормально. Данные не обновляются – только последняя цена, так как она текущая и может изменится.

Чтобы остановить логирование, достаточно нажать на значок паузы – тогда новых значений появляться не будет. 

Итак, у нас есть данные цен закрытия. Но даже если мы их скопируем и вставим в Excel, то не сможем работать (вычитать, умножать и совершать другие математические действия) – так как цены будут в виде сплошного текста, с кавычками и точкой вместо запятой. Чтобы разделить их на ячейки, делаем следующее:

  • Копируем весь текст логов, который есть внутри квадратных скобок – со всеми кавычками и запятыми.

  • Открываем лист Excel.

  • Вставляем в ячейку скопированный текст.

Работа с Excel
Работа с Excel
  • Избавляемся от кавычек: нажимаем на значок, который расположен во вкладке «Главная», «Найти и выделить» – затем кнопку «Заменить…». Также можно использовать сочетание клавиш Ctrl+F, и перейти во вкладку «Заменить».

Избавляемся от кавычек
Избавляемся от кавычек
  • В открывшейся вкладке вставляем в поле «Найти» кавычки и в поле «Заменить на» ничего не вставляем. И потом нажимаем на кнопку «Заменить все». Надеюсь, всё понятно, но если нет – скрины вам в помощь.

Находим кавычки – меняем на «ничего»
Находим кавычки – меняем на «ничего»
  • Избавившись от кавычек, делим данные по клеткам. Для этого переходим во вкладку «Данные» в верхней части Excel.

Делим данные по клеткам, шаг 1
Делим данные по клеткам, шаг 1
  • В новой вкладке нажимаем на кнопку «Текст по столбцам».

Делим данные по клеткам, шаг 2
Делим данные по клеткам, шаг 2
  • Выбираем пункт «С разделителями» и нажимаем на кнопку «Далее».

Делим данные по клеткам, шаг 3
Делим данные по клеткам, шаг 3
  • Выделяем пункт «Запятая» и нажимаем на кнопку «Готово».

Делим данные по клеткам, шаг 4
Делим данные по клеткам, шаг 4

Теперь данные разделены по ячейкам. При этом вместо запятой у них стоит точка, а с точкой Excel считать не будет. Поэтому от точек избавляемся тоже. Переходим во вкладку «Главная», нажимаем кнопку «Найти и выделить», затем «Заменить» (или просто нажимаем Ctrl+F). В поле «Найти» вставляем точку, а в поле «Заменить на» – запятую. 

Нажимаем на кнопку «Заменить всё».

Находим точки, меняем на запятые
Находим точки, меняем на запятые

И теперь наши данные имеют запятую вместо точки, а значит, мы можем ими пользоваться для расчетов. Пользуйтесь на здоровье! 

Итоги

В этой статье мы подошли к более прикладной части работы с Pine Script – извлечению данных прямо из скриптов. Рассмотрели простой, но эффективный способ, как можно забирать данные с графика без использования платных функций TradingView, обойдя ограничения с помощью логов.

Это решение не идеально и не такое удобное, как прямой экспорт, но оно универсально и доступно всем пользователям. А главное – дает больше контроля и понимания того, что происходит внутри скрипта.

На этом заканчиваю, но не прощаюсь. Если есть вопросы, задавайте и не стесняйтесь. В следующем материале продолжим исследовать практические приёмы работы с TradingView и Pine Script – если интересно/актуально, подписывайтесь.

До новых встреч!

Комментарии (4)


  1. rPman
    15.07.2025 18:24

    Я дико удивлен данной статье, лично я не пытался собирать объемные данные об инструментах traidingview но первое что я бы посмотрел это инспектор браузера - вкладка сеть, нашел бы там вот такую строчку и с помощью того же wscat получил бы realtime поток событий на выбранном графике (нужно скопировать подключение как curl и заменить curl wscat -c)
    Для получения исторических данных придется покопаться (просто поиском по значению например) да и получение самих заголовков запросов все еще нужен браузер, но мне кажется это удобнее и проще чем вот так скриптами.

    Как минимум похожим способом я когда то очень давно получал realtime котировки с биржи, принципиально не поддерживающую официально api для этого, ну и доступ к чатам, что тоже обычно закрыто.


  1. tuxi
    15.07.2025 18:24

    Наверное это уже секрет полишинеля, года 4 назад я сделал "реверс инжиниринг" трейдинг вью и нащупал место где котировки передаются на ТФ меньше чем 1 минута, там это сделано через вебсокеты.

    Началось все с того, что мне просто нужны были котировки по максимальному набору тикеров, чтобы не подключать кучу разных апишек.

    Повесил в итоге headless браузер, и передавал котировки (LHOC) на свой сервер сразу как только они обновлялись.

    Может кому-нибудь тоже пригодится такая возможность.


    1. rPman
      15.07.2025 18:24

      стесняюсь спросить, как вы получали сразу много котировок? вас traidingview не банил за 100500 одновременно открытых подключений?


      1. tuxi
        15.07.2025 18:24

        Нужные мне тикеры добавлял в его активном окне. Всего 1 инстанс браузера в итоге. И с чего ему меня банить? Может у меня портфель такой, разнообразный.