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

FMZ PINE Сценарий Doc

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

[TOC]

img

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

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

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

<version>
<declaration_statement>
<code>

Примечания

Примечания символы, поддерживаемые языком Pine FMZ: однострочные примечания//, многострочные примечания/* */, например, метод "ноты" в следующем примере:

[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)  // calculate the MACD indicator

/*
The plot function draws the indicator line on the chart
*/
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()декларация должна быть включена в код стратегии в Pine of FMZ.

Код

Строки в скрипте, которые не являются комментариями или инструкциями компилятора, которые являются инструкциями, которые реализуют алгоритм скрипта.

  • Переменная декларация
  • Перераспределение переменных
  • Декларация функции
  • Встроенные вызовы функций, вызовы функций, определенные пользователем
  • if, for, whileилиswitchи другие конструкции

Заявления могут быть организованы различными способами.

  • Некоторые заявления могут быть выражены в одной строке, например, большинство деклараций переменных, строки, содержащие только один вызов функции, или однострочные декларации функции.
  • Заявления в глобальном объеме сценария (т. е. части, которые не являются частью локального блока) не могут начинаться сspaceилиtab(клавиатура). Их первый символ также должен быть первым символом строки. Строки, которые начинаются с первой позиции строки, по определению являются частью глобального объема сценария.
  • А.local blockЛокальный блок должен быть отрезан одной вкладкой или четырьмя пробелами (в противном случае он будет анализироваться как соединенный код предыдущей строки, который определяется как непрерывное содержание предыдущей строки кода), и каждый локальный блок определяет другой локальный объем.
  • Многочисленные однострочные заявления могут быть соединены на одной строке с помощью запятой (,) в качестве делимитаторов.
  • Строка может содержать комментарии или просто комментарии.
  • Линии также могут быть завернуты (продолжены на нескольких линиях).

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

indicator("", "", true)             // Declaration statement (global scope), can be omitted

barIsUp() =>                        // Function declaration (global scope)
    close > open                    // Local block (local scope)

plotColor = if barIsUp()            // Variable declaration (global scope)
    color.green                     // Local block (local scope)
else
    color.red                       // Local block (local scope)

runtime.log("color", color = plotColor)  // Call a built-in function to output the log (global scope)

Новый код строки

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

a = open + high + low + close

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

a = open +
      high +
          low +
             close

Длинный сюжет ((() вызов может быть завершен как:

close1 = request.security(syminfo.tickerid, "D", close)      // closing price data series of syminfo.tickerid daily level of the current trading pair
close2 = request.security(syminfo.tickerid, "240", close)    // closing price data series of syminfo.tickerid 240-minute level of the current trading pair
plot(ta.correlation(close, open, 100),                       // Line-long plot() calls can be wrapped
   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Встроенная переменная записывает начальную цену каждого представления int BAR, если этоopenпредставляет собой 5-минутный интервал представления данных.openпеременная записывает цену открытия каждого 5-минутного интервала представления BAR (бар).openДля обозначения предыдущих значений (прошлых значений) в временных рядах используется[]Когда стратегия выполняется на определенном интервал представления BAR,open[1]Смысл заключается в том, чтобы относиться к цене открытия предыдущего представления int BAR текущего представления int BAR.

Хотявременные рядыочень напоминает структуру данных array, хотя язык PINE также имеет тип массива.

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

Результат вызова функции на временных рядах также оставит след на временных рядах, опять же мы используем[]Например, при тестировании, превышает ли цена закрытия текущего представления BAR максимальное значение самой высокой цены в последних 10 представлениях BAR (за исключением текущего представления 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 в соответствующем временном ряду.

Аргументы шаблона библиотеки соснового языка

Инструкции по установке аргументов встроенного шаблона Pine Language Trade Class Library стратегии PINE.

img

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

  • Режим исполнения Модель ценового закрытия: модель исполняется только после завершения текущей BAR, а сделка исполняется, когда начинается следующая BAR. Модель цены в режиме реального времени: модель выполняется каждый раз, когда цена движется, и есть сигнал для немедленного выполнения сделки.
  • Размер открытой партии по умолчанию: если в торговом заказе не указана сумма сделки, то сделка будет выполнена в соответствии с установленной суммой.
  • Максимальное количество заказов для одной сделки: определите максимальное количество каждого заказа, чтобы избежать воздействия на рынок в соответствии с фактическим рынком и этой установкой аргумента.
  • Точки скольжения: Определить скольжение при размещении заказа в соответствии сPricing Currency PrecisionНапример, точность ценообразования валюты устанавливается на 2, то есть точна до второй запятой, точна до 0,01. Затем каждая точка сдвига представляет 0,01 единицы ценообразования. В это время точка сдвига устанавливается на 5, а сдвиг при размещении ордера составляет 0,05 (сдвиг относится к части цены, которая переполняется при размещении ордера на торговлю лучше и сдерживает).
  • Наиболее длинное число переменной периода: влияет на количество K-линий BAR в графике. Это то же самое, что и вызов функцииSetMaxBarLenвjavascript srategy.

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

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

Опционы на прямую торговлю

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

Торговля на месте, другие параметры

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

Торговля заказами

Открытая позиция

strategy(title = "open long example", pyramiding = 3)                                // The number of orders placed in the same direction allowed by pyramiding
strategy.entry("long1", strategy.long, 0.01)                                         // Open a long position at the market price, specify the group label as long1
strategy.entry("long2", strategy.long, 0.02, when = close > ta.ema(close, 10))       // The condition is triggered, the order is executed, and the market price opens a long position
strategy.entry("long3", strategy.long, 0.03, limit = 30000)                          // Specify the (lower) price, plan to place a buy order, wait for a deal to open a position, and open a position at a limit price

Закрытое положение

strategy(title = "close long example", pyramiding = 2)                              // The number of orders placed in the same direction allowed by pyramiding
strategy.entry("long1", strategy.long, 0.1)                                         // Open a long position at the market price, specify the group label as long1
strategy.entry("long2", strategy.long, 0.1)                                         // Open a long position at the market price, specify the group label as long2
strategy.close("long1", when = strategy.position_size > 0.1, qty_percent = 50, comment = "close buy entry for 50%")   // To close a position, specify to close 50% of the positions whose group label is long1
strategy.close("long2", when = strategy.position_size > 0.1, qty_percent = 80, comment = "close buy entry for 80%")   // To close a position, specify to close 80% of the positions whose group label is long2

Механизм торговли

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

Планируемый порядок

При размещении ордера с помощью команды размещения ордера, если цена не указана, по умолчанию это рыночный ордер. В дополнение к рыночному ордеру, вы также можете разместить ордер через запланированный ордер, который не действует немедленно для размещения ордера. Планируемый ордер существует в запланированной очереди ордера программы, когда он не запускается, и может быть замечен на вкладке таблицы Планированный ордер информации о состоянии (т.е. строка состояния, когда стратегия работает) во время запуска.реальный заказ/обратное тестирование. Система будет размещать ордер только тогда, когда рыночная цена в реальном времени отвечает условиям для запуска этих запланированных ордеров. Поэтому это нормально, чтобы эти ордера имели небольшое отклонение в торговой цене.strategy.entryфункция для размещения заказа, мы можем указатьlimit, stop arguments.

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), заказ будет активирован только в том случае, если текущая рыночная цена выше этой цены.

  • приказ прекращения

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

  • ордер на остановку

    Вlimitиstopаргументы могут быть установлены одновременно, и ордер будет активирован по цене, которая отвечает условиям первой.

% собственного капитала

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

// Simple moving average crossover strategy
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))  

// If the moving average crossover condition is met, buy or sell
if (longCondition)
    strategy.entry("Long", strategy.long)  

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

После уточненияdefault_qty_type=strategy.percent_of_equity, наборdefault_qty_valueНапример: если на текущем счете имеется 10 000 USDT, установка ордера на 1% означает размещение ордера с шкалой 100 USDT (вычисляется на основе текущей цены при продаже).

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

Вар

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

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 содержит цену закрытия первой ценовой строки green в серии. Переменная c содержит цену закрытия десятой зеленой строки в серии.

На FMZ он разделен на модель цены в реальном времени и модель цены закрытия.varиvarip.

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

// Test var varip
var i = 0
varip ii = 0

// Print the i and ii changed in each round of the strategy logic on the graph
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)

// Each round of logic execution increments i and ii by 1
if true
    i := i + 1
    ii := ii + 1
  • Модель цен в режиме реального времени Вышеупомянутый тест-код выполняется в две фазы: 1. фазу представления исторического числа. 2. фазу представления числа в реальном времени.var, varipвыполняются постепенно при каждом раунде выполнения кода стратегии (потому чтоif trueТаким образом, можно увидеть, что числа, отображаемые на представлении int BAR результата обратного теста, увеличиваются на 1 один за другим. Когда завершается фаза исторического представления int, начинается фаза представления int в реальном времени.var, varipобъявленные переменные начинают меняться по-разному. Поскольку это модель цены в режиме реального времени, код стратегии будет выполняться один раз для каждого изменения цены в представлении int BAR,i := i + 1иii := ii + 1Различие заключается в том, что ii изменяется каждый раз. Хотя i также изменяется каждый раз, предыдущее значение будет восстановлено, когда логика стратегии будет выполнена в следующем раунде, и значение i не будет обновлено, пока не будет завершено текущее представление int BAR (то есть предыдущее значение не будет восстановлено, когда логика стратегии будет выполнена в следующем раунде). Таким образом, можно увидеть, что переменная i все еще увеличивается на 1 для каждого BAR. Но переменная ii накапливается несколько раз для каждого BAR.

  • Модель ценообразования Поскольку модель ценового закрытия выполняет логику стратегии только один раз на представление int BAR ушел.varиvaripв приведенном выше примере ведут себя точно так же постепенно при модели ценового закрытия, как в фазе исторического представления int, так и в фазе представления int в реальном времени, увеличивая на 1 на представление int BAR.

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

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

varip variable_name = expression

Объяснение:

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

Пример

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

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

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

Истинно

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

ПримечанияПожалуйста, см. описаниеСравнениеОператоры иЛогично. Operators.

См. также bool

ложный

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

ПримечанияПожалуйста, см. описаниеСравнениеОператоры иЛогично. Operators.

См. также bool

если

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- Эта переменная получает значение ifcondition- Если условие истинно, логика в блоке заявленияthenиспользуется (var_decl_then0, var_decl_then1Если условие ложное, логика в блоке заявленияelse ifилиelseиспользуется (var_decl_else0, var_decl_else1, и т.д.).return_expression_thenиreturn_expression_else- Последнее выражение в модуле или выражение из блока else возвращает окончательное значение заявления.

Тип возвращаемого значения if-указания зависит от типаreturn_expression_thenиreturn_expression_else. При запуске на TradingView их типы должны соответствовать: когда у вас есть значение строки в блоке 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 присваивается значение empty (na, false или ):

Пример

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

Блоки then, else if, else перемещаются на четыре места:

Пример

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

Результативное значениеifЭто может быть полезно, если вам нужны побочные эффекты выражений, например, в стратегии торговли:

Пример

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

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

Пример

// 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- Декларация необязательной переменной, которая будет присвоена как значение loops return_expression.counter- переменная, которая сохраняет значение счетчика петли, увеличивая/уменьшая на 1 или значение step_num на каждой итерации петли.from_num- Начальное значение счетчика. Допускаются значения/выражения int/float.to_num- Конечное значение счетчика. Кружка прерывается, когда счетчик больше to_num (или меньше to_num в случае from_num > to_num). Допускаются значения/выражения series int/float, но они оцениваются только на первой итерации цикла.step_num- Значение инкремента/декремента счетчика. Это необязательно. По умолчанию +1 или -1, в зависимости от наибольшего из from_num или to_num. При использовании значений счетчик также инкрементируется/декрементируется в соответствии с наибольшим из from_num или to_num, поэтому знак +/- step_num необязателен.statements | continue | break- Любое количество утверждений или ключевых слов "продолжить" или "прорвать", отпечатанных четырьмя пробелами или одной вкладкой.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...inconstruct позволяет повторять несколько заявлений для каждого элемента в массиве.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- Любое количество утверждений или ключевых слов "продолжить" или "прорвать", отпечатанных четырьмя пробелами или одной вкладкой.return_expression- Возвратное значение петли присваивается переменной вvar_declarationЕсли цикл выходит из-за ключевых слов continue или break, возвращаемое значение цикла - это переменная, которая была в последний раз назначена до выхода цикла.continue- Ключевое слово, которое можно использовать только в петлях.break- Ключевое слово для выхода из цикла.

Позволяет изменять элементы массива или их размер в петле. Здесь мы используем форму одного аргументаfor...inдля определения количества строк, имеющих значение OHLC, большее, чем SMA значения close, для каждой стойки:

Пример

// 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- Если верно, выполните локальный блокwhileВ случае ошибки, выполнение сценария продолжается послеwhile statement. continue- Это...continueКлючевое слово заставляет петлю перейти к следующей итерации.break- Это...breakИсполнение скрипта возобновляется послеwhile statement. return_expression- Необязательная строка, в которой представлена возвращаемая стоимостьwhile statement.

Пример

// 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должен быть исполнен.

переключатель

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

[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Вводится только с=>tag, и выполняется только в том случае, если предыдущий блок не выполняется.switchзаявление присвоено переменной иdefault_local_blockне указано, заявка возвращаетnaеслиlocal_blockПри присвоении результатаswitchзаявление на переменную, всеlocal_blockэкземпляры должны возвращать значение того же типа.

См. также if ?:

серия

Серия - это ключевое слово, которое указывает тип серии данных.series keyword.

Оператор

=

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

:=

Оператор назначения присваивает значение переменной слева. Используется для присвоения значений ранее объявленным переменным.

!=

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

expr1 != expr2

ВозвращениеБулево значение или последовательность булевых значений.

%

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

expr1 % expr2

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

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

Пример: -1 % 9 = -1 - 9 * отрезанный ((-1/9) = -1 - 9 * отрезанный ((-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

ВозвращениеБинарный+возвращает комбинацию expr1 и expr2 Number возвращает целое число или значение с плавающей запятой или последовательность значений: Бинарный + возвращает expr1 плюс expr2. Унарий + возвращает экспресс (ничто не добавляется к унарийской операторской симметрии).

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

+=

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

expr1 += expr2

Пример

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

ВозвращениеДля строки возвращает соединение expr1 и expr2. Для чисел возвращает целое число или значение плавающего числа или ряд значений.

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

-

Субтракция или унитарный минус применимый к числовым выражениям.

expr1 - expr2
- expr

ВозвращениеВозвращается целое число или значение с плавающей запятой или ряд значений: Бинарный + возвращает expr1 минус expr2. Унарий-возвращает отрицание expr.

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

-=

Назначение вычитания, применимое к числовым выражениям.

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

ВозвращениеБулевое значение или ряд булевых значений.

=>

Оператор => используется в пользовательских декларациях функций и вswitch statements.

Грамматика декларации функции:

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

А.<local_block>это нуль или больше инструкций с Pine Script.<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)

Возвращениеexpr2 если expr1 оценивается как true, expr3 иначе. нулевое значение (0 и также NaN, +Infinity, -Infinity) считается ложным, любое другое значение является истинным.

ПримечанияИспользуйте na для else ветви, если она вам не нужна. Вы можете объединить два или более операторов?: для достижения эквивалента switch-подобного заявления (см. Примеры выше). Вы можете использовать арифметические операторы как с числами, так и с переменными рядов.

См. также na

[]

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

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

и

Логическое и применимо к булевым выражениям.

expr1 and expr2

ВозвращениеБулевое значение или ряд булевых значений.

или

Логическая OR. Применима к булевым выражениям.

expr1 or expr2

ВозвращениеБулевое значение или ряд булевых значений.

Нет, нет.

Логическое отрицание (НЕ). Применимо к булевым выражениям.

not expr1

ВозвращениеБулевое значение или ряд булевых значений.

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

Буль

Ключевое слово, используемое для явной декларации типа bool (булевой) переменной или аргумента.

Пример

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

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

См. также var varip int float color string true false

Инт

Ключевое слово, используемое для явной декларации типа int (целого числа) переменной или аргумента.

Пример

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

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

См. также var varip float bool color string

плыть

Ключевое слово, используемое для явной декларации типа float (плавающей запятой) переменной или аргумента.

Пример

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

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

См. также 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)

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

См. также 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 непрозрачен. Когда не поставляется пара AA, используется FF. Шестерниковые буквы могут быть верхними или нижними буквами.

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

См. также var varip int float string color.rgb color.new

массив

Ключевое слово, используемое для явной декларации типа array переменной или аргумента.array.new<type>, array.from function.

Пример

// 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 keyword.
  • За ключевым словом типа следует название типа.
  • Тип первой строки определяет название типа, вставляет четыре пробела и определяет поля, содержащиеся в типе.
  • Каждое поле должно декларировать свой тип данных, например 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)   // Output {"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, поэтому его поля (индекс, цена, объем) сохраняют свои значения в каждой итерации, начиная с первой записи и заканчивая последней записью.
  • Объект 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, поэтому оно возвращается на каждый неподтвержденный бар. Объект счетчика объявляется с помощью ключевого слова var, поэтому он сохраняется на протяжении всей выполнения сценария. В каждой итерации, как поле бар и поле клещей увеличиваются на 1. Поле бар возвращается на каждый неподтвержденный бар, в то время как поле клещей не возвращается. Наконец, вы можете сравнить разницу между полями counter.bars и counter.ticks. Значение counter.bars возвращается на каждую неподтвержденную строку, в то время как значение counter.ticks продолжает увеличиваться до конца выполнения сценария.


Больше

ПросящиеПочему стратегия Square Duplication не может быть реализована?

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

ПросящиеОптимизированный тренд-трекер

Изобретатели количественного измерения - мечтыЗдравствуйте, пожалуйста, какая именно стратегия?