[TOC]
Общая структура кода в 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.
Хотявременные рядыочень напоминает структуру данных
Временные ряды, разработанные на языке сосны, могут легко рассчитать совокупное значение цены закрытия в коде стратегии, и нет необходимости использовать структуры петли, такие как для, только встроенная функция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 в соответствующем временном ряду.
Инструкции по установке аргументов встроенного шаблона
Pricing Currency Precision
Например, точность ценообразования валюты устанавливается на 2, то есть точна до второй запятой, точна до 0,01. Затем каждая точка сдвига представляет 0,01 единицы ценообразования. В это время точка сдвига устанавливается на 5, а сдвиг при размещении ордера составляет 0,05 (сдвиг относится к части цены, которая переполняется при размещении ордера на торговлю лучше и сдерживает).SetMaxBarLen
вjavascript
srategy.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, приводит к тому, что значение переменной
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")
Переменная
На 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
Пример
// 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 присваивается значение
Пример
// if
x = if close > open
close
// If current close > current open, then x = close.
// Otherwise the x = na.
plot(x)
Блоки
Пример
// 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)
Конструкция
[var_declaration =] for counter = from_num to to_num [by step_num]
statements | continue | break
return_expression
var_declaration
- Декларация необязательной переменной, которая будет присвоена как значение loopcounter
- переменная, которая сохраняет значение счетчика петли, увеличивая/уменьшая на 1 или значение step_num на каждой итерации петли.from_num
- Начальное значение счетчика. Допускаются значения/выражения int/float.to_num
- Конечное значение счетчика. Кружка прерывается, когда счетчик больше to_num (или меньше to_num в случае from_num > to_num). Допускаются значения/выражения step_num
- Значение инкремента/декремента счетчика. Это необязательно. По умолчанию +1 или -1, в зависимости от наибольшего из from_num или to_num. При использовании значений счетчик также инкрементируется/декрементируется в соответствии с наибольшим из from_num или to_num, поэтому знак +/- step_num необязателен.statements | continue | break
- Любое количество утверждений или ключевых слов "продолжить" или "прорвать", отпечатанных четырьмя пробелами или одной вкладкой.return_expression
- В случае возврата значения петли, если оно присутствует, переменной в var_declaration присваивается. Если петля выходит из-за ключевых слов 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
construct позволяет повторять несколько заявлений для каждого элемента в массиве.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
- Ключевое слово для выхода из цикла.
Позволяет изменять элементы массива или их размер в петле.
Здесь мы используем форму одного аргументаfor...in
для определения количества строк, имеющих значение 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
- Если верно, выполните локальный блок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
Пример
// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)
ВозвращениеДля строки возвращает соединение expr1 и expr2. Для чисел возвращает целое число или значение плавающего числа или ряд значений.
ПримечанияВы можете использовать арифметические операторы как с числами, так и с переменными рядов.
Субтракция или унитарный минус применимый к числовым выражениям.
expr1 - expr2
- expr
ВозвращениеВозвращается целое число или значение с плавающей запятой или ряд значений:
Бинарный -
возвращает отрицание 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 для
См. также
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 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 i = 14 // Same as `i = 14`
i := na
plot(i)
ПримечанияЯвное упоминание типа в декларации переменной является необязательным, за исключением случаев, когда он инициируется na. Узнайте больше о типах Pine Script на странице Руководства пользователя в системе типов.
См. также
var
varip
float
bool
color
string
Ключевое слово, используемое для явной декларации типа
Пример
// float
float f = 3.14 // Same as `f = 3.14`
f := na
plot(f)
ПримечанияЯвное упоминание типа в декларации переменной является необязательным, за исключением случаев, когда он инициируется na.
См. также
var
varip
int
bool
color
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 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.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.Создание объектов
Используя объявленный тип, вызовите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.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 не может быть реализована?
Изобретатели количественного измерения - мечтыХорошо, давайте проверим.
ПросящиеОптимизированный тренд-трекер
Изобретатели количественного измерения - мечтыЗдравствуйте, пожалуйста, какая именно стратегия?