FMZ PINE Script Documentación

Creado el: 2022-05-06 14:27:06, Actualizado el: 2025-01-23 10:19:06
comments   18
hits   13760

[TOC]

Palabras clave, gramática y descripción de la configuración

Estructura del código

La estructura general que sigue el código en Pine:

<version>
<declaration_statement>
<code>

Comentarios

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')

Ediciones

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

Declaración de las declaraciones

  • 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.

Código

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.

  • Declaración de las variables
  • Revalorización de las variables
  • Declaración de la función
  • Invocación de funciones integradas y definidas por el usuario
  • ifforwhileoswitchEstructura de las placas

Las oraciones se pueden ordenar de muchas maneras.

  • Algunas declaraciones pueden expresarse en una sola línea, como la mayoría de las declaraciones de variables, que contienen una sola línea de llamada de función o una declaración de función de una sola línea. Otras, como las estructuras, siempre requieren más de una línea, ya que requieren un bloque local.
  • Las declaraciones en el ámbito global de un script (es decir, las partes que no pertenecen a bloques locales) no pueden ser consideradas空格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.
  • Una estructura o una declaración de funciones de varias líneas siempre requiere unlocal blockUn 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.
  • Las oraciones de una sola línea se pueden enrolar en una línea usando el comma ((,) como separador.
  • Una línea puede contener comentarios o simplemente comentarios.
  • Las líneas también pueden ser envueltas (continúa en varias líneas).

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)  // 调用一个内置函数输出日志 (全局范围)

Cambiar el código

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")

Secuencia de tiempo

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 incluidasopenPor ejemplo:openLa variable incorporada registra el precio de apertura de cada línea KBAR, si estaopenEs el dato de un ciclo de 5 minutos de la línea K.openLo 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 aopenEs 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.

FMZ PINE Script Documentación

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:

Parámetros de la versión de la biblioteca de clases de intercambio de la lengua Pine

La configuración de los parámetros de la plantilla de la política de PINE, “Pine Language Exchange Repository”.

FMZ PINE Script Documentación

Configuración de las operaciones

  • Ejecución Modelo de cierre de precios: ejecuta el modelo al final del BAR actual y ejecuta la operación al comienzo del BAR subyacente. Modelo de precios en tiempo real: ejecuta el modelo cada vez que el precio cambia y ejecuta la operación inmediatamente cuando hay una señal.
  • Número de manos de apertura de posición por defecto: si la instrucción de negociación no especifica el número de operaciones, ejecute las operaciones de acuerdo con el número establecido.
  • Máxima cantidad de órdenes en una sola transacción: De acuerdo con el descubierto real, en combinación con la configuración de este parámetro, determine la cantidad máxima de órdenes en una sola transacción para evitar el impacto en el cuadro.
  • Puntos de deslizamiento: según定价货币精度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.
  • Número de ciclos más largos de la variable: el número de líneas KBAR que afectan el gráfico, yjavascriptLlamadas en la estrategiaSetMaxBarLenLa función es la misma.

Opciones de futuros

  • Código de variedad: Código de contrato, que solo se necesita configurar cuando el objeto de la bolsa es un objeto de la bolsa no en efectivo.
  • Número mínimo de transacciones: el número mínimo de transacciones en el contrato al momento de la orden.

Opciones reales

  • Regreso automático: Regreso automático al estado anterior a la parada de la última estrategia.
  • Número de reintentos de pedido: el pedido no se realiza, se cancela el pedido y se vuelve a ordenar el intento de negociación, el parámetro se utiliza para limitar el número máximo de reintentos.
  • Intervalo de encuestas de red ((millisecondos): solo es válido para el protocolo REST, controla el intervalo de peticiones de red y evita que las peticiones sean demasiado frecuentes y sobrepasen los límites de la bolsa.
  • Tiempo de sincronización de cuentas (segundos): el período de tiempo para la sincronización de datos de cuentas.
  • Tiempo de sincronización de posiciones después de la apertura de la posición (millisecondas): solo para la repetición de la apertura de posiciones causada por el retraso de los datos de algunas bolsas, la configuración de un tiempo de sincronización más grande puede mitigar este tipo de problemas.
  • Módulo de multiplicador de palanca: establece el multiplicador de palanca.

Comercio en efectivo, otras configuraciones

  • Volumen de transacción de una sola mano: El volumen de transacción de una sola mano por defecto es válido solo para el efectivo.
  • Volumen mínimo de transacciones: el volumen mínimo de transacciones.
  • Precisión monetaria: Precisión de precios, es decir, el número de dígitos en el precio.
  • Precisión de la variedad de transacción: Precisión de la siguiente orden, es decir, los dígitos menores de la siguiente orden.
  • Cuotas de servicio: Para algunos datos calculados con esta configuración, 0.002 representa 2 milésimas.
  • Intervalos de pérdidas y ganancias: solo se utilizan las estadísticas de pérdidas y ganancias para mostrar en el disco.
  • Fallo en el intento de repetición ((ms): intervalo de repetición en el fallo de la solicitud de red。
  • Uso de un agente: sólo es válido para el protocolo REST
  • Ocultar errores comunes de la red: Ocultar errores comunes en la zona de registro.
  • La dirección de base de conmutación: sólo es válida para el protocolo REST.
  • Notificaciones de envío: envío de mensajes al buzón de correo, etc.

Realizar un pedido

La apertura de una posición

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)                          // 指定(较低的)价格,计划下买单订单,等待成交开仓,限价开仓

Posiciones estables

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%持仓

Mecanismo de intercambio

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.

Plan de trabajo

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.entryCuando la función se ordena, podemos especificarlimitstopPará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 el precio límite de la orden cuando la orden es de compra (es decir,directionLos 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,directionLos parámetros sonstrategy.shortLa orden se activa sólo cuando el precio actual en el mercado es superior a ese precio.

  • Orden de detención

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.

  • Orden de límite de parada

Se puede configurar simultáneamentelimitstopParámetros, los pedidos se activan al primer precio que cumpla las condiciones.

Porcentaje de derechos y intereses

//@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_equityDespués de la configuracióndefault_qty_valueEn 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).

Declaración, Palabras clave de la estructura lógica

var

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.varvaripLas 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.varvaripLas variables i, ii de la declaración se ejecutan incrementalmente cada vez que se ejecuta el código de la estrategia.if truePor 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.varvaripLas 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 + 1yii := ii + 1La 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:varvaripLas variables declaradas se muestran de manera muy consistente en el ejemplo anterior, incrementando 1BAR por cada línea K.

varip

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.

true

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

false

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

if

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 sentenciasthenLa lógica envar_decl_then0var_decl_then1Si la condición es false, se usa el bloque de sentencias.else ifoelseLa lógica envar_decl_else0var_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_thenyreturn_expression_elseCuando 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 omitirelseEn 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.ifEl 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)

for

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

for...inLa 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_expressionEl 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_elementEn 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_declarationLa 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...inPara 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 nuestroisPosEl valor de la matriz es trueCuando están en nuestrovaluesArrayEl 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

whileLa 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 expressionSe puede proporcionar un valor de inicialización para esta variable. boolean_expression- Si es verdad, ejecutawhileEl bloque local de la oración. Si es false, entonces enwhileDespués de la frase, continúa con el guión. continue - continueLa palabra clave conduce a la siguiente generación. break - breakLas palabras clave terminan el ciclo.whileLa sentencia fue restablecida. return_expression- Se lo ofrecemos.whileLa 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.whileEl bloque de código local después de la línea debe resumirse en cuatro espacios o un marcador. Terminar.whileEl ciclo.whileLa siguiente expresión de Boole debe convertirse en false, o debe ejecutarse.break

switch

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_blockEjemplos odefault_local_blockUno de ellos.default_local_blockSólo con=>La marca se introduce junto y sólo se ejecuta si no se ejecuta el bloque anterior. SiswitchEl resultado de la sentencia se asigna a una variable y no se especificadefault_local_blockSi no se ejecuta,local_block, la frase regresana¿Qué es eso?switchCuando el resultado de una sentencia se asigna a una variable, todoslocal_blockLa instancia debe devolver el mismo tipo de valor.

Véase también if ?:

series

series es una palabra clave que indica el tipo de serie de datos.seriesLas palabras clave suelen ser innecesarias.

El operador

=

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 ((-19) = -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 yswitchEn 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

and

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.

or

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.

not

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.

Tipo de datos clave

bool

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

int

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

float

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

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

color

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

array

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.fromLa 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

Objects

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
  • usartypeTipo de declaración de la palabra clave
  • Después de la palabra clave type está el nombre del tipo.
  • La primera línea type define el nombre del tipo, luego se enciende en cuatro espacios para definir el campo que contiene el tipo.
  • Cada campo debe declarar su tipo de datos, por ejemplo, int, float, string.

Objeto 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.

  • El firstBar se declara con la palabra clave var, por lo qu