ое абсолютное значение. Прибыль будет иметь тот же символ, что и дивиденды.
Пример: -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
Возвращение
Бинарные строки+
Возвращает объединение express1 и express2
Цифры возвращают целые числа или значения с плавающей точкой, или ряд значений:
Бинарный ‘+’ возвращает express1 плюс express2。
1 юта + 1 юта возвращает express ((( не добавляет ничего к симметрии оператора 1 юта) [2].
Примечание Вы можете использовать числовые операторы арифметики, а также ряды переменных. В случае ряда операторы применяются к элементам.
Применение арифметического назначения применимо к числовым выражениям или строкам
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。
Одной единицы-
Вернуть отрицательную форму express.
Примечание Вы можете использовать числовые операторы арифметики, а также ряды переменных. В случае ряда операторы применяются к элементам.
Определение вычитания. Применимо к числовым выражениям.
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
В комментариях.
Синтаксис функционной декларации:
<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)
Возвращение Если express1 оценивается как true, то express2 - как true, в противном случае - как express3. Значения нуля ((0 и NaN+, Infinity,-Infinity) считаются false, а все остальные значения - как true.
Примечание Если вам это не нужно, используйте na в качестве ветви else. Вы можете использовать два или более операторов: для реализации фразы, подобной фразе фразы “switch” (см. пример выше). Вы можете использовать числовые операторы арифметики, а также ряды переменных. В случае ряда операторы применяются к элементам.
См. также
na
Подсерия ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠
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)
Примечание Ясное упоминание типа в заявлении переменной является выборочным, если только он не инициирован na. Узнайте больше о типе Pine на странице руководства пользователя системы типов.
См. также
var
varip
int
float
color
string
true
false
Ключевое слово типа int () для явно заявляемых переменных или параметров.
Пример
// int
int i = 14 // Same as `i = 14`
i := na
plot(i)
Примечание Ясное упоминание типа в заявлении переменной является выборочным, если только он не инициирован na. Узнайте больше о типе Pine на странице руководства пользователя системы типов.
См. также
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 на странице руководства пользователя системы типов.
См. также
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 не прозрачна. Ясное упоминание типа в заявлении переменной является выборочным, если только он не инициирован na. Узнайте больше о типе 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), которые можно понимать как безметодные классы, позволяющие пользователям создавать в стратегии пользовательские типы, организующие различные значения в одном объекте.
Определение типа
Давайте определим тип “order” для хранения информации о заказах:
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)
Использование ключевого слова varip в Pine позволяет указать, что поле с объектом будет сохраняться в течение всего выполнения сценария, а не будет перемещаться в неизвестном столбце. В заявлениях типа Counter поле bars не использует ключевое слово varp, поэтому в каждом неустановленном столбце оно будет перемещаться назад. В поле ticks используется ключевое слово varp, поэтому оно не будет перемещаться назад в неустановленном столбце. counter объявлен с помощью ключевого слова var, поэтому он будет сохраняться в течение всего выполнения сценария. В каждой итерации поля bars и ticks увеличиваются на 1 ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ Наконец, можно сравнить различия между ними, нарисовав поля 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 того же объекта.
Чтобы создать копию, независимую от исходного объекта, в этом случае мы можем использовать встроенный метод copy (). В этом примере мы объявляем, что 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), эти поля в белой копии объекта будут указывать на тот же экземпляр, что и объект. FMZ-платформа реализует глубокую копию напрямую, без дополнительной обработки, например:
Глубокая копия
//@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.
Встроенные методы
Например, в одном из сценариев:
//@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 позволяет пользователю определять пользовательские методы, используемые вместе с любыми встроенными или пользовательскими объектами определенного типа. Методы определения по сути идентичны функциям определения, но имеют два ключевых отличия:
Например, в следующем коде можно вставить пользовательский метод, используемый для вычисления индекса Бринга:
//@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> sourceArray = array.new<float>(samplesInput)
method maintainQueue(array<float> srcArray, float value, bool takeSample = true) =>
if takeSample
srcArray.push(value)
srcArray.shift()
srcArray
method calcBB(array<float> srcArray, float mult, bool calculate = true) =>
var float mean = na
var float dev = na
if calculate
mean := srcArray.avg()
dev := srcArray.stdev() * mult
[mean, mean + dev, mean - dev]
bool newSample = bar_index % n == 0
[sampleMean, highBand, lowBand] = sourceArray.maintainQueue(sourceInput, newSample).calcBB(multiplier, newSample)
plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)
Вы можете увидеть пользовательские методы, использующие ключевые слова method declaration:maintainQueue, calcBB, где первым параметром в списке параметров являетсяarray<float>
Тип означает, что методarray<float>
Методы переменных типа, так что можно увидеть, что для вычисления показателя Булина используется следующий код:
[sampleMean, highBand, lowBand] = sourceArray.maintainQueue(sourceInput, newSample).calcBB(multiplier, newSample)
Перезагрузка методов
В качестве простого примера, предположим, что мы хотим определить метод, связанный с типом переменных. Поскольку мы должны явно указать тип объекта, связанный с методом, определенным пользователем, нам нужно определить перегрузку для каждого типа, который мы хотим, чтобы он был идентифицирован. Ниже мы определяем метод getType (), который возвращает строки, обозначающие тип переменной, и имеет пять основных типов перегрузок:
//@version=5
indicator("Type Inspection")
// @function Identifies an object's type.
// @param this Object to inspect.
// @returns (string) A string representation of the type.
method getType(int this) =>
na(this) ? "int(na)" : "int"
method getType(float this) =>
na(this) ? "float(na)" : "float"
method getType(bool this) =>
na(this) ? "bool(na)" : "bool"
method getType(color this) =>
na(this) ? "color(na)" : "color"
method getType(string this) =>
na(this) ? "string(na)" : "string"
a = 1 // a.getType(): float
b = 1.0 // b.getType(): float
c = true // c.getType(): bool
d = color.white // d.getType(): string(na)
e = "1" // e.getType(): string
runtime.log("a.getType():", a.getType())
runtime.log("b.getType():", b.getType())
runtime.log("c.getType():", c.getType())
runtime.log("d.getType():", d.getType())
runtime.log("e.getType():", e.getType())
runtime.error("stop")
Определение основного типа для каждой переменнойgetType()
Какая перезагрузка будет использоваться? На FMZ-платформе, поскольку основной сценарий PINE реализован в языке Javascript, числовые типы будут рассматриваться как плавающие данные.
При вызове функции передается параметр, можно указать присвоение имени параметра, можно напрямую передать переменную в соответствующем параметре, также поддерживается смешанное использование. Например:
plot(close, title="test plot") // 直接传参数 close ;指定参数 title ,赋值字符串"test plot"
После присвоения значения имени параметра переменная не может быть передана в качестве параметра, а все последующие параметры должны быть написаны в форме присвоения имени параметра.
// plot(close, title="test", color.red) // 虽然plot第三个参数是颜色值,但是这样写就会报错
plot(close, title="test", color=color.red) // 正确写法
plot(close, "test", color.red) // 正确写法
Передается вtimeframe
Временный цикл параметров преобразуется в секунды.
timeframe.in_seconds(timeframe)
Пример
// Get chart timeframe:
i_tf = input.timeframe("1D")
// Convert timeframe to the int value (number of seconds in 1 Day):
tf = timeframe.in_seconds(i_tf)
plot(tf)
Возвращение
timeframe
Число секунд в одной из K-линий представляет собой форму int.
параметр
timeframe
(simple string) Временный промежуток.Примечание
Дляtimeframe
>= Функция ‘1M’ рассчитывает секунды на основе 30.4167 (365⁄12) дней в месяце.
См. также
input.timeframe
timeframe.period
Создание кода-идентификатора с просьбой сгладить среднее значение K-линейных значений。
ticker.heikinashi(symbol)
Пример
heikinashi_close = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close)
heikinashi_aapl_60_close = request.security(ticker.heikinashi(syminfo.tickerid), "60", close)
plot(heikinashi_close)
plot(heikinashi_aapl_60_close)
Возвращение Строка кода акции, которая может быть предоставлена функцией request.security.
параметр
symbol
(simple string) Идентификатор товарного кода.См. также
syminfo.tickerid
syminfo.ticker
request.security
Запрос внешних данных.
request.data(url, attribute)
Пример
/*backtest
start: 2024-09-01 16:00:00
end: 2024-10-10 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
args: [["RunMode",1,358374],["ZPrecision",0,358374]]
*/
var chart_data = "https://www.datadata.com/api/v1/query/ebe46218-c5c6-4366-8c72-413694417976/data"
spotPrice = request.data(chart_data, "$.spot_close_price")
futuresPrice = request.data(chart_data, "$.future_close_price")
diff = futuresPrice - spotPrice
plot(diff, "永续-现货差价")
plot(futuresPrice, "期货价格", overlay=true)
plot(spotPrice, "现货价格", overlay=true)
if diff > 80 and strategy.position_size >= 0
runtime.log("diff > 80")
strategy.entry("Enter Short", strategy.short)
if diff < 60 and strategy.position_size <= 0
runtime.log("diff < 60")
strategy.entry("Enter Short", strategy.long)
Возвращение
параметрattribute
Определенная серия данных.
параметр
url
(simple string) запрошенный источник данных url, ответ источника данных должен соответствовать требованиям (включая, по крайней мере, свойства time, data):{"data": [], "schema": ["time", "data"]}
◦ Обратите внимание на формат данных, приведенный в примере: {
"data": [
[1720051200000, "{\"spot_close_price\" : 57050.01, \"future_close_price\" : 57045.9}"],
[1720137600000, "{\"spot_close_price\" : 56628.79, \"future_close_price\" : 56604.9}"],
// ...
],
"schema": ["time", "data"]
}
attribute
(simple string) Название атрибута, возвращающее нужные данные. Например:"$.spot_close_price"
,использовать$.
Как префикс, имя атрибута совпадает с атрибутом в поле data в запрошенном источнике данныхЕсли сообщение неверное, необходимо проверитьrequest.data
Временный диапазон запроса совпадает с временным диапазоном, установленным для отслеживания.
В данном примере SQL-ссылка для запроса data-data:
WITH latest_data AS (
SELECT
klines.spot_1d.Time AS time,
CONCAT('{\"spot_close_price\" : ', klines.spot_1d.Close, ', \"future_close_price\" : ', klines.future_1d.Close, '}') AS data
FROM
klines.spot_1d
JOIN
klines.future_1d
ON
klines.spot_1d.Time = klines.future_1d.Time
WHERE
klines.spot_1d.Symbol = 'btc_usdt'
AND
klines.future_1d.Symbol = 'btc_usdt.swap'
AND
klines.spot_1d.Exchange = 'Binance'
AND
klines.future_1d.Exchange = 'Binance'
ORDER BY
klines.spot_1d.Time DESC
LIMIT 100
)
SELECT * FROM latest_data
ORDER BY time ASC;
На сайте FMZИсследование данныхСтраничный запрос, создание ссылок на данные, используемые в примереhttps://www.datadata.com/api/v1/query/ebe46218-c5c6-4366-8c72-413694417976/data
。
Требуется другой сорт/разрешение.
request.security(symbol, timeframe, expression, gaps, lookahead, ignore_invalid_symbol, currency)
Пример
s = request.security(syminfo.tickerid, "D", close) // 1 Day
plot(s)
expr = ta.sma(close, 10)
s1 = request.security(syminfo.tickerid, "240", expr) // 240 Minutes
plot(s1)
// To avoid difference in calculation on history/realtime you can request not latest values and use merge strategy flags as follows:
s2 = request.security(syminfo.tickerid, "D", close[1], barmerge.gaps_off, barmerge.lookahead_on)
plot(s2)
f() => [open, high]
[o, h] = request.security(syminfo.tickerid, "D", f())
[l, c] = request.security(syminfo.tickerid, "D", [low, close])
plot((o + h + l + c) / 4)
Возвращение Серия требований
параметр
symbol
(simple string) Код товара.timeframe
(simple string) Период времени。 Пустая строка будет интерпретироваться как текущий период времени для графика。expression
(series int/float/bool/color) может быть вычислен из запроса request.security и возвратить выражение. Оно может быть серией или множеством элементов, которые могут быть преобразованы в серию.gaps
(barmerge_gaps) Дает запрошенную стратегию объединения данных (требует, чтобы данные автоматически объединялись с основными сериями данных OHLC). Возможные значения: barmerge.gaps_on, barmerge.gaps_off. barmerge.gaps_on - запрошенные данные объединяются с возможными разрывами.lookahead
(barmerge_lookahead) Дает запрошенную стратегию объединения данных. Возможные значения: barmerge.lookahead_on, barmerge.lookahead_off. Начиная с версии 3, по умолчанию barmerge.lookahead_off. Обратите внимание, что поведение идентично реальному времени, только в истории оно отличается.ignore_invalid_symbol
(const bool) опциональный параметр. Если не найдены указанные товары, определяется поведение функции: если false, то сценарий останавливается и возвращает ошибку при выполнении; если true, то функция возвращает na и продолжает выполнение. По умолчанию false.currency
(simple string) конвертирует валюту, относящуюся к товару (например, OHLC), в валюту. Затем вычисляет значение после конвертации (expression). Используемый коэффициент конвертации основан на ежедневном обменном курсе FX_IDC пары за предыдущий день (в зависимости от вычисленной K-линии).Примечание
Код PineScript, использующий эту функцию, может выполнять различные вычисления для исторических записей и реального времени.
Если вы хотите указать дополнительные параметры для запрошенного товара, например, время сделки или тип корректировки, вы можете использовать функцию ticker.new ().
Невозможно использовать переменную ‘ticker’ для передачи отклонения к этой функции. Вы можете использовать переменную ‘ticker.new’ или струнное выражение кода акций, например AAPL+MSFT*TSLA”。
В настоящее время в одном сценарии может быть не более 40 вызовов request.security.
Пожалуйста, обратите внимание, что использование данной переменной/функции может привести к перекрашиванию индикатора.
Разрешенные значения параметров разрешения:
1S, 5S, 15S, 30S - интервалы в секунды (цикл диаграммы должен быть меньше или равен запрошенному циклу)
От 1 до 1440 минут
От 1D до 365D дней
С 1 до 52 Вт в течение нескольких недель
От 1 до 12 месяцев
См. также
syminfo.ticker
syminfo.tickerid
timeframe.period
ta.correlation
barmerge.lookahead_off
barmerge.lookahead_on
Еслиsource
Строка содержитstr
В противном случае возвращается false.
str.contains(source, str)
Пример
// If the current chart is a continuous futures chart, e.g “BTC1!”, then the function will return true, false otherwise.
var isFutures = str.contains(syminfo.tickerid, "!")
plot(isFutures ? 1 : 0)
Возвращение
Если вsource
Найти в строкеstr
, то это true, в противном случае это false.
параметр
source
(series string) Строка источникаstr
(series string) Подстрока, которую нужно искать.См. также
str.pos
str.match
Еслиsource
Строка будет называтьсяstr
В конце указанной подстроки возвращается true, в противном случае возвращается false.
str.endswith(source, str)
Возвращение
Еслиsource
Строка будет называтьсяstr
В конце подстроки, указанной в строке, указывается true, в противном случае - false.
параметр
source
(series string) Строка источникаstr
(series string) Подстрока, которую нужно искать.См. также
str.startswith
Еслиsource
Строка будет называтьсяstr
В случае, если подстрока, указанная в начале, возвращает true, в противном случае возвращает false.
str.startswith(source, str)
Возвращение
Еслиsource
Строка будет называтьсяstr
Если в строке “true” указывается “true”, то в строке “false” указывается “false”.
параметр
source
(series string) Строка источникаstr
(series string) Подстрока, которую нужно искать.См. также
str.endswith
Возвращает новую строку, которая являетсяsource
Подстрока стринга ≠ подстрока стрингаbegin_pos
Знаки начинаются в указанном индексе и расширяются доsource
‘end_pos - 1’ для строки
str.substring(source, begin_pos)
str.substring(source, begin_pos, end_pos)
Пример
sym= "EXCHANGE_NAME:SYMBOL_NAME"
pos = str.pos(sym, ":") // Get position of ":" character
tkr= str.substring(sym, pos+1) // "SYMBOL_NAME"
if barstate.islastconfirmedhistory
runtime.log(tkr)
Возвращение Подстрока, извлеченная из исходной строки.
параметр
source
(series string) источник, из которого извлекается подстрока.begin_pos
(series int) начальное местоположение выделенной подстроки. Оно является эксклюзивным (( выделенная подстрока включает в себя символы этого места)end_pos
(series int) место окончания。 оно является эксклюзивным ((извлеченная строка не включает в себя символы этого местоположения)。 является выборочным。 по умолчаниюsource
Длина строки.Примечание
Индекс строки начинается с 0. Еслиbegin_pos
равныйend_pos
, функция возвращает пустую строку .
См. также
str.contains
str.pos
str.match
str.tonumber(string)
Возвращение Если содержит действительные числа, то является плавающей точкой строки, иначе - na。
параметр
string
(series string) представляет собой строку int