Tutorial de introducción al lenguaje cuantitativo PINE de Inventor

Creado el: 2022-05-30 16:23:43, Actualizado el: 2022-09-28 17:10:21
comments   0
hits   8860

[TOC]

Tutorial de introducción al lenguaje cuantitativo PINE de Inventor

El video tutorial también incluye: ¿Es muy difícil entrar en el comercio de cantidades? usando el trading view del lenguaje Pine desde el pequeño blanco hasta el gran dios Quant - el primer experto en el lenguaje Pine

La plataforma de comercio cuantitativo del inventor admite la estrategia de programación en el lenguaje Pine, admite la retroalimentación, las estrategias del lenguaje Pine en vivo, y es compatible con versiones más bajas del lenguaje Pine.Plaza de la estrategiaHay una gran cantidad de estrategias y scripts de Pine que han sido recopilados y trasladados.

FMZ no solo es compatible con el lenguaje Pine, sino también con la potente función de dibujo del lenguaje Pine. Las funciones de la plataforma FMZ, las herramientas prácticas y la administración eficiente y fácil, también mejoran aún más la utilidad de la estrategia y el guión de Pine. FMZ se basa en la compatibilidad con el lenguaje Pine, y al mismo tiempo se ha realizado un cierto grado de extensión, optimización y corte del lenguaje Pine.

En resumen, algunas de las diferencias más evidentes:

  • 1 Política de Pine en FMZ, identificación de la versión al comienzo del código//@versionY el código comienzastrategyindicatorLas frases no son obligatorias y FMZ no las soporta por el momento.importImportadolibraryfunción.

Algunas de las estrategias que se pueden ver son las siguientes:

  //@version=5
  indicator("My Script", overlay = true)
  src = close
  a = ta.sma(src, 5)
  b = ta.sma(src, 50)
  c = ta.cross(a, b)
  plot(a, color = color.blue)
  plot(b, color = color.black)
  plotshape(c, color = color.red)

O lo que se puede leer es:

  //@version=5
  strategy("My Strategy", overlay=true)

  longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
  if (longCondition)
      strategy.entry("My Long Entry Id", strategy.long)

  shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
  if (shortCondition)
      strategy.entry("My Short Entry Id", strategy.short)

En la FMZ se puede simplificar como:

  src = close
  a = ta.sma(src, 5)
  b = ta.sma(src, 50)
  c = ta.cross(a, b)
  plot(a, color = color.blue, overlay=true)
  plot(b, color = color.black, overlay=true)
  plotshape(c, color = color.red, overlay=true)

O también:

  longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
  if (longCondition)
      strategy.entry("My Long Entry Id", strategy.long)

  shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
  if (shortCondition)
      strategy.entry("My Short Entry Id", strategy.short)
  • 2 , estrategia [script] Algunas configuraciones relacionadas con la transacción son establecidas por el parámetro “Pine Language Transaction Class Library” en la interfaz de estrategia FMZ.

    • Modelo de precios de cierre y modelo de precios en tiempo real En la vista comercial, podemos pasar porstrategyLa función decalc_on_every_tickParámetros para configurar la estrategia El script ejecuta la lógica de la estrategia en tiempo real cada vez que el precio cambia, en este momentocalc_on_every_tickLos parámetros se deben ajustar atruePor defectocalc_on_every_tickEl parámetro esfalseLa lógica de la estrategia se ejecuta cuando la línea K BAR actual de la estrategia se ha agotado completamente. En FMZ se puede configurar a través de los parámetros de la plantilla de la biblioteca de clases de intercambio de lenguaje Pine.

    Tutorial de introducción al lenguaje cuantitativo PINE de Inventor

    • La precisión de los valores como el precio, la cantidad de pedidos al momento de ejecutar la estrategia debe ser controlada en la FMZ En la vista de trading, ya que solo se puede hacer una prueba de simulación, no hay problemas de precisión de la hora de la orden en el mercado real. En FMZ, se puede ejecutar la estrategia de Pine en el mercado real. Entonces, se necesita una estrategia que pueda especificar con flexibilidad la precisión del precio de la variedad de transacciones y la precisión de la cantidad de pedidos.

    • Código del contrato a plazo La variedad de transacción en FMZ si es un contrato, tiene 2 propiedades: “pareja de transacción” y “código de contrato”. Además de la necesidad de configurar claramente el par de transacción en el disco y en la retrospectiva, también se necesita un código de contrato específico configurado en el parámetro “código de variedad” de la plantilla de la biblioteca de transacciones del lenguaje Pine. Por ejemplo, los contratos de perpetuidad se rellenanswapEl código de contrato se puede especificar en función de si el intercambio en el que se opera tiene un contrato de este tipo. Por ejemplo, los contratos trimestrales de todos los intercambios se pueden completar aquí.quarterEstos códigos de contratos coinciden con los códigos de contratos futuros definidos en la documentación de la API de lenguaje Javascript/python/c++ de FMZ.

Para otros ajustes, por ejemplo, la cantidad mínima de pedido, el número de pedido por defecto, etc., consulte la documentación en el idioma Pine.La base de datos de intercambio de la lengua PineIntroducción a los parámetros

  • 3、runtime.debugruntime.logruntime.errorFunción de extensión de FMZ para la delimitación de la función.

En la plataforma FMZ se han añadido 3 funciones para la desinstalación.

  • runtime.debug: La función no se usa generalmente para imprimir información de variables en el control.

  • runtime.log: contenido de salida en el registro │ FMZ PINE tiene una función específica para el lenguaje │

    runtime.log(1, 2, 3, close, high, ...),可以传多个参数。
    
  • runtime.errorCuando se llama: se produce un error de ejecución y un mensaje de error como se indica en el parámetro message.

    runtime.error(message)
    
    1. parte de la función de dibujo se ha ampliadooverlayparámetro

Funciones de dibujo en el lenguaje Pine en FMZplotplotshapeplotcharSe ha incrementadooverlayEl soporte de parámetros permite especificar el dibujo en el gráfico principal o en el gráfico secundario.overlayconfiguracióntruedibujado en el mapa principal, configurado comofalseDibujar en subdibujos. Permite que la estrategia Pine en FMZ se ejecute dibujando el gráfico principal y el gráfico secundario al mismo tiempo.

  • 5、syminfo.mintickValoración de las variables incorporadas

syminfo.mintickLa variable interna se define como el valor de medida mínimo de la variedad actual. En la FMZOferta firme/Prueba retrospectivaEl parámetro de la plantilla Precisión de la moneda de precio en la interfaz de la biblioteca de clases de negociación del lenguaje Pine permite controlar este valor. La Precisión de la moneda de precio se establece en 2, es decir, el precio es preciso hasta el segundo dígito decimal en el momento de la negociación, y la unidad de cambio mínimo en el precio es de 0,01 .syminfo.mintickPor ejemplo, el valor de 0.01 ≠ 0.01 ≠ 0.01.

  • 6. El precio medio en FMZ PINE Script es el precio que incluye la comisión

Por ejemplo: el precio de pedido es de 8000, la dirección de venta, la cantidad de 1 mano (un), el precio promedio después de la transacción no es de 8000, es inferior a 8000 (el costo incluye los honorarios).

Fundamentos de la lengua Pine

Al comenzar a aprender las bases del lenguaje Pine, es posible que no estemos familiarizados con las instrucciones y la gramática del código de algunos ejemplos. No importa si no entendemos, podemos familiarizarnos primero con los conceptos, comprender el propósito de la prueba o consultar la documentación del lenguaje Pine de FMZ para ver las instrucciones. Luego, siga el tutorial paso a paso para familiarizarse con la gramática, las instrucciones, las funciones y las variables integradas.

Ejecución del modelo

En la introducción al aprendizaje de la lengua Pine, es muy necesario conocer los conceptos relacionados con el proceso de ejecución de los programas de escritura en la lengua Pine. Las políticas de la lengua Pine se ejecutan en base a gráficos, que se pueden entender como una serie de cálculos y operaciones que se ejecutan en la tabla en orden cronológico, comenzando por los primeros datos que ya se han cargado en la tabla. La cantidad de datos cargados inicialmente en la tabla es limitada.bar_indexCita el índice de la línea K Bar en el momento de la ejecución de la secuencia de comandos Pine.

plot(bar_index, "bar_index")

Tutorial de introducción al lenguaje cuantitativo PINE de Inventor

plotLa función es una de las que más usaremos en el futuro. Es muy sencillo de usar, es dibujar líneas en el gráfico de acuerdo a los parámetros introducidos, y los datos introducidos sonbar_indexLa línea se llamabar_indexSe puede ver que la línea llamada bar_index en la primera barra tiene un valor de 0 y aumenta a la derecha con el incremento de la barra.

La configuración de la política varía, y el modelo de ejecución de la política también varía.收盘价模型y实时价模型El concepto de modelo de precios de cierre, modelo de precios en tiempo real, también se ha presentado brevemente anteriormente.

  • Modelo de precio de cierre

Cuando se ejecuta el código de la estrategia, el ciclo de la barra de la línea K actual se ejecuta completamente, y cuando la barra de la línea K se cierra, el ciclo de la línea K ha terminado. En este momento se ejecuta una vez más la lógica de la estrategia Pine, y la señal de transacción desencadenada se ejecutará al comienzo de la siguiente barra de la línea K.

  • Modelo de precios en tiempo real

Cuando se ejecuta el código de la estrategia, la barra de la línea K actual, sea cerrada o no, ejecuta la lógica de la estrategia de Pine una vez por cada cambio de movimiento, y la señal de transacción desencadenada se ejecuta inmediatamente.

Cuando la estrategia del lenguaje Pine se ejecuta de izquierda a derecha en el gráfico, la barra de líneas K en el gráfico se divide en历史Bary实时Bar¿Qué es eso?

  • Bar de la historia

Cuando se inicia la ejecución de la estrategia configurada como “modelo de precios reales”, todas las barras K de la gráfica, excepto la barra K de la parte más derecha, son历史Bar◦ La lógica de la estrategia en cada uno历史BarSe ejecutará una sola vez. Cuando se inicia la ejecución de una estrategia configurada como “modelo de precio de cierre”, todas las barras en el gráfico son历史Bar◦ La lógica de la estrategia en cada uno历史BarSe ejecutará una sola vez.

Los cálculos basados en la barra de historial: El código de la estrategia se ejecuta una vez en la barra de historia cerrada, y luego continúa ejecutándose en la siguiente barra de historia hasta que todas las barras de historia se ejecuten una vez.

  • Bar en tiempo real

Cuando la estrategia se ejecuta en la última barra de la línea K de la parte más derecha, la barra es la barra real. Cuando la barra real se cierra, la barra se convierte en una barra pasada (y se convierte en una barra histórica). La parte más derecha de la gráfica genera una nueva barra real.

Cuando la estrategia se configura como “modelo de precios en tiempo real” para comenzar a ejecutarse, se ejecuta una lógica de estrategia por cada cambio de movimiento en la barra en tiempo real. Cuando se inicia la ejecución de una estrategia configurada como “modelo de precio de cierre”, el gráfico no muestra la barra en tiempo real.

Basado en el cálculo de Bar en tiempo real: Si la estrategia está configurada como un gráfico de “modelo de precio de cierre” y no muestra la barra en tiempo real, el código de la estrategia se ejecuta solo una vez al cierre de la barra actual. Si la política se configura como “modelo de precio de mercado real”, el cálculo en la barra de tiempo real y el historial en la barra de tiempo real son completamente diferentes, y cada cambio en la barra de tiempo real ejecuta un código de política. Por ejemplo, las variables incorporadashighlowcloseEn el Bar histórico es cierto, en el Bar en tiempo real es posible que estos valores cambien cada vez que la situación cambia. Por lo tanto, los indicadores y otros datos calculados en base a estos valores también cambian en tiempo real.closeEl precio es el precio actual, y el precio de venta es el precio actual.highylowSiempre representan los máximos y mínimos alcanzados desde el inicio de la barra en tiempo real actual. Estas variables incorporadas representan los valores finales de la última actualización de la barra en tiempo real.

Mecanismo de retroceso en la ejecución de la estrategia en el Bar en tiempo real (modelo de precios en tiempo real): En la ejecución de Bar en tiempo real, cada nueva generación de la estrategia ejecuta una variable definida por el usuario preestablecido, conocida como revertir. Para entender el mecanismo de revertir con un ejemplo, el siguiente código de prueba.

Aviso:

  /*backtest 
  ...
  ..
  .
  */

El paquete contiene información de configuración de retroalimentación guardada en código en la plataforma FMZ.

  /*backtest
  start: 2022-06-03 09:00:00
  end: 2022-06-08 15:00:00
  period: 1m
  basePeriod: 1m
  exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
  */

  var n = 0
  if not barstate.ishistory
      runtime.log("n + 1之前, n:", n, " 当前bar_index:", bar_index)
      n := n + 1
      runtime.log("n + 1之后, n:", n, " 当前bar_index:", bar_index)

  plot(n, title="n")

Tutorial de introducción al lenguaje cuantitativo PINE de Inventor

Tutorial de introducción al lenguaje cuantitativo PINE de Inventor

En realidad, sólo estudiamos las escenas que se ejecutan en el Bar en tiempo real, así que usamosnot barstate.ishistoryLa restricción de expresión se aplica solo a las variables n en tiempo real en Bar, y se usa antes y después de ejecutar la operación de acumulación.runtime.logLa información de salida de la función está en el registro de la política.plotLa curva trazada n se puede ver cuando la estrategia se encuentra en la barra de historial y n siempre es 0. Cuando se ejecuta en la barra de tiempo real, se desencadena una operación de n + 1 y se ejecuta una operación de n + 1 en cada ronda de ejecución de la estrategia en la barra de tiempo real. Se puede observar a partir de la información del registro que cada ronda de ejecución del código de la estrategia n se restablece al valor final de la anterior ejecución de la estrategia Bar.

En resumen: 1. La estrategia se ejecuta una vez cada vez que se actualiza el código de la estrategia cuando la barra de tiempo real se inicia. 2. Cuando se ejecuta en la barra de tiempo real, se vuelve a rodar la variable antes de ejecutar el código de la política. 3 Cuando se ejecuta en la barra de tiempo real, la variable se presenta una vez en la actualización de cierre.

Las operaciones de dibujo, como las curvas en el gráfico, también pueden causar un rediseño debido a la regresión de los datos, por ejemplo, si modificamos el código de prueba que acabamos de probar, prueba en disco:

  var n = 0
  if not barstate.ishistory
      runtime.log("n + 1之前, n:", n, " 当前bar_index:", bar_index)
      n := open > close ? n + 1 : n
      runtime.log("n + 1之后, n:", n, " 当前bar_index:", bar_index)

  plot(n, title="n")

Captura de pantalla del momento A Tutorial de introducción al lenguaje cuantitativo PINE de Inventor

Captura de pantalla del momento B Tutorial de introducción al lenguaje cuantitativo PINE de Inventor

La única cosa que hemos cambiado es esta frase:n := open > close ? n + 1 : nEn la primera gráfica (momento A) se agrega n, ya que el precio de apertura es más alto que el precio de cierre (momento B), la curva de la gráfica muestra el valor de 5 . Luego, la tendencia cambia, el precio se actualiza como se muestra en la segunda gráfica (momento B). En esta ocasión, el precio de apertura es inferior al precio de cierre (momento A), el valor de n se retrasa y no se agrega 1. La curva de la gráfica n también se vuelve a dibujar de inmediato, en esta ocasión, la curva de n es de 4.

  • Contexto de las variables en la función

A continuación, vamos a estudiar las variables en las funciones de la lengua Pine. De acuerdo con la descripción de algunos de los tutoriales de Pine, las variables en la función y las variables fuera de la función tienen la siguiente diferencia:

La historia de las variables de la serie utilizadas en la función Pine se crea con cada llamada consecutiva de la función. Si no se llama a la función en cada columna en la que se ejecuta el script, esto dará lugar a diferencias entre los valores de la historia de la serie interna y externa de la función en el bloque local. Por lo tanto, si no se llama a la función en cada columna, las series que utilizan el mismo valor de índice dentro y fuera de la función no citan el mismo punto de historia.

No importa, lo averiguamos a través de un código de prueba que se ejecuta en FMZ:

  /*backtest
  start: 2022-06-03 09:00:00
  end: 2022-06-08 15:00:00
  period: 1m
  basePeriod: 1m
  exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
  */

  f(a) => a[1]
  f2() => close[1]  

  oneBarInTwo = bar_index % 2 == 0
  plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A")   
  plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")   
  plot(close[2], title = "close[2]", color = color.red, overlay = true)
  plot(close[1], title = "close[1]", color = color.green, overlay = true)

Captura de pantalla de la detección en funcionamiento

Tutorial de introducción al lenguaje cuantitativo PINE de Inventor

El código de prueba es más sencillo y se utiliza principalmente para examinar los datos citados de dos maneras:f(a) => a[1]yf2() => close[1]

  • f(a) => a[1]La forma en que la función regresa al final:a[1]

  • f2() => close[1]Utiliza las variables incorporadas directamente:closeLa última función que regresa es ,close[1]

[]Símbolo utilizado para referenciar el valor histórico de una variable de una serie de datos, close[1] es decir, el precio de cierre de la barra anterior al precio de cierre actual. En total, nuestro código de prueba muestra 4 datos en la tabla:

  • plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A") Dibujar un carácter A, color rojo, cuando oneBarInTwo es verdadero, y dibujarlo en la posición (en el eje Y) como:f(close)El valor devuelto es:

  • plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B") Dibujar un carácter en B, color verde, cuando oneBarInTwo es verdadero, y dibujarlo en la posición (en el eje Y) como:f2()El valor devuelto es:

  • plot(close[2], title = "close[2]", color = color.red, overlay = true) La línea de dibujo, de color rojo, se dibuja en la posición (en el eje Y) como:close[2]Es decir, el precio de cierre en la barra de la barra 2a a la izquierda.

  • plot(close[1], title = "close[1]", color = color.green, overlay = true) La línea de dibujo, de color verde, se dibuja en la posición (en el eje Y) como:close[1]Es decir, el precio de cierre en la barra del número 1 del lado izquierdo de la barra actual.

Se puede ver en la secuencia de comandos ejecutados a través de la estrategia de retroalimentación, aunque el dibujo A marca la función utilizadaf(a) => a[1]Y la función de dibujo B marcadof2() => close[1]Se utiliza[1] para referirse a los datos históricos de la serie de datos, pero la posición de los marcadores “A” y “B” en el gráfico es completamente diferente. La posición del marcador “A” siempre cae en la línea roja, es decir, el código de la estrategiaplot(close[2], title = "close[2]", color = color.red, overlay = true)En la línea que se dibuja, los datos que se usan son:close[2]

Tutorial de introducción al lenguaje cuantitativo PINE de Inventor

La razón es que el índice a través de la barra de la línea K, es decir, las variables incorporadasbar_indexCalcular si se dibujan las marcas “A” y “B”. Las marcas “A” y “B” no se dibujan en cada barra de línea K.f(a) => a[1]Los valores que se citan de esta manera se relacionan con la función si la función no se llama en cada barra.f2() => close[1]Este modo de citar los valores es diferente (aunque se utilice[1] con el mismo índice) [2].

  • Algunas funciones incorporadas necesitan ser calculadas en cada barra para calcular correctamente su resultado.

Un ejemplo simple de esto es:

  res = close > close[1] ? ta.barssince(close < close[1]) : -1
  plot(res, style = plot.style_histogram, color=res >= 0 ? color.red : color.blue)

Vamos a llamar a la función de códigota.barssince(close < close[1])Se escribe en un operador triangularcondition ? value1 : value2Esto ha llevado a que sólo enclose > close[1]Cuando se llama a la función ta.barssince.ta.barssinceLa función se calcula desde la última vezclose < close[1]El número de líneas K al momento de la creación. La función ta.barssince se llama close > close[1], es decir, el precio de cierre actual es mayor que el precio de cierre de la barra anterior, cuando se llama la función ta.barssince cuya condición es close < close[1] no se ha establecido, ni tampoco la última vez que se estableció.

ta.barssince: Cuando se llama, la función devuelve na。 si la condición nunca se ha cumplido antes de la línea K actual.

Como se muestra en la figura:

Tutorial de introducción al lenguaje cuantitativo PINE de Inventor

Por lo tanto, cuando se dibuja el gráfico, solo se dibuja el dato cuando la variable res tiene un valor ((-1) }}.

Para evitar este problema, sólo tenemos queta.barssince(close < close[1])La llamada de la función toma el operador triangular y lo escribe en la parte externa de cualquier posible subdivisión condicional. Esto hace que el cálculo se realice en cada barra de la línea K.

  a = ta.barssince(close < close[1])
  res = close > close[1] ? a : -1
  plot(res, style = plot.style_histogram, color=res >= 0 ? color.red : color.blue)

Tutorial de introducción al lenguaje cuantitativo PINE de Inventor

Secuencia de tiempo

El concepto de secuencia temporal es muy importante en el lenguaje Pine, es un concepto que debemos entender cuando aprendemos el lenguaje Pine. La secuencia temporal no es un tipo, sino una estructura básica para almacenar una serie de valores de las variables a lo largo del tiempo. Sabemos que los scripts de Pine están basados en gráficos, y el contenido más básico que se muestra en los gráficos es el gráfico de líneas K. La secuencia temporal en la que cada valor está asociado a una barra de tiempo de una barra de líneas K.openEs una variable interna en el lenguaje Pine, cuya estructura es la secuencia de tiempo de almacenamiento de los precios de apertura de cada línea K de Bar. Se puede interpretar comoopenEsta estructura de secuencia de tiempo representa el precio de apertura de todas las barras de la línea K desde el primer bar en el inicio de la línea K hasta el bar ejecutado en el guión actual. Si la línea K actual es de 5 minutos de duración, entonces en el código de la estrategia de Pine utilizamos la referencia ((o))openEl precio de apertura de la barra de línea K en la ejecución actual del código de la estrategia.[]El operador se utiliza cuando la estrategia Pine se ejecuta en una barra de línea K.open[1]Indicación de las referenciasopenEl precio de apertura de la barra de línea K anterior a la barra de línea K ejecutada por el guión actual en la secuencia de tiempo (es decir, el precio de apertura del ciclo de línea K anterior).

  • Las variables en la secuencia de tiempo son muy fáciles de calcular Lo que hacemos es que tenemos una función interna.ta.cumPor ejemplo:
  ta.cum

  Cumulative (total) sum of `source`. In other words it's a sum of all elements of `source`.
  ta.cum(source) → series float
  RETURNS
  Total sum series.
  ARGUMENTS
  source (series int/float)
  SEE ALSO
  math.sum

Código de prueba:

  v1 = 1
  v2 = ta.cum(v1)
  plot(v1, title="v1")
  plot(v2, title="v2")
  plot(bar_index+1, title="bar_index")

Hay muchas similitudes.ta.cumEste tipo de función incorporada puede procesar directamente datos en una secuencia de tiempo, por ejemplota.cumEs decir, sumamos los valores correspondientes de las variables transmitidas en cada barra de la línea K, y luego usamos un gráfico para facilitar la comprensión.

El proceso de ejecución de la estrategia es la variable bar_index | - | - | - | - | La estrategia se ejecuta en la primera línea de K-Bar de 0 y 1 y 1 y 1 y 2. La estrategia se ejecuta en la segunda línea K-Bar. La estrategia se ejecuta en la tercera raíz de K, la barra de la raíz 2 y la raíz 1 y la raíz 3. |…|…|…|…| Las estrategias se ejecutan en la primera línea de K de N + 1.

Se puede ver que en realidad v1, v2 e incluso bar_index son estructuras de secuencias de tiempo, y en cada barra hay datos correspondientes. Este código de prueba no se distingue entre el “modelo de precios en tiempo real” o el “modelo de precios de cierre” solo para mostrar el Bar en tiempo real en el gráfico. Para medir la velocidad, usamos la prueba de retroalimentación del “modelo de precios de cierre”.

Tutorial de introducción al lenguaje cuantitativo PINE de Inventor

Porque v1 es igual a 1 en cada barra.ta.cum(v1)La función se ejecuta en la primera línea K Bar, y dado que solo hay una primera línea Bar, se calcula el resultado como 1, y se asigna un valor a la variable v2。 Cuandota.cum(v1)Cuando se ejecuta en la segunda línea K Bar, ya hay 2 líneas K Bar ((la primera corresponde a la variable interna bar_index es 0, la segunda corresponde a la variable interna bar_index es 1), por lo que se calcula el resultado es 2, dando un valor a la variable v2, y así sucesivamente. En realidad se puede observar que v2 es el número de líneas K Bar en la gráfica, ya que el índice de las líneas Kbar_indexEntonces, si el valor de 0 es 0 y el valor de 0 es 0.bar_index + 1En realidad, es el número de líneas de K.v2ybar_indexEs cierto que coinciden.

Tutorial de introducción al lenguaje cuantitativo PINE de Inventor

También puedo usarta.cumLa función interna calcula la suma de los precios de cierre de todas las barras de la gráfica actual, que se puede escribir así:ta.cum(close), cuando la estrategia se ejecuta en la barra de tiempo real de la parte derechata.cum(close)El resultado calculado es la suma de los precios de cierre de todas las barras de la tabla (sin ejecutar hasta el lado más a la derecha, solo se suma a la barra actual).

Las variables en la secuencia de tiempo también se pueden calcular con operadores, como por ejemplo:ta.sma(high - low, 14)Las variables incorporadashigh(El precio más alto de la línea K Bar) menoslow(Precio mínimo de K-Line Bar), el último usota.smaLa función busca el promedio.

  • Los resultados de las llamadas de funciones también dejan huellas de valores en la secuencia de tiempo
  v1 = ta.highest(high, 10)[1]
  v2 = ta.highest(high[1], 10)
  plot(v1, title="v1", overlay=true)
  plot(v2, title="v2", overlay=true)

El código de prueba se ejecuta en la prueba de retroalimentación y se observav1yv2Los valores de la función son los mismos, y las líneas dibujadas en el gráfico también se superponen completamente. Los resultados de las llamadas a la función pueden dejar huellas de valores en la secuencia de tiempo, como el códigota.highest(high, 10)[1]Entre ellosta.highest(high, 10)Los resultados de las llamadas a funciones también pueden usarse.[1] para citar su valor histórico. Basado en la barra anterior de la barra actualta.highest(high, 10)El resultado es:ta.highest(high[1], 10)Por eso.ta.highest(high[1], 10)yta.highest(high, 10)[1]El mismo precio.

Verificación de la información de salida con otra función de gráfico:

  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, overlay=true)
  plotchar(true, title="b", char=str.tostring(b), location=location.belowbar, color=color.green, overlay=true)

Los valores de las variables a y b de la secuencia temporal se muestran arriba y abajo de la barra correspondiente. El código de dibujo se puede conservar durante el aprendizaje, ya que puede ser necesario producir información en la tabla para su observación durante las pruebas.

Tutorial de introducción al lenguaje cuantitativo PINE de Inventor

Estructura del guión

Estructura general

En la parte inicial del tutorial hemos resumido algunas de las diferencias entre el uso del lenguaje Pine en FMZ y en Trading View.indicator()strategy()Y, por ahora, no lo apoyaré.library()Por supuesto, para ser compatible con las versiones anteriores del guión de Pine, las estrategias se escribieron como://@version=5indicator()strategy()Algunas configuraciones de la política también están disponibles enstrategy()Configuración de los parámetros de transmisión de la función.

<version>
<declaration_statement>
<code>

<version>La información de control de versión puede ser omitida.

Comentarios

El uso de la lengua Pine//Como comentario de una sola línea, ya que el lenguaje Pine no tiene comentarios de varias líneas./**/Se usa para comentarios de varias líneas.

Código

Las líneas que no son comentarios o instrucciones del compilador en un script son declaraciones, que implementan el algoritmo del script. Una declaración puede ser uno de estos elementos.

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

Las oraciones se pueden ordenar de muchas maneras.

  • Algunas declaraciones pueden expresarse en una sola línea, como la mayoría de las declaraciones de variables, que contienen una sola línea de llamada de función o una declaración de función de una sola línea. Otras, como las estructuras, siempre requieren más de una línea, ya que requieren un bloque local.
  • Las declaraciones en el ámbito global de un script (es decir, las partes que no pertenecen a bloques locales) no pueden ser consideradas空格o制表符Las líneas que comienzan en la primera posición de la línea, por definición, forman parte del alcance global del script.
  • Una estructura o una declaración de funciones de varias líneas siempre requiere unlocal blockUn bloque local debe resumir en un marcador o en cuatro espacios (de lo contrario, se analizará como una secuencia de la línea anterior de código, es decir, se juzgará como un contenido continuo de la línea anterior de código), y cada bloque local define un rango local diferente.
  • Las oraciones de una sola línea se pueden enrolar en una línea usando el comma ((,) como separador.
  • Una línea puede contener comentarios o simplemente comentarios.
  • Las líneas también pueden ser envueltas (continúa en varias líneas).

Por ejemplo, se incluyen tres bloques locales, uno en la declaración de la función personalizada y dos en la declaración de la variable con la estructura if, con el siguiente código:

indicator("", "", true)             // 声明语句(全局范围),可以省略不写

barIsUp() =>                        // 函数声明(全局范围)
    close > open                    // 本地块(本地范围)

plotColor = if barIsUp()            // 变量声明 (全局范围)
    color.green                     // 本地块 (本地范围)
else
    color.red                       // 本地块 (本地范围)

runtime.log("color", color = plotColor)  // 调用一个内置函数输出日志 (全局范围)

Cambiar el código

Las líneas largas pueden ser divididas en varias líneas, o “envueltas”. Las líneas envueltas deben reducirse en cualquier cantidad de espacios, siempre que no sea un múltiplo de 4.

a = open + high + low + close

Puede ser envasado en (tenga en cuenta que el número de espacios en cada línea no es un múltiplo de 4):

a = open +
      high +
          low +
             close

Una llamada a una trama larga puede ser empaquetada como ▽.

close1 = request.security(syminfo.tickerid, "D", close)      // syminfo.tickerid 当前交易对的日线级别收盘价数据系列
close2 = request.security(syminfo.tickerid, "240", close)    // syminfo.tickerid 当前交易对的240分钟级别收盘价数据系列
plot(ta.correlation(close, open, 100),                       // 一行长的plot()调用可以被包装
   color = color.new(color.purple, 40),
   style = plot.style_area,
   trackprice = true)

Las oraciones en las declaraciones de funciones definidas por el usuario también pueden ser empaquetadas. Sin embargo, debido a que el bloque local debe comenzar gramaticalmente con una contracción (((4 espacios o 1 símbolo), cuando se divide a la siguiente línea, la parte de continuación de la oración debe comenzar con una contracción o más ((( no es igual a un múltiplo de 4 espacios)).

test(c, o) =>
    ret = c > o ?
       (c > o+5000 ? 
          1 :
              0):
       (c < o-5000 ? 
          -1 : 
              0)
           
                   
a = test(close, open)
plot(a, title="a")

Identificadores y operadores

Identificador

Antes de entender las variables, primero debemos entender el concepto de la etiqueta de identificación de la barra. La etiqueta de identificación de la barra común se utiliza comofunciónyLas variablesLos nombres de las variables y las funciones.funciónComo veremos en el siguiente tutorial, primero aprendemos el código de identificación de la hormiga 。

  • 1. El identificador debe estar en mayúsculas(A-Z)o en minúsculas(a-z)Las letras o el sublinado(_)Inicio, como el primer carácter del identificador.
  • 2. El siguiente carácter después del primer carácter del identificador puede serLas letrasBaja líneaoLos números
  • 3. El nombre del identificador está en mayúsculas.

Por ejemplo, los siguientes identificadores:

fmzVar
_fmzVar
fmz666Var
funcName
MAX_LEN
max_len
maxLen
3barsDown  // 错误的命名!使用了数字字符作为标识符的开头字符

Al igual que la mayoría de los lenguajes de programación, el lenguaje Pine también tiene sugerencias de escritura. Por lo general, se recomienda que los nombres de los identificadores:

  • 1 , todas las letras mayúsculas se utilizan para nombrar las constantes .
  • 2. UsoLas reglas de los picos del camelloNombres para otros identificadores.
// 命名变量、常量
GREEN_COLOR = #4CAF50
MAX_LOOKBACK = 100
int fastLength = 7

// 命名函数
zeroOne(boolValue) => boolValue ? 1 : 0

El operador

Los operadores son símbolos de operación en un lenguaje de programación que se utilizan para construir expresiones, mientras que las expresiones son reglas de cálculo diseñadas para algún tipo de cálculo cuando escribimos una estrategia. Los operadores en el lenguaje Pine se clasifican en función de:

Los operadores de asignación de valor, los operadores de cálculo, los operadores de comparación, los operadores lógicos,? :El operador terciario.[]El operador de referencia de la historia.

Con el operador aritmético*Por ejemplo, para diferenciar el tipo de problema que produce el resultado de la operación de lenguaje Pine en Trading View, hay el siguiente código de prueba:

//@version=5
indicator("")
lenInput = input.int(14, "Length")
factor = year > 2020 ? 3 : 1
adjustedLength = lenInput * factor
ma = ta.ema(close, adjustedLength)  // Compilation error!
plot(ma)

El error de compilación al ejecutar este script en Trading View se debe a queadjustedLength = lenInput * factorDespués de la multiplicación, el resultado esseries intSin embargo,ta.emaEl segundo parámetro de la función no admite este tipo de código. Sin embargo, en FMZ no hay restricciones estrictas de este tipo, y el código anterior funciona correctamente.

A continuación veremos el uso de los diferentes operadores.


Operador de asignación

Hay dos tipos de operadores de asignación:=:=En la parte inicial de este tutorial hemos visto algunos ejemplos.

=El operador se utiliza para dar un valor a una variable cuando se inicializa o declara.=Las variables después de la inicialización y la declaración de la asignación de valor comenzarán con ese valor en cada barra posterior. Estas son declaraciones de variables válidas:

a = close           // 使用内置变量赋值给a
b = 10000           // 使用数值赋值
c = "test"          // 使用字符串赋值
d = color.green     // 使用颜色值赋值
plot(a, title="a")
plot(b, title="b")
plotchar(true, title="c", char=str.tostring(c), color=d, overlay=true)

Avisoa = closeDeclaración de valoración, en cada barra de la variable a es el precio de cierre actual de la barra ((close) }}. Otras variablesbcdEs invariable y se puede probar en el sistema de retroalimentación en la FMZ, y los resultados se pueden ver en el diagrama.

:=Se utiliza para reasignar valores a variables existentes, y se puede entender simplemente como el uso de:=Un operador es una variable que se utiliza para modificar el valor de una variable que ya ha sido declarada e inicializada. Si se utiliza:=Un operador que asigna un valor a una variable que no ha sido iniciada o declarada puede generar errores, por ejemplo:

a := 0

Así que,:=Los operadores de asignación se usan generalmente para reasignar una variable existente, por ejemplo:

a = close > open 
b = 0 
if a
    b := b + 1

plot(b)

¿Cuál es el resultado?close > open(es decir, el BAR actual es la línea de sol), la variable a es el valor verdadero (true) ejecuta el código en el bloque local de la declaración ifb := b + 1, usando el operador de asignación:=Se le da una nueva asignación a b, se añade un 1 ◦ y luego se usa la función plot para dibujar en la tabla los valores de la variable b en cada BAR de la secuencia de tiempo, en línea ◦

¿Estamos pensando que si hay una línea de sol BAR, b continuará acumulando 1? Por supuesto que no, aquí no usamos ninguna palabra clave cuando declaramos a la variable b y la inicializamos como 0.b=0Se ejecuta en cada BAR, así que se puede ver que el resultado de este código es que se vuelve a poner la variable b a 0 cada vez, si la variable a es verdadera, entonces cumple conclose > openEntonces, en esta ronda de ejecución de código, b se agregará a 1, en el gráfico de la función de trazado, b es 1, pero en la siguiente ronda de ejecución de código, b se reasignará a 0. Aquí también es donde los principiantes del lenguaje Pine pueden tropezar fácilmente.

En cuanto a los operadores de asignación, hay dos palabras clave que hay que ampliar:varvarip

  • var

Esta es una palabra clave que ya hemos visto y usado en otros tutoriales, pero que no hemos explorado en detalle.

var es una palabra clave utilizada para asignar y initializar variables una vez. Generalmente, la sintaxis de asignación de variables que no incluye la palabra clave var provoca que los valores de las variables se cubran cada vez que se actualizan los datos. Por el contrario, cuando se utilizan las variables de asignación de la palabra clave var, se mantienen en su estado original a pesar de la actualización de los datos.

Así que vamos a usar este ejemplo, pero vamos a usar este ejemplo cuando asignamos a b.varLas palabras clave:

  a = close > open 
  var b = 0 
  if a
      b := b + 1

  plot(b)

varLa palabra clave permite que la variable b sólo ejecute la asignación inicial por primera vez, y luego no se restablece a b a 0 cada vez que se ejecuta la lógica de la política, por lo que la línea dibujada en el momento de la ejecución se puede observar b, es decir, el número de rayos B que han aparecido en el BAR de la línea K en el momento de la medición.

Las variables de la declaración var pueden ser escritas no solo en el ámbito global, sino también en bloques de código, como en este ejemplo:

  strategy(overlay=true)
  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 la serie. La variable ‘b’ mantiene el precio de cierre de la primera barra de precios de aluminio verde de la serie. La variable ‘c’ mantiene el precio de cierre de la décima naranja verde de la serie.

  • varip

varipLa primera vez que vimos esta palabra clave, podemos ver la descripción de la misma:

varip ((var intrabar persist) es una palabra clave utilizada para asignar y initializar variables una vez. Es similar a la palabra clave var, pero las variables que usan la declaración varip conservan su valor entre las actualizaciones de la línea K en tiempo real.

¿Es más difícil de entender? No importa, lo explicamos con ejemplos, es fácil de entender.

  strategy(overlay=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
  i := i + 1
  ii := ii + 1

Este código de prueba tiene un comportamiento diferente en el modelo de precios de cierre y en el modelo de precios en tiempo real:

Modelo de precios en tiempo real: ¿Recuerdan que la estrategia que hemos explicado anteriormente se ejecuta en una etapa de BAR histórica y una etapa de BAR en tiempo real?varvaripVariables declaradasiiiCada vez que se ejecuta el código de la estrategia, se ejecuta una operación de incremento. Por lo tanto, se puede ver que los números que se muestran en la línea KBAR de los resultados de la retroalimentación aumentan 1 cada uno. Cuando termina la etapa histórica de la línea K y comienza la etapa de la línea K en tiempo real, las variables de las declaraciones var y varip comienzan a cambiar.i := i + 1yii := ii + 1La diferencia es que ii se modifica cada vez que se ejecuta. Aunque i también se modifica cada vez, el siguiente ciclo de ejecución de la lógica de la estrategia restablece el valor anterior (¿recuerdas el mecanismo de retroceso que explicamos en el capítulo anterior “Ejecución del modelo”?) hasta que la línea KBAR actual se completa para actualizar el valor de determinación de i (es decir, el siguiente ciclo de ejecución de la lógica de la estrategia no restablece el valor anterior). Así que se puede ver que la variable i sigue aumentando por cada barra.

Modelo de cierre de la operación: Dado que el modelo de precio de cierre es una lógica de estrategia que se ejecuta cuando cada línea K BAR termina. Así, en el modelo de precio de cierre, las etapas históricas de la línea K y las etapas de la línea K en tiempo real, las variables de las declaraciones var, varp se muestran de forma progresiva en el ejemplo anterior, aumentando 1 por cada línea K BAR.


Operador de aritmética
El operador ilustrar
+ Añadido
- La ley de la deducción
* La multiplicación
/ Eliminación de las leyes
% Buscar ejemplos

+-Un operador puede ser usado como un operador binario o un operador unitario. Otros operadores aritméticos solo pueden ser usados como un operador binario, y si se usan como un operador unitario se producen errores.

1 , el operador aritmético es de tipo numérico en ambos lados, el resultado es de tipo numérico, entero o número de puntos flotantes dependiendo del resultado de la operación. 2. Si el número de operaciones es una cadena, el operador es+, se calcula como una cadena, los valores se convierten en forma de cadena, y luego las cadenas se entrelazan. Si se trata de otro operador de aritmética, se intenta convertir la cadena en un valor y luego se opera. 3. Si el número de operaciones es na, el resultado es nulo, y se muestra NaN cuando se imprime en la FMZ.

a = 1 + 1 
b = 1 + 1.1
c = 1 + "1.1"
d = "1" + "1.1"
e = 1 + na 

runtime.log("a:", a, ", b:", b, ", c:", c, ", d:", d, ", e:", e)   
// a: 2 , b: 2.1 , c: 11.1 , d: 11.1 , e: NaN

El lenguaje Pine en FMZ es un poco diferente del lenguaje Pine en Trading View, ya que no es muy exigente o estricto con los requisitos de tipo de variable. Por ejemplo:

a = 1 * "1.1"
b = "1" / "1.1"
c = 5 % "A" 

plot(a)
plot(b)
plot(c)

En FMZ es posible, pero en la vista de trading se reportará un error de tipo. Para los operadores de cálculo, cuando los números operativos de ambos lados son cadenas, el sistema calcula las cadenas después de convertirlas en valores numéricos. Si las cadenas no numéricas no se pueden calcular, el resultado de la operación del sistema es un valor nulo.


Comparar el operador

El operador de comparación es un operador binario.

El operador ilustrar
< Menos de
> Más que
<= Menos es igual a
>= Más grande es igual a
== El mismo.
!= Desigualdad

Ejemplo de prueba:

a = 1 > 2 
b = 1 < 2 
c = "1" <= 2 
d = "1" >= 2 
e = 1 == 1 
f = 2 != 1 
g = open > close 
h = na > 1 
i = 1 > na

runtime.log("a:", a, ", b:", b, ", c:", c, ", d:", d, ", e:", e, ", f:", f, ", g:", g, ", h:", h, ", i:", i)   
// a: false , b: true , c: true , d: false , e: true , f: true , g: false , h: false , i: false

Como se puede ver, el operador de comparación es muy sencillo de usar, pero es también el operador que más usamos al escribir políticas. Se puede comparar valores, pero también se pueden comparar variables incorporadas, por ejemplocloseopenesperar. Al igual que los operadores de cálculo, en la FMZ hay una diferencia con el Pine de Trading View, la FMZ no tiene un tipo de requerimiento especialmente estricto, por lo que este tipo de declaracionesd = "1" >= 2En FMZ no hay error, la ejecución se convierte primero en una cadena de valores y luego se compara. En Trading View hay error.


Operador lógico
El operador Símbolo del código ilustrar
No not Operador unitario, no operativo
y and Operador binario que opera con y
o or Operador binario, o operación

Si hablamos de operadores lógicos, entonces debemos hablar de tablas de valores reales. Al igual que aprendimos en la escuela secundaria, solo que aquí estamos probando y aprendiendo en el sistema de retroalimentación:

a = 1 == 1  // 使用比较运算符构成的表达式,结果为布尔值
b = 1 != 1
c = not b   // 逻辑非操作符
d = not a   // 逻辑非操作符

runtime.log("测试逻辑操作符:and", "#FF0000")
runtime.log("a:", a, ", c:", c, ", a and c:", a and c)
runtime.log("a:", a, ", b:", b, ", a and b:", a and b)
runtime.log("b:", b, ", c:", c, ", b and c:", b and c)
runtime.log("d:", d, ", b:", b, ", d and b:", d and b)

runtime.log("测试逻辑操作符:or", "#FF0000")
runtime.log("a:", a, ", c:", c, ", a or c:", a or c)
runtime.log("a:", a, ", b:", b, ", a or b:", a or b)
runtime.log("b:", b, ", c:", c, ", b or c:", b or c)
runtime.log("d:", d, ", b:", b, ", d or b:", d or b)

runtime.error("stop")

Para evitar que el sistema de retroalimentación se vea afectado por la información que se imprime constantemente, usamosruntime.error("stop")Una vez ejecutada la impresión, se produce un error excepcional que detiene la medición, y luego se puede observar la información de salida, y se puede encontrar que el contenido de la impresión y la tabla de valores reales son en realidad los mismos.


El operador de trinidad

Utilizando el operador triangular? :Expresiones trigonométricas combinadas con números operativoscondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseEn el curso anterior ya estábamos familiarizados con el término. Las denominadas expresiones tridimensionales, los operadores tridimensionales, significan que hay tres operaciones en total.

condition ? valueWhenConditionIsTrue : valueWhenConditionIsFalse¿Qué es lo que pasa?conditionEs decir, si el valor de la expresión de la regla verdadera es:valueWhenConditionIsTrueSi es así.conditionEl valor para la expresión hipotética esvalueWhenConditionIsFalse

A pesar de que no tiene mucha utilidad práctica, los ejemplos que se pueden usar son fáciles de mostrar:

a = close > open
b = a ? "阳线" : "阴线"
c = not a ? "阴线" : "阳线"
plotchar(a, location=location.abovebar, color=color.red, char=b, overlay=true)
plotchar(not a, location=location.belowbar, color=color.green, char=c, overlay=true)

No importa lo que hagas si te encuentras con una cruz. Las expresiones tridimensionales también pueden ser empotradas, como ya hicimos en el tutorial anterior.

a = close > open
b = a ? math.abs(close-open) > 30 ? "阳线" : "十字星" : math.abs(close-open) > 30 ? "阴线" : "十字星"
c = not a ? math.abs(close-open) > 30 ? "阴线" : "十字星" : math.abs(close-open) > 30 ? "阳线" : "十字星"
plotchar(a, location=location.abovebar, color=color.red, char=b, overlay=true)
plotchar(not a, location=location.belowbar, color=color.green, char=c, overlay=true)

En realidad es lo mismo quecondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseEnvalueWhenConditionIsTruevalueWhenConditionIsFalse, también se usa otra expresión trinomial en su lugar.


Operador de historial

Utilizan