[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()
В этом случае мы не можем сказать, что мы не знаем.
В сценарии строка, не содержащая комментариев или компиляторных инструкций, является предложением, которое реализует алгоритм сценария.
if
,for
,while
или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 Language Exchange Library" с параметрами настройки.
定价货币精度
Параметры и этот параметр определяют скользкую цену при размещении заказа; например, ценообразовательная денежная точность установлена на 2, то есть точна до второго числа, точна до 0.01; тогда скользкая цена представляет собой 0.01 ценных единиц на каждой точке. При этом скользкая цена установлена на 5, скользкая цена при размещении заказа составляет 0.05 ((Скользкая цена указывает на цену при размещении заказа в целях улучшения и расчетов за превышение цены на транзакцию).javascript
Призыв в стратегииSetMaxBarLen
Функции работают одинаково.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
Мы можем указать, когда мы заказываем функцию.limit
、stop
Параметры.
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)
// 简单的均线交叉策略
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")
Переменная
В FMZ есть модели цены в режиме реального времени, модели цены закрытия, модели цены закрытия.var
、varip
Мы проверили это с помощью следующего кода.
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-линийный этап.var
、varip
При выполнении каждого раунда кода стратегии заявленная переменная i、ii выполняется с нарастающей операцией ((посколькуif true
Таким образом, определенно выполняется соответствующий блок кода условий); поэтому можно видеть, что цифры, отображаемые на результатах рецензирования K-линии BAR, каждый из них увеличивается на 1; когда исторический K-линий завершается, начинается реальный K-линий;var
、varip
Изменения в заявленных переменных начинают происходить по-другому. Поскольку это модель цены в реальном времени, каждый раз, когда цена меняется в K-линии BAR, выполняется один и тот же стратегический код.i := i + 1
иii := ii + 1
Различие заключается в том, что ii изменяется каждый раз. i, хотя и изменяется каждый раз, возвращается к предыдущему значению при следующем раунде выполнения логики стратегии, но не обновляется до тех пор, пока не закончится текущая линия K BAR.
Модель закрытия
Поскольку модель закрытия выполняет одну стратегическую логику после каждого прохождения K-линии BAR.var
、varip
Переменные, заявленные в этом примере, проявляются совершенно однозначно, причем каждое из 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 версии позволяет использовать
Общие коды:
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_then0
,var_decl_then1
И так далее. Если условие false, используется словарный блокelse if
Илиelse
Логика в (((var_decl_else0
,var_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)
Можно использовать несколько
Примеры
// 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-заявления могут содержать друг друга:
Примеры
// 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 в качестве ветви
До встречи
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
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
Тип заявления ключевого слова.Создание объектов
Использование заявленных типов, вызовы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.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 работает только с одной разновидностью.
Изобретатели количественного измерения - мечтыСпасибо за вашу поддержку. Документы будут продолжать совершенствоваться.
Изобретатели количественного измерения - мечтыДа, это так.
Изобретатели количественного измерения - мечтыПИНЕ-классовая библиотека шаблонов, параметры которой позволяют установить базовые адреса обменных пунктов.