FMZ PINE Script Документы

Создано: 2022-05-06 14:27:06, Обновлено: 2025-01-23 10:19:06
comments   18
hits   13760

[TOC]

Ключевые слова, грамматика, настройки

Структура кода

Общая структура кода в Pine:

<version>
<declaration_statement>
<code>

Примечание

ФМЗ поддерживает язык Pine с комментариями: однострочные комментарии//Многострочные комментарии/* */Например, в примере с комментариями:

[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)  // 计算MACD指标

/*
plot函数在图表上画出指标线
*/
plot(macdLine, color = color.blue, title='macdLine')
plot(signalLine, color = color.orange, title='signalLine')
plot(histLine, color = color.red, title='histLine')

Версия

Компиляторные инструкции следующего вида сообщают, в какой версии Пинь был написан сценарий:

//@version=5

Вы можете пропустить в коде, что является версией 5 по умолчанию//@version=5

Заявление

  • indicator()
  • strategy()

Заявление определяет тип сценария, который в свою очередь определяет, что в нем разрешено, и как его использовать и выполнять. Настраивает ключевые атрибуты сценария, такие как его название, где он будет появляться, когда он будет добавлен в график, точность и формат показаний, которые он показывает, а также числовые значения, управляющие некоторыми действиями при его запуске, такие как максимальное количество изображенных объектов, которые он будет показывать в графике.indicator()илиstrategy()Заявление.

Код

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

  • Заявление переменной
  • Переоценка переменной
  • Заявление функции
  • Встроенные функции, пользовательские функции
  • ifforwhileилиswitchСтруктура и т.д.

Предложения можно составить разными способами.

  • Некоторые предложения могут быть выражены в одной строке, например, большинство заявлений переменных, содержащих только одну строку для вызова функции или однострочные заявления функции. Другие, как структуры, всегда нуждаются в нескольких строках, поскольку они требуют локального блока.
  • Глобальные высказывания в сценарии (то есть части, которые не относятся к локальным блокам) не могут быть использованы в качестве空格или制表符(таб-клавиши) начинаются. Их первый символ также должен быть первым символом строки. Строки, начинающиеся с первой строки строки, по определению являются частью глобального масштаба сценария.
  • Структурные или многострочные функции всегда требуютlocal block。 Локальный блок должен быть сжат в один значок или четыре пробела (в противном случае он будет расшифрован как последовательность кода предыдущей строки, то есть будет рассматриваться как последовательность кода предыдущей строки), и каждый локальный блок определяет другой локальный диапазон。
  • Несколько одиночных предложений могут быть соединены в один ряд, используя запятую ((,) в качестве разделительного знака.
  • В одной строке может быть комментарий, а может быть только комментарий.
  • Строки также могут быть завершены (продолжение в нескольких строках).

Например, включает в себя три локальных блока, один в заявлениях с функциями на заказ, два в заявлениях с переменными с использованием if-структуры, следующим образом:

indicator("", "", true)             // 声明语句(全局范围),可以省略不写

barIsUp() =>                        // 函数声明(全局范围)
    close > open                    // 本地块(本地范围)

plotColor = if barIsUp()            // 变量声明 (全局范围)
    color.green                     // 本地块 (本地范围)
else
    color.red                       // 本地块 (本地范围)

runtime.log("color", color = plotColor)  // 调用一个内置函数输出日志 (全局范围)

Код смены

Длинные строки могут быть разделены на несколько строк, или “упакованы”. Упакованные строки должны быть сжаты в любое количество пробелов, если только они не являются кратными числами 4 (эти границы используются для сжатия локальных блоков).

a = open + high + low + close

может быть упакован в (заметьте, что количество пробелов в каждой строке не является кратным количеству 4):

a = open +
      high +
          low +
             close

Длинный вызов plot ((() может быть упакован в。

close1 = request.security(syminfo.tickerid, "D", close)      // syminfo.tickerid 当前交易对的日线级别收盘价数据系列
close2 = request.security(syminfo.tickerid, "240", close)    // syminfo.tickerid 当前交易对的240分钟级别收盘价数据系列
plot(ta.correlation(close, open, 100),                       // 一行长的plot()调用可以被包装
   color = color.new(color.purple, 40),
   style = plot.style_area,
   trackprice = true)

Однако, поскольку локальный блок грамматически должен начинаться со сжатия (((4 пробела или 1 значок), при разделе его на следующую строку, продолжение части предложения должно начинаться с более чем одного сжатия (((не равняется кратному количеству 4 пробелов)). Например:

test(c, o) =>
    ret = c > o ?
       (c > o+5000 ? 
          1 :
              0):
       (c < o-5000 ? 
          -1 : 
              0)

a = test(close, open)
plot(a, title="a")

Временная последовательность

Временная последовательность не является типом или форматом данных, а является базовым структурным понятием в языке PINE. Она используется для хранения последовательно меняющихся во времени значений, каждое из которых соответствует определенной точке времени. Такая структура понятия временной последовательности подходит для обработки и записи серии данных, изменяющихся со временем. Встроенные переменныеopenНапример,openВстроенная переменная записывает стоимость открытия каждого K-образа BAR, если этоopenЭто 5 минут циклов K-линии.openВ переменной записывается цена открытия каждые 5 минут K строки BAR{column}.openДля того, чтобы ссылаться на предыдущие значения в временной последовательности, мы используем[]Исторический оператор, когда политика выполняется на некоторой K-линии BAR,open[1]Означает, что цена, по которой открывается текущая K-линия BAR, соответствует начальной цене предыдущей K-линии BAR.

ХотяВременная последовательностьСтроение данных “аресты” легко вспомнить, хотя в языке PINE также есть типы массивов. Однако они и хронологические последовательности - это совершенно разные понятия.

С помощью PINE можно легко вычислить суммированные значения цены закрытия, используя только встроенные функции языка PINE, без использования циклической структуры, такой как for.ta.cum(close)Для примера, нам нужно вычислить среднее значение разницы между максимальным и минимальным значениями последних 14 K-линий BAR (то есть 14 K-линий BAR, наиболее близких к текущему моменту выполнения кода).ta.sma(high - low, 14)

Результат вызова функции на временной последовательности также оставляет след на временной последовательности.[]Исторический оператор ссылается на предыдущие значения. Например, проверка того, превышает ли закрытие текущей K-линии BAR максимальное значение наивысшего значения в последних 10 K-линий BAR (без учета текущей K-линии BAR). Можно написать:breach = close > ta.highest(close, 10)[1]Также можно написать:breach = close > ta.highest(close[1], 10)Так что…ta.highest(close, 10)[1]иta.highest(close[1], 10)Это равноценно.

Проверка выполняется следующим кодом:

strategy("test pine", "test", true) 

a = ta.highest(close, 10)[1]
b = ta.highest(close[1], 10)

plotchar(true, title="a", char=str.tostring(a), location=location.abovebar, color=color.red)
plotchar(true, title="b", char=str.tostring(b), location=location.belowbar, color=color.green)

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

Ссылки на исторические данные (history-referencing)

В Trading View есть ограничение на количество исторических ссылок (до 5000), например, следующий код:

//@version=6
indicator("test")

ema = ta.ema(close, 10000)      // 报错:Error on bar 0: The 'ema'->'sum' function references too many historical candles (10000), the limit is 5000.
plot(ema, "ema")

// pre10000 = ema[10000]        // 报错:Invalid number of bars back specified in the history-referencing operator. It accepts a value between 0 and 5000.
// plot(pre10000, "pre10000")

На FMZ используется языковая политика PINE “Статья сделок” в “Классической библиотеке сделок на языке Pine” с параметром “Самое длинное число циклов переменных” для определения максимального количества строк ссылочных данных.

FMZ PINE Script Документы

indicator("test")

ema = ta.ema(close, 1000)  // ema = ta.ema(close, 3000) 则报错:Invalid number 3000 of bars back specified in the history-referencing operator. It accepts a value between 0 and 2000.
plot(ema, "ema")

Параметр “наибольшее число циклов переменной” не должен быть слишком большим, в соответствующей политике можно использовать диапазон цитирования данных.

Параметры модуляции класса класса транзакций языка Pine

Показания по настройке параметров встроенного шаблона стратегии PINE “Лингвистическая библиотека сделок класса Pine”.

FMZ PINE Script Документы

Настройки торгов

  • Исполнение Модель закрытия цены: модель выполняется только после того, как текущий BAR заканчивается, а сделка выполняется, когда начинается нижний BAR. Моделирование цены в режиме реального времени: при каждом изменении цены моделирование выполняется, и сделки выполняются сразу после получения сигнала.
  • Количество открытых позиций по умолчанию: если инструкция по торговле не указывает количество сделок, то сделки выполняются в соответствии с количеством, установленным для этого.
  • Максимальная единовременная торговля: в зависимости от фактического раскрытия, в сочетании с данной параметром, определяется максимальное количество заказов на каждый заказ, чтобы избежать удара по диапазону.
  • Количество пунктов скольжения:定价货币精度Параметр и этот параметр определяют скольжение цены на момент заказа. Например, точность ценообразования установлена на 2, то есть точно до второго знака запятой, точно до 0,01. Таким образом, каждая точка скольжения цены представляет собой 0,01 ценообразования.
  • Наибольшее число циклов переменной: количество BAR для K-линий, влияющих на график, иjavascriptВызов в стратегииSetMaxBarLenФункции одинаковые.

Фьючерсные опционы

  • Код разновидности: Код контракта, который необходимо установить только в том случае, если объект биржи является объектом нетоварной биржи.
  • Минимальное количество контрактов: минимальный объем контрактов на момент заказа.

Реальные опционы

  • Автоматическое восстановление: автоматическое восстановление до остановки последней стратегии.
  • Количество повторных попыток заказа: если заказ не сработал, он будет аннулирован, а заказ будет перезадан. Этот параметр используется для определения максимального количества повторных попыток.
  • Интервал сетевого опроса ((миллисекунд): действует только для протокола REST, контролирует интервал сетевых запросов, избегает слишком частого запроса, превышающего ограничения биржи.
  • Время синхронизации аккаунтов (в секундах): период времени синхронизации данных аккаунтов.
  • Время синхронизации позиций после открытия позиции ((миллисекунд): только для некоторых бирж, которые повторно открывают позиции, вызванные задержкой данных, установка большего времени синхронизации может облегчить такие проблемы.
  • Умножение рычагов: Установите множитель рычагов

Торговля наличными деньгами, другие настройки

  • Одноразовый объем: по умолчанию одноразовый объем действует только для наличных товаров.
  • Минимальный объем: минимальный объем сделки.
  • Точность ценообразования: точность цены, то есть меньшая цифра цены.
  • Точность вида сделки: точность следующего заказа, т.е. маленькая цифра следующего заказа.
  • Обработка: для некоторых данных, рассчитанных на основе этой настройки, 0.002 означает 2 тысячных.
  • Промежуточная статистика убытков: использование статистики убытков только для отображения на диске.
  • Неудачная повторная попытка ((миллисекунд): интервал повторной попытки при неудачном сетевом запросе.
  • Использование агента: действует только для протокола REST.
  • Скрыть распространенные ошибки сети: Скрыть распространенные ошибки в регистре.
  • Переключение на базовый адрес: действует только для протокола REST.
  • Отправка уведомлений: отправка сообщений в почтовый ящик и т.д.

Оформить заказ

Открытие позиции

strategy(title = "open long example", pyramiding = 3)                                // pyramiding 允许的同方向下单的次数
strategy.entry("long1", strategy.long, 0.01)                                         // 市价开多仓,指定分组标签为long1
strategy.entry("long2", strategy.long, 0.02, when = close > ta.ema(close, 10))       // 条件触发,执行下单,市价开多仓
strategy.entry("long3", strategy.long, 0.03, limit = 30000)                          // 指定(较低的)价格,计划下买单订单,等待成交开仓,限价开仓

Равновесие

strategy(title = "close long example", pyramiding = 2)                              // pyramiding 允许的同方向下单的次数
strategy.entry("long1", strategy.long, 0.1)                                         // 市价开多仓,指定分组标签为long1
strategy.entry("long2", strategy.long, 0.1)                                         // 市价开多仓,指定分组标签为long2
strategy.close("long1", when = strategy.position_size > 0.1, qty_percent = 50, comment = "close buy entry for 50%")   // 平仓,指定平掉分组标签为long1的仓位的50%持仓
strategy.close("long2", when = strategy.position_size > 0.1, qty_percent = 80, comment = "close buy entry for 80%")   // 平仓,指定平掉分组标签为long2的仓位的80%持仓

Торговый механизм

Механизм удержания позиций в языке PINE аналогичен однонаправленному удержанию позиций. Например, при удержании позиций в многостороннем направлении ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((

План действий

При заказе с помощью команды “заказать” при заказе, если не указана какая-либо цена, по умолчанию считается, что это рыночная цена. Кроме рыночной цены, можно также заказать через планку, которая не будет действовать сразу.Фиксированный диск/ретроспективаВ таблице “Планируемые заказы” в разделе “Информация о состоянии на момент выполнения стратегии” можно увидеть: “Система действительно заказывает только тогда, когда рыночные цены в реальном времени соответствуют условиям, которые вызывают эти плановые заказы”. Таким образом, небольшие отклонения в цене совершения этих заказов являются нормальными.strategy.entryКогда мы заказываем функции, мы можем указатьlimitstopПараметры

var isTrade = false 
if not barstate.ishistory and not isTrade
    isTrade := true 
    strategy.entry("test 1", strategy.long, 0.1, stop=close*1.3, comment="test 1 order")                     // stop
    strategy.entry("test 2", strategy.long, 0.2, limit=close*0.7, comment="test 2 order")                    // limit
    strategy.entry("test 3", strategy.short, 0.3, stop=close*0.6, limit=close*1.4, comment="test 3 order")   // stop-limit    
  • Ограничительный заказ

Установление предельной цены заказа, когда заказ является покупкой (т.е.directionПараметры:strategy.long), заказ может быть инициирован только в том случае, если текущая рыночная цена ниже этой цены. При заказе на продажу (т.е.directionПараметры:strategy.shortПри этом заказ может быть инициирован только в том случае, если текущая рыночная цена превышает эту цену.

  • Заказ stop

Установка стоп-стоп-цены ордера, при которой ордер будет срабатывать только в том случае, если текущая рыночная цена будет выше этой цены. При заказе на продажу, заказ будет срабатывать только тогда, когда текущая рыночная цена будет ниже этой цены.

  • stop-limit заказ

Можно одновременноlimitstopПараметр, заказ будет инициирован по первой цене, которая соответствует условиям.

Процентная доля прав

//@version=5
strategy("Percent of Equity Order", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)  

// 简单的均线交叉策略
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))  

// 如果均线交叉条件满足,则买入或卖出
if (longCondition)
    strategy.entry("Long", strategy.long)  

if (shortCondition)
    strategy.entry("Short", strategy.short)
  

Определеноdefault_qty_type=strategy.percent_of_equityПосле, настройкиdefault_qty_valueВ процентном соотношении ((0 ~ 100), 1 - это 1%. Заказ рассчитывается по количеству валют в счете. Например: текущий счет имеет 10000 USDT, настройка заказа на 1%, то есть заказ с использованием 100 USDT в масштабе (расчет по текущей цене при продаже).

Заявление, логическая структура, ключевые слова

var

var - ключевое слово для распределения и одноразовой инициализации переменных. Обычно, синтаксис присвоения переменных, не содержащий ключевое слово var, приводит к тому, что значение переменной покрывается при каждом обновлении данных. Наоборот, когда используются ключевые слова var, переменные распределяются, несмотря на обновление данных, и они могут сохранять статус папки, изменяя ее только в том случае, если выполняются условия в if-expressions.

var variable_name = expression

Объяснение:

  • variable_name- любое имя пользовательской переменной, разрешенной в Pine Script, которое может содержать латинские символы, цифры и зачеркивание в верхней и нижней буквы_), но не с цифрами в начале).
  • expression- любое арифметическое выражение, как определение регулярной переменной.

Пример

// Var keyword example
var a = close
var b = 0.0
var c = 0.0
var green_bars_count = 0
if close > open
    var x = close
    b := x
    green_bars_count := green_bars_count + 1
    if green_bars_count >= 10
        var y = close
        c := y
plot(a, title = "a")
plot(b, title = "b")
plot(c, title = "c")

Переменная ‘a’ сохраняет закрытие первого столбца каждой строки в ряду. Переменная ‘b’ сохраняет ценовую оценку на закрытие первой в серии ценовой палки на зеленый кремний. Переменная ‘c’ сохраняет закрытие десятой в серии зеленой картошки.

На FMZ, это реальные цены модели, закрытие цены модели, дляvarvaripПеременные в заявлении тестируются следующим кодом:

strategy("test pine", "test 1", true) 

// 测试 var varip
var i = 0
varip ii = 0

// 将策略逻辑每轮改变的i、ii打印在图上
plotchar(true, title="ii", char=str.tostring(ii), location=location.abovebar, color=color.red)
plotchar(true, title="i", char=str.tostring(i), location=location.belowbar, color=color.green)

// 每轮逻辑执行都给i、ii递增1
if true
    i := i + 1
    ii := ii + 1
  • Модель цен в реальном времени Вышеуказанный тест-код выполняется в два этапа: 1-й этап исторической K-линии; 2-й этап реальной K-линии;varvaripПеременные i и ii в заявлении выполняют увеличительную операцию при каждом выпуске кода стратегии, потому чтоif trueТаким образом, можно увидеть, что число, отображаемое на линии BAR результатов обратной измерения, увеличивается в 1 раз. Когда этап исторической линии K заканчивается, начинается этап реальной линии K.varvaripИз-за того, что это реальная модель цены, в K-линии BAR каждый изменение цены выполняется один раз, и поэтому в K-линии BAR каждый изменение цены выполняется один раз, а в K-линии BAR - один раз.i := i + 1иii := ii + 1Все выполняется один раз. Разница заключается в том, что ii изменяется каждый раз. Хотя i также изменяется каждый раз, но при следующем раунде выполнения логики стратегии предыдущие значения возвращаются, и значение i не обновляется до тех пор, пока текущая K-линия BAR не будет завершена (то есть при следующем раунде выполнения логики стратегии предыдущие значения не будут возвращены).

  • Модель цены закрытия Поскольку модель закрытия цены выполняет стратегическую логику только после того, как K-линия BAR заканчивается. Таким образом, в модели закрытия цены этапы исторической K-линии и этапы реальной K-линии,varvaripУказанные переменные в приведенных выше примерах выступают в полном соответствии с увеличением BAR на каждую K-линию в 1 .

varip

varip ((var intrabar persist) - ключевое слово, используемое для распределения и разовой инициализации переменных. Оно похоже на ключевое слово var, но переменные с использованием декларации varip сохраняют свои значения между обновлениями K-линий в реальном времени.

varip variable_name = expression

Объяснение:

  • variable_name- любое имя пользовательской переменной, разрешенное в сценарии Pine, может содержать латинские символы в верхних и нижних словах, цифры и зачеркивание_), но не с цифрами в начале).
  • expression- любое арифметическое выражение, как при определении регулярной переменной. На первой K-линии выражение вычисляется только один раз и распределяется переменной один раз.

Пример

// varip
varip int v = -1
v := v + 1
plot(v)

При использовании var, график возвращает значение bar_index. При использовании varip, то же самое происходит на исторической K-линии, но на реальной K-линии график возвращает значение, которое увеличивается на 1 для каждого tick.

Примечание Можно использовать только с простыми типами, такими как float, int, bool, string, и с массивами этих типов.

true

Отображает значение переменной типа буль, или используется при выраженииСравнениеилиЛогикаЗначение, которое может быть вычислено в операторе.

Примечание Смотрите такжеСравнениеОператор иЛогикаОписание оператора:

См. также bool

false

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

Примечание Смотрите такжеСравнениеОператор иЛогикаОписание оператора:

См. также bool

if

If-ссылка определяет блок ссылки, который должен быть выполнен, чтобы удовлетворить условию выражения.

Общий код:

var_declarationX = if condition
    var_decl_then0
    var_decl_then1
    ...
    var_decl_thenN
    return_expression_then
else if [optional block]
    var_decl_else0
    var_decl_else1
    ...
    var_decl_elseN
    return_expression_else
else
    var_decl_else0
    var_decl_else1
    ...
    var_decl_elseN
    return_expression_else

Примечание var_declarationX- эта переменная получает значение if-ссылки condition- используйте блок ссылки, если условие truethenЛогика вvar_decl_then0var_decl_then1Если условие false, используйте блокelse ifилиelseЛогика вvar_decl_else0var_decl_else1И так далее. return_expression_then , return_expression_else- последнее выражение в модуле или выражение из блока else возвращает конечное значение фразы. Если объявление переменной в конце, то его значение будет результатом.

Тип возвращаемого значения if зависит отreturn_expression_thenиreturn_expression_elseТипы . Когда они работают на TradingView, их типы должны совпадать: когда у вас есть значение строки в блоке else, невозможно вернуть целое число из блока then. Когда они работают на FMZ, следующий пример не ошибается, когда y значение принимает значение “open” и число, когда он составляется на графике, составляет n/a.

Пример

// This code compiles
x = if close > open
    close
else
    open  

// This code doesn’t compile by trading view
// y = if close > open
//     close
// else
//     "open"
plot(x)

Можно пропустить.elseБлок. В этом случае, если условие false, то для переменной var_declarationX присваивается empty (на, false или ):

Пример

// if
x = if close > open
    close
// If current close > current open, then x = close.
// Otherwise the x = na.
plot(x)

Можно использовать множество else if блоков или вообще не использовать then, else if, else блоков перемещается четыре пробела:

Пример

// if
x = if open > close
    5
else if high > low
    close
else
    open
plot(x)

Можно игнорироватьifРезультат высказывания ((var_declarationX= может быть пропущен) . Это может быть полезно, если вам нужны побочные эффекты выражения, например, в стратегических сделках:

Пример

if (ta.crossover(high, low))
    strategy.entry("BBandLE", strategy.long, stop=low)
else
    strategy.cancel(id="BBandLE")

If-заявления могут содержать друг друга:

Пример

// if
float x = na
if close > open
    if close > close[1]
        x := close
    else
        x := close[1]
else
    x := open
plot(x)

for

Структура ‘for’ позволяет выполнять несколько предложений повторно:

[var_declaration =] for counter = from_num to to_num [by step_num]
    statements | continue | break
    return_expression

var_declaration- выборочное заявление переменной, которое будет присвоено значение return_expression для обратного круга. counter- переменная, которая сохраняет значение счетчика оборотов, увеличивается/уменьшается на 1 или step_num в каждой итерации оборота. from_num- Начальные значения счетчика. Разрешается использование thresholds int/float thresholds/expressions. to_num- конечная величина счетчика. Цикл прерывается, когда счетчик больше, чем to_num (или меньше, чем to_num в случае, когда from_num > to_num). Использование thresholds int/float thresholds/expressions разрешено, но они оцениваются только при первой итерации цикла. step_num- Увеличение/уменьшение значения счетчика. Оно является выборочным. По умолчанию значение +1 или -1, в зависимости от того, какой из них является наибольшим из from_num или to_num. При использовании значения счетчик также увеличивается/уменьшается в зависимости от наибольшего из from_num или to_num, поэтому знак +/- для step_num является выборочным. statements | continue | break- Любое количество фраз, или ключевые слова ‘continue’ или ‘break’, сжатые в 4 пробела или одну табуляцию. return_expression- Возвратные значения цикла, если они существуют, присваиваются переменным в var_declaration. Если цикл выходит из-за ключевого слова continue или break, то возвратные значения цикла - это значения последней переменной, присвоенной перед выходом из цикла. continue- ключевое слово, которое может быть использовано только в цикле. Оно приводит к выполнению следующей итерации цикла break- Ключевые слова для выхода из круга.

Пример

// Here, we count the quantity of bars in a given 'lookback' length which closed above the current bar's close
qtyOfHigherCloses(lookback) =>
    int result = 0
    for i = 1 to lookback
        if close[i] > close
            result += 1
    result
plot(qtyOfHigherCloses(14))

См. также for...in while

for…in

for...inСтруктура позволяет выполнять несколько заявлений для каждого элемента в массиве. Она может быть использована с любыми параметрами:array_element, или используется вместе с двумя параметрами:[index, array_element]Вторая форма не влияет на функцию цикла. Она отслеживает индекс текущей итерации в первой переменной модуля.

[var_declaration =] for array_element in array_id
    statements | continue | break
    return_expression

[var_declaration =] for [index, array_element] in array_id
    statements | continue | break
    return_expression

var_declaration- заявление о выборе переменной, которая будет передана в циклreturn_expressionЗначение index- выборочный переменный, который отслеживает текущий икодированный индекс. Индекс начинается с 0. Переменный неизменен в циклическом теле.array_elementВ подгруппе array_element- содержит переменную для каждого элемента последовательного ряда, который будет обрабатываться в цикле. Эта переменная неизменна в циклическом теле. array_id- Идентификатор массива, который возвращает циклическую итерацию. statements | continue | break- Любое количество фраз, или ключевые слова ‘continue’ или ‘break’, сжатые в 4 пробела или одну табуляцию. return_expression- возвращаемое значение цикла распределено наvar_declarationЕсли цикл выходит из-за ключевых слов ‘continue’ или ‘break’, то возвращаемым значением цикла является значение последнего присвоенного значения перед выходом из цикла. continue- ключевое слово, которое может быть использовано только в цикле. Оно приводит к выполнению следующей итерации цикла break- Ключевые слова для выхода из круга.

Допускается изменение элементов массива или его размера в цикле. Здесь мы используемfor...inОднопараметрическая форма для определения того, на каждой K-линии сколько OHLC-значений K-линии больше, чем ‘close’ - SMA:

Пример

// Here we determine on each bar how many of the bar's OHLC values are greater than the SMA of 'close' values
float[] ohlcValues = array.from(open, high, low, close)
qtyGreaterThan(value, array) =>
    int result = 0
    for currentElement in array
        if currentElement > value
            result += 1
        result
plot(qtyGreaterThan(ta.sma(close, 20), ohlcValues))

Здесь, мы используем два параметра фор…in, чтобы вывести нашуisPosЗначение массива будет trueКогда они были у нас.valuesArrayСоответствующее значение в массиве является правильным:

Пример

// for...in
var valuesArray = array.from(4, -8, 11, 78, -16, 34, 7, 99, 0, 55)
var isPos = array.new_bool(10, false)  

for [index, value] in valuesArray
    if value > 0
        array.set(isPos, index, true)  

if barstate.islastconfirmedhistory
    runtime.log(str.tostring(isPos))

См. также for while array.sum array.min array.max

while

whileСтроки допускают условную итерацию блоков локального кода.

variable_declaration = while boolean_expression
    ...
    continue
    ...
    break
    ...
    return_expression

Объяснение: variable_declaration- Избирательные заявления переменных.return expressionМожно задать значение для этой переменной. boolean_expression- Если true, то выполняетсяwhileЛокальный блок фразы. Если false, то вwhileПосле высказывания продолжите выполнение сценария. continue - continueКлючевые слова ведут к следующему размножению цикла. break - breakКлючевые слова приводят к завершению цикла.whileПосле высказывания возвращается. return_expression- Подарок.whileВыберите строку, которая возвращает значение фразы.

Пример

// This is a simple example of calculating a factorial using a while loop.
int i_n = input.int(10, "Factorial Size", minval=0)
int counter   = i_n
int factorial = 1
while counter > 0
    factorial := factorial * counter
    counter   := counter - 1

plot(factorial)

Примечание НачалоwhileЛокальный блок после строки должен быть сжат на четыре пробела или на один значок.whileЦиклwhileСледующий Булевой экспресс должен в конечном итоге стать ложным, или должен быть выполнен.break

switch

Оператор switch передает контроль над одним из нескольких предложений в зависимости от условий и значения выражения.

[variable_declaration = ] switch expression
    value1 => local_block
    value2 => local_block
    ...
    => default_local_block

[variable_declaration = ] switch
    boolean_expression1 => local_block
    boolean_expression2 => local_block
    ...
    => default_local_block

Switch с выражением:

Пример

// Switch using an expression

string i_maType = input.string("EMA", "MA type", options = ["EMA", "SMA", "RMA", "WMA"])

float ma = switch i_maType
    "EMA" => ta.ema(close, 10)
    "SMA" => ta.sma(close, 10)
    "RMA" => ta.rma(close, 10)
    // Default used when the three first cases do not match.
    => ta.wma(close, 10)

plot(ma)

Выберите “switch” без выражения:

Пример

strategy("Switch without an expression", overlay = true)

bool longCondition  = ta.crossover( ta.sma(close, 14), ta.sma(close, 28))
bool shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))

switch
    longCondition  => strategy.entry("Long ID", strategy.long)
    shortCondition => strategy.entry("Short ID", strategy.short)

Возвращение Значение последнего выражения в выполняемом блоке локальных выражений.

Примечание Использовать толькоlocal_blockПример илиdefault_local_blockПервое.default_local_blockТолько с=>Знак вводится вместе и выполняется только в том случае, если предыдущий блок не выполнен. ЕслиswitchРезультат высказывания присвоен переменной и не указанdefault_local_blockЕсли нет исполненияlocal_block, возвращаетna│ │ │switchРезультат высказывания распределяется на переменнуюlocal_blockПример должен возвращать значения того же типа.

См. также if ?:

series

series - ключевое слово, обозначающее тип серии данных.seriesКлючевые слова обычно не нужны.

Оператор

=

Используется для присвоения значения переменной, но только при декларировании переменной ((впервые используется))

:=

Оператор присвоения, присваивающий значение левой переменной. Используется для присвоения значения переменной, ранее заявленной.

!=

не равен │ выражениям любого типа │

expr1 != expr2

Возвращение Бульвария, или ряд бульварий.

%

Модиальное число ((дополнительное целое число) применимо к числовым выражениям

expr1 % expr2

Возвращение Целые числа или значения с плавающей точкой, или ряд значений.

Примечание В сценарии Пайна, при исчислении остатка целых чисел, сделка будет прервана. То есть, ее окружность будет вписана в минималь