Se você ainda não escreveu uma estratégia com a linguagem Pine, que é tão fácil de aprender, eu...

Autora:Sonhos pequenos, Criado: 2022-06-01 17:37:55, Atualizado: 2023-09-18 20:19:45

img

Se você ainda não escreveu uma estratégia com a linguagem Pine, que é tão fácil de aprender, eu...

É uma pena que tantas estratégias, ideias e indicadores excelentes não possam ser implementados em TradingView. É uma pena ver que a FMZ, como uma empresa dedicada a tornar a tecnologia de negociação quantitativa mais comum para muitos traders, não consegue conter o impulso de resolver essa necessidade!

A necessidade é insuportável!

Assim, no mundo do desenvolvimento de código de programação, depois de trilhar montanhas, percorrer milhares de montanhas, percorrer 9 * 9 = 81 crateras, passar inúmeras noites sem dormir, a parede acumulou o vulcão vulcão comum de Red Bull. Finalmente, o FMZ suporta a compatibilidade com a linguagem Pine, e todos os scripts do Pine do TradingView podem ser usados.

Eu também aprendi o idioma Pine recentemente. Mas a verdade é que o idioma Pine é simples e fácil de usar e aprender. O quê? Não acredito? Veja a minha cebola a escrever uma estratégia de rede para você.

/*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)

O FMZ possui um disco real, ferramentas de retrospecção, inúmeras funções, além da linguagem Pine, que é fácil de usar.

É claro que esta estratégia é uma estratégia de rede, a estratégia de rede também tem feridas, não é uma impressora que ganha tudo, o importante é ver o uso e os parâmetros. Isso não é uma descrição, nós estamos mais focados em como escrever estratégias fáceis, realizar sua própria lógica de negociação, escrever estratégias de negociação para ganhar dinheiro, sem pedir ajuda é uma sensação muito legal!

Descrição do código

Estou aqui para dar uma explicação para vocês, o código é simples e fácil de entender, com uma linguagem tão fácil de aprender, o Pine, se você ainda não escreveu uma estratégia, então eu vou... em detalhes!

Começou/*backteste*/O conteúdo embalado é o código de configuração de repassagem do FMZ, que é uma função do FMZ e não o conteúdo da linguagem Pine. É claro que você pode não escrever essa parte do conteúdo e, ao repassá-lo, você precisa clicar manualmente no controle de parâmetros para configurar a configuração e os parâmetros de repassagem.

/*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]]
*/

O seguinte código:

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)Algumas opções usadas para configurar o script são: overlay=true, ou seja, dar um parâmetrooverlayAssegure o valor true, para que, ao desenhar um gráfico, ele seja desenhado no gráfico principal (o gráfico de K é o gráfico principal, é tão simples de entender).
  • varip beginPrice = 0A palavra-chave varip é usada para declarar que um valor inicial da variável beginPrice é 0, que é o preço inicial da rede.
  • var spacing = input.float(-1, title="间距价格")A definição de um parâmetro de estratégia é chamada de parâmetro de intervalo de preço de cada ponto da rede, ou seja, o intervalo de cada ponto da rede.
  • var dir = input.string("long", title="方向", options = ["long", "short", "both"])A configuração de um parâmetro de política, chamado de parâmetro de direção de barras de barras de barras, é uma opção com caixa de drag, que permite escolher long, short, both.
  • var amount = input.float(-1, title="下单量")Configura um parâmetro para controlar o volume de transações por ponto de rede.
  • var numbers = input.int(-1, title="网格数量")O número de pontos de rede, 20 é 20 pontos de rede em uma direção.
  • var profit = input.int(-1, title="盈利价差") / syminfo.mintickA diferença de preço entre as posições de cada ponto da rede é estabilizada por um parâmetro.

A seguir, veja o código:

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

Isso significa que, se qualquer um dos parâmetros spacing, amount, numbers, profit não estiver definido como -1, a política será interrompida.

Vamos, vamos!

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

Isso significa que quando a política está no estágio da linha K em tempo real e o preço inicial é == 0, é possível alterar o valor do preço inicial para o preço mais recente atual. Quando a política é executada formalmente, o preço atual inicial é o preço inicial da grade. Como o script tem um estágio histórico da linha K BAR, a estratégia executa a lógica repetidamente no estágio histórico da barra, não faz sentido colocar a grade no bar histórico.

O que é a fase BAR da história?

Por exemplo, no momento atual A, a estratégia começa a ser executada, e a estratégia recebe um dado com 100 K-line BARs, e com o tempo 100 BARs se tornam 101, 102... N. Quando a estratégia começa a ser executada no momento A, o 101o BAR é o estágio da linha K em tempo real, que é o momento mais recente de dados em tempo real. Então, do 1o BAR ao 100o BAR, todos esses são históricos já passados, mas a estratégia também funciona em todos esses históricos, então este estágio é o estágio da linha K em tempo real.

barstate.ishistoryEsta é uma variável embutida da linguagem Pine, e se o BAR atual for o BAR do estágio histórico, então a variável é a variável que está sendo usada no estágio histórico.barstate.ishistorySe for verdade, o BAR é falso se não for o estágio histórico. Portanto, o not barstate.ishistory está no estágio da linha K em tempo real.

E então nós criamos uma função.

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 

A função busca se existe um id entre todas as ordens que já estão em negociação, e retorna o ID do único que existe quando a função findTradeId é chamada (note que este ID não é o ID do pedido da bolsa, é o nome ou a etiqueta da estratégia para a ordem), se não existe, retorna a string "notFound".

A partir daí, começa a criação da rede:

// 实时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)

O ciclo for é usado para determinar o número de ciclos, ou seja, colocar as ordens correspondentes em números baseados no parâmetro de números. O parâmetro dir é usado para definir direção. A função findTradeId é usada para verificar se as ordens marcadas no local da grade atual já estão abertas e só podem ser baixadas quando não estiverem abertas. A função strategy.order é usada para especificar o parâmetro limit para a lista de planos. A função strategy.order é usada para especificar o ponto de lucro.

img

img

img

img

A curva de ganhos mostra que as redes também são arriscadas, não ganham, mas apenas levam um pouco menos de risco em uma grande escala.

Então, se eu não escrever estratégias com a linguagem Pine, que é tão fácil de aprender, então eu...


Relacionados

Mais.

Perseguidor.Este tipo de tutoriais de nível de parto pode ser mais do que alguns, preferencialmente dedicado a tutoriais de pinos ((conhecimento pago)hhh 。 sonho total v587

artronObrigado.

BBBwwed2009Sonho total V5

Sonhos pequenosSim, já fiz uma série de tutoriais do Pine na estação B: https://www.bilibili.com/video/BV1sU4y1B71i/

Sonhos pequenosNão é cortês, obrigado por apoiar o FMZ.

Sonhos pequenosO canal B também tem um vídeo de introdução à língua PINE.