Si no escribo estrategias con este lenguaje fácil de aprender, como el lenguaje Pine, entonces...

El autor:Un sueño pequeño., Creado: 2022-06-01 17:37:55, Actualizado: 2023-09-18 20:19:45

img

Si no escribo estrategias con este lenguaje fácil de aprender, como el lenguaje Pine, entonces...

Es una lástima que tantas estrategias, ideas e indicadores excelentes no se puedan implementar en TradingView, ya que hay una explosión de estrategias de código abierto.

¡Este deseo es insoportable!

Así, en el mundo del código de desarrollo de programación, después de subir montañas, caminar por montañas, atravesar 9 * 9 = 81 pozos, pasar innumerables noches sin dormir, los muros se acumulaban después de que los muros se acumulaban. Finalmente, FMZ admitió la compatibilidad con el lenguaje Pine, y todos los guiones de Pine de TradingView se podían usar.

En cuanto al lenguaje Pine, yo también me he autoaprendiendo recientemente. ¿Qué? ¿No lo crees? Mira, mis cebollas te han escrito una estrategia de rejilla.

/*backtest
start: 2021-06-01 00:00:00
end: 2022-05-23 00:00:00
period: 1h
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
args: [["v_input_float_1",500],["v_input_string_1",2],["v_input_float_2",0.01],["v_input_int_1",20],["v_input_int_2",500],["RunMode",1,358374],["MinStock",0.001,358374]]
*/

strategy(overlay=true)

varip beginPrice = 0
var spacing = input.float(-1, title="间距价格")
var dir = input.string("long", title="方向", options = ["long", "short", "both"])
var amount = input.float(-1, title="下单量")
var numbers = input.int(-1, title="网格数量")
var profit = input.int(-1, title="盈利价差") / syminfo.mintick

if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
    runtime.error("参数错误")

if not barstate.ishistory and beginPrice == 0 
    beginPrice := close 

findTradeId(id) =>
    ret = "notFound"
    for i = 0 to strategy.opentrades - 1
        if strategy.opentrades.entry_id(i) == id 
            ret := strategy.opentrades.entry_id(i)
    ret 

// 实时K线阶段
if not barstate.ishistory
    // 检索网格
    for i = 1 to numbers
        // 做多
        direction = dir == "both" ? "long" : dir 
        plot(beginPrice-i*spacing, direction+str.tostring(i), color.green)
        if direction == "long" and beginPrice-i*spacing > 0 and beginPrice-i*spacing < close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.long,  qty=amount, limit=beginPrice-i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
        // 做空
        direction := dir == "both" ? "short" : dir 
        plot(beginPrice+i*spacing, direction+str.tostring(i), color.red)
        if direction == "short" and beginPrice+i*spacing > close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.short, qty=amount, limit=beginPrice+i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)

FMZ cuenta con una gran cantidad de funciones, herramientas de revisión y una gran cantidad de funciones, además de la sencillez de uso del lenguaje Pine, que pueden ser consideradas como una herramienta de juego. ¡Cuenta con la configuración de parámetros, la configuración de revisión y el código, que no supera las 50 líneas de código en total!

Por supuesto, esta estrategia es una estrategia de red, la estrategia de red también tiene una herida, no es una impresora ganadora, lo clave es ver el uso, los parámetros. ¡Esto no es una descripción, nos centramos más en cómo escribir estrategias fáciles, realizar nuestra propia lógica de negociación, escribir estrategias de negociación para ganar dinero, ¡no pedir a nadie!

Descripción del código

Estoy aquí para darles una explicación, el código es sencillo y fácil de entender, en este lenguaje de Pine fácil de aprender.

El principio/*backtesty*/El contenido envuelto es el código de configuración de repetición de FMZ, que es una función de FMZ y no el contenido del lenguaje Pine. Por supuesto, puede dejar de escribir esta parte del contenido y, al volver a replicar, debe hacer clic manualmente en el control de parámetros para configurar la configuración y los parámetros de repetición.

/*backtest
start: 2021-06-01 00:00:00
end: 2022-05-23 00:00:00
period: 1h
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
args: [["v_input_float_1",500],["v_input_string_1",2],["v_input_float_2",0.01],["v_input_int_1",20],["v_input_int_2",500],["RunMode",1,358374],["MinStock",0.001,358374]]
*/

El siguiente código es:

strategy(overlay=true)

varip beginPrice = 0
var spacing = input.float(-1, title="间距价格")
var dir = input.string("long", title="方向", options = ["long", "short", "both"])
var amount = input.float(-1, title="下单量")
var numbers = input.int(-1, title="网格数量")
var profit = input.int(-1, title="盈利点数") / syminfo.mintick
  • strategy(overlay=true)Algunas opciones para configurar el guión: overlay=true, es decir, para dar parámetros.overlayLa asignación de valor true, para que cuando se dibuja el gráfico, se dibuja en el gráfico principal del gráfico (el gráfico de K es el gráfico principal, que es tan simple de entender).
  • varip beginPrice = 0Con la palabra clave varip se declara que la variable beginPrice tiene una asignación inicial de 0, que es el precio inicial de la red.
  • var spacing = input.float(-1, title="间距价格")Si el valor de cada punto de la red es igual a 100, el precio de cada transacción es igual a 100.
  • var dir = input.string("long", title="方向", options = ["long", "short", "both"])Se establece un parámetro de política, llamado parámetro de dirección de la malla, que es una opción con el cuadro de arrastre, se puede seleccionar largo, corto, ambos.
  • var amount = input.float(-1, title="下单量"): Establece un parámetro para controlar el volumen de transacciones en cada punto de la red.
  • var numbers = input.int(-1, title="网格数量"): número de puntos de la red, 20 es 20 puntos de la red en una dirección.
  • var profit = input.int(-1, title="盈利价差") / syminfo.mintick: Establece un parámetro que controla la rentabilidad de cada punto de la red y el par de precios para el equilibrio.

En la página de Facebook de la empresa, se puede leer el código:

if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
    runtime.error("参数错误")

Esto significa que si uno de los parámetros spacing, amount, numbers, profit no está configurado, por defecto es -1, la política se detiene.

¡ Vamos, ahora!

if not barstate.ishistory and beginPrice == 0 
    beginPrice := close 

Esto significa que cuando la política está en la fase de la línea K en tiempo real y el precio de inicio == 0, cambiar el valor de beginPrice a su precio actual más reciente. Se puede entender que cuando la política está funcionando formalmente, el precio actual inicial es el precio inicial de la rejilla. Como el script tiene una etapa histórica de la línea K BAR, la política ejecuta una vez más la lógica en la etapa histórica de la barra, no tiene sentido colocar la rejilla en la barra histórica.

¿Cuál es la etapa histórica del BAR?

Por ejemplo, en el momento actual A, la estrategia comienza a ejecutarse, y la estrategia obtiene un dato de 100 BAR de K líneas, que con el tiempo se convierte definitivamente en 100 BARs en 101, 102... N. Cuando comienza a ejecutarse desde el momento A, el 101o BAR es la fase de la línea K en tiempo real, y esta es la fase de datos en tiempo real más reciente. Entonces, desde el 1o BAR hasta el 100o BAR, todos estos son historias pasadas, pero la estrategia también se repite en estas historias, por lo que esta fase es la fase de la línea K en tiempo real.

barstate.ishistoryEsta es una variable interna del lenguaje Pine, si el BAR actual es el BAR de la etapa histórica, entonces el valor de BAR es igual al valor de BAR de la etapa histórica.barstate.ishistoryEs verdadero, si no es el BAR de la etapa de la historia, es falso. Así que no barstate.ishistory es verdadero, entonces está en la etapa de la línea K en tiempo real.

Y luego creamos una función.

findTradeId(id) =>
    ret = "notFound"
    for i = 0 to strategy.opentrades - 1
        if strategy.opentrades.entry_id(i) == id 
            ret := strategy.opentrades.entry_id(i)
    ret 

La función busca si existe un id en todos los pedidos que ya se han abierto y, si existe, devuelve el ID de la casilla existente cuando se llama a la función findTradeId (ten en cuenta que este ID no es el ID de la orden de la bolsa, sino el nombre o etiqueta de la política para la orden), si no existe, devuelve la cadena "notFound".

El siguiente paso es comenzar a organizar la red:

// 实时K线阶段
if not barstate.ishistory
    // 检索网格
    for i = 1 to numbers
        // 做多
        direction = dir == "both" ? "long" : dir 
        plot(beginPrice-i*spacing, direction+str.tostring(i), color.green)
        if direction == "long" and beginPrice-i*spacing > 0 and beginPrice-i*spacing < close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.long,  qty=amount, limit=beginPrice-i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
        // 做空
        direction := dir == "both" ? "short" : dir 
        plot(beginPrice+i*spacing, direction+str.tostring(i), color.red)
        if direction == "short" and beginPrice+i*spacing > close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.short, qty=amount, limit=beginPrice+i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)

Se utiliza el ciclo for para determinar el número de ciclos, es decir, la colocación de órdenes con el número correspondiente según el parámetro de números. Según el parámetro dir, se establece la dirección. Se utiliza la función findTradeId para determinar si las órdenes etiquetadas en la ubicación de la red actual ya se han abierto y solo se pueden bajar de la lista de planes cuando no se han abierto. Se utiliza la función strategy.order para especificar el parámetro limit como lista de planes.

img

img

img

img

Si nos fijamos en la curva de ganancias, sabemos que la red también es arriesgada, no es ganadora, solo que es un poco menos arriesgada en una gran escala.

Así que, si no escribo una estrategia con este lenguaje fácil de aprender, Pine, entonces...


Relacionados

Más.

El acosadorEste tipo de tutoriales a nivel de tutoría puede ser más de varios, lo mejor es que se dediquen a un tutorial de pines ((conocimiento pagado)hhh 。 sueño total v587

ArtrónGracias.

Se casó en 2009El sueño total V5

Un sueño pequeño.Sí, ya he hecho una serie de tutoriales de Pine en la estación B: https://www.bilibili.com/video/BV1sU4y1B71i/

Un sueño pequeño.Gracias por apoyar a FMZ.

Un sueño pequeño.También puedes ver un video de introducción al idioma PINE en la estación B.