В процессе загрузки ресурсов... загрузка...

FMZ PINE Script документация

Автор:Изобретатели количественного измерения - мечты, Создано: 2022-05-06 14:27:06, Обновлено: 2024-10-12 15:27:04

[TOC]

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

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

Обычная структура кода в Pine:

<version>
<declaration_statement>
<code>

Комментарии

Комментарийный символ, поддерживаемый FMZ на языке 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')

Версия

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

//@version=5

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

Заявление

  • indicator()
  • strategy()

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

Код

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

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

Слов можно составить разными способами.

  • Некоторые заявления могут быть выражены в одном строке, например, большинство деклараций о переменных, содержащие только одну строку для вызова функции или однострочные декларации о функциях; другие, как структура, всегда требуют нескольких строк, поскольку они требуют одного локального блока.
  • Сценарий не может быть выполнен с помощью глобальных предложений (т.е. частей, не относящихся к локальным блокам).空格или制表符(tab) начинается. Их первый символ также должен быть первым символом строки. Строки, начинающиеся с первого места в строке, по определению являются частью глобального диапазона сценария.
  • Структура или многострочное заявление функции всегда требует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

Можно упаковать в (примечание: количество пространств, сокращенных на каждую строку, не является кратным четырём):

a = open +
      high +
          low +
             close

Долгий призыв к сюжету может быть упакован в.

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)

Строки в user-defined function declarations также могут быть упакованы. Однако, поскольку локальный блок должен начаться с замыкания ((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Это данные циклов линии K в течение 5 минут.openВ переменной записывается цена открытия в K-строке BAR (Статив) каждые 5 минут.openЭто означает, что цена открытия на K-линии BAR, где она находится в данный момент. Для ссылки на предыдущие значения в последовательности времени (предыдущие значения), мы используем[]Исторический оператор, когда политика выполняется на K-линии BAR,open[1]Это означает, что цена, по которой начал продаваться предыдущий K-линейный BAR, ссылается на текущий K-линейный BAR.

ХотяВременная последовательностьЭто легко напомнить нам о структуре данных, как "атрибуты", хотя в языке PINE есть и типы атрибутов.

Разработка временных последовательностей в языке PINE позволяет легко вычислить суммарные значения цены закрытия в стратегическом коде, и не требует использования циклических структур, таких как for, а просто использует встроенные функции языка PINE.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 всегда равны, поэтому оба метода выражения являются равными.

Параметры шаблона библиотеки языковых операций Pine

Встроенный шаблон политики PINE "Pine Language Exchange Library" с параметрами настройки.

img

Настройка сделок

  • Использование Модель закрытия: выполняется только после окончания текущего BAR, а сделка выполняется в начале нижнего BAR. Модель цены в реальном времени: модель выполняется при каждом изменении цены, и есть сигнал для немедленного выполнения сделки.
  • По умолчанию количество открытых позиций: если в инструкции не указано количество сделок, сделка выполняется по этому параметру.
  • Максимальное количество разовых сделок: в соответствии с фактическим счетом, в сочетании с параметром настройки, определяется максимальное количество заказов за один раз, чтобы избежать удара с диска.
  • Количество цен:定价货币精度Параметры и этот параметр определяют скользкую цену при размещении заказа; например, ценообразовательная денежная точность установлена на 2, то есть точна до второго числа, точна до 0.01; тогда скользкая цена представляет собой 0.01 ценных единиц на каждой точке. При этом скользкая цена установлена на 5, скользкая цена при размещении заказа составляет 0.05 ((Скользкая цена указывает на цену при размещении заказа в целях улучшения и расчетов за превышение цены на транзакцию).
  • Наиболее длинное число циклов: влияет на количество 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При этом, если цена на рынке сейчас выше, то заказ запускается.

  • Остановка заказа

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

  • Стоп-лимит

    Можно установить одновременно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 назначаются переменные, которые, несмотря на обновление данных, сохраняют статус-лист и изменяются только при удовлетворении условий в 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
  • Модель цены в реальном времени При выполнении вышеперечисленного тестового кода проводится два этапа: первый, исторический K-линийный этап; второй, реальный K-линийный этап.varvaripПри выполнении каждого раунда кода стратегии заявленная переменная i、ii выполняется с нарастающей операцией ((посколькуif trueТаким образом, определенно выполняется соответствующий блок кода условий); поэтому можно видеть, что цифры, отображаемые на результатах рецензирования K-линии BAR, каждый из них увеличивается на 1; когда исторический K-линий завершается, начинается реальный K-линий;varvaripИзменения в заявленных переменных начинают происходить по-другому. Поскольку это модель цены в реальном времени, каждый раз, когда цена меняется в K-линии BAR, выполняется один и тот же стратегический код.i := i + 1иii := ii + 1Различие заключается в том, что ii изменяется каждый раз. i, хотя и изменяется каждый раз, возвращается к предыдущему значению при следующем раунде выполнения логики стратегии, но не обновляется до тех пор, пока не закончится текущая линия K BAR.

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

разновидности

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-линии в реальном времени график возвращает значение, которое увеличивается на каждом тике.

ПримечанияИспользуется только с простыми типами, такими как float, int, boole, string, и с массивами этих типов.

Истинно

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

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

До встречи bool

ложный

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

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

До встречи bool

если

If-заявления определяют, какие фрагменты фразы должны выполняться при выполнении условий выражения. Пине-скриптинг 4 версии позволяет использовать else 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 их типы должны соответствовать: невозможно вернуть целое значение из блока then, когда у вас есть значение строки в блокеelse. При выполнении в 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 присваивается threshold na (na, 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 блоков перемещается в четыре пространства:

Примеры

// 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" позволяет выполнять несколько предложений:

[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- начальное значение счетчика.to_num- конечные значения счетчика; цикл прерывается, когда счетчик больше to_num ((или меньше to_num в случае from_num > to_num); разрешается использовать формулы 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Структура позволяет выполнять несколько повторных заявлений для каждого элемента в матрице. Она может использоваться вместе с любым из параметров: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- отслеживает опциональные переменные текущего игрового индекса. Индексы начинаются с нуля. Переменные неизменны в цикле.array_elementВ этом разделе мы рассмотрим некоторые из них.array_element- содержит переменные для каждого элемента последовательного массива, обрабатываемого в цикле; эта переменная неизменна в цикле;array_id- Идентификаторы матриц с повторяющимися циклами.statements | continue | break- Любое количество предложений, или ключевые слова "continue" или "break", сжатые до 4 пробелов или одной вкладки.return_expression- возвращаемое значение цикла присвоеноvar_declarationВнутренние переменные, если они существуют. Если цикл выходит из-за ключевых слов "continue" или "break", то возвращаемое значение цикла является переменным, которому было присвоено последнее значение перед выходом цикла.continue- ключевое слово, которое может использоваться только в обратном цикле. Оно приводит к следующему повторению обратного цикла.break- Ключевое слово для выхода из круга.

Позволяет изменять элементы массива или их размер в цикле. Здесь мы используемfor...inФорма однопараметра для определения того, сколько линий K имеют значение OHLC, большее, чем 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))

Здесь мы используем два параметров формы for...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Строки позволяют повторяться условиям локального блока.

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

Объясните:variable_declaration- Обязательное объявление переменных.return expressionМожно дать значение инициализации для данной переменной.boolean_expression- Если true, выполнитеwhileЕсли ложь, то это означает, что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 переносит контроль в одно из нескольких предложений в зависимости от значения условий и выражения.

[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 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)

Снимок: Снимок: Снимок:

Примеры

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Ключевые слова обычно не нужны.

Операторы

=

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

:=

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

!=

Не равняется. Применяется для любого типа выражения.

expr1 != expr2

Возвращается значениеВ этом случае, если вы используете один из этих параметров, то вы можете использовать другие параметры.

%

Модуль ((полный остаток числа) ‒ для использования в числовых выражениях.

expr1 % expr2

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

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

Пример: -1 % 9 = -1 - 9 * truncate ((-1/9) = -1 - 9 * truncate ((-0.111) = -1 - 9 * 0 = -1。

%=

Показатель модуля. Применяется для выражения числа.

expr1 %= expr2

Примеры

// Equals to expr1 = expr1 % expr2.
a = 3
b = 3
a %= b
// Result: a = 0.
plot(a)

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

*

Умножение. Применяется для выражения числа.

expr1 * expr2

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

*=

Назначение умножения.

expr1 *= expr2

Примеры

// Equals to expr1 = expr1 * expr2.
a = 2
b = 3
a *= b
// Result: a = 6.
plot(a)

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

+

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

expr1 + expr2
+ expr

Возвращается значениеБинарная система строки+Возвращение объединения expres1 и expres2 Цифры возвращают целые числа или значения флуктуации, или ряд значений: Бинарный х +'возвращает express1 + express2. 1+1 возвращает expression ((не добавляет ничего к симметрии 1 оператора)).

ПримечанияВы можете использовать арифметические операторы с цифрами, а также числовые строки переменных. В случае использования числовых строк, операторы применяются к элементам.

+=

Примечание: Примечание.

expr1 += expr2

Примеры

// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)

Возвращается значениеДля строки возвращает последовательность expres1 и expres2; для цифр возвращает целые числа или значения плавающих точек, или ряд значений.

ПримечанияВы можете использовать арифметические операторы с цифрами, а также числовые строки переменных. В случае использования числовых строк, операторы применяются к элементам.

-

Субтракция или однозначное отрицательное число.

expr1 - expr2
- expr

Возвращается значениеВозвращает целые числа или значения плавающих точек, или ряд значений: Динамический кремний +'возвращает express1 минус express2. Один юань-Возвращение отрицательного выражения expres.

ПримечанияВы можете использовать арифметические операторы с цифрами, а также числовые строки переменных. В случае использования числовых строк, операторы применяются к элементам.

-=

Субтракционное назначение.

expr1 -= expr2

Примеры

// Equals to expr1 = expr1 - expr2.
a = 2
b = 3
a -= b
// Result: a = -1.
plot(a)

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

/

Исключение. Применяется для числовых выражений.

expr1 / expr2

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

/=

За исключением обозначения. Применяется для числовых выражений.

expr1 /= expr2

Примеры

// Equals to expr1 = expr1 / expr2.
a = 3
b = 3
a /= b
// Result: a = 1.
plot(a)

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

<

Меньше. Применяется для числовых выражений.

expr1 < expr2

Возвращается значениеВ этом случае, если вы используете один из этих параметров, то вы можете использовать другие параметры.

<=

меньше или равна. Применяется для числовых выражений.

expr1 <= expr2

Возвращается значениеВ этом случае, если вы используете один из этих параметров, то вы можете использовать другие параметры.

==

Это означает, что вы можете использовать любой тип выражения.

expr1 == expr2

Возвращается значениеВ этом случае, если вы используете один из этих параметров, то вы можете использовать другие параметры.

=>

Оператор '=>' используется для user-defined function declarations иswitchВ этом случае мы не можем сказать, что это не так.

Функциональное объявление имеет следующий синтаксис:

<identifier>([<parameter_name>[=<default_value>]], ...) =>
    <local_block>
    <function_result>

Один.<local_block>Это нулевые или более фразы Пайна.<function_result>Это может быть переменная, выражение или элементная группа.

Примеры

// single-line function
f1(x, y) => x + y
// multi-line function
f2(x, y) => 
    sum = x + y
    sumChange = ta.change(sum, 10)
    // Function automatically returns the last expression used in it
plot(f1(30, 8) + f2(1, 3))

ПримечанияВы можете узнать больше о функциях, которые определяются пользователями, на странице "Заявления функций" и "Скрипты" в руководстве пользователя.

>

Больший, чем. Применяется для числовых выражений.

expr1 > expr2

Возвращается значениеВ этом случае, если вы используете один из этих параметров, то вы можете использовать другие параметры.

>=

больше или равняется. Применяется для числовых выражений.

expr1 >= expr2

Возвращается значениеВ этом случае, если вы используете один из этих параметров, то вы можете использовать другие параметры.

?:

Трехслойные операторы.

expr1 ? expr2 : expr3

Примеры

// Draw circles at the bars where open crosses close
s2 = ta.cross(open, close) ? math.avg(open,close) : na
plot(s2, style=plot.style_circles, linewidth=2, color=color.red)  

// Combination of ?: operators for 'switch'-like logic
c = timeframe.isintraday ? color.red : timeframe.isdaily ? color.green : timeframe.isweekly ? color.blue : color.gray
plot(hl2, color=c)

Возвращается значениеЕсли expression1 оценивается как true, то expression2 будет оцениваться как true, если expression3 не оценивается как true; нулевые значения ((0 и NaN+, Infinity,-Infinity) будут считаться ложными, все остальные значения будут считаться истинными.

ПримечанияЕсли вам не нужно, пожалуйста, используйте na в качестве ветви else. Вы можете использовать два или более операторов: для выполнения предложений, похожих на фразы с коммутаторами (см. пример выше). Вы можете использовать арифметические операторы с цифрами, а также числовые строки переменных. В случае использования числовых строк, операторы применяются к элементам.

До встречи na

[]

Подзнаки серии ─ предоставляет доступ к предыдущим значениям серии expr1 ─ expr2 - это число прошлых k строк, которое должно быть числовым ─ плавающее будет отклонено вниз ─

expr1[expr2]

Примеры

// [] can be used to "save" variable value between bars
a = 0.0 // declare `a`
a := a[1] // immediately set current value to the same as previous. `na` in the beginning of history
if high == low // if some condition - change `a` value to another
    a := low
plot(a)

Возвращается значениеСреди них есть и другие.

До встречи math.floor

и

Логический AND ─ применяется к выражению Буля ─

expr1 and expr2

Возвращается значениеВ этом случае, если вы используете один из этих параметров, то вы можете использовать другие параметры.

или

Логика OR ─ применяется к выражению Буля ─

expr1 or expr2

Возвращается значениеВ этом случае, если вы используете один из этих параметров, то вы можете использовать другие параметры.

Нет, нет.

Логическое обратное (NOT) ≠ применимо к выражению Буля.

not expr1

Возвращается значениеВ этом случае, если вы используете один из этих параметров, то вы можете использовать другие параметры.

Ключевые слова типа данных

Буль

Ключевые слова типа "Bool" для четко заявляемых переменных или параметров. Значение переменной "Bool" может быть true, false или na.

Примеры

// bool
bool b = true    // Same as `b = true`
b := na
plot(b ? open : close)

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

До встречи var varip int float color string true false

Инт

Ключевые слова типа int ((integer)), используемые для выраженного объявления переменных или параметров.

Примеры

// int
int i = 14    // Same as `i = 14`
i := na
plot(i)

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

До встречи var varip float bool color string

плыть

Ключевые слова типа "float" ("плавучая точка"), используемые для выраженного заявления переменных или параметров.

Примеры

// float
float f = 3.14    // Same as `f = 3.14`
f := na
plot(f)

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

До встречи var varip int bool color string

строка

Ключевые слова типа "string", используемые для выраженного заявления переменных или параметров.

Примеры

// string
string s = "Hello World!"    // Same as `s = "Hello world!"`
// string s = na // same as "" 
plot(na, title=s)

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

До встречи var varip int float bool str.tostring str.format

цвет

Ключевые слова типа "color", используемые для выраженного заявления переменных или параметров.

Примеры

// color
color textColor = color.green
if barstate.islastconfirmedhistory
    runtime.log("test", textcolor = textColor)

ПримечанияЦветовые символы имеют следующий формат: #RRGGBB или #RRGGBBAA. Буквы представляют шестнадцатизначные значения от 00 до FF (от 0 до 255 в десятичной системе), где RR, GG и BB являются значениями красного, зеленого и синего компонентов цвета. AA является опционным значением цветовой прозрачности (или альфа-прозрачности), из которых 00 является невидимым, FF - непрозрачным. Указание типа в декларации переменного является опциональным, если он не инициирован на на; для получения дополнительной информации о типе Pine смотрите на странице руководства пользователя системы типов.

До встречи var varip int float string color.rgb color.new

массив

Ключевые слова для типа матрицы матрицы матрицы для четко заявленных переменных или параметров; можно использоватьarray.new<type>,array.fromФункция создает массивные объекты ((или ID)).

Примеры

// array
array<float> a = na
a := array.new<float>(1, close)
plot(array.get(a, 0))

ПримечанияОбъекты массива всегда имеют форму кубических рядов.

До встречи var array.new array.from

Объекты

Объекты языка PINE являются примером типа, определенного пользователем (UDT), который можно понять как класс без методов, который позволяет пользователю создавать в политике пользовательские типы, организованные по разным значениям в одном объекте.

Определение типа

Давайте определим тип заказа для хранения информации о заказах:

type order
    float price
    float amount
    string symbol
  • ИспользованиеtypeТип заявления ключевого слова.
  • Type после ключевого слова означает имя типа.
  • После того, как в первой строке type определяется название типа, загружается четыре поля, определяющие поле, содержащееся в этом типе.
  • Каждое поле требует заявления типа данных, например int, float, string.

Создание объектов

Использование заявленных типов, вызовыnew()Функция создает объекты:

order1 = order.new()
order1 = order.new(100, 0.1, "BTC_USDT")
order1 = order.new(amount = 0.1, symbol = "BTC_USDT", price = 100)

Также можно создавать пустые объекты:

order order1 = na

Вот пример из жизни:

type order
    float price
    float amount
    string symbol

if strategy.position_size == 0 and open > close
    strategy.entry("long", strategy.long, 1)

order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
// runtime.log(order1)   // 输出 {"data":{"price":46002.8,"amount":1,"symbol":"swap"},"_meta":0,"_type":"order"}

В этом примере:

order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)

Также можно использовать следующую форму:

order order1 = na
order1 := order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)

Типы объектов для использования ключевых слов var

//@version=5
indicator("Objects using `var` demo")

//@type A custom type to hold index, price, and volume information.
type BarInfo
    int   index = bar_index
    float price = close
    float vol   = volume

//@variable A `BarInfo` instance whose fields persist through all iterations, starting from the first bar.
var BarInfo firstBar = BarInfo.new()
//@variable A `BarInfo` instance declared on every bar.
BarInfo currentBar = BarInfo.new()

// Plot the `index` fields of both instances to compare the difference.
plot(firstBar.index, "firstBar")
plot(currentBar.index, "currentBar")

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

  • Объект firstBar декларируется с помощью ключевого слова var, поэтому его поля ((index, price, vol) будут сохранять свои значения в каждой итерации, начиная с первой записи и заканчивая последней записью.
  • Объект currentBar не использует заявление с ключевым словом var, поэтому его поле будет реинсталироваться на каждой записи, и будет иметь новый объект на каждой итерации.

Вы можете сравнить различия между двумя объектами, изображая индексные поля. firstBar.index сохраняет предыдущее значение в каждой иерархии, а currentBar.index в каждой иерархии реиннициализируется в bar_index для текущей записи.

Типы объектов для использования ключевых слов varip

//@version=5
indicator("Objects using `varip` fields demo")

//@type A custom type that counts the bars and ticks in the script's execution.
type Counter
    int       bars  = 0
    varip int ticks = 0

//@variable A `Counter` object whose reference persists throughout all bars.
var Counter counter = Counter.new()

// Add 1 to the `bars` and `ticks` fields. The `ticks` field is not subject to rollback on unconfirmed bars.
counter.bars  += 1
counter.ticks += 1

// Plot both fields for comparison.
plot(counter.bars, "Bar counter", color.blue, 3)
plot(counter.ticks, "Tick counter", color.purple, 3)

В Pine, используя ключевое слово varip, можно указать, что поле объекта будет сохраняться на протяжении всего выполнения сценария, а не прокручиваться в неизвестных столбцах. В заявлении типа Counter поле bars не использует ключевое слово varip, поэтому оно будет перескакивать в каждом неизвестном столбце; а поле ticks использует ключевое слово varip, поэтому оно не будет перескакивать в неизвестном столбце. Объект counter объявлен с помощью ключевого слова var, поэтому он будет существовать на протяжении всего процесса выполнения сценария. В каждой иерархии поле bars и поле ticks увеличиваются на 1; поле bars будет перескакивать в каждом неизвестном столбце, а поле ticks не будет перескакивать. Наконец, можно сравнить различия между ними, изобразив поля counter.bars и counter.ticks. Значения counter.bars будут перескакивать в каждом неизвестном столбце, а значения counter.ticks будут продолжать увеличиваться до тех пор, пока сценарий не закончится.

Изменить значение поля

type order
    float price
    float amount
    string symbol

if strategy.position_size == 0 and open > close
    strategy.entry("long", strategy.long, 1)
    
order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)

if strategy.position_size != 0
    runtime.log(order1)
    order1.price := 999
    order1.amount := 100
    runtime.log(order1)
    runtime.error("stop")

Использовать:=Оператор переназначения изменяет значение поля объекта.

Набор объектов

Пример заявляет пустую матрицу, которая будет хранить объекты типа order, определенного пользователем:

type order
    float price
    float amount
    string symbol

arrOrder = array.new<order>()

order1 = order.new(99, 1, "BTC_USDT")
order2 = order.new(100, 2, "ETH_USDT")

array.push(arrOrder, order1)
array.push(arrOrder, order2)

runtime.log(arrOrder)
runtime.error("stop")

Или

type order
    float price
    float amount
    string symbol

var array<order> arrOrder = na
arrOrder := array.new<order>()

order1 = order.new(99, 1, "BTC_USDT")
order2 = order.new(100, 2, "ETH_USDT")

array.push(arrOrder, order1)
array.push(arrOrder, order2)

runtime.log(arrOrder)
runtime.error("stop")

Копировать объекты

В Pine объекты распределяются ссылками. Когда существующие объекты распределяются на новые, они оба указывают на один и тот же объект.

//@version=5
indicator("")
type pivotPoint
    int x
    float y
pivot1 = pivotPoint.new()
pivot1.x := 1000
pivot2 = pivot1
pivot2.x := 2000
// Both plot the value 2000.
plot(pivot1.x)
plot(pivot2.x)

В следующем примере мы создаем объект pivot1 и устанавливаем его поле x на 1000. Затем мы заявляем, что pivot2 содержит переменную, имеющую ссылку на объект pivot1, поэтому оба указывают на один и тот же случай. Таким образом, изменение pivot2.x также изменяет pivot1.x, так как оба ссылаются на поле x одного и того же объекта.

Чтобы создать копию, независимую от первоначального объекта, в этом случае мы можем использовать встроенный метод копии ((); в этом примере мы заявляем, что pivot2 ссылается на переменную из копируемого примера объекта pivot1. Теперь, изменение pivot2.x не изменит pivot1.x, так как он указывает на поле x отдельного объекта:

//@version=5
indicator("")
type pivotPoint
    int x
    float y
pivot1 = pivotPoint.new()
pivot1.x := 1000
pivot2 = pivotPoint.copy(pivot1)
pivot2.x := 2000
// Plots 1000 and 2000.
plot(pivot1.x)
plot(pivot2.x)

Следует отметить, что метод копирования в TradingView - это базовая копия. Если объект имеет поля особого типа (array и т.д.), то эти поля в базовая копия этого объекта будут указывать на тот же случай, что и этот объект. ФМЗ-платформа реализует глубокое копирование напрямую, без необходимости дополнительной обработки.

Глубокая копия

//@version=5

indicator("test deepCopy")

type orderInfo
    float price
    float amount

type labelInfo
    orderInfo order
    string labelMsg

labelInfo1 = labelInfo.new(orderInfo.new(100, 0.1), "test labelInfo1")
labelInfo2 = labelInfo.copy(labelInfo1)

labelInfo1.labelMsg := "labelInfo1->2"    // 修改 labelInfo1 的基础类型字段,看是否影响 labelInfo2
labelInfo1.order.price := 999             // 修改 labelInfo1 的复合类型字段,看是否影响 labelInfo2

runtime.log(labelInfo1)
runtime.log(labelInfo2)
runtime.error("stop")

Результаты тестирования, labelInfo.copy ((labelInfo1) при выполнении глубокой копии, изменение labelInfo1 никаких полей не повлияет на labelInfo2.

Методы

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

Встроенные методы

Например, сценарий, который выглядит так:

//@version=5
indicator("Custom Sample BB", overlay = true)

float sourceInput  = input.source(close, "Source")
int   samplesInput = input.int(20, "Samples")
int   n            = input.int(10, "Bars")
float multiplier   = input.float(2.0, "StdDev")

var array<float> sourceArray = array.new<float>(samplesInput)
var float        sampleMean  = na
var float        sampleDev   = na

// Identify if `n` bars have passed.
if bar_index % n == 0
    // Update the queue.
    array.push(sourceArray, sourceInput)
    array.shift(sourceArray)
    // Update the mean and standard deviaiton values.
    sampleMean := array.avg(sourceArray)
    sampleDev  := array.stdev(sourceArray) * multiplier

// Calculate bands.
float highBand = sampleMean + sampleDev
float lowBand  = sampleMean - sampleDev

plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)

Это означает, что вы должны быть готовы.

//@version=5
indicator("Custom Sample BB", overlay = true)

float sourceInput  = input.source(close, "Source")
int   samplesInput = input.int(20, "Samples")
int   n            = input.int(10, "Bars")
float multiplier   = input.float(2.0, "StdDev")

var array<float> sourceArray = array.new<float>(samplesInput)
var float        sampleMean  = na
var float        sampleDev   = na

// Identify if `n` bars have passed.
if bar_index % n == 0
    // Update the queue.
    sourceArray.push(sourceInput)
    sourceArray.shift()
    // Update the mean and standard deviaiton values.
    sampleMean := sourceArray.avg()
    sampleDev  := sourceArray.stdev() * multiplier

// Calculate band values.
float highBand = sampleMean + sampleDev
float lowBand  = sampleMean - sampleDev

plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)

Вы можете видеть, что PINE поддерживаетMethodsПосле этого, кодarray.avg(sourceArray)В этом случае пользователь может написать в формате "Методы" следующее:sourceArray.avg()Я не знаю. Внимание, FMZ не поддерживается.array.avgПодобные звонки.

Методы, определенные пользователем

Pine позволяет пользователю определять пользовательские методы, используемые вместе с любыми объектами с встроенным или пользовательским типом. Методы определения по существу идентичны функциям определения, но с двумя ключевыми отличиями:

1, ключевое слово method должно быть включено перед именем функции. 2, параметры метода, тип первого из которых должен быть четко заявлен, так как он указывает тип объекта, с которым будет связан метод.

Например, в следующем коде код для вычисления показателя Brin может быть упакован как пользовательский метод:

//@version=5
indicator("Custom Sample BB", overlay = true)

float sourceInput  = input.source(close, "Source")
int   samplesInput = input.int(20, "Samples")
int   n            = input.int(10, "Bars")
float multiplier   = input.float(2.0, "StdDev")

var array<float> sourceArray = array.new<float>(samplesInput)
var float        sampleMean  = na
var float        sampleDev   = na

// Identify if `n` bars have passed.
if bar_index % n == 0
    // Update the queue.
    sourceArray.push(sourceInput)
    sourceArray.shift()
    // Update the mean and standard deviaiton values.
    sampleMean := sourceArray.avg()
    sampleDev  := sourceArray.stdev() * multiplier

// Calculate band values.
float highBand = sampleMean + sampleDev
float lowBand  = sampleMean - sampleDev

plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)

Изменение в редакцию:

//@version=5
indicator("Custom Sample BB", overlay = true)

float sourceInput  = input.source(close, "Source")
int   samplesInput = input.int(20, "Samples")
int   n            = input.int(10, "Bars")
float multiplier   = input.float(2.0, "StdDev")

var array<float> sour

Больше

ВуаоянКак можно работать с несколькими сделками одновременно?

Легкие облака.Пожалуйста, расскажите, может pine иметь больше транзакций, не так ли? Или перемещаться по транзакциям, как JS?

Лиза20231Спасибо за подробную документацию.

художественностьОго! Как этот скрипт pine использует на платформе симулятор okex?

художественностьЭто означает, что стратегию tradingview можно скопировать прямо на платформу изобретателя и использовать!

Изобретатели количественного измерения - мечтыЯзык PINE может выполнять только одноразовые стратегии, а многоразовые стратегии лучше всего использовать для написания дизайна в Python, JavaScript, C++.

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

Легкие облака.Не могу использовать okx анимационный диск.

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

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

Легкие облака.Я считаю, что лучше всего совмещать с JS, чтобы JS лучше адаптировался к различным способам торговли.

Тенденционный охотникЕсли вы хотите, чтобы вы были в курсе, что вы хотите, чтобы вы были в курсе, что вы хотите, чтобы вы были в курсе.

Изобретатели количественного измерения - мечтыНепристойность.

Легкие облака.Хорошо, спасибо, Джимми.

Изобретатели количественного измерения - мечтыЗдравствуйте, но на данный момент стратегия языка PINE работает только с одной разновидностью.

Изобретатели количественного измерения - мечтыСпасибо за вашу поддержку. Документы будут продолжать совершенствоваться.

Изобретатели количественного измерения - мечтыДа, это так.

Изобретатели количественного измерения - мечтыПИНЕ-классовая библиотека шаблонов, параметры которой позволяют установить базовые адреса обменных пунктов.