FMZ PINE Script Документы

Создано: 2022-05-06 14:27:06, Обновлено: 2025-01-23 10:19:06
comments   18
hits   13761

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

Пример: -1 % 9 = -1 - 9 * truncate ((-19) = -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

Логика AND ≠ применима к булевым выражениям ≠

expr1 and expr2

Возвращение Бульвария, или ряд бульварий.

or

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

expr1 or expr2

Возвращение Бульвария, или ряд бульварий.

not

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

not expr1

Возвращение Бульвария, или ряд бульварий.

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

bool

Ключевое слово типа 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
int i = 14    // Same as `i = 14`
i := na
plot(i)

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

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

float

Ключевое слово типа 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
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
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

Ключевые слова для явно декларируемых переменных или параметров.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

Objects

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

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

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

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

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

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

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

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

order order1 = na

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

type order
    float price
    float amount
    string symbol

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

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

Примером может служить следующее:

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

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

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

Тип объекта Использование ключевого слова var

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

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

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

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

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

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

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

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

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

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

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

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

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

Использование ключевого слова 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。

Methods

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

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

//@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Временный цикл параметров преобразуется в секунды.

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 (36512) дней в месяце.

См. также input.timeframe timeframe.period

ticker

ticker.heikinashi

Создание кода-идентификатора с просьбой сгладить среднее значение 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

request.data

Запрос внешних данных.

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

Требуется другой сорт/разрешение.

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

str

str.contains

Если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

str.endswith

ЕслиsourceСтрока будет называтьсяstrВ конце указанной подстроки возвращается true, в противном случае возвращается false.

str.endswith(source, str)

Возвращение ЕслиsourceСтрока будет называтьсяstrВ конце подстроки, указанной в строке, указывается true, в противном случае - false.

параметр

  • source(series string) Строка источника
  • str(series string) Подстрока, которую нужно искать.

См. также str.startswith

str.startswith

ЕслиsourceСтрока будет называтьсяstrВ случае, если подстрока, указанная в начале, возвращает true, в противном случае возвращает false.

str.startswith(source, str)

Возвращение ЕслиsourceСтрока будет называтьсяstrЕсли в строке “true” указывается “true”, то в строке “false” указывается “false”.

параметр

  • source(series string) Строка источника
  • str(series string) Подстрока, которую нужно искать.

См. также str.endswith

str.substring

Возвращает новую строку, которая является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

str.tonumber(string)

Возвращение Если содержит действительные числа, то является плавающей точкой строки, иначе - na。

параметр

  • string(series string) представляет собой строку int