[TOC] ¿Qué quieres decir?
La estructura general del código en Pine es la siguiente:
<version>
<declaration_statement>
<code>
Notas símbolos soportados por el lenguaje Pine de FMZ: notas de una sola línea//
, notas de varias líneas/* */
, como el método de las notas del siguiente ejemplo:
[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9) // calculate the MACD indicator
/*
The plot function draws the indicator line on the chart
*/
plot(macdLine, color = color.blue, title='macdLine')
plot(signalLine, color = color.orange, title='signalLine')
plot(histLine, color = color.red, title='histLine')
Una instrucción de compilador de la siguiente forma le dice al compilador qué versión de Pine fue escrita con el script:
//@version=5
La versión predeterminada es V5, que puede omitirse del código//@version=5
.
indicator()
strategy()
La declaración determina el tipo de script, que a su vez determina lo que está permitido en él, y cómo se utiliza y ejecuta. Establece propiedades clave del script, como su nombre, donde aparecerá cuando se agrega al gráfico, la precisión y el formato de los valores numéricos que muestra, y ciertos valores numéricos que rigen su comportamiento en tiempo de ejecución, por ejemplo, el número máximo de objetos de dibujo para mostrar en el gráfico.indicator()
o bienstrategy()
La declaración debe incluirse en un código de estrategia en Pine de FMZ.
Líneas en un script que no son comentarios o instrucciones del compilador, que son instrucciones, que implementan el algoritmo del script. Una instrucción puede ser uno de estos contenidos.
if
, for
, while
o bienswitch
y otras construccionesLas declaraciones pueden organizarse de varias maneras.
space
o bientab
Las líneas que comienzan en la primera posición de una línea son por definición parte del alcance global del script.local block
Un bloque local debe estar recubierto por una pestaña o cuatro espacios (de lo contrario, se analizará como el código concatenado de la línea anterior, que se determina como el contenido continuo de la línea anterior de código), y cada bloque local define un alcance local diferente.Por ejemplo, incluye tres bloques locales, uno en la declaración de función personalizada y dos en la declaración de variable utilizando la estructura if, como sigue:
indicator("", "", true) // Declaration statement (global scope), can be omitted
barIsUp() => // Function declaration (global scope)
close > open // Local block (local scope)
plotColor = if barIsUp() // Variable declaration (global scope)
color.green // Local block (local scope)
else
color.red // Local block (local scope)
runtime.log("color", color = plotColor) // Call a built-in function to output the log (global scope)
Las líneas largas se pueden dividir en múltiples líneas, o
a = open + high + low + close
Puede ser envuelto como (tenga en cuenta que el número de espacios recubiertos por línea no es un múltiplo de 4):
a = open +
high +
low +
close
Una llamada de trama larga puede ser envuelta como:
close1 = request.security(syminfo.tickerid, "D", close) // closing price data series of syminfo.tickerid daily level of the current trading pair
close2 = request.security(syminfo.tickerid, "240", close) // closing price data series of syminfo.tickerid 240-minute level of the current trading pair
plot(ta.correlation(close, open, 100), // Line-long plot() calls can be wrapped
color = color.new(color.purple, 40),
style = plot.style_area,
trackprice = true)
Sin embargo, dado que un bloque local debe comenzar sintácticamente con un guión (4 espacios o 1 pestaña), al dividirlo en la siguiente línea, la continuación de una instrucción debe comenzar con más de un guión (no igual a 4 múltiplos de espacios).
test(c, o) =>
ret = c > o ?
(c > o+5000 ?
1 :
0):
(c < o-5000 ?
-1 :
0)
a = test(close, open)
plot(a, title="a")
La serie temporal no es un tipo de datos o formato, sino que es un concepto de una estructura básica en el lenguaje PINE. Se utiliza para almacenar valores que cambian continuamente en el tiempo, cada valor corresponde a un punto en el tiempo. La estructura del concepto de serie temporal es adecuada para procesar y registrar una serie de datos que cambian con el tiempo.
Tome la variable incorporadaopen
Por ejemplo, elopen
la variable incorporada registra el precio de apertura de cada representación int BAR, si estaopen
es un período de 5 minutos de datos de representación int.open
La variable registra el precio de apertura de cada representación de int de 5 minutos BAR (bar).open
Para referirse a los valores anteriores (valores pasados) en la serie temporal, utilizamos el valor de apertura de la representación int actual BAR.[]
Cuando la estrategia se ejecuta en una cierta representación int BAR,open[1]
El significado es referirse al precio de apertura de la anterior representación int BAR de la actual representación int BAR.
Aunqueserie de tiempoEs muy parecido a la estructura de datos
Las series temporales diseñadas en lenguaje de pino pueden calcular fácilmente el valor acumulado del precio de cierre en el código de estrategia, y no hay necesidad de utilizar estructuras de bucle como para, sólo la función incorporadata.cum(close)
Para otro ejemplo, necesitamos calcular el valor promedio de la diferencia entre el precio más alto y el precio más bajo de los últimos 14 BARs de representación de int (es decir, los 14 BARs de representación de int más cercanos al momento actual en que se ejecuta el código), que se puede escribir como:ta.sma(high - low, 14)
El resultado de llamar a una función en una serie de tiempo también dejará un rastro en la serie de tiempo, de nuevo usamos el[]
Por ejemplo, al probar si el precio de cierre de la representación actual de int BAR excede el valor máximo del precio más alto en la última representación de int 10 BAR (excluyendo la representación actual de int BAR).breach = close > ta.highest(close, 10)[1]
, y también podemos escribirbreach = close > ta.highest(close[1], 10)
Así que...ta.highest(close, 10)[1]
yta.highest(close[1], 10)
son equivalentes.
Esto se puede verificar 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 producirá los valores de a y b en cada BAR en la serie de tiempo correspondiente.
Instrucciones para establecer los argumentos de la plantilla incorporada
Pricing Currency Precision
En este momento, el punto de deslizamiento se establece en 5, y el deslizamiento al colocar una orden es de 0.05 (el deslizamiento se refiere a la parte del precio que se desborda al colocar una orden para una mejor y una orden de comercio de desventaja).SetMaxBarLen
En eljavascript
srategy.strategy(title = "open long example", pyramiding = 3) // The number of orders placed in the same direction allowed by pyramiding
strategy.entry("long1", strategy.long, 0.01) // Open a long position at the market price, specify the group label as long1
strategy.entry("long2", strategy.long, 0.02, when = close > ta.ema(close, 10)) // The condition is triggered, the order is executed, and the market price opens a long position
strategy.entry("long3", strategy.long, 0.03, limit = 30000) // Specify the (lower) price, plan to place a buy order, wait for a deal to open a position, and open a position at a limit price
strategy(title = "close long example", pyramiding = 2) // The number of orders placed in the same direction allowed by pyramiding
strategy.entry("long1", strategy.long, 0.1) // Open a long position at the market price, specify the group label as long1
strategy.entry("long2", strategy.long, 0.1) // Open a long position at the market price, specify the group label as long2
strategy.close("long1", when = strategy.position_size > 0.1, qty_percent = 50, comment = "close buy entry for 50%") // To close a position, specify to close 50% of the positions whose group label is long1
strategy.close("long2", when = strategy.position_size > 0.1, qty_percent = 80, comment = "close buy entry for 80%") // To close a position, specify to close 80% of the positions whose group label is long2
El mecanismo de posición del lenguaje PINE es similar a la posición unidireccional. Por ejemplo, al mantener una posición en la dirección larga (posición larga), si hay una orden de operación de venta, una orden planificada, etc. (en la dirección opuesta a la posición), la ejecución se activará, y la posición en la dirección larga se cerrará primero. (Cerrar todas las posiciones largas), y luego ejecutar la orden activada (en la dirección opuesta en relación con la posición antes del cierre).
Cuando se coloca una orden utilizando el comando de colocación de órdenes, si no se especifica precio, el valor predeterminado es una orden de mercado. Además de la orden de mercado, también se puede colocar una orden a través de una orden planificada, que no opera inmediatamente para colocar una orden. La orden planificada existe en la cola de orden planificada del programa cuando no se activa, y se puede ver en la pestaña de la tabla strategy.entry
función para hacer un pedido, podemos especificar ellimit
, stop
arguments.
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 límite
Cuando la orden es una orden de compra (es decir, el precio de compra de la orden de compra de la orden de compra).direction
El argumento esstrategy.long
), la orden sólo se activará cuando el precio de mercado actual sea inferior a este precio.
Cuando la orden es una orden de venta (es decir, ladirection
El argumento esstrategy.short
), la orden sólo se activará si el precio de mercado actual es superior a este precio.
orden de detención
Cuando la orden es una orden de compra, la orden solo se activará cuando el precio de mercado actual sea mayor que este precio. Cuando una orden es una orden de venta, la orden solo se activará si el precio actual del mercado es inferior a ese precio.
orden de límite de detención
Ellimit
ystop
los argumentos pueden establecerse al mismo tiempo, y la orden se activará al precio que cumpla las condiciones primero.
//@version=5
strategy("Percent of Equity Order", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// Simple moving average crossover strategy
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
// If the moving average crossover condition is met, buy or sell
if (longCondition)
strategy.entry("Long", strategy.long)
if (shortCondition)
strategy.entry("Short", strategy.short)
Después de especificardefault_qty_type=strategy.percent_of_equity
, puestodefault_qty_value
En el caso de la orden denominada en una moneda denominada en la cuenta, la cantidad de la orden se calcula de acuerdo con la cantidad de la moneda denominada en la cuenta. Por ejemplo: si la cuenta corriente tiene 10.000 USDT, establecer una orden de 1% significa colocar una orden con una escala de 100 USDT (calculada en función del precio actual al momento de la venta).
var es una palabra clave utilizada para asignar e iniciar variables de una sola vez.
En general, la gramática de asignación de variables que no contiene la palabra clave var hace que el valor de la variable
var variable_name = expression
Explicación:
variable_name
- Cualquier nombre de una variable de usuario permitido en Pine Script (puede contener letras mayúsculas y minúsculas latinas, números y subrayados (_), pero no puede comenzar con un número).expression
Cualquier expresión aritmética, como definir una variable regular, la expresión será evaluada y asignada 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
En FMZ, se divide en modelo de precio en tiempo real y modelo de precio de cierre. Usamos el siguiente código para probar las variables declaradas porvar
yvarip
.
strategy("test pine", "test 1", true)
// Test var varip
var i = 0
varip ii = 0
// Print the i and ii changed in each round of the strategy logic on the graph
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)
// Each round of logic execution increments i and ii by 1
if true
i := i + 1
ii := ii + 1
Modelo de precios en tiempo real
El código de prueba anterior se ejecuta en dos fases: 1. fase de representación de int histórico. 2. fase de representación de int en tiempo real. En el modelo de precios en tiempo real, fase de representación de int histórico, las variables i y ii declaradas porvar
, varip
Se ejecutan incrementalmente en cada ronda de ejecución de código de estrategia (porqueif true
Por lo tanto, se puede ver que los números que se muestran en la representación int BAR del resultado de la prueba de retroceso se incrementan uno por uno. Cuando termina la fase de representación int histórica, comienza la fase de representación int en tiempo real.var
, varip
Debido a que es un modelo de precios en tiempo real, el código de estrategia se ejecutará una vez por cada cambio de precio en una representación int BAR,i := i + 1
yii := ii + 1
La diferencia es que ii se modifica cada vez. Aunque i también se modifica cada vez, el valor anterior se restablecerá cuando se ejecute la lógica de estrategia en la siguiente ronda, y el valor de i no se actualizará hasta que se complete la representación int actual BAR (es decir, el valor anterior no se restablecerá cuando se ejecute la lógica de estrategia en la siguiente ronda). Por lo tanto, se puede ver que la variable i sigue aumentando en 1 para cada BAR. Pero la variable ii se acumula varias veces para cada BAR.
Modelo de precios de cierre
Dado que el modelo de precio de cierre ejecuta la lógica de la estrategia sólo una vez por representación int BAR desaparecido.var
yvarip
En el ejemplo anterior, se comportan exactamente igual incrementalmente en el modelo de precio de cierre, tanto en la fase de representación de int histórica como en la fase de representación de int en tiempo real, incrementando en 1 por representación de int BAR.
varp (var intrabar persist) es una palabra clave utilizada para asignar e iniciar variables de una sola vez. Es similar a la palabra clave var, pero una variable declarada con varp conserva su valor entre las actualizaciones de candlestick en vivo.
varip variable_name = expression
Explicación:
variable_name
- Cualquier nombre de una variable de usuario permitido en una escritura Pine (puede contener letras mayúsculas y minúsculas latinas, números y subrayados (_), pero no puede comenzar con un número).expression
- Cualquier expresión aritmética, como el tiempo que define las variables regulares.Ejemplo
// varip
varip int v = -1
v := v + 1
plot(v)
Cuando se usa var, la gráfica devuelve el valor de bar_index. Con varip, el mismo comportamiento ocurre en barras históricas, pero en barras en vivo, el gráfico devuelve un valor que aumenta en uno por cada tick.
Las observacionesSolo se puede usar con tipos simples como float, int, bool, string y matrices de estos tipos.
Representa el valor de una variable bool, o un valor que se puede calcular cuando una expresión utiliza uncomparacióno bienes lógico operator.
Las observacionesPor favor, vea las descripciones deComparaciónOperadores yEs lógico. Operators.
Véase también
bool
Representa el valor de una variable bool y el resultado de operaciones de comparación y operaciones lógicas.
Las observacionesPor favor, vea las descripciones deComparaciónOperadores yEs lógico. Operators.
Véase también
bool
Una instrucción If define un bloque de instrucciones que deben ejecutarse cuando se cumple la condición de una expresión.
Código universal 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 observaciones
var_declarationX
- Esta variable obtiene el valor de la declaración sicondition
- Si la condición es verdadera, la lógica en el bloque de la declaraciónthen
se utiliza (var_decl_then0
, var_decl_then1
, etc.). Si la condición es falsa, la lógica en el bloque de la declaraciónelse if
o bienelse
se utiliza (var_decl_else0
, var_decl_else1
, etc.).return_expression_then
yreturn_expression_else
- La última expresión del módulo o la expresión del bloque else devuelve el valor final de la instrucción.
El tipo de valor de retorno de la instrucción if depende del tipo dereturn_expression_then
yreturn_expression_else
. Cuando se ejecuta en TradingView, sus tipos deben coincidir: cuando tiene un valor de cadena en el bloque else, no es posible devolver un valor entero del bloque de entonces. Cuando se ejecuta en el FMZ, el siguiente ejemplo no reportará un error. Cuando el valor y es
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)
Elelse
En este caso, si la condición es falsa, a la variable var_declarationX se le asigna un valor
Ejemplo
// if
x = if close > open
close
// If current close > current open, then x = close.
// Otherwise the x = na.
plot(x)
Los bloques de
Ejemplo
// if
x = if open > close
5
else if high > low
close
else
open
plot(x)
El valor resultante de laif
Puede ser útil si necesita efectos secundarios de las expresiones, 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")
Si las instrucciones pueden contenerse entre sí:
Ejemplo
// if
float x = na
if close > open
if close > close[1]
x := close
else
x := close[1]
else
x := open
plot(x)
La construcción
[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 del bucle.counter
- Una variable que mantiene el valor del contador del bucle, incrementando/decrementando en 1 o el valor step_num en cada iteración del bucle.from_num
- El valor inicial del contador. Se permiten los valores/expresiones de serie int/float.to_num
- El valor final del contador. El bucle se rompe cuando el contador es mayor que to_num (o menor que to_num en el caso de from_num > to_num). step_num
- El valor de incremento/decremento del contador. Es opcional. El valor predeterminado es +1 o -1, dependiendo del mayor de from_num o to_num. Cuando se utilizan valores, el contador también se incrementa/decremente de acuerdo con el mayor de from_num o to_num, por lo que el signo +/- de step_num es opcional.statements | continue | break
- Cualquier número de instrucciones, o las palabras clave return_expression
- El valor de retorno del bucle, si está presente, se asigna a la variable en var_declaration. Si el bucle sale debido a las palabras clave continue
- Una palabra clave que sólo puede ser usada en bucles, hace que se ejecute la siguiente iteración del bucle.break
- La palabra clave para salir del bucle.
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
Elfor...in
construct permite que se repitan múltiples instrucciones para cada elemento de la matriz. Se puede usar con cualquiera de los argumentos:array_element
, o con dos argumentos:[index, array_element]
La segunda forma no afecta a la función del bucle, sino que hace un seguimiento del índice de la iteración actual en la primera variable del tuple.
[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 a la que se asignará el valor de los buclesreturn_expression
.
index
- Una variable opcional que hace un seguimiento del índice de iteración actual. El índice comienza en 0. Las variables son inmutables dentro del cuerpo del bucle. Cuando se usa, debe estar contenida en un tuplo que también contengaarray_element
.
array_element
- Una variable que contiene cada elemento de matriz consecutivo a procesar en el bucle.array_id
- El ID de la matriz de la iteración del bucle.statements | continue | break
- Cualquier número de instrucciones, o las palabras clave return_expression
- El valor de retorno del bucle se asigna a la variable envar_declaration
Si el bucle sale debido a las palabras clave continue
- Una palabra clave que sólo puede ser usada en bucles, hace que se ejecute la siguiente iteración del bucle.break
- La palabra clave para salir del bucle.
Permite modificar elementos de una matriz o su tamaño dentro de un bucle.
Aquí, usamos la forma de un solo argumento defor...in
para determinar, para cada barra, cuántas barras tienen un valor OHLC mayor que la SMA del valor
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 la forma de dos argumentos de para...en para establecer los valores de nuestroisPos
matriz atrue
Cuando sus valores correspondientes en nuestravaluesArray
las matrices son positivas:
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
Elwhile
la declaración permite la iteración condicional de bloques de código nativos.
variable_declaration = while boolean_expression
...
continue
...
break
...
return_expression
Explicación:variable_declaration
- Declaración de variables opcional.return expression
puede proporcionar un valor de inicialización para esta variable.boolean_expression
- Si es cierto, ejecutar el bloque local de lawhile
Si es falso, la ejecución del script continúa después de lawhile
statement.
continue
- Elcontinue
La palabra clave hace que el bucle se ramifique a la siguiente iteración.break
- Elbreak
La ejecución del script se reanuda después de lawhile
statement.
return_expression
- Línea opcional que proporciona el valor de retorno de lawhile
statement.
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 observacionesEl bloque de código nativo después de la inicialwhile
Para terminar una línea debe haber cuatro espacios o una pestaña.while
bucle, la expresión booleana siguientewhile
debe llegar a ser falsa, obreak
debe ser ejecutado.
El operador de conmutación transfiere el control a una de varias instrucciones basadas en 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
cambio con expresión:
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)
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)
Las devolucionesEl valor de la última expresión en el bloque de instrucciones local ejecutado.
Las observacionesSólo uno de loslocal_block
casos odefault_local_block
puede ser ejecutado.default_local_block
sólo se introduce con el=>
El resultado de un bloque de etiquetado, y sólo se ejecuta si el bloque anterior no se ejecuta.switch
la declaración se asigna a una variable ydefault_local_block
no se especifica, la instrucción devuelvena
si eslocal_block
Cuando se asigna el resultado de unswitch
declaración a una variable, todoslocal_block
las instancias deben devolver un valor del mismo tipo.
Véase también
if
?:
serie es una palabra clave que indica el tipo de serie de datos.series
keyword.
Se utiliza para asignar valores a las variables, pero solo cuando se declara la variable (utilizada por primera vez).
El operador de asignación asigna un valor a la variable de la izquierda. Se utiliza para asignar valores a variables declaradas previamente.
Aplicable a expresiones de cualquier tipo.
expr1 != expr2
Las devolucionesValor booleano, o una secuencia de valores booleanos.
Modulo (residuo entero), aplicable a las expresiones numéricas.
expr1 % expr2
Las devolucionesValor entero o flotante, o serie de valores.
Las observacionesEn Pine Script, cuando se calcula el resto entero, el cociente se trunca, es decir, se redondea hacia el valor absoluto más bajo.
Ejemplo: -1 % 9 = -1 - 9 * truncado(-1/9) = -1 - 9 * truncado(-0.111) = -1 - 9 * 0 = -1.
Aplicable a las expresiones numéricas.
expr1 %= expr2
Ejemplo
// Equals to expr1 = expr1 % expr2.
a = 3
b = 3
a %= b
// Result: a = 0.
plot(a)
Las devolucionesValor entero o flotante, o serie de valores.
Aplicable a las expresiones numéricas.
expr1 * expr2
Las devolucionesValor entero o flotante, o serie de valores.
Aplicable a las expresiones numéricas.
expr1 *= expr2
Ejemplo
// Equals to expr1 = expr1 * expr2.
a = 2
b = 3
a *= b
// Result: a = 6.
plot(a)
Las devolucionesValor entero o flotante, o serie de valores.
Adición o unario más. Aplicable a expresiones numéricas o cadenas.
expr1 + expr2
+ expr
Las devolucionesEl binario+
de la cadena devuelve la combinación de expr1 y expr2
Número devuelve un valor entero o con coma flotante, o una secuencia de valores:
El binario
Las observacionesPuede utilizar operadores aritméticos con números, así como con variables de serie.
Se aplica a expresiones numéricas o cadenas.
expr1 += expr2
Ejemplo
// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)
Las devolucionesPara cadenas, devuelve la concatenación de expr1 y expr2. Para números, devuelve un valor entero o flotante, o serie de valores.
Las observacionesPuede utilizar operadores aritméticos con números, así como con variables de serie.
Sustracción o menos unario. Aplicable a las expresiones numéricas.
expr1 - expr2
- expr
Las devolucionesDevuelve un valor entero o con coma flotante, o una serie de valores:
El binario -
devuelve la negación de expr.
Las observacionesPuede utilizar operadores aritméticos tanto con números como con variables de serie.
Aplicable a las expresiones numéricas.
expr1 -= expr2
Ejemplo
// Equals to expr1 = expr1 - expr2.
a = 2
b = 3
a -= b
// Result: a = -1.
plot(a)
Las devolucionesValor entero o flotante, o serie de valores.
Aplicable a las expresiones numéricas.
expr1 / expr2
Las devolucionesValor entero o flotante, o serie de valores.
Aplicable a las expresiones numéricas.
expr1 /= expr2
Ejemplo
// Equals to expr1 = expr1 / expr2.
a = 3
b = 3
a /= b
// Result: a = 1.
plot(a)
Las devolucionesValor entero o flotante, o serie de valores.
Aplicable a las expresiones numéricas.
expr1 < expr2
Las devolucionesValor booleano, o serie de valores booleanos.
Menor o igual a. Aplicable a las expresiones numéricas.
expr1 <= expr2
Las devolucionesValor booleano, o serie de valores booleanos.
Es aplicable a expresiones de cualquier tipo.
expr1 == expr2
Las devolucionesValor booleano, o serie de valores booleanos.
El operador switch
statements.
La gramática de la declaración de la función es:
<identifier>([<argument_name>[=<default_value>]], ...) =>
<local_block>
<function_result>
A. El trabajo.<local_block>
es cero o más instrucciones de Pine Script.<function_result>
es una variable, una expresión, o un tuplo.
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 enmiendasPuede obtener más información sobre las funciones definidas por el usuario en las páginas del Manual del usuario sobre las funciones de declaración y las bibliotecas de guiones.
Más grande que. aplicable a las expresiones numéricas.
expr1 > expr2
Las devolucionesValor booleano, o serie de valores booleanos.
Más grande o igual a. Aplicable a las expresiones numéricas.
expr1 >= expr2
Las devolucionesValor booleano, o serie de valores booleanos.
Operador condicional ternario.
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)
Las devolucionesexpr2 si expr1 se evalúa como verdadero, expr3 de lo contrario. El valor cero (0 y también NaN, +Infinity, -Infinity) se considera falso, cualquier otro valor es verdadero.
Las observacionesUtilice na para
Véase también
na
El subíndice de la serie proporciona acceso a los valores anteriores de la serie expr1. expr2 es el número de barras en el pasado, y debe ser numérico.
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)
Las devolucionesUna serie de valores.
Véase también
math.floor
Lógico y aplicable a las expresiones booleanas.
expr1 and expr2
Las devolucionesValor booleano, o serie de valores booleanos.
OR lógico, aplicable a las expresiones booleanas.
expr1 or expr2
Las devolucionesValor booleano, o serie de valores booleanos.
La negación lógica (NOT) es aplicable a las expresiones booleanas.
not expr1
Las devolucionesValor booleano, o serie de valores booleanos.
Palabra clave utilizada para declarar explícitamente el tipo
Ejemplo
// bool
bool b = true // Same as `b = true`
b := na
plot(b ? open : close)
Las observacionesMencionar explícitamente el tipo en una declaración de variable es opcional, excepto cuando se inicializa con na.
Véase también
var
varip
int
float
color
string
true
false
Palabra clave utilizada para declarar explícitamente el tipo
Ejemplo
// int
int i = 14 // Same as `i = 14`
i := na
plot(i)
Las observacionesMencionar explícitamente el tipo en una declaración de variable es opcional, excepto cuando se inicializa con na.
Véase también
var
varip
float
bool
color
string
Palabra clave utilizada para declarar explícitamente el tipo
Ejemplo
// float
float f = 3.14 // Same as `f = 3.14`
f := na
plot(f)
Las observacionesMencionar explícitamente el tipo en una declaración de variable es opcional, excepto cuando se inicializa con na.
Véase también
var
varip
int
bool
color
string
Palabra clave utilizada para declarar explícitamente el tipo
Ejemplo
// string
string s = "Hello World!" // Same as `s = "Hello world!"`
// string s = na // same as ""
plot(na, title=s)
Las observacionesMencionar explícitamente el tipo en una declaración de variable es opcional, excepto cuando se inicializa con na.
Véase también
var
varip
int
float
bool
str.tostring
str.format
Palabra clave utilizada para declarar explícitamente el tipo
Ejemplo
// color
color textColor = color.green
if barstate.islastconfirmedhistory
runtime.log("test", textcolor = textColor)
Las observacionesLos literales de color tienen el siguiente formato: #RRGGBB o #RRGGBBAA. Los pares de letras representan valores hexadecimales de 00 a FF (0 a 255 en decimal) donde los pares RR, GG y BB son los valores para los componentes rojos, verdes y azules del color. AA es un valor opcional para la transparencia del color (o componente alfa) donde 00 es invisible y FF opaco. Cuando no se suministra el par AA, se usa FF. Las letras hexadecimales pueden ser mayúsculas o minúsculas.
Mencionar explícitamente el tipo en una declaración de variable es opcional, excepto cuando se inicializa con na.
Véase también
var
varip
int
float
string
color.rgb
color.new
Palabra clave utilizada para declarar explícitamente el tipo array.new<type>
, array.from
function.
Ejemplo
// array
array<float> a = na
a := array.new<float>(1, close)
plot(array.get(a, 0))
Las observacionesLos objetos de matriz son siempre de forma
Véase también
var
array.new
array.from
Los objetos en el lenguaje PINE son instancias de tipos definidos por el usuario (UDT), que se pueden entender como clases sin métodos que permiten a los usuarios crear tipos personalizados en estrategias para organizar diferentes valores en una entidad.
Definición de los tipos
Definamos un tipo de orden para almacenar la información de la orden:
type order
float price
float amount
string symbol
type
keyword.Creación de objetos
Utilizando el tipo declarado, llame alnew()
función para crear un objeto:
order1 = order.new()
order1 = order.new(100, 0.1, "BTC_USDT")
order1 = order.new(amount = 0.1, symbol = "BTC_USDT", price = 100)
También puede crear objetos vacíos:
order order1 = na
Veamos 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) // Output {"data":{"price":46002.8,"amount":1,"symbol":"swap"},"_meta":0,"_type":"order"}
En este ejemplo:
order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
También se puede escribir como:
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 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 utiliza la palabra clave var para declarar una variable asignada a un objeto de un tipo definido por el usuario, la palabra clave se aplica automáticamente a todos los campos del objeto.
Al trazar los campos de índice de los dos objetos, puede comparar las diferencias entre ellos. firstBar.index mantendrá el valor establecido previamente en cada iteración, mientras que currentBar.index se reinicializará en cada iteración al valor bar_index de la entrada actual.
Tipos de objetos para el uso de 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, la palabra clave varip se utiliza para indicar que los campos de un objeto persisten durante toda la ejecución del script y no vuelven a rodar en barras no confirmadas. En la declaración del tipo Contador, el campo bares no utiliza la palabra clave varip, por lo que se vuelve a rodar en cada barra no confirmada. El objeto contador se declara utilizando la palabra clave var, por lo que persiste durante toda la ejecución del script. En cada iteración, tanto el campo de barras como el campo de ticks se incrementan en 1. Por último, al trazar los campos counter.bars y counter.ticks, puede comparar la diferencia entre ellos. El valor de counter.bars vuelve a rodar en cada barra no confirmada, mientras que el valor de counter.ticks continúa aumentando hasta el final de la ejecución del script.
El mendigo¿Por qué las estrategias de la Plaza de Replicación de la estrategia de Pine no pueden ser reales?
Los inventores cuantifican - sueños pequeñosBien, vamos a ver qué pasa.
El mendigoEl rastreador de tendencias optimizado de Zhang
Los inventores cuantifican - sueños pequeñosHola, ¿cuál es la estrategia en concreto?