파인: 오버로드, 뉴 스트링 펑크션 등!

Dec 23, 2021

파인 v5 릴리즈뒤로 끊임없이 새로운 피처 및 개선을 해오고 있습니다. 지난 두달에 걸쳐 만든오래 기다렸던 피처들을 보겠습니다.

펑크션 오버로드

펑크션 오버로드란 라이브러리에 디파인되어 있거나 스크립트에 들어가 있던 펑크션을 바꾼 것입니다. 오버로드는 오리지널 펑크션과 같은 이름을 쓰지만, 파라미터 갯수, 파라미터 타입 등이 다릅니다. 파라미터 타입이 고정된 라이브러리에 특히 쓸모가 있습니다.

아래 인디케이터에서 세 파라미터를 받는 mult() 펑크션의 오버로드가 나와 있습니다:

//@version=5
indicator("Function overload")

// Two parameters
mult(x1, x2) =>
    x1 * x2

// Three parameters
mult(x1, x2, x3) =>
    x1 * x2 * x3

plot(mult(7, 4))
plot(mult(7, 4, 2))

아규먼트 타입에 따라 서로 다르게 돌아가는 오버로드를 디파인하였습니다. 오리지널 펑크션과 같은 파라미터 갯수를 갖게 하려면 그 파라미터들은 오리지널 파라미터와는 서로 다른 타입이어야 합니다:

//@version=5
indicator("Function overload")

// Accepts both 'int' and 'float' values because any 'int' can be automatically cast to 'float'
mult(float x1, float x2) =>
    x1 * x2

// Returns a 'bool' value instead of a number
mult(bool x1, bool x2) =>
    x1 and x2 ? true : false

mult(string x1, string x2) =>
    str.tonumber(x1) * str.tonumber(x2)

// Has three parameters, so explicit types are not required
mult(x1, x2, x3) =>
    x1 * x2 * x3

plot(mult(7, 4))
plot(mult(7.5, 4.2))
plot(mult(true, false) ? 1 : 0)
plot(mult("5", "6"))
plot(mult(7, 4, 2))

for…in

for 스트럭쳐로 어레이를 돌리려면 빈 어레이가 되지 않도록 하고 어레이 인덱스가 바운드를 벗어나지 않도록 해야 합니다.

새로운 for…in 스트럭쳐는 어레이에 있는 모든 엘리먼트에 대해 돌려 주므로 편리합니다. 신택스는 심플합니다: for array_element in array_id 는 array_id  엘리먼트에 대해 인덱스 0부터 시작해 어레이의 각 엘리먼트를 array_element 베어리어블에 넣고 어레이를 돌립니다. 어레이가 비어 있거나 루프를 돌리는 도중에 새로운 어레이 엘리먼트가 들어가거나 빠져 나와도 에러가 나지 않습니다

아래 스크립트에서는 for…in 를 써서 a1 어레이에서 가장 큰 수를 찾아줍니다:

//@version=5
indicator("For...in cycle")
var int[] a1 = array.from(1, 3, 6, 3, 8, 0, -9, 5)

highest(array) =>
    var int highestNum = na
    for element in array
        if na(highestNum) or element > highestNum
            highestNum := element
    highestNum

plot(highest(a1))

새로운 스트링 펑크션

새 스트링 펑크션 및 레귤러 익스프레션 펑크션이 생겼습니다. 어레이를 쓰는 유저 디파인 스트링 펑크션과 달리 “simple” 폼의 밸류를 리턴할 수 있어 symbol arguments for request.security(),에 대한 symbol 아규먼트를 만들 수 있습니다.

str.contains(source, str)

source 스트링에 str 서브스트링이 들어 있는지를 알려줍니다. 보기로, 현재 차트가 연속 선물 차트인지를 알려면 syminfo.tickerid 빌트인 베어리어블에서 “!” 서브스트링이 들어있는지를 찾아보면 됩니다:

var isContinuous = str.contains(syminfo.tickerid, "!")  
plot(isContinuous ? 1 : 0)

str.pos(source, str)

source  스트링에서 str 스트링의 포지션을 리턴합니다.

str.substring(source, begin_pos, end_pos)

source 스트링에서 서브스트링을 뽑아냅니다. 다음 보기에서는 str.substring() 과 str.pos() 으로 인풋 스트링에서 “AAPL” 서브스트링을 읽어 옵니다:

s = input.string("Time to sell some NASDAQ:AAPL") 
pos = str.pos(s, ":")  // Get the position of the ":" character
tkr = str.substring(s, pos + 1) // "AAPL"

str.replace(source, target, replacement, occurrence)

기존의 str.replace_all() 펑크션과 달리, str.replace() 는 매치된 서브스트링을 대체 스트링으로 바꿀수 있습니다. 다음 보기에서, 스프레드 스트링의 첫 심볼에 대해 “FTX” 프레픽스를 “BINANCE” 로 바꿉니다:

var source = "FTX:BTCUSD / FTX:BTCEUR"
// Replace the first occurrence of "FTX" with the "BINANCE" replacement string
var newSource = str.replace(source, "FTX",  "BINANCE", 0)

str.lower(source) and str.upper(source)

source  스트링을 소문자 또는 대문자로 바꾸어 줍니다:

s = str.lower("Time to Sell Some AAPL") // time to sell some aapl!
s = str.upper("Time to Sell Some AAPL!") // TIME TO SELL SOME AAPL!

str.startswith(source, str) and  str.endswith(source, str)

source 스트링이 str 서브스트링으로 시작하는지 및 끝나는지를 알려 줍니다.

str.match(source, regex)

지정된 regular expression과 매칭이 되는 서브스트링을 뽑아 줍니다.  보기로, regex [\\w]+:[\\w]+ 로 “It’s time to sell some NASDAQ:AAPL!” 소스 스트링에서 심볼 네임을 뽑아 리턴합니다:

s = "It's time to sell some NASDAQ:AAPL!"
var string tickerId = str.match(s, "[\\w]+:[\\w]+") //"NASDAQ:AAPL"

커런시 컨버전

request.* 네임스페이스의 대부분의 펑크션들은 리턴 밸류를 다른 커런시로 바꿀 수 있습니다. currency 아규먼트가 펑크션 콜때 지정되면 이 펑크션이 리턴하는 프라이스 밸류는 소스 커런시에서 타겟 커런시로 바뀌게 됩니다. currency 파라미터는 다음 펑크션에 새로 생겼습니다:

텍스트박스

파인의 박스 드로잉에서 텍스트를 쓸 수 있습니다! 박스를 그린 뒤 그 안에 텍스트를 넣고 싶으면 box.new() 펑크션에 text 아규먼트를 넣기만 하면 됩니다. text_size, text_color, text_valign, 및 text_halign 파라미터로 텍스트를 세밀하게 조절할 수 있습니다. 아니면 아래 새 펑크션으로 조절할 수도 있습니다:

이 피처에 대한 보기로, 빌트인 Multi-Time Period Charts 인디케이터를 그 주의 하이/로우를 디스플레이하도록 바꾸었습니다:

새로운 파인 피처는 당사 파인 유저 매뉴얼의 릴리즈 노트에 나와 있습니다. 당사 PineCoders 또한 Squawk Box 텔리그램 채널, 트위터, 및 트레이딩뷰 파인 스크립트 퍼블릭 챗을 통해 업데이트를 내보내고 있습니다.

이 피처가 맘에 들기를 바라며 여러분의 피드백/서체스쳔을 기다립니다.

여러분을 위한 트레이딩뷰를 만들겠습니다.

Look first Then leap

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