O Pine Script® agora tem mapas!

Aug 31, 2023

Apresentamos uma nova ferramenta para os programadores de Pine — Os mapas, coleções que contêm dados em pares de valores-chave. Eles permitem que os usuários vinculem elementos relacionados de diferentes tipos para acesso posterior em um script. Ao contrário de outras coleções do Pine, os scripts acessam rapidamente os valores de um mapa usando as chaves de seus pares de valores-chave em vez de um índice interno.

O namespace map abriga todas as nossas funções relacionadas a mapas. Para criar um mapa, use a função map.new<key_type, value_type>(). Por exemplo:

//@variable A map containing `int` keys and  `line` values.
m = map.new<int, line>()

As chaves de um mapa podem ser de qualquer tipo fundamental (intfloatboolstring, ou color), e seus valores podem ser de qualquer tipo, até mesmo um tipo definido pelo usuário.

Depois de criar um mapa, você pode usar qualquer uma das funções no namespace map com ele. Por exemplo, você pode colocar pares de valores-chave nele usando map.put() e recuperar o valor vinculado a uma chave exclusiva usando map.get(). Você também pode gerar um array de todas as chaves ou valores mapeados usando map.keys() ou map.values(). Para obter mais informações sobre o uso dessas novas coleções e suas funções relacionadas, consulte a página sobre Maps do nosso Manual do Usuário.

No exemplo abaixo, criamos um script que usa mapas para colorir o plano de fundo do gráfico com base nas variações de preço da sessão. Ele usa um mapa de dados para armazenar o horário de fechamento e as informações de variação de preço líquido para cada sessão do dia e, em seguida, calcula uma proporção da variação de preço da sessão atual em relação à variação média em um número determinado de sessões do histórico. Ele colore o fundo do gráfico com base nessa proporção usando o conteúdo do mapa de cores e exibe o valor da proporção na Janela de Dados:

//@version=5
indicator("Session change highlighter", overlay = true)

// Inputs
sessionInput = input.session("0800-1700", "Session")
timezone     = input.string("America/New_York", "Timezone")
length       = input.int(10, "Sessions to compare")

//@variable A map of `int` closing time keys and `float` price change values.
var data = map.new<int, float>()
//@variable A map of `string` keys and `color` values for calculating the `highlightColor`.
var colors = map.new<string, color>()

var float sessionOpen    = na
float     relativeChange = na
int       closeTime      = time_close("D", sessionInput, timezone)

// Put (`string`, `color`) pairs into the `colors` map on the first bar.
if barstate.isfirst
    colors.put("Purple", color.new(color.purple, 50))
    colors.put("Orange", color.new(color.orange, 50))
    colors.put("Yellow", color.new(color.yellow, 50))

if not na(closeTime)
    // Update the session's opening price.
    if na(closeTime[1])
        sessionOpen := open

    // Assign a new value to the `closeTime` key in the `data` map.
    data.put(closeTime, math.abs(close - sessionOpen) / sessionOpen)

    //@variable An `array` of price changes from each session in the `data` map.
    sessionHistory = data.values()
    //@variable The number of sessions included in the `data` map.
    dataSize = data.size()

    if dataSize >= length
        //@variable The average price change over `length` sessions.
        avgSessionChange = sessionHistory.slice(dataSize - length, dataSize).avg()
        relativeChange := data.get(closeTime) / avgSessionChange

//@variable Returns a color gradient based on the `relativeChange` using the values in the `colors` map.
highlightColor = switch
    relativeChange <= 1 => color.from_gradient(relativeChange, 0, 1, colors.get("Purple"), colors.get("Orange"))
    =>                     color.from_gradient(relativeChange, 1, 2, colors.get("Orange"), colors.get("Yellow"))

bgcolor(highlightColor, title = "Background highlight")
plot(relativeChange, "Relative Change Ratio", highlightColor, display = display.data_window)

As publicações a seguir são exemplos de scripts que usam mapas:

Volume/Market Profile por SamRecio

Volume Profile por LuxAlgo

Historical Pattern Matcher por Trendoscope

Para se manter atualizado sobre os novos recursos do Pine Script®, fique de olho nas notas de Lançamento do Manual do Usuário. A conta do PineCoders também transmite atualizações a partir da sua Squawk Box no Telegram, da sua conta no Twitter e do chat público de Q&A do Pine Script® no TradingView.

Esperamos que esse recurso tão solicitado seja bastante útil, assim como achamos que será, e continue nos enviando seus comentários e sugestões para que possamos tornar a plataforma a melhor possível. Criamos o TradingView para você e estamos sempre dispostos a ouvir suas opiniões.

— Equipe do TradingView

Look first Then leap

TradingView is built for you, so make sure you're getting the most of our awesome features
Launch Chart