[TOC] ¿Qué quieres decir?
La estructura general del código en Pine es la siguiente:
<version>
<declaration_statement>
<code>
Anotatorios con soporte para el lenguaje Pine de FMZ: anotaciones de una sola línea//
¿Qué es lo que está sucediendo?/* */
En el caso de los ejemplos siguientes, por ejemplo, el texto de las notas:
[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')
Las instrucciones del compilador en la siguiente forma le dicen al compilador en qué versión del guión está escrito Pine:
//@version=5
Por defecto, la versión v5 se puede omitir en el código.//@version=5
。
indicator()
strategy()
Las declaraciones determinan el tipo de script, que determina qué contenido se permite y cómo se utiliza y ejecuta. Establecen las propiedades clave del script, como su nombre, dónde aparecerá cuando se agrega al gráfico, la precisión y el formato de los valores que muestra, y controlan ciertos valores de su comportamiento al ejecutarse, como el número máximo de objetos gráficos que mostrará en el gráfico.indicator()
¿Qué es esto?strategy()
La declaración fue hecha por el presidente de la República.
Las líneas de un guión que no son notas o instrucciones del compilador son oraciones que implementan el algoritmo del guión. Una oración puede ser una de ellas.
if
,for
,while
¿Qué es esto?switch
Estructura de las ecuacionesLas oraciones se pueden ordenar de varias maneras.
空格
¿Qué es esto?制表符
(tab key) comienza. Su primer carácter también debe ser el primer carácter de la línea. Las líneas que comienzan en la primera posición de la línea, por definición, forman parte del alcance global del script.local block
Un local debe ser reducido a un símbolo o cuatro espacios (de lo contrario, se resolverá como la línea de código seria anterior, es decir, se determinará como el contenido continuo de la línea anterior de código), y cada local definirá un rango local diferente.Por ejemplo, incluye tres bloques, uno en la declaración de funciones personalizadas y dos en la declaración de variables que usan la estructura if, con el siguiente código:
indicator("", "", true) // 声明语句(全局范围),可以省略不写
barIsUp() => // 函数声明(全局范围)
close > open // 本地块(本地范围)
plotColor = if barIsUp() // 变量声明 (全局范围)
color.green // 本地块 (本地范围)
else
color.red // 本地块 (本地范围)
runtime.log("color", color = plotColor) // 调用一个内置函数输出日志 (全局范围)
Las líneas largas se pueden dividir en varias líneas, o ser "envueltas"; las líneas envueltas deben ser reducidas a cualquier número de espacios, siempre que no sean múltiplos de 4 (estos límites se usan para reducir los bloques).
a = open + high + low + close
Se puede empaquetar como (tenga en cuenta que el número de espacios que se reducen por línea no es un múltiplo de 4):
a = open +
high +
low +
close
Una llamada de Plot (()) larga puede ser envuelta en.
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)
Las declaraciones de una función definida por el usuario también pueden ser envasadas. Sin embargo, como los bloques locales deben comenzar con una contracción (cuatro espacios o un símbolo), cuando se divide a la siguiente línea, la parte continua de la declaración debe comenzar con más de una contracción (no igual a un múltiplo de cuatro espacios). Por ejemplo:
test(c, o) =>
ret = c > o ?
(c > o+5000 ?
1 :
0):
(c < o-5000 ?
-1 :
0)
a = test(close, open)
plot(a, title="a")
La secuencia de tiempo no es un tipo o formato de datos, sino que es un concepto de estructura básica en el lenguaje PINE. Se utiliza para almacenar valores que cambian continuamente en el tiempo, cada valor corresponde a un punto de tiempo.
Variables incorporadasopen
Por ejemplo,open
La variable interna registra el precio de apertura de cada barra de la línea K, si esto es cierto.open
Es el ciclo de 5 minutos de la línea K. Entonces esto es el ciclo de 5 minutos de la línea K.open
Lo que se registra en la variable es el precio de apertura de la columna BAR de la línea K cada 5 minutos. Cuando su programa de política se ejecuta, se cita en el código.open
Es decir, se refiere al precio de apertura de la línea BAR en la línea K actual. Para referirse al valor anterior en la secuencia de tiempo (el valor pasado), usamos[]
El operador de historial, cuando la política se ejecuta en un K-line BAR,open[1]
Esto significa que se refiere al precio de apertura de la barra anterior de la línea K de la barra actual.
AunqueSecuencia temporalEs fácil pensar en estructuras de datos como "matrices", aunque el lenguaje PINE también tiene tipos de matrices. Pero son conceptos completamente diferentes a las secuencias de tiempo.
El lenguaje PINE diseña secuencias de tiempo de esta manera para calcular el valor acumulado de los precios de cierre de forma muy fácil en el código de la estrategia, y no requiere el uso de estructuras circulares como for, solo con funciones integradas que utilizan el lenguaje PINE.ta.cum(close)
Por otro lado, si queremos calcular el valor medio de la diferencia entre el valor máximo y el valor mínimo de las últimas 14 K-string BAR (es decir, la distancia más cercana a 14 K-string BAR) en el momento en que se ejecuta el código, podemos escribir:ta.sma(high - low, 14)
Los resultados de las llamadas a funciones en la secuencia de tiempo también dejarán una huella en la secuencia de tiempo, también se puede usar[]
El operador histórico se refiere al valor anterior. Por ejemplo, cuando se prueba si el precio de cierre de la K-line BAR actual es mayor que el valor máximo del precio más alto de los últimos 10 K-line BARs (excluyendo la K-line BAR actual), se puede escribir:breach = close > ta.highest(close, 10)[1]
También se puede escribir:breach = close > ta.highest(close[1], 10)
¿Por qué?ta.highest(close, 10)[1]
yta.highest(close[1], 10)
El gobierno de los Estados Unidos está en contra de la ley.
La verificación se puede hacer con el siguiente código:
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)
El código de prueba anterior produce a y b en cada BAR con sus respectivos valores en la secuencia de tiempo, y se puede ver que los valores de a y b siempre son iguales, por lo que los dos métodos de expresión son equivalentes.
La configuración de los parámetros de la librería de transacciones de lenguaje "Pine", la plantilla incorporada de la política PINE.
定价货币精度
Los parámetros y este parámetro determinan el precio de deslizamiento al momento de realizar el pedido. Por ejemplo, el precio de la precisión monetaria se establece en 2, es decir, exacto a la segunda posición de la decima y exacto a 0.01. Entonces, el punto de deslizamiento representa 0.01 unidades de precio.javascript
Llamadas en la estrategiaSetMaxBarLen
La función es la misma.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%持仓
El mecanismo de tenencia del lenguaje PINE es similar al de la tenencia unidireccional. Por ejemplo, cuando se tiene una posición de múltiples posiciones ("tenencia de múltiples posiciones"), si hay órdenes de operación de venta, listas de planes, etc. (en relación con la dirección opuesta a la tenencia), la orden de ejecución se desencadena, primero se llena la posición de múltiples posiciones ("levantan todas las tenencias de múltiples posiciones) y luego se ejecuta la orden desencadenada (en relación con la dirección opuesta a la tenencia de anteriores posiciones).
Cuando se usa la instrucción de pedido, el precio de mercado es el precio predeterminado si no se especifica ningún precio. Además del precio de mercado, también se puede pedir a través del pedido de programa, el pedido de programa no se opera inmediatamente. El pedido de programa se puede realizar en la cola de encargo de programación de un programa que no se haya activado.Disco en vivo / reevaluaciónLa información de estado de tiempo (es decir, el bar de estado cuando la política está en ejecución) se ve en la tabla de partición de "órdenes programadas". El sistema solo realiza pedidos cuando los precios en tiempo real del mercado cumplen con las condiciones para activar estos pedidos programados. Por lo tanto, estos pedidos tienen un pequeño desvío en los precios de transacción.strategy.entry
Cuando ordenamos una función, podemos especificarlimit
、stop
Los parámetros.
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
Orden de límite
Establecer un precio límite para el pedido, cuando el pedido es un pago (es decir,direction
El parámetro esstrategy.long
En el caso de los precios más bajos en el mercado actual, los pedidos sólo se activan cuando el precio actual es inferior.
Cuando el pedido es un pedido de venta (es decir)direction
El parámetro esstrategy.short
En el caso de los precios en el mercado actual, los pedidos sólo se activan cuando el precio actual del mercado es mayor que ese precio.
Las órdenes de stop
Establece el precio de stop loss de la orden, cuando la orden es de compra, la orden se activa solo cuando el precio actual del mercado es superior a ese precio. Cuando el pedido es un pedido de venta, el pedido sólo se activa cuando el precio actual del mercado es inferior a ese precio.
Las órdenes de stop-limit
Se puede configurar simultáneamentelimit
、stop
Los parámetros, los pedidos se activan en el precio que cumple con los requisitos primero.
//@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)
Especificardefault_qty_type=strategy.percent_of_equity
Luego, el ajustedefault_qty_value
Porcentaje de cantidad ((0~100), 1 es el 1%;; cantidad calculada por el número de monedas de la cuenta; por ejemplo: cuenta actual tiene 10000 USDT, se establece un 1% de la orden, es decir, la orden de la cantidad de la escala de 100 USDT (cuantificada por el precio actual al momento de la venta).
var es la palabra clave para asignar y iniciar variables de una sola vez. Generalmente, la sintaxis de asignación de variables que no incluye la palabra clave var causa que el valor de la variable se cubra cada vez que se actualiza el dato. Por el contrario, cuando se utilizan variables asignadas con la palabra clave var, aunque el dato se actualice, pueden mantenerse en estado de equilibrio y cambiarlo solo cuando se cumplen las condiciones de las expresiones si.
var variable_name = expression
¿Qué es esto?
variable_name
- Cualquier nombre de variable de usuario permitido en Pine Script ((puede contener caracteres latinos en mayúsculas y minúsculas, números y guiones ((_), pero no puede comenzar con un número))).expression
- Cualquier expresión aritmética, tal como la definición de una variable regular.Ejemplos
// 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")
La variable
En FMZ, el modelo de precios en tiempo real, el modelo de precios de cierre, y el modelo de precios de cierre se dividen en dos tipos:var
、varip
Las variables declaradas se prueban con el siguiente código:
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
Modelo de precios en tiempo real
El código de prueba anterior se divide en dos etapas de ejecución: la primera, la etapa de la línea K histórica; la segunda, la etapa de la línea K en tiempo real. Cuando el modelo de precios en tiempo real, la etapa de la línea K histórica, la línea K en tiempo real, la línea K en tiempo real.var
、varip
Las variables declaradas i, ii se ejecutan incrementalmente cada vez que se ejecuta el código de la política, ya queif true
Por lo tanto, se puede ver que cada uno de los números que se muestran en el resultado de la línea K BAR es cada vez mayor de 1. Cuando termina la fase de la línea K histórica, comienza la fase de la línea K en tiempo real.var
、varip
Las variables declaradas comienzan a cambiar. Como es un modelo de precios en tiempo real, cada cambio de precio dentro de una K-line BAR ejecuta una serie de códigos de estrategia.i := i + 1
yii := ii + 1
La diferencia es que ii se modifica cada vez. Aunque i también se modifica cada vez, el valor anterior se restablece en la siguiente ronda de ejecución de la lógica de la estrategia, hasta que la línea K actual BAR no se actualiza para determinar el valor anterior (es decir, no se restablece el valor anterior en la siguiente ronda de ejecución de la lógica de la estrategia). Así que se puede ver que la variable i sigue siendo BAR1 por cada raíz; pero la variable ii se suma varias veces por cada BAR.
Modelo de precio de cierre
Dado que el modelo de precio de cierre ejecuta una lógica estratégica al final de cada K line BAR. Por lo tanto, en el modelo de precio de cierre, la fase de la línea K histórica y la fase de la línea K en tiempo real se ejecutan de forma simultánea.var
、varip
Las variables declaradas se muestran perfectamente congruentes en el ejemplo anterior, incrementando 1 BAR por cada línea K.
varip (var intrabar persist) es una clave para asignar y iniciar variables de una sola vez. Es similar a la clave var, pero las variables que utilizan la declaración varip conservan su valor entre actualizaciones de K líneas en tiempo real.
varip variable_name = expression
¿Qué es esto?
variable_name
- Cualquier nombre de variable de usuario permitido en el guión de Pine (puede incluir caracteres latinos mayúsculas y minúsculas, números y guiones, pero no puede comenzar con números).expression
- Cualquier expresión aritmética, como cuando se define una variable regular. En la primera línea K, la expresión se calcula una sola vez y se asigna a la variable una vez.Ejemplos
// varip
varip int v = -1
v := v + 1
plot(v)
Cuando se usa var, el gráfico devuelve el valor de bar_index. Usando varip, el mismo comportamiento ocurre en la línea K histórica, pero en la línea K en tiempo real, el gráfico devuelve un valor que aumenta uno por cada tick.
Nota: el nombre de la ciudad esSolo puede usarse con tipos simples, como float, int, boolean, string, y con matrices de estos tipos.
Indica el valor de una variable de tipo Boole, o cuando se usa una expresiónComparación¿Qué es esto?La lógicaEl valor que se puede calcular cuando el operador.
Nota: el nombre de la ciudad esPara más información:ComparaciónLos operadores yLa lógicaDescripción del operador.
Hasta luego.
bool
Indica el valor de una variable de tipo Boole, así como los resultados de las operaciones de comparación y de las operaciones lógicas.
Nota: el nombre de la ciudad esPara más información:ComparaciónLos operadores yLa lógicaDescripción del operador.
Hasta luego.
bool
Las oraciones if definen los bloques de oración que deben ejecutarse cuando se cumplen las condiciones de la expresión. La lenguaje de escritura Pine de la versión 4 permite usar la sintaxis
El código común proviene de:
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
Nota: el nombre de la ciudad es
var_declarationX
- Esta variable obtiene el valor de la frase sicondition
- Si la condición es true, se usa el bloque de sentenciasthen
La lógica en elvar_decl_then0
,var_decl_then1
Por ejemplo, si la condición es false, se usa el bloque de sentencias.else if
¿Qué es esto?else
La lógica en elvar_decl_else0
,var_decl_else1
Y así sucesivamente.return_expression_then , return_expression_else
- La última expresión en el módulo o la expresión del bloqueelse devolverá el valor final de la frase. Si la declaración de la variable está al final, su valor será el valor del resultado.
El tipo de valor que se devuelve en la frase if depende de:return_expression_then
yreturn_expression_else
Tipo: Cuando se ejecuta en TradingView, sus tipos deben coincidir: cuando tienes un valor de cadena en el bloqueelse, no es posible devolver un valor entero desde el bloque then. Cuando se ejecuta en FMZ, los siguientes ejemplos no devuelven errores: cuando el valor de y se toma como "open", el valor del gráfico de la trama es n/a.
Ejemplos
// 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)
Se puede omitirelse
Bloquear. En este caso, si la condición es false, se asigna un umbral vacío a la variable var_declarationX (na,false o umbral):
Ejemplos
// if
x = if close > open
close
// If current close > current open, then x = close.
// Otherwise the x = na.
plot(x)
Se pueden usar varios bloques de
Ejemplos
// if
x = if open > close
5
else if high > low
close
else
open
plot(x)
¿Cómo se puede ignorar esto?if
El valor del resultado de la declaración ((
Ejemplos
if (ta.crossover(high, low))
strategy.entry("BBandLE", strategy.long, stop=low)
else
strategy.cancel(id="BBandLE")
Las oraciones if pueden contenerse entre sí:
Ejemplos
// if
float x = na
if close > open
if close > close[1]
x := close
else
x := close[1]
else
x := open
plot(x)
La estructura for permite la repetición de varias oraciones:
[var_declaration =] for counter = from_num to to_num [by step_num]
statements | continue | break
return_expression
var_declaration
- Una declaración de variable opcional que se asignará como el valor de la expresión return_expression de la vuelta al círculo.counter
- Para guardar las variables de los valores del contador de la vuelta, aumenta/disminuye el valor de 1 o step_num en cada repetición de la vuelta.from_num
- El valor inicial del contador. Se permite el uso de las frases int/float thresholds/expresiones.to_num
- El valor final del contador. El ciclo se interrumpe cuando el contador es mayor que to_num (o menor que to_num en el caso de from_num > to_num). Se permite el uso de las frases int/float thresholds/expresiones, pero solo se evalúan en la primera repetición del ciclo.step_num
- Aumento/disminución del contador. Es opcional. El valor predeterminado es +1 o-1, dependiendo del más grande de from_num o de to_num. Cuando se usa un valor, el contador también aumenta o disminuye según el más grande de from_num o de to_num, por lo que el símbolo +/- de step_num es opcional.statements | continue | break
- Cualquier número de frases, o las palabras clave "continue" o "break" para reducir a 4 espacios o una pestaña.return_expression
- El valor de retorno del ciclo, si existe, se asigna a las variables de la var_declaration. Si el ciclo se retira debido a la clave "continue" o "break", el valor de retorno del ciclo es el valor de la última variable a la que se le asignó el valor antes de salir del ciclo.continue
- La palabra clave que sólo se puede usar en el giro.break
- La palabra clave para salir del círculo de regreso.
Ejemplos
// 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))
Hasta luego.
for...in
while
for...in
La estructura permite ejecutar varias declaraciones repetidas para cada elemento de la matriz. Se puede usar junto con cualquier parámetro:array_element
, o se puede usar junto con dos parámetros:[index, array_element]
La segunda forma no afecta a la función del ciclo; sigue el índice de la iteración actual en la primera variable del grupo.
[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
- Una declaración de variable opcional, que será asignada al cicloreturn_expression
El valor de las letras y letras.index
- Seguimiento de variables opcionales del índice iterativo actual. ■ Indice que comienza en cero. ■ Variables invariantes en el ciclo. ■ Cuando se usa, debe contener también un índice.array_element
En el subgrupo de los elementos de.array_element
- Contiene las variables de cada elemento de la matriz continua a tratar en el ciclo.array_id
- ID de la matriz de repetición en círculo.statements | continue | break
- Cualquier número de frases, o las palabras clave "continue" o "break" para reducir a 4 espacios o una pestaña.return_expression
- El valor de retorno del ciclo se asigna avar_declaration
Variables en el interior, si existen. Si el bucle se retira debido a la palabra clave "continue" o "break", el valor de retorno del bucle es el valor de la última variable asignada antes de que el bucle se retire.continue
- La palabra clave que sólo se puede usar en el giro.break
- La palabra clave para salir del círculo de regreso.
Permite modificar los elementos de la matriz o su tamaño durante el ciclo.
Aquí usamosfor...in
La forma de un solo parámetro para determinar en cada línea K, cuántas líneas K tienen un valor OHLC mayor que el SMA del umbral de cercanía:
Ejemplos
// 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))
Aquí usamos dos parámetros de la forma de for...in para expresar nuestroisPos
El valor de la matriz está configurado comotrue
Cuando están en nuestrovaluesArray
El valor correspondiente en el conjunto es:
Ejemplos
// 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))
Hasta luego.
for
while
array.sum
array.min
array.max
while
Las declaraciones permiten la repetición de condiciones en bloques de código locales.
variable_declaration = while boolean_expression
...
continue
...
break
...
return_expression
¿Qué es esto?variable_declaration
- Declaración de variables opcionales.return expression
Se puede proporcionar un valor de inicialización para esta variable.boolean_expression
- Si es verdad, ejecutawhile
El bloque local de la frase. Si es falso, se encuentra enwhile
Después de la frase, sigue ejecutando el guión.continue
- continue
Las palabras clave conducen a la rama circular hasta la siguiente iteración.break
- break
Las palabras clave terminan el ciclo.while
La frase se repite después de la frase.return_expression
- Se ofrece.while
Las líneas opcionales que devuelven el valor de la frase.
Ejemplos
// 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)
Nota: el nombre de la ciudad esPrimariowhile
El bloque de código local después de la línea debe ser reducido a cuatro espacios o un símbolo.while
El círculo.while
La siguiente expresión de Boole debe convertirse en false o ejecutarse.break
。
El operador switch transfiere el control a una de las declaraciones según el valor de la condición y la expresión.
[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
En la página de Facebook de Facebook, el usuario de Twitter dice:
Ejemplos
// 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)
En la página web de Twitter de la empresa, el usuario dice que el cambio no tiene expresión:
Ejemplos
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)
El valor de retornoEl valor de la última expresión en el bloque de la oración local ejecutada.
Nota: el nombre de la ciudad esSólo puede ejecutarse.local_block
ejemplo odefault_local_block
Uno de ellos.default_local_block
Sólo con=>
Introducción con marcadores, y sólo se ejecuta cuando no se ejecuta el bloque anterior.switch
El resultado de la frase se asigna a una variable y no se especificadefault_local_block
Si no se ejecuta.local_block
La frase se vuelve:na
¿Qué es esto?switch
Cuando los resultados de las declaraciones se asignan a las variables, todoslocal_block
Las instancias deben devolver valores del mismo tipo.
Hasta luego.
if
?:
series es una palabra clave que indica el tipo de serie de datos.series
Las palabras clave son generalmente innecesarias.
Se utiliza para asignar valores a variables, pero sólo cuando se declara una variable (la primera vez que se usa).
Operador de asignación para asignar variables a la izquierda.
No es igual a. Aplicable a cualquier tipo de expresión.
expr1 != expr2
El valor de retornoEl valor de Boole, o una serie de valores de Boole.
Los módulos ((integral residual) ⇒ aplicados a las expresiones numéricas ⇒
expr1 % expr2
El valor de retornoUn número entero o un valor de punto flotante, o una serie de valores.
Nota: el nombre de la ciudad esEn el guión de Pine, cuando se calcula el resto de los enteros, el operador se interrumpe; es decir, se cuadra hasta el mínimo valor absoluto. El valor obtenido tendrá el mismo símbolo que el dividendo.
Ejemplo: -1 % 9 = -1 - 9 * truncate ((-1/9) = -1 - 9 * truncate ((-0.111) = -1 - 9 * 0 = -1.
Los indicadores de módulos. Se aplican a las expresiones numéricas.
expr1 %= expr2
Ejemplos
// Equals to expr1 = expr1 % expr2.
a = 3
b = 3
a %= b
// Result: a = 0.
plot(a)
El valor de retornoUn número entero o un valor de punto flotante, o una serie de valores.
La multiplicación. Se aplica a la expresión numérica.
expr1 * expr2
El valor de retornoUn número entero o un valor de punto flotante, o una serie de valores.
Los indicadores de multiplicación. Se aplican a las expresiones numéricas.
expr1 *= expr2
Ejemplos
// Equals to expr1 = expr1 * expr2.
a = 2
b = 3
a *= b
// Result: a = 6.
plot(a)
El valor de retornoUn número entero o un valor de punto flotante, o una serie de valores.
Añadir o un solo número exacto. Aplicable para expresiones numéricas o cadenas.
expr1 + expr2
+ expr
El valor de retornoEl sistema binario de las cadenas+
Devuelve la combinación de expres1 y expres2
Los números devuelven un número entero o un valor de punto flotante, o una serie de valores:
El sistema binario con el r +'devuelve expres1 más expres2 ∞.
El valor de un valor de unidad + el valor de unidad devuelve el valor de un valor de unidad (sin añadir nada a la simetría del operador).
Nota: el nombre de la ciudad esPuedes usar operadores aritméticos con números y columnas de variables. En el caso de columnas de números, los operadores se aplican a los elementos.
Los indicadores de acoplamiento.
expr1 += expr2
Ejemplos
// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)
El valor de retornoPara una cadena, devuelve la serie de expres1 y expres2; para un número, devuelve un número entero o un valor de punto flotante, o una serie de valores.
Nota: el nombre de la ciudad esPuedes usar operadores aritméticos con números y columnas de variables. En el caso de columnas de números, los operadores se aplican a los elementos.
La ley de deducción o unidad negativa.
expr1 - expr2
- expr
El valor de retornoDevuelve un número entero o un valor de punto flotante, o una serie de valores:
El binomial r +'devuelve expres1 menos expres2.
Un dólar-
Devuelve la negación de expr.
Nota: el nombre de la ciudad esPuedes usar operadores aritméticos con números y columnas de variables. En el caso de columnas de números, los operadores se aplican a los elementos.
La designación de la ley de la deducción.
expr1 -= expr2
Ejemplos
// Equals to expr1 = expr1 - expr2.
a = 2
b = 3
a -= b
// Result: a = -1.
plot(a)
El valor de retornoUn número entero o un valor de punto flotante, o una serie de valores.
La excepción ─ aplica a las expresiones numéricas ─.
expr1 / expr2
El valor de retornoUn número entero o un valor de punto flotante, o una serie de valores.
Excepto las designaciones.
expr1 /= expr2
Ejemplos
// Equals to expr1 = expr1 / expr2.
a = 3
b = 3
a /= b
// Result: a = 1.
plot(a)
El valor de retornoUn número entero o un valor de punto flotante, o una serie de valores.
Menor que. Aplica para las expresiones numéricas.
expr1 < expr2
El valor de retornoEl valor de Boole, o una serie de valores de Boole.
Menor o igual a. Aplica para las expresiones numéricas.
expr1 <= expr2
El valor de retornoEl valor de Boole, o una serie de valores de Boole.
Esto es lo mismo que: ≠ {\displaystyle \alpha }, y puede aplicarse a cualquier tipo de expresión.
expr1 == expr2
El valor de retornoEl valor de Boole, o una serie de valores de Boole.
Los operadores '=>' se utilizan para las declaraciones de funciones definidas por el usuario yswitch
En la frase, el hombre dice:
La sintaxis de las declaraciones de funciones es:
<identifier>([<parameter_name>[=<default_value>]], ...) =>
<local_block>
<function_result>
Uno.<local_block>
Las frases de Pine son cero o más frases de Pine.<function_result>
Es una variable, una expresión o un grupo de elementos.
Ejemplos
// 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))
Nota: el nombre de la ciudad esPuede obtener más información sobre las funciones definidas por el usuario en la página de declaraciones de funciones y librería de guiones del manual del usuario.
Más grande que. Aplica para las expresiones numéricas.
expr1 > expr2
El valor de retornoEl valor de Boole, o una serie de valores de Boole.
Más grande o igual a. Aplica para las expresiones numéricas.
expr1 >= expr2
El valor de retornoEl valor de Boole, o una serie de valores de Boole.
Los operadores de las tres condiciones.
expr1 ? expr2 : expr3
Ejemplos
// 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)
El valor de retornoSi expres1 se evalúa como true, expres2 se evalúa como true, si no, expres3 se evalúa como true. Los valores cero ((0 y NaN+, Infinity,-Infinity) se consideran falsos y todos los demás valores son true.
Nota: el nombre de la ciudad esSi no lo necesitas, usa na como una rama de la columna else. Puede combinar dos o más?: operadores para implementar una frase similar a la de un switch de botón (ver el ejemplo anterior). Puedes usar operadores aritméticos con números y columnas de variables. En el caso de columnas de números, los operadores se aplican a los elementos.
Hasta luego.
na
Subetiqueta de la serie. Ofrece acceso a los valores anteriores de la serie expr1. Expr2 es el número de líneas k pasadas y debe ser un valor. El flotador se desplazará hacia abajo.
expr1[expr2]
Ejemplos
// [] 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)
El valor de retornoEs una serie de valores.
Hasta luego.
math.floor
La lógica AND ─ aplica para las expresiones de Boole ─.
expr1 and expr2
El valor de retornoEl valor de Boole, o una serie de valores de Boole.
La lógica OR↑ se aplica a las expresiones de Boole↑
expr1 or expr2
El valor de retornoEl valor de Boole, o una serie de valores de Boole.
La respuesta lógica ((NOT) ⇒ se aplica a las expresiones de Boole.
not expr1
El valor de retornoEl valor de Boole, o una serie de valores de Boole.
Palabras clave de tipo "Bool" para variables o parámetros declarados expresamente. El valor de la variable "Bool" puede ser true, false o na.
Ejemplos
// bool
bool b = true // Same as `b = true`
b := na
plot(b ? open : close)
Nota: el nombre de la ciudad esEs opcional mencionar claramente el tipo en la declaración de la variable, a menos que se inicie con na. Más información sobre el tipo Pine en la página de manual del usuario del sistema de tipos.
Hasta luego.
var
varip
int
float
color
string
true
false
Palabras clave de tipo
Ejemplos
// int
int i = 14 // Same as `i = 14`
i := na
plot(i)
Nota: el nombre de la ciudad esEs opcional mencionar claramente el tipo en la declaración de la variable, a menos que se inicie con na. Más información sobre el tipo Pine en la página de manual del usuario del sistema de tipos.
Hasta luego.
var
varip
float
bool
color
string
Palabras clave de tipo float (float) para declarar variables o parámetros expresamente.
Ejemplos
// float
float f = 3.14 // Same as `f = 3.14`
f := na
plot(f)
Nota: el nombre de la ciudad esEs opcional que el tipo se mencione expresamente en la declaración de la variable, a menos que se inicie con na.
Hasta luego.
var
varip
int
bool
color
string
Palabras clave de tipo "string" para declarar variables o parámetros expresamente.
Ejemplos
// string
string s = "Hello World!" // Same as `s = "Hello world!"`
// string s = na // same as ""
plot(na, title=s)
Nota: el nombre de la ciudad esEs opcional mencionar claramente el tipo en la declaración de la variable, a menos que se inicie con na. Más información sobre el tipo Pine en la página de manual del usuario del sistema de tipos.
Hasta luego.
var
varip
int
float
bool
str.tostring
str.format
Palabras clave de tipo "color" para declarar variables o parámetros expresamente.
Ejemplos
// color
color textColor = color.green
if barstate.islastconfirmedhistory
runtime.log("test", textcolor = textColor)
Nota: el nombre de la ciudad esLos caracteres de color tienen el siguiente formato: #RRGGBB o #RRGGBBAA. Las letras representan los valores de los sesenta dígitos de 00 a FF (de 0 a 255 en el decimal), donde RR, GG y BB son los valores de los componentes rojos, verdes y azules de los colores. AA es el valor opcional de la transparencia de color (o componente alfa), donde 00 es invisible y FF es opaco. Cuando no se proporciona AA, se usa FF. Los caracteres de los sesenta dígitos se pueden escribir mayúsculas o minúsculas. Es opcional mencionar el tipo de forma explícita en la declaración de la variable, a menos que se inicie con na. Más información sobre el tipo Pine se puede encontrar en la página de la guía de usuario del sistema de tipos.
Hasta luego.
var
varip
int
float
string
color.rgb
color.new
Se puede usar la palabra clave para el tipo de pila de la matriz que se usa para declarar variables o parámetros explícitamente.array.new<type>
,array.from
La función crea objetos de la matriz ((o ID)).
Ejemplos
// array
array<float> a = na
a := array.new<float>(1, close)
plot(array.get(a, 0))
Nota: el nombre de la ciudad esLos objetos de la matriz son siempre en forma de matrices en serie.
Hasta luego.
var
array.new
array.from
Los objetos del lenguaje PINE son ejemplos de tipos definidos por el usuario (UDT), que pueden ser entendidos como clases sin métodos, que permiten a los usuarios crear tipos personalizados en políticas que organizan diferentes valores en una entidad.
Tipo definido
Definiamos un tipo de orden para guardar la información de la orden:
type order
float price
float amount
string symbol
type
El tipo de declaración de palabras clave.Creación de objetos
Utilice el tipo declarado y llamenew()
Objetos de creación de funciones:
order1 = order.new()
order1 = order.new(100, 0.1, "BTC_USDT")
order1 = order.new(amount = 0.1, symbol = "BTC_USDT", price = 100)
También puedes crear objetos en blanco:
order order1 = na
A continuación vemos un ejemplo práctico:
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"}
La frase en el ejemplo dice:
order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
También se puede escribir en la siguiente forma:
order order1 = na
order1 := order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
Tipo de objeto para usar la palabra clave 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")
Cuando se asigna una variable de un objeto de tipo definido por el usuario con la declaración de la palabra clave var, esta palabra clave se aplica automáticamente a todos los campos de ese objeto. Esto significa que los objetos declarados con la palabra clave var mantendrán su estado entre cada iteración, sin necesidad de reiniciar su valor de campo en cada iteración.
Al dibujar los campos de índice de los dos objetos, puede comparar las diferencias entre ellos. firstBar.index mantendrá el valor preestablecido en cada iteración, mientras que currentBar.index se reinicia en cada iteración como el valor de bar_index de la entrada actual.
Tipo de objeto para la palabra clave 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)
En Pine, el uso de la palabra clave varip puede indicar que los campos de los objetos persisten durante toda la ejecución del script y no se deslizan en columnas no confirmadas. En una declaración de tipo Counter, el campo bars no utiliza la palabra clave varip, por lo que se desplaza en cada columna no confirmada; mientras que el campo ticks utiliza la palabra clave varip, por lo que no se desplaza en la columna no confirmada. El objeto counter está declarado con la palabra clave var, por lo que continuará existiendo durante toda la ejecución del script. En cada iteración, el campo bars y el campo ticks se incrementan. El campo bars se desplaza en cada columna sin confirmar, mientras que el campo ticks no. Finalmente, se pueden comparar las diferencias entre ellos mediante el dibujo de los campos counter.bars y counter.ticks. Los valores de counter.bars se desplazarán hacia atrás en cada columna no confirmada, mientras que los valores de counter.ticks seguirán aumentando hasta que el script termine de ejecutarse.
Cambiar el valor del campo
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")
Se puede usar:=
El operador de reasignación cambia el valor de los campos de objetos.
Conjunto de objetos
El ejemplo declara una matriz vacía que guardará objetos del tipo de orden definido por el usuario:
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")
¿Qué es esto?
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")
Objeto de replicación
En Pine, los objetos se asignan por referencia. Cuando un objeto existente se asigna a una nueva variable, ambos apuntan al mismo objeto.
//@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)
En el siguiente ejemplo, creamos un objeto pivot1 y establecemos su campo x como 1000. Luego declaramos que un pivot2 contiene variables que hacen referencia a ese objeto pivot1, por lo que ambos apuntan a la misma instancia. Por lo tanto, cambiar pivot2.x también cambiará pivot1.x, ya que ambos hacen referencia al campo x del mismo objeto.
Para crear copias independientes del objeto original, en este caso podemos usar el método de copia incorporada ((); en este ejemplo, declaramos que pivot2 se refiere a una variable de la instancia de copia del objeto pivot1. Ahora, cambiar pivot2.x no cambia pivot1.x, ya que se refiere a un campo de x como un objeto separado:
//@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)
Es importante tener en cuenta que el método de copia de TradingView es la copia básica. Si un objeto tiene campos de un tipo especial (array, etc.), los campos en la copia básica de ese objeto apuntarán a la misma instancia que el objeto. La plataforma FMZ permite realizar copias profundas directamente sin necesidad de procesamiento adicional, por ejemplo:
Copia en profundidad
//@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")
Resultados de prueba, labelInfo.copy ((labelInfo1) se copia en profundidad cuando se ejecuta, modificando labelInfo1 ningún campo afectará a labelInfo2.
Los métodos del lenguaje Pine son funciones especializadas asociadas a tipos construidos o definidos por el usuario en una instancia específica. En la mayoría de los aspectos, son básicamente similares a las funciones normales, pero ofrecen una sintaxis más corta y conveniente. Los usuarios pueden usar métodos de acceso puntual directamente en las variables, al igual que para acceder a los campos de los objetos Pine.
Métodos incorporados
Por ejemplo, un código de script que dice:
//@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)
El equivalente se puede traducir como:
//@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)
Se puede ver el apoyo de PINE.Methods
Después, el código.array.avg(sourceArray)
Los usuarios pueden escribir sus métodos en la siguiente forma:sourceArray.avg()
¿Qué es esto?
Nota: FMZ no está disponible por el momento.array.avg
El nombre de la ciudad es el de la ciudad.
Métodos definidos por el usuario
Pine permite a los usuarios definir métodos personalizados para su uso junto con cualquier objeto de tipo construido o definido por el usuario. Los métodos de definición son esencialmente los mismos que las funciones de definición, pero con dos diferencias clave:
La palabra clave "method" debe estar antes del nombre de la función. Los parámetros del método, donde el tipo del primer parámetro debe ser declarado expresamente, ya que indica el tipo de objeto al que el método se asociará.
Por ejemplo, en el siguiente código, el código para calcular el indicador de Brin se envuelve como un método personalizado por el usuario:
//@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)
El nombre de la ciudad es:
//@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
¡Qué bueno!¿Cómo se puede hacer para que varios contratos de bitcoins funcionen simultáneamente?
Nube ligeraPor favor, ¿puede Pine hacer más transacciones? ¿Puede JS hacer más transacciones?
- ¿Qué quieres decir?Gracias por los detalles.
el arte¿Cómo es que el script de pine usa la placa de simulación de okex en la plataforma?
el arteEsto equivale a copiar las estrategias de tradingview directamente a las plataformas de los inventores para usarlas.
Los inventores cuantifican - sueños pequeñosEl lenguaje PINE sólo puede hacer una política de variedad única, la política de variedades múltiples es mejor o escribir el diseño en Python, JavaScript, C ++.
Los inventores cuantifican - sueños pequeñosOh, sí, OKX es muy especial, su entorno analógico y su entorno de disco real tienen la misma dirección, sólo que hay una diferencia en otro lugar.
Nube ligeraNo se puede usar el simulador okx.....
Los inventores cuantifican - sueños pequeñosEste problema de la arquitectura de la variedad no se resuelve bien, ya que cada interfaz es diferente y no se limita a la frecuencia de las interfaces, lo que genera muchos problemas.
Los inventores cuantifican - sueños pequeñosBien, gracias por la sugerencia de Cloudways, por favor informe este requerimiento.
Nube ligeraMe siento mejor mezclado con JS, JS puede adaptarse mejor a todo tipo de transacciones.
La tendencia de los cazadoresEl precio de cierre es para cada variedad, y el precio de cierre es para cada variedad.
Los inventores cuantifican - sueños pequeñosNo es muy amable.
Nube ligeraBien, gracias muchachos.
Los inventores cuantifican - sueños pequeñosHola, la política de lenguaje de PINE sólo funciona con una variedad por el momento.
Los inventores cuantifican - sueños pequeñosGracias por su apoyo. La documentación seguirá mejorando.
Los inventores cuantifican - sueños pequeñosSí, es cierto.
Los inventores cuantifican - sueños pequeñosPINE es una biblioteca de modelos, en la que los parámetros permiten configurar la dirección de base de los intercambios.