Inventor de la introducción al lenguaje PINE cuantificado

El autor:Un sueño pequeño., Creado: 2022-05-30 16:23:43, Actualizado: 2022-09-28 17:10:21

[TOC] ¿Qué quieres decir?

Inventor de la introducción al lenguaje PINE cuantificado

En el video, se puede leer:¿Es muy difícil comenzar a cuantificar las transacciones? ¿Utilizar el punto de vista de negociación del lenguaje Pine desde el blanco pequeño hasta el dios Quant - el primer explorador del lenguaje Pine

La plataforma de comercio cuantificado de Inventor admite políticas de escritura en el lenguaje Pine, soporta retrospecciones, ejecuta políticas de lenguaje Pine en disco real y es compatible con versiones más bajas del lenguaje Pine.FMZ.COM¿Qué es esto?Plaza de la EstrategiaEn la página web de Pine, hay una serie de estrategias de búsqueda y transferencia (scripts).

FMZ no sólo es compatible con el lenguaje Pine, sino que también es compatible con el lenguaje Pine. Las funciones de la plataforma FMZ, la gran cantidad de herramientas útiles, la administración eficiente y fácil, también mejoran aún más la utilidad de la política de Pine (escritura). FMZ se basa en la compatibilidad con el lenguaje Pine, y también se extiende, optimiza y recorta el lenguaje Pine.

En este sentido, el gobierno de la República Popular China (PRC) ha aprobado una ley que establece que los derechos humanos deben ser respetados en todo el mundo.

  • 1, Política de Pine en FMZ, código de inicio de la versión de identificación//@versionY el código comienza constrategyindicatorLa frase no requiere composición, FMZ no lo apoya por el momento.importImportaciónlibraryLa función de las páginas web.

    Tal vez veas algunas estrategias escritas así:

    //@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 puede ser algo así:

    //@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 FMZ se puede simplificar a:

    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)
    

    ¿Qué es esto?

    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, Política (script) Algunas configuraciones relacionadas con transacciones son establecidas por el parámetro "Pine Language Transaction Library" en la interfaz de la política de FMZ.

    • Modelo de precios de cierre y modelo de precios en tiempo real En la vista de comercio, podemos pasar porstrategyLa funcióncalc_on_every_tickParámetros para configurar el script de la estrategia para ejecutar la lógica de la estrategia en tiempo real cada vez que el precio cambia.calc_on_every_tickLos parámetros deben sertruePor defecto.calc_on_every_tickLos parámetros son:falseEs decir, la estrategia se ejecuta sólo cuando la línea K BAR actual de la estrategia ha terminado por completo. En FMZ se puede configurar mediante los parámetros de la plantilla "Pine Language Exchange Library".

      img

    • El control de precisión numérica, como el precio, la cantidad de unidades, etc. al ejecutar la estrategia, se requiere en la FMZ. En la vista comercial, no hay problemas de precisión en el momento de realizar un pedido en vivo, ya que solo se pueden realizar pruebas simuladas. En FMZ, se puede ejecutar la estrategia Pine en vivo. Entonces se necesita una estrategia que pueda especificar con flexibilidad la precisión de precios de la variedad de operaciones, la precisión del número de pedidos. Estas configuraciones de precisión controlan los decímetros de los datos relevantes, evitando que los datos no cumplan con los requisitos de los pedidos de los intercambiadores y no puedan realizar pedidos.

    • Código del contrato de futuros En FMZ, la variedad de transacciones tiene dos propiedades si es un contrato. Por ejemplo, el par de transacciones y el código de contrato, además de la necesidad de establecer claramente el par de transacciones en el disco real y en la revisión, también se requiere establecer un código de contrato específico en el parámetro "código de variedad" de la plantilla de la biblioteca de clases de transacciones del lenguaje Pine. Por ejemplo, el contrato permanente se llena.swapEl código de contrato es específico para el intercambio en el que se opera. Por ejemplo, algunos contratos se negocian todos los trimestres.quarterLos códigos de estos contratos coinciden con los códigos de futuros definidos en la API de lenguaje JavaScript/python/c++ de FMZ.

    Para otros ajustes, por ejemplo, el volumen mínimo de unidad, el volumen de unidad predeterminado, etc. puede consultar la documentación del lenguaje Pine sobre el tamaño mínimo de unidad."Pine Language Exchange Library" (Biblioteca de intercambios de lenguaje en el lenguaje Pine)La introducción de los parámetros.

  • 3、runtime.debugruntime.logruntime.errorFunción ampliada de FMZ para el desmantelamiento.

    Se han añadido 3 funciones de depuración en la plataforma FMZ.

    • runtime.debug: Imprimir información de variables en el mando, generalmente no se utiliza esta función.

    • runtime.log: Exporta el contenido en el registro.. FMZ PINE tiene una función especial..

      runtime.log(1, 2, 3, close, high, ...),可以传多个参数。
      
    • runtime.error: cuando se llama, causa errores de ejecución y conlleva un mensaje de error especificado en los parámetros de mensaje.

      runtime.error(message)
      
  • 4 y ampliado en la función gráfica parcial.overlayParámetros

    Lenguaje Pine en FMZ, función de dibujoplotplotshapeplotcharY así sucesivamenteoverlayParámetros compatibles para especificar imágenes en el diagrama o subdiagrama.overlayConfiguracióntrueEn el diagrama principal, el dibujo está configurado comofalseDibujar en subdibujos. Cuando la política de Pine en FMZ se ejecuta, se puede dibujar un tema y un subdibujo al mismo tiempo.

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

    syminfo.mintickLa variable de configuración se define como el valor mínimo de la variedad actual; en FMZDisco en vivo/Las pruebasEn la interfaz, el parámetro de la plantilla en la biblioteca de transacciones del lenguaje "Pine" puede controlar el valor de la precisión de la moneda de precio. La precisión de la moneda de precio se configura en 2 para que el precio sea preciso hasta el segundo decimal en el momento de la transacción, en el que el mínimo de movimiento del precio es de 0.01 unidades.syminfo.mintickEl valor de 0.01 y el valor de 0.01 y el valor de 0.01 y el valor de 0.01 y el valor de 0.01 y el valor de 0.01 y el valor de 0.01.

  • 6. Los precios promedio en FMZ PINE Script incluyen las tarifas de mantenimiento.

    Por ejemplo: el precio de la orden es de 8000, la dirección de venta, la cantidad de 1 mano (unidad), el precio promedio después de la transacción no es de 8000, menos de 8000 (el costo incluye las tarifas de tramitación).

Fundamentos de la lengua pine

Cuando comenzamos a aprender las bases del lenguaje Pine, es posible que no estemos familiarizados con algunas instrucciones, la gramática del código en algunos ejemplos. No importa si no entendemos, podemos familiarizarnos con el concepto, 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 internas.

Ejecución del modelo

Es muy necesario conocer conceptos relacionados, como el proceso de ejecución de los programas de programación de guiones del lenguaje Pine. Las estrategias del lenguaje Pine son basadas en gráficos y pueden entenderse como una serie de cálculos y operaciones que se ejecutan en un gráfico en orden cronológico desde los primeros datos que ya se han cargado.bar_indexSe refiere al valor del índice de K-LineBar que está en la actualidad cuando se ejecuta el script de Pine.

plot(bar_index, "bar_index")

img

plotLa función es una de las funciones que más usaremos en el futuro. Su uso es muy simple, es dibujar líneas en un gráfico según los parámetros que se ingresan, los datos que se ingresan son:bar_indexLa línea se llamabar_indexSe puede ver que la línea llamada bar_index en el primer nombre de Bar tiene un valor de 0, aumentando 1 a la derecha a medida que Bar aumenta.

Dependiendo de la configuración de la estrategia, el modelo de ejecución de la estrategia también varía.收盘价模型y实时价模型El modelo de precios de cierre, el modelo de precios en tiempo real, también se ha presentado con brevedad anteriormente.

  • Modelo de precio de cierre

    Cuando se ejecuta el código de la estrategia, el ciclo de la línea KBar actual se ejecuta por completo, y cuando se cierra la línea K, el ciclo de la línea K se ha terminado. En este momento, se ejecuta una vez más la lógica de la política Pine, y la señal de negociación activada se ejecutará al comenzar la siguiente línea KBar.

  • Modelo de precios en tiempo real

    Cuando se ejecuta el código de la estrategia, la K-line Bar actual se ejecuta una vez más en la lógica de la estrategia Pine con cada cambio de mercado, sea o no cerrado, y la señal de negociación activada se ejecuta inmediatamente.

Cuando la política del lenguaje Pine se ejecuta de izquierda a derecha en el gráfico, la K-lineBar en el gráfico se divide en历史Bary实时Bar¿Qué es lo que está pasando?

  • Bar de historia

    Cuando la política está configurada para "modelo de precios reales", cuando se inicia la ejecución, todas las K-Line Bar en el gráfico, excepto la K-Line Bar en el extremo derecho, son历史BarLa lógica estratégica está en cada uno de ellos.历史BarLa última vez que se ejecutó fue una vez. Cuando la política está configurada para ejecutar el modelo de precio de cierre, todas las barras en el gráfico son:历史BarLa lógica estratégica está en cada uno de ellos.历史BarLa última vez que se ejecutó fue una vez.

    Los cálculos basados en el Bar histórico: El código estratégico se ejecuta una vez en el estado de cierre de la barra de historias, y luego el código estratégico continúa ejecutándose en la siguiente barra de historias hasta que todas las barras de historias se ejecutan una vez.

  • Bar en tiempo real

    Cuando la política se ejecuta en la última línea K de la barra a la derecha, la barra se convierte en una barra en tiempo real. Cuando se cierra la barra en tiempo real, esta se convierte en una barra en tiempo real pasada (que se convierte en una barra histórica). La parte más derecha del gráfico genera una nueva barra en tiempo real.

    Cuando se inicia la ejecución de la estrategia configurada como "modelo de precios en tiempo real", se ejecuta una lógica estratégica por cada movimiento del mercado en el Bar en tiempo real. La política está configurada como "modelo de precio de cierre" y no muestra Bar en tiempo real en el gráfico cuando se inicia la ejecución.

    Los cálculos basados en Bar en tiempo real: Si la política está configurada como "modelo de precio de cierre" y el gráfico no muestra Bar en tiempo real, el código de la política solo se ejecuta una vez en el cierre actual de Bar. Si la política está configurada como "modelo de precios reales", el cálculo en Bar en tiempo real es completamente diferente al cálculo en Bar histórico, donde se ejecuta un código de política por cada cambio de mercado en Bar.highlowcloseEn el Bar histórico, estos valores cambian cada vez que el mercado cambia. Por lo tanto, los datos basados en estos valores también cambian en tiempo real.closeEl precio de cada uno de estos productos es el mismo que el precio de cada uno de ellos.highylowSiempre representan los máximos altos y mínimos bajos alcanzados desde el inicio de la actual barra en tiempo real. Estas variables integradas representan el valor final de la última actualización de la barra en tiempo real.

    Mecanismo de retroceso para ejecutar la estrategia en Bar en tiempo real (modelo de precios en tiempo real): Cuando se ejecuta Bar en tiempo real, la variable definida por el usuario que se vuelve a colocar antes de ejecutar cada nueva iteración de la política se llama retroceder. Para entender el mecanismo de retrocesión, vamos a usar un ejemplo en el código de prueba siguiente.

    No hay que olvidarlo.

    /*backtest 
    ...
    ..
    .
    */
    

    El contenido del paquete es la información de configuración de retrospección que se guarda en forma de 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")
    

    img

    img

    Solo examinamos las escenas que se ejecutan en tiempo real, por lo que usamosnot barstate.ishistoryLa restricción de la expresión se aplica solo a la suma de variables n en tiempo real Bar y se usa antes y después de la ejecución de la operación de sumaruntime.logLa función produce información en el registro de la política.plotLa curva n que se muestra es 0 cuando la política se ejecuta en el Bar histórico; cuando se ejecuta hasta el Bar en tiempo real se activa la operación n + 1 y se ejecuta n + 1 cada vez que se ejecuta la política en el Bar en tiempo real. Se puede observar desde la información del registro que n se reubica en el valor que se envió finalmente a la última vez que se ejecuta la política anterior cada vez que se ejecuta el código.

    En resumen: 1, cuando la política se inicia en la ejecución en tiempo real Bar, se ejecuta un código de la política cada vez que se actualiza el campo. 2, cuando se ejecuta en tiempo real en Bar, se vuelve a rodar la variable antes de cada ejecución del código de la política. 3. Cuando se ejecuta en Bar en tiempo real, las variables se presentan una vez en la actualización de cierre.

    Las operaciones gráficas como las curvas en los gráficos también pueden causar rediseños debido a que los datos se vuelven atrás, por ejemplo, modificamos el código de prueba que acabamos de hacer, prueba de disco real:

    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 imagen del momento Aimg

    Captura de imagen del momento Bimg

    En la página de Facebook de la organización, se puede leer lo siguiente:n := open > close ? n + 1 : nEn el primer gráfico, se puede ver que en el momento A, n se suma a 1, ya que el precio de apertura es mayor que el precio de cierre. La curva n muestra un valor de 5; luego, el movimiento de la situación, la actualización del precio se muestra como en el segundo gráfico. En este momento, el precio de apertura es menor que el precio de cierre.

  • Contexto de las variables en la función

    A continuación, vamos a examinar juntos las variables dentro de las funciones del lenguaje Pine. Según la descripción de algunos tutoriales de Pine, las variables dentro de las funciones difieren de las variables fuera de las funciones de la siguiente manera:

    La historia de las variables de la serie utilizada 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 causará una diferencia entre los valores históricos dentro del bloque de la función y los valores históricos de la serie externa. Por lo tanto, si no se llama a la función en cada columna, las series con el mismo valor de índice dentro de la función y las referencias externas no referirán al mismo punto histórico.

    ¿No es un poco difícil de leer? Está bien, vamos a resolver el problema con 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)
    

    Retrospectiva de ejecución

    img

    El código de prueba es relativamente simple y se basa principalmente en examinar los datos citados de dos maneras:f(a) => a[1]yf2() => close[1]

    • f(a) => a[1]Cómo usar los parámetros de transmisión, la función regresa al finala[1]

    • f2() => close[1]Variables integradas directamente:closeLa función regresa al final.close[1]

    []Los símbolos se utilizan para hacer referencia a los valores históricos de las variables de la serie de datos, cerrar[1] es decir, referirse a la fecha de cierre en el Bar anterior al precio de cierre actual. Nuestro código de prueba representa 4 tipos de datos en el gráfico:

    • 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 A, colorado en rojo, dibujado cuando oneBarInTwo es verdadero, y su posición (en el eje Y) es:f(close)El valor que se devuelve.

    • plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")Dibujar un caracter B con color verde, dibujar cuando oneBarInTwo es verdadero y dibujar su posición (en el eje Y) como:f2()El valor que se devuelve.

    • plot(close[2], title = "close[2]", color = color.red, overlay = true)Las líneas de dibujo, de color rojo, se ubican (en el eje Y):close[2]Es decir, el precio de cierre en el bar anterior al número 2 del bar actual (el número 2 a la izquierda).

    • plot(close[1], title = "close[1]", color = color.green, overlay = true)Las líneas de dibujo, de color verde, se ubican (en el eje Y):close[1]Es decir, el precio de cierre en el bar anterior al número 1 del bar actual (el número 1 a la izquierda).

    Se puede ver la imagen de la pantalla que se ejecuta mediante la estrategia de retrospección, aunque la imagen A marca la función utilizadaf(a) => a[1]Función utilizada para marcar la imagen Bf2() => close[1]Se utilizan[1] para referirse a datos históricos en series de datos, pero las posiciones de los marcadores "A" y "B" en el gráfico son completamente diferentes. La posición de los marcadores "A" siempre cae en la línea roja, es decir, el código en la estrategia.plot(close[2], title = "close[2]", color = color.red, overlay = true)En la línea dibujada, los datos que usa la línea son:close[2]

    img

    La razón es que se puede hacer a través del índice de la línea KBar, que es la variable interna.bar_indexCalcular si se dibujan las marcas "A" y "B"; las marcas "A" y "B" no se dibujan en todas las líneas KBar.f(a) => a[1]El valor que se cita de esta manera, si la función no se llama en cada bar, se comparará con la función.f2() => close[1]El valor de referencia de esta manera no es el mismo (incluso si se utiliza el mismo índice como [1]).

  • Algunas funciones integradas requieren calcular en cada Bar para calcular correctamente sus resultados.

    En el caso de los que no tienen acceso a internet, la mayoría de los usuarios de Twitter no tienen acceso a internet.

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

    Así que vamos a llamar a la función en el código.ta.barssince(close < close[1])Escrito en un operador tripartitocondition ? value1 : value2En la actualidad, la mayoría de las personas que viven en el país no tienen acceso a internet.close > close[1]时去调用ta.barssince函数。可偏偏ta.barssinceLa función es calcular desde la última vez.close < close[1]El número de líneas de K en la creación; cuando se llama la función ta.barssince, está cerca > cerrar[1], es decir, el precio de cierre actual es mayor que el precio de cierre del Bar anterior, la función ta.barssince no tiene condiciones cerrar < cerrar [1] cuando se llama, y no tiene una posición de cierre más reciente.

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

    La imagen es la siguiente:

    img

    Por lo tanto, cuando se dibuja el gráfico, sólo se dibuja el dato cuando la variable res tiene un valor ((−1)).

    Para evitar este problema, sólo tenemos que hacer un par de cosas.ta.barssince(close < close[1])Las llamadas a funciones se toman de los operadores de tres elementos y se escriben en el exterior de cualquier posible rama de condiciones; por lo que se ejecutan en cada línea KBar.

    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)
    

    img

Secuencia temporal

El concepto de la secuencia de tiempo es muy importante en el lenguaje Pine, es un concepto que debemos entender cuando aprendemos el lenguaje Pine. La secuencia de tiempo no es un tipo, sino la estructura básica de los valores continuos de las variables almacenadas con el tiempo.openEs una variable incorporada en el lenguaje Pine, cuya estructura es la de almacenar la secuencia de tiempo de los precios de apertura de cada línea KBar.openEsta estructura de la secuencia de tiempo representa el precio de apertura de todas las K-stringBar en el momento en que el guión actual se ejecuta. Si la K-string actual es un ciclo de 5 minutos, entonces utilizamos una citación en el código de la estrategia de PINE.openEl tiempo es el precio de apertura de la línea KBar en la ejecución actual del código de la estrategia.[]Operador. Se utiliza cuando la política Pine se ejecuta en una K-line Bar.open[1]Indica las referenciasopenEl precio de apertura de la línea KBar anterior a esta línea KBar ejecutada por el script actual en la secuencia de tiempo (es decir, el precio de apertura del ciclo de la línea K anterior).

  • Las variables en la secuencia de tiempo son muy fáciles de calcular. Así 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
    

    El 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 cosas similares.ta.cumEstas funciones integradas pueden procesar directamente datos de la secuencia de tiempo, por ejemplo:ta.cumEs decir, sumamos los valores correspondientes a las variables de entrada en cada KlineBar, y luego usamos un gráfico para facilitar el entendimiento.

    Proceso de ejecución de la estrategia Variable incorporado bar_index V1 V2
    La estrategia se ejecuta en la primera raíz de la línea KBar. 0 1 1
    La estrategia se ejecuta en la segunda línea KBar 1 1 2
    La estrategia se ejecuta en la tercera línea K Bar 2 1 3
    La estrategia se ejecuta en la N + 1 K línea Bar. No 1 N + 1

    Como se puede ver, en realidad v1, v2 e incluso bar_index son estructuras de secuencias de tiempo, con datos correspondientes en cada Bar. Este código de prueba distingue entre el "modelo de precios en tiempo real" y el "modelo de precios de cierre" simplemente por si se muestra el Bar en tiempo real en el gráfico. Para medir la velocidad, usamos el "modelo de precios de cierre" para realizar pruebas de recapitulación.

    img

    Y esto es porque v1 es igual a 1 en cada Bar.ta.cum(v1)Cuando la función se ejecuta en la primera línea KBar, dado que solo hay una primera Bar, el resultado es 1, y se asigna a la variable v2. Cuandota.cum(v1)Cuando se ejecuta en la segunda K-línea Bar, ya hay 2 K-líneas Bar (la primera correspondiente a la variable interna bar_index es 0, la segunda correspondiente a la variable interna bar_index es 1), por lo que el resultado del cálculo es 2, asignando a la variable v2, y así sucesivamente. Se puede observar que en realidad v2 es el número de K-líneas Bar en el gráfico, debido a que el índice de la K-líneabar_indexSi el valor es igual a 0, entonces el valor es igual.bar_index + 1En realidad, es el número de K-Line Bar.v2ybar_index¿Qué es lo que está sucediendo?

    img

    Y también puedo usarlo.ta.cumLa función interna calcula la suma de los precios de cierre de todos los Bar en el gráfico actual, entonces sólo se puede escribir así:ta.cum(close)Cuando la política se ejecuta en el Bar en tiempo real en el extremo derecho,ta.cum(close)El resultado calculado es la suma de los precios de cierre de todos los Bar en el gráfico (sin correr hasta el extremo derecho, solo se suma al Bar actual).

    Las variables en la secuencia de tiempo también pueden ser calculadas con operadores, como el código:ta.sma(high - low, 14)Es decir, la variable interna.high(el precio más alto de la línea K Bar) menoslow(K-line Bar precio mínimo), utilizado por última vezta.smaLa función busca el promedio.

  • Los resultados de las llamadas de funciones también dejan una huella de valor 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 cuando se realiza la prueba, y se puede observarv1yv2Los valores son los mismos, y las líneas dibujadas en el gráfico también se superponen completamente. Los resultados de las llamadas de funciones que se calculan dejan una huella de valores en la secuencia de tiempo, por ejemplo, código.ta.highest(high, 10)[1]¿Qué es esto?ta.highest(high, 10)Los resultados calculados por la llamada de la función también se pueden usar[1] para referirse a su valor histórico. Basado en el correspondiente Bar anterior al actual Bar.ta.highest(high, 10)El resultado es:ta.highest(high[1], 10)¿Por qué?ta.highest(high[1], 10)yta.highest(high, 10)[1]¿Qué es lo que está pasando?

    Utilice otra función de dibujo para exportar información de verificación:

    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)
    

    Se puede ver que los valores de las variables a y b en la secuencia de tiempo se muestran arriba y abajo de la Bar correspondiente. Durante el aprendizaje, se puede conservar este código gráfico, ya que en las pruebas, los experimentos pueden necesitar a menudo la información de salida en el gráfico para su observación.

    img

Estructura del guión

Estructura general

En la parte inicial del tutorial hemos resumido algunas diferencias en el uso de la lengua Pine en FMZ y en Trading View.indicator()strategy()Los bloggers de Twitter también están en contra de la iniciativa.library()Por supuesto, para ser compatibles con versiones anteriores del script de Pine, las políticas se escriben como://@version=5indicator()strategy()También puede ser. Algunas configuraciones de estrategia también se pueden usar enstrategy()La configuración de parámetros de transmisión de la función.

<version>
<declaration_statement>
<code>

<version>La información de control de versiones puede omitirse.

Comentarios

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

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

Identificadores y operadores

Identificador

Antes de conocer las variables, primero debemos entender el concepto de símbolo de la culebra.FunciónyVariablesLos nombres de los nombres de las variables y funciones.FunciónComo veremos más adelante en el tutorial, primero vamos a aprender a usar el símbolo de símbolo.

  • 1, el identificador debe estar en mayúscula.(A-Z)¿Cómo se escribe?(a-z)Las letras o los guiones(_)El inicio, como el primer carácter del identificador.
  • 2 puede ser el siguiente después del primer carácter del identificador.Las letrasLínea de abajo¿Qué es esto?Las cifras
  • 3. Los nombres de los identificadores están escritos en mayúsculas y minúsculas.

Por ejemplo, los identificadores con los siguientes nombres:

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.

  • 1, todas las letras mayúsculas para nombrar las constantes.
  • 2, usoLas reglas de las colinasLos nombres de otros identificadores.
// 命名变量、常量
GREEN_COLOR = #4CAF50
MAX_LOOKBACK = 100
int fastLength = 7

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

Operador

Los operadores son algunos símbolos de operaciones que se usan en el lenguaje de programación para construir expresiones, y las expresiones son reglas de cálculo que diseñamos para un propósito de cálculo cuando escribimos políticas. Los operadores en el lenguaje Pine se clasifican según su función como:

El operador de asignación, el operador de cálculo, el operador de comparación, el operador lógico.? :El operador de tres unidades.[]Los operadores de referencia histórica.

Operador de cálculo*Por ejemplo, el tipo de problema que distingue los resultados de los operadores del lenguaje Pine en Trading View tiene 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)

Cuando se ejecuta este script en Trading View, se compila un error, porque:adjustedLength = lenInput * factorY después de multiplicar, el resultado es:series intTipo (series), sin embargota.emaEl segundo parámetro de la función no soporta este tipo. Sin embargo, en FMZ no hay restricciones estrictas de este tipo, y el código anterior puede funcionar normalmente.

A continuación, vamos a ver juntos el uso de varios operadores.


Operador de asignación

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

=Los operadores se utilizan para asignar valores a las variables cuando se inicializan o se declaran.=Inicialización, las variables después de la declaración de asignación comenzarán con ese valor en cada Bar 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)

Cuidado.a = closeEnunciado de asignación en el que la variable a de cada Bar es el precio de cierre (close) de la Bar actual.bcdEl resultado de las pruebas de detección de las emisiones de gases de efecto invernadero en el FMZ es constante y puede ser probado en el sistema de retrospección en FMZ.

:=Se utiliza para reasignar valores a variables existentes y puede entenderse simplemente como el uso de:=Los operadores se utilizan para modificar valores de variables que ya han sido declarados o initializados. Si se usa:=Un operador puede generar errores en la asignación de variables no inicializadas o declaradas, por ejemplo:

a := 0

Así que,:=Los operadores de asignación generalmente se usan para reasignar variables ya existentes, por ejemplo:

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

plot(b)

¿Qué es lo que sucede?close > open(es decir, el BAR actual es el horizonte), la variable a es el valor verdadero (true) ‒ ejecuta el código en el bloque local de la frase si.b := b + 1, con el operador de asignación:=Reasignar el valor a b, agregar un 1; y luego dibujar el valor de la variable b en cada BAR de la secuencia de tiempo en un gráfico con la función plot, conectándola en línea.

¿Suponemos que cuando aparece una línea de bar, b va a seguir añadiendo 1? Por supuesto que no, aquí declaramos a la variable b que no usamos ninguna palabra clave para especificar cuando se inicializa como 0.b=0Se ejecuta en cada BAR, por lo que se puede ver que el resultado de la ejecución de este código es volver a establecer la variable b a 0 cada vez que la variable a es verdadera.close > openEntonces, cuando se ejecuta el código en esta ronda, b se suma a 1, cuando se dibuja el gráfico de la función de plot, b es 1, pero cuando se ejecuta el código en la siguiente ronda, b se vuelve a asignar a 0.

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

  • el var

    En realidad, esta palabra clave, la hemos visto y usado en tutoriales anteriores, pero no fue explorada en detalle en ese momento.

    var es una palabra clave utilizada 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 las variables se cubra cada vez que se actualizan los datos. Por el contrario, cuando se usan las variables de asignación de la palabra clave var, pueden mantenerse en estado de equilibrio a pesar de que los datos se actualizan.

    Y esto es lo que estamos haciendo con este ejemplo, pero cuando le damos un valor 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 solo ejecute la primera asignación inicial, y luego no vuelva a restablecer b a 0 cada vez que se ejecuta la lógica de la estrategia, por lo que las líneas dibujadas desde el momento de la ejecución pueden observar que b es la cantidad de rayos de luz BAR que aparecieron en la línea K actual BAR.

    Las variables declaradas var pueden ser escritas no solo a escala global, sino también en bloques de código, como 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 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.

  • variedad

    varipEsta es la primera vez que vemos esta palabra clave, y podemos ver la descripción de esta palabra clave:

    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.

    ¿No es más difícil de entender? No importa, lo explicamos con ejemplos y 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 se presenta de manera diferente en el modelo de precio de cierre y en el modelo de precio en tiempo real:

    Modelo de precios en tiempo real: ¿Recuerdan que en el modelo de precios en tiempo real, el tiempo de ejecución de la estrategia se dividió en la etapa histórica BAR y la etapa real BAR?varvaripVariables declaradasiiiLa operación incremental se ejecuta cada vez que se ejecuta el código de la estrategia. Por lo tanto, se puede ver que los números que se muestran en el resultado de la línea K BAR se incrementan uno por uno. Cuando termina la etapa de la línea K histórica, comienza la etapa de la línea K en tiempo real. Las variables de la declaración var, varip comienzan a cambiar.i := i + 1yii := ii + 1La diferencia es que ii se modifica cada vez que se ejecuta. Aunque i se modifica cada vez, el valor anterior se recupera cuando se ejecuta la lógica de la política en la siguiente ronda. (¿Recuerda el mecanismo de regresión que hablamos en el capítulo anterior de "Execución del modelo?"), el valor de i no se determina hasta que la corriente K line BAR se actualiza. (es decir, no se recupera el valor anterior cuando se ejecuta la lógica de la política en la próxima ronda).

    El modelo de precio de cierre: Dado que el modelo de precio de cierre se ejecuta una vez al final de cada K-línea BAR. Por lo tanto, en el modelo de precio de cierre, las variables de la declaración var, varip se muestran perfectamente coincidentes en el ejemplo anterior, cada vez que la K-línea BAR se incrementa 1.


Operador de cálculo
Operador Explicación
+ El café
- Bajar las leyes
* Multiplicación
/ Sin embargo
% Buscar el modelo

+-Los operadores pueden ser usados como operadores binarios o como operadores de unidad. Otros operadores aritméticos solo pueden ser usados como operadores de unidad y retornan errores si se usan como operadores de unidad.

El operador de arithmetic tiene un tipo de valor en ambos lados, y el resultado es el tipo de valor, el tipo entero o el número de puntos flotantes, dependiendo del resultado de la operación. 2, si alguno de los operadores es una cadena, el operador es+Si el resultado es una cadena, el valor se convierte en un formato de cadena y luego se emplea. Si es otro operador de cálculo, se intenta convertir la cadena en un valor y luego se opera. 3, si el número de operaciones es na, el resultado del cálculo es el valor en blanco na, que se muestra en NaN cuando se imprime en 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 al lenguaje Pine en Trading View, donde el lenguaje Pine en FMZ no es muy estricto con respecto a los requisitos de tipo de variables.

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

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

En FMZ es posible operar, pero en vista de comercio se reportan errores de tipo. Para los operadores de aritmética, cuando los números de operación en ambos lados son una cadena, el sistema calcula después de convertir la cadena en un valor. Si no se puede calcular una cadena no numérica, el resultado del sistema es el valor nulo na.


Comparar los operadores

Los operadores de comparación son operadores binarios.

Operador Explicación
< Menos de
> Es más grande que
<= Menos es igual a
>= Es más que igual a
== Es igual.
!= La 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 también es el operador que más usamos cuando escribimos políticas.closeopenY luego. Al igual que con los operadores de operaciones, en FMZ hay una diferencia con Pine en Trading View, FMZ no tiene un tipo de requerimiento particularmente estricto, por lo que tales declaraciones pueden ser usadas en FMZ.d = "1" >= 2En FMZ no se producen errores, pero en Trading View se producen errores.


Operador lógico
Operador Símbolo de código Explicación
No No lo es Operador de unidad, no operado
¿Qué es esto? y Operador binario que opera con (y)
¿Qué es esto? o bien Operador binario, o operación

Cuando hablamos de operadores lógicos, tenemos que hablar de tablas de valores reales. Como cuando aprendimos en la escuela secundaria, pero aquí hacemos pruebas en sistemas 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 esté constantemente imprimiendo información que afecte la observación, usamos una herramienta llamada "Reflector".runtime.error("stop")Después de que se ejecuta una impresión, se lanza un error inusual para detener la revisión, y luego se puede observar la información de salida, y se puede encontrar que el contenido impreso y la tabla de valores reales son los mismos.


Operador de tres

Utilizando operadores de tres dimensiones? :Expresiones tripartitas que se combinan con números operativoscondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseYa hemos aprendido en clases anteriores. Las llamadas expresiones tridimensionales, los operadores tridimensionales, significan que el número total de operaciones es de tres.

condition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseEn el centro.conditionSi el valor de la expresión es verdadero, entonces el valor de la expresión es:valueWhenConditionIsTrue¿Qué ocurriría si?conditionEl valor de la expresión hipotética esvalueWhenConditionIsFalse

Aunque no tiene ningún uso práctico, un ejemplo fácil de demostrar es:

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)

Si te encuentras con una estrella cruzada, no importa. Las expresiones tridimensionales también se pueden enmarcar, como 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 el equivalente acondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseEn el interiorvalueWhenConditionIsTruevalueWhenConditionIsFalse, también se utiliza otra expresión tripartita en su lugar.


Operador histórico

Usar el operador histórico[], los valores históricos de la secuencia de tiempo de referencia. Estos valores históricos son los valores de la variable en la K-line BAR anterior a la K-line BAR actual cuando se ejecuta el script.[]Los operadores se utilizan después de las llamadas de variables, expresiones y funciones.[]El valor de este paréntesis es el desvío de la distancia de los datos históricos a los que queremos citar a la línea K BAR actual. Por ejemplo, si quiero citar el precio de cierre de una línea K BAR anterior, se escribe:close[1]

En clases anteriores hemos visto algo parecido:

high[10]
ta.sma(close, 10)[1]
ta.highest(high, 10)[20]
close > nz(close[1], open)

[]El operador solo puede usarse una vez en el mismo valor, por lo que escribirlo así es incorrecto y devuelve un error:

a = close[1][2]   // 错误

Es posible que vea aquí, y algunos de sus compañeros dirán:[]Es decir, para la estructura de series, parece que la estructura de series (series) y las matrices son muy parecidas. A continuación, vamos a mostrar con un ejemplo que las series y las matrices en el lenguaje Pine son diferentes.

strategy("test", overlay=true)

a = close
b = close[1]
c = b[1]

plot(a, title="a")
plot(b, title="b")
plot(c, title="c")

Aunquea = close[1][2]En el caso de los bloggers, el mensaje es:

b = close[1]
c = b[1]

Si se escribe separadamente, no hay errores, si se entiende en términos de arítmetas normales, es decir, si se escribe separadamente, no hay errores.b = close[1]Después de la asignación, b debería ser un valor, sin embargo.c = b[1]Como puede verse, el concepto de serie en el lenguaje Pine no es tan simple como el de la matriz. Se puede entender que el valor histórico en el Bar anterior cercano se asigna a b, y b también es una estructura de serie de tiempo que puede seguir citando su valor histórico. Así que vemos que en las tres líneas a, b y c dibujadas, la línea b es una BAR más lenta que la línea a, y la línea c es una BAR más lenta que la línea b. La línea c es una BAR más lenta que la línea a.

Podemos arrastrar el gráfico hacia el extremo izquierdo y observar que en la primera línea K, los valores de b y c son valores en blanco (n). Esto se debe a que cuando el script se ejecuta en la primera línea K BAR, no existe una referencia a una o dos historias de ciclos. Por lo tanto, cuando escribimos una política, debemos tener cuidado de que cuando citamos datos históricos se refieran a valores en blanco, si no somos cuidadosos, el uso de valores en blanco puede causar una serie de diferencias de cálculo, incluso puede afectar a la BAR en tiempo real.nanzY esto es lo que estamos tratando de hacer con las funciones integradas.nznaFunciones, ¿recuerdas en qué capítulo?) se ocupa específicamente de situaciones de valores en blanco, por ejemplo:

close > nz(close[1], open)    // 当引用close内置变量前一个BAR的历史值时,如果不存在,则使用open内置变量

Este es un tratamiento para los posibles referencias al valor vacío ((na)).


Prioridad del operador

Ya hemos aprendido muchos operadores del lenguaje Pine que forman expresiones a través de combinaciones de operaciones y números de operaciones. Entonces, ¿cuál es la prioridad de estas operaciones cuando se calcula en las expresiones?

Las prioridades Operador
9 []
8 El valor de un operador en el tiempo+-ynot
7 */%
6 El operador binario en el momento+-
5 ><>=<=
4 ==!=
3 and
2 or
1 ?:

La parte de la expresión con una alta prioridad se opera primero, si la prioridad es la misma, se opera de izquierda a derecha.()Envuelto con la obligación de operar esta parte de la expresión primero.

Variables

Declaración de variables

Ya hemos aprendido el concepto del símbolo de símbolo, el símbolo de símbolo de símbolo es el nombre de una variable para darle un nombre. Por lo tanto, también se dice: una variable es un símbolo para guardar valores.

  • Modelo de declaración: Cuando se declara una variable, lo primero que se escribe es "modo de declaración". 1, el uso de palabras clavevar¿Qué es esto? 2o, el uso de palabras clavevarip¿Qué es esto? 3, nada escrito.

    varvaripLa palabra clave es algo que ya hemos aprendido en el capítulo anterior de "Operadores de asignación" y no se describe aquí.i = 1, de hecho, ya hemos dicho antes, que las variables declaradas así y las asignaciones, se ejecutan en cada K-line BAR.

  • Tipo de trabajo El lenguaje Pine en FMZ no es estricto con respecto a los requisitos de tipo, y generalmente se puede omitir. Sin embargo, para compatibilizar las políticas de script en Trading View, también se puede declarar variables con tipos. Por ejemplo:

    int i = 0 
    float f = 1.1
    

    Los tipos en Trading View son más estrictos, y si se usa el siguiente código en Trading View, se obtiene un error:

    baseLine0 = na          // compile time error!
    
  • Identificador El identificador es el nombre de la variable, el nombre del identificador se ha mencionado en el capítulo anterior, y se puede revisar:https://www.fmz.com/bbs-topic/9390#标识符

En resumen, declarando una variable se puede escribir:

// [<declaration_mode>] [<type>] <identifier> = value 
   声明模式             类型     标识符       = 值

Aquí se usa el operador de asignación:=Cuando se declara una variable, se le asigna un valor. Cuando se le asigna, el valor puede ser una cadena, un valor numérico, una expresión, una llamada de función, o un número de bits.ifforwhile¿Qué es esto?switchLas estructuras de si (las estructuras de palabras clave y el uso de la oración se explicarán en detalle en las lecciones posteriores, en realidad hemos aprendido en las lecciones anteriores la simple asignación de la oración de si, podemos volver a ver).

Aquí nos enfocamos en la función de entrada, una función que usamos con mucha frecuencia cuando diseñamos políticas.

Función de entrada:

input函数,参数defval、title、tooltip、inline、group

La función de entrada en FMZ es un poco diferente a la función de entrada en Trading View, aunque la función se utiliza como entrada de asignación de parámetros de la estrategia. A continuación, se explica en detalle el uso de la función de entrada en FMZ con un ejemplo:

param1 = input(10, title="参数1名称", tooltip="参数1的描述信息", group="分组名称A")
param2 = input("close", title="参数2名称", tooltip="参数2的描述信息", group="分组名称A")
param3 = input(color.red, title="参数3名称", tooltip="参数3的描述信息", group="分组名称B")
param4 = input(close, title="参数4名称", tooltip="参数4的描述信息", group="分组名称B")
param5 = input(true, title="参数5名称", tooltip="参数5的描述信息", group="分组名称C")

ma = ta.ema(param4, param1)
plot(ma, title=param2, color=param3, overlay=param5)

En FMZ, la función de entrada muestra automáticamente en la interfaz de la política de FMZ el control para establecer los parámetros de la política. Los controles que se admiten en FMZ actualmente tienen cuadro de entrada de valores, cuadro de entrada de texto, cuadro de descenso, barra de valoración.

img

En este artículo, vamos a explicar algunos de los principales parámetros de las funciones de entrada:

  • defval: el valor predeterminado de las opciones de parámetros de la política de la función de entrada, que admite variables, números y cadenas integradas en el lenguaje Pine
  • title: nombre de parámetro que muestra la política en la interfaz de la política de disco real / retrospectiva.
  • tooltip: sugerencia de los parámetros de la política, cuando el ratón se detiene en los parámetros de la política, se muestra el mensaje de texto en el que se ha configurado este parámetro.
  • group: nombre de grupo de parámetros de la política, puede darse un grupo de parámetros.

Además de las declaraciones de variables individuales y las asignaciones, el lenguaje Pine también declara un conjunto de variables y las asigna:

[变量A,变量B,变量C] = 函数 或者 ```if```、 ```for```、```while```或```switch```等结构

El más común es el que usamosta.macdCuando la función calcula el indicador MACD, como el indicador MACD es un indicador multilíneo, se calculan tres conjuntos de datos; por lo tanto, se puede escribir como:

[dif,dea,column] = ta.macd(close, 12, 26, 9)

plot(dif, title="dif")
plot(dea, title="dea")
plot(column, title="column", style=plot.style_histogram)

Es muy fácil dibujar un gráfico MACD con el código anterior, ya que no solo las funciones integradas pueden devolver varias variables, sino que las funciones personalizadas escritas también pueden devolver varias datos.

twoEMA(data, fastPeriod, slowPeriod) =>
    fast = ta.ema(data, fastPeriod)
    slow = ta.ema(data, slowPeriod)
    [fast, slow]

[ema10, ema20] = twoEMA(close, 10, 20)
plot(ema10, title="ema10", overlay=true)
plot(ema20, title="ema20", overlay=true)

Usar estructuras como if como asignación de varias variables es similar a la forma de escribir las funciones personalizadas mencionadas anteriormente.

[ema10, ema20] = if true
    fast = ta.ema(close, 10)
    slow = ta.ema(close, 20)
    [fast, slow]

plot(ema10, title="ema10", color=color.fuchsia, overlay=true)
plot(ema20, title="ema20", color=color.aqua, overlay=true)

Estructura condicional

Algunas funciones no se pueden escribir en bloques de código locales con una rama condicional, principalmente las siguientes:

barcolor (), llenar (), línea (), indicador (), gráfico (), vela de gráfico (), gráfico (), gráfico (), gráfico (), gráfico ())

En Trading View se compiló un informe de errores. En FMZ las restricciones no son tan severas, pero también se recomienda seguir las normas de escritura en Trading View. Por ejemplo, aunque no se reporta errores en FMZ, no se recomienda escribir así.

strategy("test", overlay=true)
if close > open 
    plot(close, title="close")
else 
    plot(open, title="open")

¿Cómo se llama?


Más.