Pineスクリプト®にマップ機能が新登場!

08 31, 2023

Pineプログラマーのための新しいツール、「マップ」をご紹介します。マップは、キーと値のペアによってデータを保持するコレクションです。マップを使うと、異なる型で関連する要素をリンクして、スクリプトの中であとからアクセスできるようになります。他のPineコレクションとは異なり、内部インデックスの代わりにキーと値のペアに付けられたキーを使うので、マップの値へのスクリプトのアクセスが速くなります。

マップの名前空間は、マップに関連する関数すべての本拠地になります。マップを作成するには、map.new<key_type, value_type>() 関数を使います。たとえば、下記のようになります:

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

マップのキーは基本型であればどのようなもの (int, float, bool, string, or color) でもよく、また値も型を問わず、ユーザー定義型でもかまいません。

マップを作成したら、マップの名前空間に存在する関数をどれでも使うことができます。たとえば、map.put() を使ってキーと値のペアをマップに挿入したり、map.get() を使って一意のキーにリンクした値を取得できます。また、map.keys()map.values() を使用して、マップされたキーや値すべてから配列を生成することもできます。これらの新しいコレクションと関連する関数の使用方法の詳細については、ユーザーマニュアルの「マップ」のページをご覧ください。

以下の例ではマップを使用して、セッションの価格変動に対してチャートの背景を着色するスクリプトを作成しました。このスクリプトではデータマップを使用して、各日のセッションごとに終値と正味の価格変動情報を保存します。それから、過去のセッションを指定した数だけ遡って得られた価格変動の平均に対して、現在のセッションでどれだけの価格変動が生じているかを比率として計算します。この比率に基づいてチャートの背景が色付けられていますが、このときにカラーマップの内容が使用されています。そして、比率の値がデータウィンドウに表示されています:

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

マップを使った公開スクリプトの例を以下にご紹介します:

Volume/Market Profile by SamRecio

Volume Profile by LuxAlgo

Historical Pattern Matcher by Trendoscope

Pine Script® の新機能についての最新情報は、ユーザーマニュアルのリリースノートでご覧になれます。 PineCodersアカウントでは、Telegramの Squawk BoxTwitterアカウント、そしてTradingViewのPineスクリプト® Q&A 公開チャットからも最新情報を発信しています。

ご要望が多かっただけに役立つ機能になると考えていますが、皆様にそう思っていただければ幸いです。プラットフォームをできるかぎり最善のものにしていくためにも、引き続きフィードバックやご提案をお寄せください。私たちは皆様のためにTradingViewを構築しています。ご意見をいつでもお待ちしております。

— チーム・トレーディングビュー

Look first Then leap

あなたのためのTradingView、その最高の機能を最大限にご活用ください
チャートを起動