파인 스크립트® 맵 기능 추가!

Aug 31, 2023

Pine 코더를 위한 새로운 도구인 맵, 키-값 쌍으로 데이터를 보관하는 컬렉션을 소개합니다. 이를 통해 사용자는 나중에 스크립트에서 액세스할 수 있도록 서로 다른 유형의 관련 요소를 함께 연결할 수 있습니다. 다른 Pine 컬렉션과 달리 스크립트에서는 내부 인덱스 대신 키-값 쌍의 키를 사용하여 맵의 값에 빠르게 액세스할 수 있습니다.

map 네임스페이스에는 모든 맵 관련 함수가 있습니다. 맵을 만들려면 map.new<key_type, value_type>() 펑크션을 씁니다. 보기로,

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

맵의 키는 모든 기본 타입 (int, float, bool, string, 또는 color) 이 될 수 있으며, 값은 사용자 정의 타입을 포함한 모든 타입이 될 수 있습니다.

맵을 만든 후에는 맵 네임스페이스에 있는 모든 함수를 map 과 함께 쓸 수 있습니다. 보기로, map.put()을 써서 키-값 페어를 맵에 넣고, map.get()을 써서 고유 키에 연결된 값을 검색할 수 있습니다. map.keys() 또는 map.values()를 써서 매핑된 모든 키나 값으로 어레이를 만들어낼 수도 있습니다. 이러한 새로운 컬렉션과 관련 함수를 사용하는 방법에 대한 자세한 내용은 맵에 대한 사용 설명서 페이지를 참조하세요.

아래 보기에서는 맵을 써서 세션 가격 변동에 따라 차트 배경에 색을 입히는 스크립트를 만들었습니다. 이 스크립트는 data 맵을 써서 매일 세션의 마감 시간과 순 가격 변동 정보를 저장한 다음, 현재 세션의 가격 변동과 지정된 수의 과거 세션 평균 변동 간의 비율을 계산합니다. colors 맵의 내용을 사용하여 이 비율에 따라 차트 배경의 색상을 지정하고 데이터 창에 비율 값을 표시합니다:

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

새로운 파인 스크립트® 기능에 대한 최신 정보를 얻으려면 사용자 설명서의 릴리스 노트를 주시하십시오. 또한 파인코더 계정은 텔레그램의 스쿼크 박스, 트위터 계정, 트레이딩뷰의 파인 스크립트® Q&A 공개 채팅을 통해 업데이트를 방송하고 있습니다.

많은 요청을 받았던 이 기능이 유용하게 쓰이길 바라며, 최고의 플랫폼을 만들 수 있도록 피드백과 제안을 계속 보내주시기 바랍니다. 트레이딩뷰는 여러분을 위해 만들어졌으며 항상 여러분의 의견을 듣고자 합니다.

– 트레이딩뷰 팀

Look first Then leap

트레이딩뷰는 여러분을 위해 만들어졌으므로 트레이딩뷰의 멋진 기능을 최대한 활용하세요
차트 시작