Что нового в Pine?

9 апр, 2021

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

Ключевое слово varip полезно, когда вы хотите отслеживать какие-либо данные и то, как они меняются внутри бара в реальном времени. Все обычные переменные Pine подвергаются так называемому откату, когда на каждом новом тике перед оценкой новых данных состояние переменной сбрасывается до её значения на предыдущем баре. Ключевое слово varip позволяет избежать этого и сравнить текущее значение переменной с ее значением на предыдущем тике (а не на предыдущем баре), что открывает целый новый мир возможностей. Взгляните на тиковый график, созданный одним из наших Экспертов Pine LonesomeTheBlue:

https://www.tradingview.com/script/ygNO2G1V-Tick-Chart/

Для тех из вас, кто хотел больше математики в Pine, теперь у нас есть целый набор новых математических функций и констант:

  • Новые константы math.pi, math.phi, math.rphi и math.e
  • Новое поведение функции round() — теперь функция позволяет указывать точность округления, вместо того, чтобы всегда округлять до ближайшего целого числа.
  • median()
  • mode()
  • range()
  • todegrees()
  • toradians()
  • random()

Вот стратегия для тех из вас, кто не боится опасностей: все входы и выходы перемешаны исходя из процентов, указанных в разделе Inputs, и все благодаря функции random():

//@version=4
strategy("I’m feeling lucky", overlay=true)
seed = input(1, "Seed, increase to recalculate the strategy", minval=1)
entryPerc = input(20.0, "Entry chance, %", minval=0.0, maxval=100.0)
exitPerc = input(10.0, "Exit chance, %", minval=0.0, maxval=100.0) 
roll = random(0, 100, seed)
positionSize = floor(random(1, (strategy.equity / close), seed))
if roll < entryPerc
    strategy.entry("My Long Entry Id", strategy.long, qty=positionSize)
if roll < exitPerc
    strategy.close_all()

К другим новостям: оператор присваивания := был объединен с арифметическими операторами для создания новых операторов присваивания +=, -=, *=, /= и %=. Это позволяет вам приводить в порядок и сокращать ваши скрипты: вместо использования a := a + 1 вы можете просто написать a += 1. Небольшое, но довольно удобное улучшение.

Если у вас когда-нибудь возникала необходимость преобразовать строку в число, новая функция tonumber() позволит вам это сделать. Например, в приведенном ниже скрипте tonumber() в сочетании с другими связанными со строками функциями, такими как str.split() и str.replace_all(), позволяет одному строчному полю ввода возвращать несколько целочисленных значений, которые затем используются как длины для вычислений SMA. Нет никаких веских причин делать это таким образом вместо того, чтобы воспользоваться правильным и удобным методом отдельного поля ввода для каждой SMA… Но если вдруг захочется пойти по более извилистому пути, то сделать это можно так:

//@version=4
study("My SMAs", overlay=true)
sma_lengths = input("5, 10, 20, 30, 50", title = "SMA Lengths (separated by comma)")
sma_lengths_array = str.split(str.replace_all(sma_lengths, " ", ""), ",")
sma_len(index) =>
    index > array.size(sma_lengths_array) - 1 ? 10 :
     int(tonumber(array.get(sma_lengths_array, index)))
sma0 = sma(close, sma_len(0))
sma1 = sma(close, sma_len(1))
sma2 = sma(close, sma_len(2))
sma3 = sma(close, sma_len(3)
sma4 = sma(close, sma_len(4))
plot(sma0, color=color.blue)
plot(sma1, color=color.red)
plot(sma2, color=color.green)
plot(sma3, color=color.orange)
plot(sma4, color=color.purple)

Мы добавили переменную time_tradingday, которая возвращает UNIX-время начала торгового дня. Это пригодится при анализе символов, которыми торгуют в течение ночи, например, EURUSD, где торговля начинается в воскресенье, тогда как технически торговый день на самом деле — понедельник.

Новая функция time_close() позволяет получить время закрытия бара в указанном периоде времени и сессии (в отличие от ранее существовавшей переменной time_close, которая работает только с тем периодом и той сессией, которые открыты на графике). Эта функция особенно полезна для созданных через Pine инструментов рисования, т.к. она позволяет более точно рисовать линии и метки на будущее. Чтобы увидеть её в действии, посмотрите, как пользователь JayRogers использует time_close() в индикаторе Pivot Points:

https://www.tradingview.com/script/7EwXUkBE-Pivotal-Multi-Pivot-Selector/

С новым параметром format.percent для функции study() вывод вашего скрипта теперь может быть автоматически отформатирован в процентах. Посмотрите на это в нашем встроенном индикаторе Aroon:

//@version=4
study(title="Aroon", shorttitle="Aroon", overlay=false, format=format.percent, precision=2, resolution="")
length = input(14, minval=1)
upper = 100 * (highestbars(high, length+1) + length)/length
lower = 100 * (lowestbars(low, length+1) + length)/length
plot(upper, "Aroon Up", color=#FF6A00)
plot(lower, "Aroon Down", color=#0094FF)

Три новые переменные: session.ismarket, session.ispremarket и session.ispostmarket, позволяют вам проверить, к какой части внутридневной сессии относится текущий бар. Обратите внимание, что расширенные часы отображаются только на внутридневных графиках и только тогда, когда эта опция специально включена в настройках.

Если вы хотите узнавать об обновлениях Pine, как только они появляются, следите за разделом Release notes в нашем Руководстве пользователя. Аккаунт PineCoders также транслирует новости об обновлениях в своем Telegram-канале Squawk Box, в Twitter и в публичном чате Pine Script на TradingView.

Мы надеемся, что эти улучшения будут вам полезны. Продолжайте делиться с нами своим мнением. Мы создаем TradingView для наших пользователей, и мы рады слышать, что вы думаете о наших нововведениях.

Look first Then leap

Мы создали TradingView, чтобы вы могли пользоваться самыми крутыми функциями.
Открыть график