[TOC]
La estructura general que sigue el código en Pine:
<version>
<declaration_statement>
<code>
Los signos de comentarios para el soporte de lenguaje Pine de FMZ: comentarios de una sola línea//
¿Qué es lo que está pasando?/* */
Por ejemplo, en el siguiente ejemplo, la forma de escribir los comentarios:
[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')
La siguiente forma de instrucciones de compilador le dice al compilador en qué versión de Pine está escrito el script:
//@version=5
Versión v5 por defecto, puede omitirse en el código//@version=5
。
indicator()
strategy()
Las declaraciones determinan el tipo de script, que a su vez determina qué contenido está permitido en él, y cómo se usa y se ejecuta. Establece las propiedades clave del script, como su nombre, dónde aparecerá cuando se agregue a la tabla, la precisión y el formato de los valores que muestra, y los valores para administrar ciertos comportamientos cuando se ejecute, como el número máximo de objetos de dibujo que mostrará en la tabla. Para las estrategias, las propiedades incluyen parámetros de retroalimentación, como capital inicial, comisiones, puntos de deslizamiento, etc.indicator()
ostrategy()
Declaración de la declaración.
Las líneas que no son comentarios o instrucciones del compilador en un script son declaraciones, que implementan el algoritmo del script. Una declaración puede ser uno de estos elementos.
if
,for
,while
oswitch
Estructura de las placasLas oraciones se pueden ordenar de muchas maneras.
空格
o制表符
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 bloque local debe resumir en un marcador o en cuatro espacios (de lo contrario, se analizará como una secuencia de la línea anterior de código, es decir, se juzgará como un contenido continuo de la línea anterior de código), y cada bloque local define un rango local diferente.Por ejemplo, se incluyen tres bloques locales, uno en la declaración de la función personalizada y dos en la declaración de la variable con 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 pueden ser divididas en varias líneas, o “envueltas”. Las líneas envueltas deben reducirse en cualquier cantidad de espacios, siempre que no sea un múltiplo de 4.
a = open + high + low + close
Puede ser envasado en (tenga en cuenta que el número de espacios en cada línea no es un múltiplo de 4):
a = open +
high +
low +
close
Una llamada a una trama larga puede ser empaquetada como ▽.
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 oraciones en las declaraciones de funciones definidas por el usuario también pueden ser empaquetadas. Sin embargo, debido a que el bloque local debe comenzar gramaticalmente con una contracción (((4 espacios o 1 símbolo), cuando se divide a la siguiente línea, la parte de continuación de la oración debe comenzar con una contracción o más ((( no es igual a un múltiplo de 4 espacios)).
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 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. La estructura de este concepto de secuencia de tiempo es adecuada para procesar y registrar una serie de datos que cambian con el tiempo.
Variables incluidasopen
Por ejemplo:open
La variable incorporada registra el precio de apertura de cada línea KBAR, si estaopen
Es el dato de un ciclo de 5 minutos de la línea K.open
Lo que se registra en la variable es el precio de apertura por cada 5 minutos de la línea K BAR (columna). Cuando su programa de estrategia se ejecuta, el código hace referencia aopen
Es decir, se cita el precio de apertura de la línea BAR de la línea K en la que se encuentra actualmente. Para citar el valor anterior en la secuencia de tiempo (valor pasado), usamos[]
El operador histórico, cuando la estrategia se ejecuta en una línea KBAR,open[1]
Se refiere al precio de apertura de la línea K BAR anterior a la línea K BAR actual.
AunqueSecuencia de tiempoEs fácil pensar en la estructura de datos “arrayones”, aunque el lenguaje PINE también tiene tipos de arrays. Pero son conceptos completamente diferentes de las secuencias temporales.
El lenguaje PINE diseñó la secuencia de tiempo para que los valores acumulados de los precios de cierre se puedan calcular fácilmente en el código de la estrategia, sin necesidad de utilizar una estructura de ciclo como for, solo con funciones incorporadas en el lenguaje PINE.ta.cum(close)
Por ejemplo, necesitamos calcular el promedio de la diferencia entre el valor máximo y el valor mínimo de las últimas 14 líneas de K BAR (es decir, las 14 líneas de K BAR más cercanas al momento en que se ejecuta el código). Se puede escribir como:ta.sma(high - low, 14)
Los resultados de las llamadas a una función en una secuencia de tiempo también pueden dejar huellas en la secuencia de tiempo.[]
El operador histórico cita el valor anterior. Por ejemplo, cuando se prueba si el precio de cierre de la línea K BAR actual supera el valor máximo de la máxima de las últimas 10 líneas K BAR (excluyendo la línea K BAR actual). Se puede escribir comobreach = close > ta.highest(close, 10)[1]
También se puede escribir:breach = close > ta.highest(close[1], 10)
Por eso.ta.highest(close, 10)[1]
yta.highest(close[1], 10)
Es el equivalente.
El código de verificación es el siguiente:
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 en su correspondiente secuencia de tiempo, y se puede ver que a y b son siempre iguales, por lo que ambos métodos de representación son equivalentes.
Citaciones de datos históricos
En Trading View hay un límite máximo de artículos para referencias históricas (hasta 5.000 artículos), como el siguiente código:
//@version=6
indicator("test")
ema = ta.ema(close, 10000) // 报错:Error on bar 0: The 'ema'->'sum' function references too many historical candles (10000), the limit is 5000.
plot(ema, "ema")
// pre10000 = ema[10000] // 报错:Invalid number of bars back specified in the history-referencing operator. It accepts a value between 0 and 5000.
// plot(pre10000, "pre10000")
“Configuración de transacciones” en la base de datos de transacciones de lenguaje Pine, con el parámetro “número de períodos más largos de variables” para configurar el número máximo de datos que se pueden citar.
indicator("test")
ema = ta.ema(close, 1000) // ema = ta.ema(close, 3000) 则报错:Invalid number 3000 of bars back specified in the history-referencing operator. It accepts a value between 0 and 2000.
plot(ema, "ema")
El parámetro “número de ciclos más largos de la variable” no debe ser demasiado grande, el rango de referencia de datos en la política adecuada puede ser:
La configuración de los parámetros de la plantilla de la política de PINE, “Pine Language Exchange Repository”.
定价货币精度
El parámetro y el parámetro determinan el precio de deslizamiento en el momento de la orden. Por ejemplo, la precisión de la moneda de cotización es de 2, es decir, precisa al segundo decimal, precisa a 0.01. Entonces, cada punto en el número de puntos de deslizamiento representa 0.01 unidades de cotización.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 mantenimiento de posiciones en el lenguaje PINE es similar al de la posición unidireccional. Por ejemplo, cuando se mantiene una posición en la dirección opuesta a la de la posición, si hay órdenes de venta, planes de operación, etc. que se ejecutan en la dirección opuesta a la de la posición, se eliminan primero las posiciones en la dirección opuesta a la de la posición, y luego se ejecutan las órdenes que se activan en la dirección opuesta a la de la posición anterior.
Cuando se usa la orden de pedido, si no se especifica ningún precio, el listado es el listado por defecto. Además del listado se puede ordenar a través del listado de planes, el listado de planes no opera el listado de planes de inmediato. El listado de planes puede estar en la cola de comisiones del programa que no existe en el momento de la activación.Disco vivo y retroalimentaciónLa información de estado en el tiempo (es decir, la barra de estado de la estrategia en ejecución) se ve en la sección de la tabla “Pedidos programados”. El sistema realmente ordenará solo cuando los precios en tiempo real del mercado cumplan con las condiciones que desencadenan estos planes. Por lo tanto, es normal que estos pedidos tengan una ligera desviación en el precio de transacción.strategy.entry
Cuando la función se ordena, podemos especificarlimit
、stop
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
Establecer el precio límite de la orden cuando la orden es de compra (es decir,direction
Los parámetros sonstrategy.long
), el pedido sólo se activa cuando el precio actual del mercado es inferior a ese precio.
Cuando el pedido es para venta por encargo (es decir,direction
Los parámetros sonstrategy.short
La orden se activa sólo cuando el precio actual en el mercado es superior a ese precio.
Establecer el precio de parada de la orden, cuando la orden es una compra, la orden se activará solo si el precio actual del mercado es superior a ese precio. Cuando una orden es una oferta, la orden se activa solo cuando el precio actual del mercado es inferior a ese precio.
Se puede configurar simultáneamentelimit
、stop
Parámetros, los pedidos se activan al primer precio que cumpla las condiciones.
//@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)
Específicodefault_qty_type=strategy.percent_of_equity
Después de la configuracióndefault_qty_value
En porcentaje ((0 ~ 100), 1 es el 1%. El pedido se calcula de acuerdo con la cantidad de monedas en la cuenta. Por ejemplo: la cuenta actual tiene 10000 USDT, establece un pedido del 1%, es decir, el pedido de pedido se calcula con la escala de 100 USDT (según el precio actual al vender).
var es la palabra clave para asignar y initializar variables una vez. Por lo general, la sintaxis de asignación de variables que no incluye la palabra clave var hace que el valor de la variable se cubra cada vez que se actualiza el dato. Por el contrario, cuando se usan las palabras clave var para asignar variables, a pesar de la actualización del dato, se puede mantener la barra de estado y solo cambiarla si se cumplen las condiciones de las if-expressions.
var variable_name = expression
La explicación:
variable_name
- Cualquier nombre de la variable de usuario permitida en Pine Script puede incluir caracteres latinos mayúsculas y minúsculas, números y sublinados_), pero no puede comenzar con un número) 。expression
- Cualquier expresión aritmética, como la definición de una variable regular. Se calcula la expresión y se asigna a la variable una vez.Ejemplo
// 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 ‘a’ mantiene el valor de cierre de la primera columna de cada columna de la serie. La variable ‘b’ mantiene el precio de cierre de la primera barra de precios de aluminio verde de la serie. La variable ‘c’ mantiene el precio de cierre de la décima naranja verde de la serie.
En la FMZ, se dividen en modelos de precios en tiempo real, modelos de precios de cierre, y modelos de precios de cierre para los mercados de divisas.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 al ejecutarse: 1) la etapa histórica de la línea K; 2) la etapa de la línea K en tiempo real; 3) cuando se trata de un modelo de precios en tiempo real, la etapa de la línea K histórica.var
、varip
Las variables i, ii de la declaración se ejecutan incrementalmente cada vez que se ejecuta el código de la estrategia.if true
Por lo tanto, se ejecuta el bloque de código condicional correspondiente). Por lo tanto, se puede ver que los números que aparecen en la línea BAR de los resultados de la medición son cada uno incrementados por 1. Cuando la etapa histórica de la línea K termina, comienza la etapa de la línea K en tiempo real.var
、varip
Las variables declaradas comienzan a cambiar de forma diferente. Como se trata de un modelo de precios en tiempo real, el código de la estrategia se ejecuta una vez cada cambio de precio dentro de una línea KBAR.i := i + 1
yii := ii + 1
La diferencia es que ii se modifica cada vez que se ejecuta. Aunque i también se modifica cada vez, el siguiente ciclo de ejecución de la lógica de la estrategia restablece el valor anterior, y el valor de i se actualiza hasta que la línea KBAR actual termine (es decir, no se restablece el valor anterior en el siguiente ciclo de ejecución de la lógica de la estrategia).
Modelo de precio de cierre
Dado que el modelo de precios de cierre es una lógica de estrategia que se ejecuta cuando cada K-line BAR termina. En el modelo de precios de cierre, la fase de la línea K histórica y la fase de la línea K en tiempo real, son las siguientes:var
、varip
Las variables declaradas se muestran de manera muy consistente en el ejemplo anterior, incrementando 1BAR por cada línea K.
varip ((var intrabar persist) es una palabra clave utilizada para asignar y initializar variables una vez. Es similar a la palabra clave var, pero las variables que usan la declaración varip conservan su valor entre las actualizaciones de la línea K en tiempo real.
varip variable_name = expression
La explicación:
variable_name
- Cualquier nombre de una variable de usuario permitida en el guión de Pine que pueda contener caracteres latinos mayúsculas y minúsculas, números y sublinados_), pero no puede comenzar con un número) 。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 sola vez.Ejemplo
// varip
varip int v = -1
v := v + 1
plot(v)
Con var, el gráfico devuelve el valor de bar_index. Con 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 por cada tick.
Las notas Solo se puede usar con tipos simples, como float, int, bool, string, y con arrays de estos tipos.
Representa el valor de una variable de tipo Boole, o cuando la expresión es usadaComparaciónoLa lógicaValores que se pueden calcular cuando el operador es ≠
Las notas Véase tambiénComparaciónEl operador yLa lógicaDescripción del operador
Véase también
bool
Indica el valor de una variable de tipo Boole, y el resultado de las operaciones comparativas y lógicas.
Las notas Véase tambiénComparaciónEl operador yLa lógicaDescripción del operador
Véase también
bool
Las sentencias If definen los bloques de sentencias que deben ejecutarse para cumplir con los requisitos de la expresión. La lengua de scripting Pine, versión 4, permite usar la sintaxis de else if.
El código general 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
Las notas
var_declarationX
- Esta variable obtiene el valor de la declaración if
condition
- Si la condición es verdadera, se usa el bloque de sentenciasthen
La lógica envar_decl_then0
,var_decl_then1
Si la condición es false, se usa el bloque de sentencias.else if
oelse
La lógica envar_decl_else0
,var_decl_else1
¿Qué es lo que está sucediendo?
return_expression_then , return_expression_else
- La última expresión en el módulo o la expresión de la bloqueelse devolverá el valor final de la frase. Si la declaración de la variable está al final, su valor será el resultado.
El tipo de valor que devuelve la declaración if depende dereturn_expression_then
yreturn_expression_else
Cuando se ejecuta en TradingView, sus tipos deben coincidir: cuando tienes un valor de cadena en el bloque else, no es posible devolver un valor entero desde el bloque then. Cuando se ejecuta en FMZ, el siguiente ejemplo no se equivocará, y cuando el valor de y toma el valor “open”, el valor del gráfico de trazado es n/a.
Ejemplo
// 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
En este caso, si la condición es false, se asigna un valor de valencia vacío a la variable var_declarationX (na, false o ):
Ejemplo
// 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 else if o ninguno. Los bloques de then, else if y else se mueven en cuatro espacios:
Ejemplo
// if
x = if open > close
5
else if high > low
close
else
open
plot(x)
Se puede ignorar.if
El valor de resultado de la expresión ((var_declarationX= se puede omitir) . Puede ser útil si necesita efectos secundarios de la expresión, por ejemplo, en el comercio de estrategias:
Ejemplo
if (ta.crossover(high, low))
strategy.entry("BBandLE", strategy.long, stop=low)
else
strategy.cancel(id="BBandLE")
Las sentencias If pueden incluir:
Ejemplo
// 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 ejecución repetida de varias sentencias:
[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.
counter
- Variables que guardan el valor del contador de vuelta, incrementando/disminuyendo 1 o el valor step_num en cada repetición de vuelta.
from_num
- Los valores iniciales del contador ≠ permiten el uso de una serie de valores / expresiones ≠ int / float.
to_num
- El valor final del contador. Cuando el contador es mayor que to_num (o menor que to_num en el caso de from_num > to_num), el ciclo se interrumpe. Se permite el uso de los valores de flotación/expresiones de la serie int/float, pero solo se evalúan en la primera iteración del ciclo.
step_num
- El valor de incremento/decrecimiento del contador. Es opcional. El valor por defecto es +1 o -1, dependiendo del mayor de from_num o to_num.
statements | continue | break
- Un número arbitrario de frases, o las palabras clave ‘continue’ o ‘break’, reducidas a 4 espacios o una tab.
return_expression
- El valor de retorno del ciclo, si existe, se asigna a la variable en la declaración de var. Si el ciclo se retira debido a la palabra clave de la barra de continuidad o de la barra de ruptura, el valor de retorno del ciclo es el valor de la última variable asignada antes de la salida del ciclo.
continue
- Palabras clave que sólo se pueden usar en la vuelta.
break
- Palabras clave para salir de la círculo.
Ejemplo
// 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))
Véase también
for...in
while
for...in
La estructura permite ejecutar varias instrucciones repetidas para cada elemento de la matriz. Se puede usar con cualquier parámetro:array_element
, o con los dos siguientes parámetros:[index, array_element]
La segunda forma no afecta a la función del ciclo. Se trata de un índice que sigue 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 a la secuencia dereturn_expression
El valor de
index
- Variables opcionales que siguen el índice de la iteración actual. El índice comienza en 0. La variable es inmutable en el cuerpo circular.array_element
En el subgrupo
array_element
- Contiene la variable de cada elemento de la serie que se va a procesar en el ciclo. Esta variable es inmutable en el cuerpo del ciclo.
array_id
- ID de la matriz de la repetición del círculo.
statements | continue | break
- Un número arbitrario de frases, o las palabras clave ‘continue’ o ‘break’, reducidas a 4 espacios o una tab.
return_expression
- El valor de la vuelta asignado avar_declaration
La variable, si existe. Si el ciclo se extingue debido a las palabras clave ‘continue’ o ‘break’, el valor de retorno del ciclo es la última variable asignada antes de que el ciclo se extingue.
continue
- Palabras clave que sólo se pueden usar en la vuelta.
break
- Palabras clave para salir de la círculo.
Permite modificar los elementos de la matriz o su tamaño en el ciclo.
En este caso, usamosfor...in
Para determinar cuántos valores de OHLC de la línea K son mayores que los valores de SMA de ‘close’ en cada línea K, se utiliza la forma monoparámetrica de:
Ejemplo
// 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 formas de parámetros de for…in para hacer nuestroisPos
El valor de la matriz es true
Cuando están en nuestrovaluesArray
El valor correspondiente en la matriz es el tiempo real:
Ejemplo
// 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))
Véase también
for
while
array.sum
array.min
array.max
while
La sentencia permite la iteración condicional de bloques de código locales.
variable_declaration = while boolean_expression
...
continue
...
break
...
return_expression
La explicación:
variable_declaration
- Declaraciones 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 oración. Si es false, entonces enwhile
Después de la frase, continúa con el guión.
continue
- continue
La palabra clave conduce a la siguiente generación.
break
- break
Las palabras clave terminan el ciclo.while
La sentencia fue restablecida.
return_expression
- Se lo ofrecemos.while
La línea opcional que devuelve el valor de la frase.
Ejemplo
// 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)
Las notas
El comienzo.while
El bloque de código local después de la línea debe resumirse en cuatro espacios o un marcador. Terminar.while
El ciclo.while
La siguiente expresión de Boole debe convertirse en false, o debe ejecutarse.break
。
El operador switch transfiere el control a una de las varias sentencias dependiendo de la condición y el valor de 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
El nombre de la página web es:
Ejemplo
// 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)
El cambio sin expresión:
Ejemplo
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)
Devuelve el valor El valor de la última expresión en el bloque de declaraciones locales ejecutadas.
Las notas
Sólo ejecutarlocal_block
Ejemplos odefault_local_block
Uno de ellos.default_local_block
Sólo con=>
La marca se introduce junto y sólo se ejecuta si no se ejecuta el bloque anterior. Siswitch
El resultado de la sentencia se asigna a una variable y no se especificadefault_local_block
Si no se ejecuta,local_block
, la frase regresana
¿Qué es eso?switch
Cuando el resultado de una sentencia se asigna a una variable, todoslocal_block
La instancia debe devolver el mismo tipo de valor.
Véase también
if
?:
series es una palabra clave que indica el tipo de serie de datos.series
Las palabras clave suelen ser innecesarias.
Se utiliza para dar un valor a una variable, pero solo cuando se declara una variable (por primera vez).
El operador de asignación, que asigna un valor a la variable de la izquierda. Se utiliza para asignar un valor a la variable declarada anteriormente.
No es igual a ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠
expr1 != expr2
Devuelve el valor El valor de Bur, o una serie de valores de Bur.
Número modulo ((número entero sobrante) . Aplicación para expresiones numéricas .
expr1 % expr2
Devuelve el valor Número entero o valor de punto flotante, o una serie de valores.
Las notas En el guión de Pine, cuando se calcula el resto de los números enteros, el negocio se interrumpe. Es decir, se redondea hasta el mínimo absoluto. El valor ganado 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。
La asignación de módulos. Se aplica a las expresiones numéricas.
expr1 %= expr2
Ejemplo
// Equals to expr1 = expr1 % expr2.
a = 3
b = 3
a %= b
// Result: a = 0.
plot(a)
Devuelve el valor Número entero o valor de punto flotante, o una serie de valores.
La multiplicación se aplica a las expresiones numéricas
expr1 * expr2
Devuelve el valor Número entero o valor de punto flotante, o una serie de valores.
La multiplicación se aplica a las expresiones numéricas.
expr1 *= expr2
Ejemplo
// Equals to expr1 = expr1 * expr2.
a = 2
b = 3
a *= b
// Result: a = 6.
plot(a)
Devuelve el valor Número entero o valor de punto flotante, o una serie de valores.
Añadir o poner un número positivo. Aplicable a expresiones numéricas o cadenas de caracteres.
expr1 + expr2
+ expr
Devuelve el valor
El binario de la cadena+
Regresa la combinación de expr1 y expr2
El número devuelve un número entero o un valor de punto flotante, o una serie de valores:
El binario ‘+’ devuelve expr1 más expr2。
El valor de 1 y el valor de 1 + el valor de 1 devuelven expr (sin añadir nada a la simetría del operador de 1 y 1).
Las notas Se pueden usar operadores de aritmética con números, así como series de variables. En caso de usar series, los operadores se aplican a los elementos.
La designación de la adición se aplica a las expresiones numéricas o a las cadenas .
expr1 += expr2
Ejemplo
// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)
Devuelve el valor Para las cadenas de caracteres, devuelve la secuenciación de expr1 y expr2. Para los números, devuelve un valor entero o de punto flotante, o una serie de valores.
Las notas Se pueden usar operadores de aritmética con números, así como series de variables. En caso de usar series, los operadores se aplican a los elementos.
El método de la subtracción o el número unitaria negativa. Se aplica a la expresión numérica.
expr1 - expr2
- expr
Devuelve el valor
Devuelve un valor entero o de punto flotante, o una serie de valores:
El binario ‘+’ devuelve expr1 menos expr2。
Unidad-
Regresa la expresión negativa de expr ≠
Las notas Se pueden usar operadores de aritmética con números, así como series de variables. En caso de usar series, los operadores se aplican a los elementos.
Se aplica a las expresiones numéricas.
expr1 -= expr2
Ejemplo
// Equals to expr1 = expr1 - expr2.
a = 2
b = 3
a -= b
// Result: a = -1.
plot(a)
Devuelve el valor Número entero o valor de punto flotante, o una serie de valores.
Las excepciones. Se aplican a las expresiones numéricas.
expr1 / expr2
Devuelve el valor Número entero o valor de punto flotante, o una serie de valores.
La designación de la excepción ≠ aplica para las expresiones numéricas ≠
expr1 /= expr2
Ejemplo
// Equals to expr1 = expr1 / expr2.
a = 3
b = 3
a /= b
// Result: a = 1.
plot(a)
Devuelve el valor Número entero o valor de punto flotante, o una serie de valores.
Menos de ≠ se aplica a las expresiones numéricas ≠
expr1 < expr2
Devuelve el valor El valor de Bur, o una serie de valores de Bur.
Menos o igual a . Se aplica a las expresiones numéricas .
expr1 <= expr2
Devuelve el valor El valor de Bur, o una serie de valores de Bur.
Es igual a … Aplicable a cualquier tipo de expresión . .
expr1 == expr2
Devuelve el valor El valor de Bur, o una serie de valores de Bur.
El operador ‘=>’ se utiliza para la declaración de funciones definidas por el usuario yswitch
En la frase:
La sintaxis de la declaración de la función es:
<identifier>([<parameter_name>[=<default_value>]], ...) =>
<local_block>
<function_result>
Uno de ellos.<local_block>
Es decir, cero o más frases de Pine.
<function_result>
Es una variable, una expresión o un grupo.
Ejemplo
// 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))
Las notas Puede obtener más información sobre las funciones definidas por el usuario en las páginas de las funciones declaradas y de la biblioteca de scripts del manual del usuario.
Más que ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠
expr1 > expr2
Devuelve el valor El valor de Bur, o una serie de valores de Bur.
Es mayor o igual que . Se aplica a las expresiones numéricas .
expr1 >= expr2
Devuelve el valor El valor de Bur, o una serie de valores de Bur.
El operador de la condición tridimensional.
expr1 ? expr2 : expr3
Ejemplo
// 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)
Devuelve el valor Si expr1 es evaluado como verdadero, expr2 es evaluado como verdadero, y si no es evaluado como verdadero, expr3 es evaluado como verdadero. Los valores de cero ((0 y NaN+, Infinity,-Infinity) son considerados falsos, y todos los demás valores son considerados verdaderos.
Las notas Si no lo necesita, utilice na como sucursales de else. Se puede combinar el uso de dos o más?: operadores para implementar una declaración similar a la de la barra de conmutación (ver el ejemplo anterior). Se pueden usar operadores de aritmética con números, así como series de variables. En caso de usar series, los operadores se aplican a los elementos.
Véase también
na
La subsiguiente de la serie。 proporciona 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 float será redondeado hacia abajo。
expr1[expr2]
Ejemplo
// [] 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)
Devuelve el valor Una serie de valores.
Véase también
math.floor
La lógica AND ≠ se aplica a las expresiones de Boole.
expr1 and expr2
Devuelve el valor El valor de Bur, o una serie de valores de Bur.
La lógica OR。 se aplica a las expresiones de Boole。
expr1 or expr2
Devuelve el valor El valor de Bur, o una serie de valores de Bur.
La inversión lógica es NOT. Se aplica a las expresiones de Boole.
not expr1
Devuelve el valor El valor de Bur, o una serie de valores de Bur.
Palabras clave del tipo bool ((bool)) para una variable o un parámetro declarado explícitamente. Los valores de la variable “Bool” pueden ser verdadero, falso o na.
Ejemplo
// bool
bool b = true // Same as `b = true`
b := na
plot(b ? open : close)
Las notas Es opcional mencionar claramente el tipo en la declaración de la variable, a menos que se inicie con na. Para más información sobre el tipo Pine, consulte la página del manual del usuario del sistema de tipos.
Véase también
var
varip
int
float
color
string
true
false
Palabras clave de tipo int para una variable o un parámetro declarados explícitamente.
Ejemplo
// int
int i = 14 // Same as `i = 14`
i := na
plot(i)
Las notas Es opcional mencionar claramente el tipo en la declaración de la variable, a menos que se inicie con na. Para más información sobre el tipo Pine, consulte la página del manual del usuario del sistema de tipos.
Véase también
var
varip
float
bool
color
string
Palabras clave del tipo float para una variable o un parámetro declarado explícitamente.
Ejemplo
// float
float f = 3.14 // Same as `f = 3.14`
f := na
plot(f)
Las notas Es opcional mencionar claramente el tipo en la declaración de la variable, a menos que se inicie con na.
Véase también
var
varip
int
bool
color
string
Palabras clave del tipo “string” para variables o parámetros declarados explícitamente.
Ejemplo
// string
string s = "Hello World!" // Same as `s = "Hello world!"`
// string s = na // same as ""
plot(na, title=s)
Las notas Es opcional mencionar claramente el tipo en la declaración de la variable, a menos que se inicie con na. Para más información sobre el tipo Pine, consulte la página del manual del usuario del sistema de tipos.
Véase también
var
varip
int
float
bool
str.tostring
str.format
Palabras clave del tipo “color” para una variable o un parámetro de declaración explícita.
Ejemplo
// color
color textColor = color.green
if barstate.islastconfirmedhistory
runtime.log("test", textcolor = textColor)
Las notas Los caracteres de color tienen el siguiente formato: #RRGGBB o #RRGGBBAA. Los pares de letras representan los dieciséis digitos de 00 a FF ((de 0 a 255 en decimal), donde RR, GG y BB son los valores de las proporciones de rojo, verde y azul de los colores. AA es el porcentaje de transparencia de color (o el porcentaje de alfa), donde 00 no se ve y FF no es transparente. Cuando no se proporciona el par de AA, se usa FF. Los pares de letras de dieciséis digitos pueden escribirse en mayúscula o en minúscula. Es opcional mencionar claramente el tipo en la declaración de la variable, a menos que se inicie con na. Para más información sobre el tipo Pine, consulte la página del manual del usuario del sistema de tipos.
Véase también
var
varip
int
float
string
color.rgb
color.new
Las palabras clave del tipo de columna de la matriz de columnas que se usan para declarar variables o parámetros explícitamente.array.new<type>
,array.from
La función crea un objeto de la matriz ((o ID) }}.
Ejemplo
// array
array<float> a = na
a := array.new<float>(1, close)
plot(array.get(a, 0))
Las notas Los objetos de la matriz son siempre en forma de una serie de pilas.
Véase también
var
array.new
array.from
Los objetos de la lengua PINE son ejemplos de tipos definidos por el usuario (UDT), que pueden entenderse como clases sin métodos, permitiendo a los usuarios crear tipos personalizados en la política para organizar diferentes valores en una entidad.
Definición del tipo
Vamos a definir un tipo de orden para guardar la información del pedido:
type order
float price
float amount
string symbol
type
Tipo de declaración de la palabra claveObjeto de creación
Utiliza el tipo declarado bueno, llamadanew()
Objeto de creación de la función:
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 vacíos:
order order1 = na
A continuación vemos un ejemplo real:
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 siguiente es una de ellas:
order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
También puede escribirse 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 el uso de la 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 usa una declaración de la palabra clave var para asignar una variable a un objeto de un tipo definido por el usuario, la palabra clave se aplica automáticamente a todos los campos de ese objeto. Esto significa que un objeto declarado a través de la palabra clave var mantendrá su estado entre cada iteración sin la necesidad de reiniciar su valor de campo en cada iteración.