En la carga de los recursos... Cargando...

FMZ PINE Script documentación

El autor:Los inventores cuantifican - sueños pequeños, Creado: 2022-05-06 14:27:06, Actualizado: 2024-10-12 15:27:04

[TOC] ¿Qué quieres decir?

Las palabras clave, la gramática, la configuración de resúmenes

Estructura del código

La estructura general del código en Pine es la siguiente:

<version>
<declaration_statement>
<code>

Comentarios

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

Edición

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

Las declaraciones

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

El código

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.

  • Declaración de variables
  • Reasignación de las variables
  • Declaración de funciones
  • Llamadas de funciones integradas, llamadas de funciones definidas por usuarios
  • ifforwhile¿Qué es esto?switchEstructura de las ecuaciones

Las oraciones se pueden ordenar de varias maneras.

  • Algunas declaraciones pueden expresarse en una sola línea, como la mayoría de las declaraciones de variables, que contienen solo una línea para llamar a una función o una declaración de función de una sola línea; otras, como las estructuras, siempre requieren varias líneas porque requieren un bloque local.
  • Las frases de un guión en su ámbito global (es decir, las partes que no pertenecen a un subconjunto) no pueden ser interpretadas de la siguiente manera:空格¿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.
  • Las declaraciones de estructuras o de múltiples líneas de funciones siempre requieren unlocal blockUn 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.
  • Se pueden unir varias oraciones de una sola línea en una sola línea mediante el uso del punto (,) como separador.
  • Una línea puede contener comentarios o solo comentarios.
  • Las líneas también pueden ser envueltas (continúa en varias líneas).

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

Cambio de código

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

Secuencia temporal

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 incorporadasopenPor ejemplo,openLa variable interna registra el precio de apertura de cada barra de la línea K, si esto es cierto.openEs el ciclo de 5 minutos de la línea K. Entonces esto es el ciclo de 5 minutos de la línea K.openLo 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.openEs 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.

Parámetros para el modelo de la biblioteca de transacciones de lenguaje Pine

La configuración de los parámetros de la librería de transacciones de lenguaje "Pine", la plantilla incorporada de la política PINE.

img

Configuración de las transacciones

  • Cómo ejecutar Modelo de precio de cierre: el modelo se ejecuta al final del BAR actual y se ejecuta cuando comienza el BAR inferior. Modelo de precios en tiempo real: cada cambio de precio ejecuta el modelo con señales para ejecutar transacciones de inmediato.
  • Número de operaciones por defecto: Si la instrucción de negociación no especifica el número de operaciones, las operaciones se ejecutan según el número establecido.
  • Número máximo de operaciones individuales: según la cuenta real, en combinación con este parámetro de configuración, determine el número máximo de operaciones por transacción, evitando el impacto de la superficie de la cuenta.
  • El número de puntos de cambio:定价货币精度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.
  • Número de ciclos más largos de las variables: afecta el número de BAR de la línea K del gráfico, conjavascriptLlamadas en la estrategiaSetMaxBarLenLa función es la misma.

Opciones de futuros

  • Código de variedad: Código de contrato, el objeto de la bolsa es un objeto de la bolsa que no es efectivo.
  • Número mínimo de ofertas: el volumen mínimo de operaciones del contrato al momento de realizar el pedido.

Opciones de disco real

  • Auto-restaurar el progreso: Restaurar automáticamente el estado antes de que la última política se detuviera.
  • Número de repeticiones de la orden: la orden no se realiza, se revoca la orden y se vuelve a realizar la transacción, el parámetro se utiliza para limitar el número máximo de repeticiones.
  • Intervalo de consulta de red (millisecondes): solo es válido para el protocolo REST, para controlar el intervalo de las solicitudes de red y evitar que las solicitudes sean demasiado frecuentes y superen los límites de la bolsa.
  • Tiempo de sincronización de la cuenta (segunda): Periodo de tiempo para la sincronización de los datos de la cuenta.
  • Tiempo de sincronización de posiciones después de la apertura (millisegundos): solo para las posiciones repetidas causadas por el retraso de los datos de algunos intercambios, el tiempo de sincronización más grande puede mitigar este tipo de problemas.
  • El factor de apalancamiento: Configurar el factor de apalancamiento.

Negocios al contado, otras configuraciones

  • Volumen de transacción de una mano: el volumen de transacción de una mano por defecto, sólo es válido para el efectivo.
  • El volumen mínimo de transacciones: el volumen mínimo de transacciones.
  • Precisión monetaria: Precisión del precio, es decir, los dígitos menores del precio.
  • Precisión de la variedad de transacciones: Precisión de la siguiente unidad, es decir, el número de dígitos de la siguiente unidad.
  • Tarifas: para calcular algunos datos según esta configuración, 0.002 significa 2 por mil.
  • Intervalo de estadísticas de pérdidas y ganancias: solo se muestra en el disco real el uso de estadísticas de pérdidas y ganancias.
  • Fallo de reintento (millisegundos): Intervalo de reintento cuando la solicitud de red falla.
  • Agente de uso: solo es válido para el protocolo REST.
  • Esconde errores comunes en la red: Esconde errores comunes en el área de registros.
  • Cambiar la dirección de la base: solo es válido para el protocolo REST.
  • Push notifications: Push mensajes a los buzones de correo, etc.

Las transacciones

Las tiendas abiertas

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

El campo de batalla

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

Mecanismos de negociación

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

Lista de proyectos

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.entryCuando ordenamos una función, podemos especificarlimitstopLos 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,directionEl parámetro esstrategy.longEn 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)directionEl parámetro esstrategy.shortEn 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áneamentelimitstopLos parámetros, los pedidos se activan en el precio que cumple con los requisitos primero.

Porcentaje de 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)
  

Especificardefault_qty_type=strategy.percent_of_equityLuego, el ajustedefault_qty_valuePorcentaje 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).

Declaración, estructura lógica y palabras clave

el var

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 a mantiene el precio de cierre de la primera columna de cada columna en la serie. La variable B mantendrá el precio de cierre de la barra de precios de la primera barra de precios de la serie. La variable c c c mantiene el precio de cierre de la décima franja verde de la serie.

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: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 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.varvaripLas variables declaradas i, ii se ejecutan incrementalmente cada vez que se ejecuta el código de la política, ya queif truePor 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.varvaripLas 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 + 1yii := ii + 1La 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.varvaripLas variables declaradas se muestran perfectamente congruentes en el ejemplo anterior, incrementando 1 BAR por cada línea K.

variedad

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.

Es cierto

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

- No es cierto.

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

si es

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 else if.

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 sentenciasthenLa lógica en elvar_decl_then0var_decl_then1Por ejemplo, si la condición es false, se usa el bloque de sentencias.else if¿Qué es esto?elseLa lógica en elvar_decl_else0var_decl_else1Y 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_thenyreturn_expression_elseTipo: 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 omitirelseBloquear. 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 else if o no usarlos en absoluto. Los bloques de then, else if, else if se mueven en cuatro espacios:

Ejemplos

// if
x = if open > close
    5
else if high > low
    close
else
    open
plot(x)

¿Cómo se puede ignorar esto?ifEl valor del resultado de la declaración ((var_declarationX= puede omitirse) ). Puede ser útil si necesita un lado de la expresión, por ejemplo, en la negociación de estrategias:

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)

para

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

para... en

for...inLa 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_expressionEl 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_elementEn 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_declarationVariables 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...inLa 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 nuestroisPosEl valor de la matriz está configurado comotrueCuando están en nuestrovaluesArrayEl 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

mientras...

whileLas 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 expressionSe puede proporcionar un valor de inicialización para esta variable.boolean_expression- Si es verdad, ejecutawhileEl bloque local de la frase. Si es falso, se encuentra enwhileDespués de la frase, sigue ejecutando el guión.continue - continueLas palabras clave conducen a la rama circular hasta la siguiente iteración.break - breakLas palabras clave terminan el ciclo.whileLa frase se repite después de la frase.return_expression- Se ofrece.whileLas 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 esPrimariowhileEl bloque de código local después de la línea debe ser reducido a cuatro espacios o un símbolo.whileEl círculo.whileLa siguiente expresión de Boole debe convertirse en false o ejecutarse.break

el cambio

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_blockejemplo odefault_local_blockUno de ellos.default_local_blockSólo con=>Introducción con marcadores, y sólo se ejecuta cuando no se ejecuta el bloque anterior.switchEl resultado de la frase se asigna a una variable y no se especificadefault_local_blockSi no se ejecuta.local_blockLa frase se vuelve:na¿Qué es esto?switchCuando los resultados de las declaraciones se asignan a las variables, todoslocal_blockLas instancias deben devolver valores del mismo tipo.

Hasta luego. if ?:

serie

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

Operador

=

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 yswitchEn 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

y

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.

o bien

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.

No lo es

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.

Tipo de datos Palabras clave

Bool también

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

Int

Palabras clave de tipo int (integer) para declarar variables o parámetros expresamente.

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

flotación

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

la cuerda

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

el color

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

el conjunto

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

Objetos

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
  • UsotypeEl tipo de declaración de palabras clave.
  • Después de la palabra clave type, aparece el nombre del tipo.
  • Después de la primera línea type define el nombre del tipo, se reducen los cuatro espacios para definir los campos que contiene el tipo.
  • Cada campo necesita declarar su tipo de datos, por ejemplo int, float, string.

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.

  • El objeto firstBar está declarado con la palabra clave var, por lo que sus campos (index, price, vol) mantendrán su valor en cada iteración, desde la primera entrada hasta la última entrada.
  • El objeto currentBar no utiliza la declaración de la palabra clave var, por lo que sus campos se reiniciarán en cada entrada y habrá un nuevo objeto 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.

Métodos

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.MethodsDespué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.avgEl 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

Más.

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