Крупнейшие инвестиционные компании, успешные трейдеры, матерые волки с Уолл-Стрит и прочие серьезные участники рынков используют в торговле алгоритмы. В первом материале я приводил конкретные примеры, цифры, аргументы – если пропустили, почитайте, будет полезно. 

А если кратко, то суть в следующем: игроки, которые до сих пор торгуют на рынке исключительно «вручную» или при помощи готовых, общедоступных инструментов – неконкурентны. Хочется оставаться в игре? Придется подключать роботов.

Ну или так...
Ну или так...

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

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

Стратегию будем разрабатывать на базе одного из самых популярных технических индикаторов – RSI (индекс относительной силы). В моем первом материале мы подробно разбирали, как он устроен и реализовали его с нуля на Pine Script. Еще раз: если не читали эту часть, начните именно с неё – понимание внутренней логики индикатора очень полезно для построения стратегии на его основе. 

P.s. тема большая и непростая. Поэтому все материалы я разделил на «части» или главы – как угодно. Цель всего цикла материалов – научить вас создавать собственные индикаторы и стратегии для алгоритмической торговли. От базовых примеров до более сложных решений. 

В результате вы не просто сможете написать свой код – а ПОЙМЕТЕ, как переводить свои идеи в алгоритмы. Думаю, это гораздо полезнее. 

Начнем.

Индикатор и Стратегия – в чём разница в Pine Script? 

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

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

  • Стратегия предназначена для автоматического моделирования торговли. Она позволяет формализовать правила входа и выхода из позиции, задать параметры управления рисками и протестировать эффективность подхода на исторических данных с помощью встроенного тестера TradingView. Создается с помощью конструкции strategy().

В стратегии используются специальные функции:

  • strategy.entry() – для открытия позиции;

  • strategy.exit() – для закрытия;

  • strategy.close() – для досрочного выхода;

  • strategy.equity, strategy.closedtrades и др. – для анализа результатов.

И еще раз (повторение мать учения): индикатор отвечает на вопрос «что видно?», а стратегия – «что делать?».

Реализация стратегии на Pine Script на основе индикатора RSI

Чтобы написать стратегию, необходимо перейти на сайт TradingView и открыть график интересующего нас инструмента. Как это сделать – разбирали в первом материале.

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

В редакторе у вас откроется либо базовый индикатор, либо написанный ранее код индикатора RSI.

Чтобы создать индикатор на Pine Script, мы можем либо переписать самостоятельно код, либо открыть уже готовый базовый вариант стратегии. Я пойду по пути базового варианта. Нажимаю на стрелку рядом с названием индикатора (если вы его не придумали, будет надпись «Новый скрипт»).

В открывшемся окне выбираем «Создать новый», затем – «Стратегия».

После этого перед нами открывается базовая стратегия на Pine Script:

Давайте ненадолго тут остановимся и рассмотрим стратегию поближе. 

  • Другая функция – strategy. Первое, что мы видим. У функции есть 2 уже знакомых нам параметра: название и расположение отрисовки. Также есть новый параметр: fill_orders_on_standard_ohlc = true. Он заставляет стратегии, работающие на графиках Хейкен Аши, заполнять заявки, используя фактические цены OHLC (Открытие, Максимум, Минимум, Закрытие) для получения более реалистичных результатов. 

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

Но мы работаем со стандартным свечным графиком, так что в дальнейшем не будем пользоваться данным параметром (по умолчанию стоит false).

  • Далее идет условие на открытие длинной позиции (когда короткая простая скользящая средняя пересекает длинную снизу вверх). При выполнении данного условия открывается позиция с id – «My Long Entry Id» в лонг (на покупку). 

  • Затем идет обратное условие (короткая простая скользящая средняя пересекает длинную сверху вниз). При выполнении этого условия открывается новая позиция в шорт с id – «My Short Entry Id». 

Важно: при таком условии, когда у нас открывается одна сделка и открывается обратная сделка (сначала лонг, потом шорт), Pine Script сначала будет закрывать лонговую сделку (с id – «My Long Entry Id»), а потом будет сразу же открывать шортовую сделку (с id – «My Short Entry Id»).

Тоже самое произойдет, когда будет открыта шортовая сделка и появится сигнал на длинную позицию: сначала закроется короткая позиция и сразу же откроется лонговая.

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

  • покупка будет при пересечении RSI нижней границы снизу вверх на уровне 30, 

  • продажа – при пересечении RSI верхней границы снизу вверх на уровне 70.

Чтобы реализовать стратегию, необходимо вставить в редактор вот такой код:

strategy(title = "RSI strategy", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)
 
rsi_period = input.int(defval = 14, title = "RSI period", minval = 1, step = 1)
overbought_line = input.int(defval = 70, title = "Overbought line", minval = 0, maxval = 100, step = 1)
oversold_line = input.int(defval = 30, title = "Oversold line", minval = 0, maxval = 100, step = 1)
 
rsi = ta.rsi(close, rsi_period)
 
longCondition = ta.crossunder(rsi, oversold_line)
if (longCondition)
    strategy.entry("Long", strategy.long)
 
shortCondition = ta.crossover(rsi, overbought_line)
if (shortCondition)
    strategy.close("Long", comment = "Sell")
 
plot(series = rsi, title = "RSI line", color = #147461, linewidth = 2)
hline(price = overbought_line, title = "Overbought line", color = #1474618e, linestyle = hline.style_dotted)
hline(price = oversold_line, title = "Oversold line", color = #1474618e, linestyle = hline.style_dotted)

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

Пояснения к стратегии

Параметры strategy() сильно не изменились. Мы добавили название и поменяли overlay на false, чтобы отрисовывать индикатор RSI на новой панели. 

Из нового добавили 2 параметра: 

  • default_qty_type = strategy.percent_of_equity – это означает, что стратегия будет покупать/продавать на процент от доступного капитала

  • default_qty_value = 100 – как раз и отображает, на какой процент будет покупать/продавать по умолчанию. В такой конфигурации покупка/продажа всегда будет на 100% от доступного капитала.

Далее идут инпуты, которые мы рассматривали в прошлой статье.

Затем идет сокращенная функция для расчета RSI через встроенную функцию ta.rsi (значение, по которому считают (clode) период (в нашем случае период 14)).

Затем у нас идет условие на открытие длинной позиции. Мы называем это условие, чтобы потом к нему обращаться. 

Далее прописываем функцию, которая проверяет: пересек ли первый источник данных второй (так как crossunder, то сверху вниз). 

  • первый источник – RSI, 

  • второй источник – нижняя граница. 

Если это условие выполняется, открывается новая позиция с id – «Long» и направлением лонг (strategy.long).

После чего идет условие на закрытие длинной позиции. Название я с примера не менял. Если кого-то это смущает – просто поменяйте у себя и всё. 

Условие похоже на открытие позиции: если первый источник (RSI) пересекает второй источник/значение (верхняя граница, 70), напомню, снизу вверх, так как функция crossover – то мы закрываем лонговую позицию с id – «Long» и с комментарием (будет отображается сверху стрелочки на графике) «Sell».

Дальше вы видим блок с отрисовкой – его тоже уже смотрели.

Добавление стратегии на график

Давайте посмотрим, что у нас получилось. Для этого нажимаем на кнопку «Добавить на график».

После добавления стратегии на график сразу открывается вкладка «Тестер стратегии», в которой изображен P&L нашей стратегии и от простого удержания.

На первой панели мы наблюдаем различные показатели: 

  • Общая прибыль/убыток, 

  • Максимальная просадка, 

  • Всего сделок, 

  • Прибыльные сделки и Фактор прибыли (валовая прибыль/валовый убыток). 

Снизу можно убрать или добавить флажок на таких параметрах как: 

  • Средства – это результат нашей стратегии; 

  • Просадка – просадка по открытым позициям (максимальная);

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

Еще можно изменить отображение графика: в абсолютных значениях или в процентном. И есть дополнительные вкладки: 

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

  • Анализ сделок – здесь показана статистика уже по сделкам: количество, успешные, прибыль/убыток и так далее.

  • Список сделок – тут небольшие сводки по каждой сделке: когда открыта, когда закрыта, направление и результат. Если нажать слева от типа сделки (Вход в длинную позицию/Выход из длинной позиции) на мишень – можно перейти к нужной позиции на графике. Очень удобно для анализа.

Коэффициенты риска/эффективности – эту вкладку рассмотрим детальнее. 

Здесь можно найти следующие коэффициенты:

  1. Коэффициент Шарпа – показатель эффективности. Чем он выше, тем лучше. Рассчитывается как разница между ожидаемой (средней) доходностью стратегии за период и безрисковой ставкой, деленная на стандартное отклонение доходности. Если средняя доходность и стандартное отклонение рассчитывает TradingView, то безрисковую ставку необходимо вписывать вручную. Это можно сделать напрямую в strategy(), по умолчанию безрисковая ставка – 2% годовых.

  2. Коэффициент Сортино – показатель эффективности стратегии. Схож с коэффициентом Шарпа, но отличается тем, что делится разность ожидаемой (средней) доходности и безрисковой ставки НЕ на стандартное отклонение, а на стандартное отклонение отрицательной доходности. То есть учитываются только негативные результаты доходности. Это более точно отражает риск стратегии, так как при стандартном отклонении учитывается и положительный результат как риск, хотя таковым не является.

  3. Фактор прибыли – показывает, сколько прибыли приходится на 1 единицу убытков. Очевидно, что чем выше показатель, тем лучше. При этом коэффициент Шарпа и Сортино правильнее рассматривать относительно других стратегий, а не просто выше какого-то значения. А вот фактор прибыли можно рассматривать и относительно других стратегий, и независимо – так как он сам по себе показывает эффективность. Если коэффициент ниже 1, то на 1 убытков приходится меньше 1 прибыли. Значит, мы будем скорее в минусе. Соответственно, чем выше показатель, даже независимо от других стратегий, тем лучше.

  4. Маржин-колл – когда рынок идет не в нашу сторону, нас может ликвидировать. В таком случае мы получаем маржин-колл (в данной стратегии мы его не получали).

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

Мы видим, что у нас имеется график RSI на нижней новой панели, но на самом графике инструмента появляются новые обозначения: 

  • синие стрелочки с текстом Long и цифрами

  • розовые стрелочки с текстом Sell и цифрами

Текст – это либо ID длинных сделок, либо комментарий коротких. А цифры обозначают, сколько контрактов (то есть монет) было куплено и продано.

Также можем перейти в настройки стратегии. Для этого нажимаем на шестеренку рядом с названием стратегии:

Если основные инпуты мы смотрели в индикаторе RSI, то в данном случае (в стратегии) появилась новая вкладка «Свойства». Перейдя в нее можно увидеть основные параметры стратегии:

Тут виден первоначальный капитал, валюта, объем заявок и так далее.

Все эти параметры можно настроить напрямую в коде стратегии в функции strategy().

Или поменять в данном окне и применить как «Сделать по умолчанию».

Сохраняем скрипт

Переходим в код и сохраняем стратегию. Для этого нажимаем на область, где написано «Новый скрипт» и «Сохранить». 

Название должно отличаться от других скриптов! Если вы сохраните стратегию под уже существующим названием, то прошлый индикатор/стратегия перезапишется. И вы всё потеряете. Будьте внимательнее. 

Стратегию можно будет найти в списке «Мои скрипты».

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

Подсказка: справа есть особый значок, которые подсказывает, что это стратегия, а не индикатор.

Итоги

На этом этапе мы завершили построение простой стратегии на основе RSI в среде Pine Script. В отличие от индикатора, стратегия позволяет нам не просто наблюдать за рынком, а формализовать торговую логику и протестировать её на исторических данных.

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

Важно понимать: простая стратегия на RSI – это отправная точка. Её не стоит воспринимать как готовое решение для реальной торговли. Просто она отлично подходит для обучения и понимания того, как превращать идеи в алгоритмы. 

В следующих материалах, при помощи уже всех этих знаний, мы продолжим углубляться и делать более сложные (в дальнейшем и уникальные) вещи. Сохраняйтесь в закладках, подписывайтесь на аккаунт и до новых встреч!

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


  1. Shpankov
    25.06.2025 10:44

    На работу устроиться не пробовали?


    1. WildBoar_Fond Автор
      25.06.2025 10:44

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


      1. Shpankov
        25.06.2025 10:44

        Надеюсь, преподаёте с гарантией трудоустройства? :-)


  1. MANAB
    25.06.2025 10:44

    Статья из разряда - торгового робота можно реализовать на языке программирования X. Ну почти на любом можно реализовать что угодно. Можно на C# или C++ или Go или JS, + еще куча других. Вопрос скорее возникает - в чем смысл делать пример про Pine Script еще? Наоборот был бы смысл использовать свое собственное решение, чтобы лишний раз не светить свою логику робота и планируемых сделок.


    1. WildBoar_Fond Автор
      25.06.2025 10:44

      Комментарий из разряда «кто чем богат - тем и делится» (не удержался, заглянул в аккаунт)

       в чем смысл 

      Две статьи опубликовал, дважды объяснял смысл. А в чем смысл выражать неудовлетворение чужим «плохим» материалом, когда можно написать свой хороший – вопрос открытый.


  1. Robomanus
    25.06.2025 10:44

    В принципе наполнение статьи соответствует названию, описывается пример простейшего алгоритма. Почему выбран PineScript думаю из-за его относительной простоты освоения, как тот-же MQL из MetaTrader и популярности платформы, на которой он используется. Но вот его функциональность вызывает вопросы, так как это узкоспециализированное решение самой TradingView и ни о какой гибкости и сложной кастомизации и речи быть не может, грубо говоря вот тебе 10 деталек конструктора, как хочешь их так и используй. Поэтому, конечно более сложные алгоритмы пишутся на известных всем яп.


    1. WildBoar_Fond Автор
      25.06.2025 10:44

      Почему выбран PineScript думаю из-за его относительной простоты освоения

      Именно так

      Но вот его функциональность вызывает вопросы, так как это узкоспециализированное решение самой TradingView и ни о какой гибкости и сложной кастомизации и речи быть не может

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

      А с чего это всё начинается? Как раз с базовых прототипов, простых инструментов и минимальных стратегий)


  1. empenoso
    25.06.2025 10:44

    Писал что-то подобное, но чуть подробнее:

    https://habr.com/ru/articles/907682/