오늘, Pine Script® v6의 출시를 발표하게 되어 기쁘게 생각합니다! 트레이더 중심 프로그래밍 언어의 이번 업그레이드 버전에는 다양한 최적화와 오랫동안 요청된 기능 개선이 포함되어 있어 Pine Script® 프로그래머에게 더 큰 효율성과 유용성을 제공하여 새로운 차원으로 도약할 수 있는 발판을 마련했습니다.
이 게시물에서는 Pine v6의 가장 주목할 만한 몇 가지 업그레이드에 대해 간략하게 설명합니다. 릴리스 노트에서 v6의 새로운 기능에 대해 자세히 알아보고 향후 개선 사항에 대한 최신 정보를 확인하세요.
v6 변환 도구
이전 버전 변경 사항과 마찬가지로 Pine v6에 포함된 업그레이드는 이전 Pine 버전에서 작성된 개인 스크립트 또는 게시된 스크립트에는 영향을 미치지 않습니다. 이 시점 이후의 모든 새로운 기능은 최신 Pine 버전에서만 구현되므로 새로운 기능에 액세스하려면 스크립트를 v6로 변환하는 것이 좋습니다. 가장 쉬운 방법은 Pine 에디터의 “스크립트 관리” 메뉴에서 “코드를 v6로 변환”을 선택하여 활성화할 수 있는 새로운 v6 변환 도구를 사용하는 것입니다.
모든 스크립트를 자동으로 v6로 변환할 수 있는 것은 아니며, 경우에 따라 변환된 스크립트가 예상대로 작동하도록 수동 편집이 필요한 경우도 있습니다. 자동 변환에 문제가 발생하거나 스크립트를 v6로 수동으로 변환하려는 경우 편리한 마이그레이션 가이드를 참조하세요.
동적 요청
트레이딩뷰는 전 세계 거래 가능한 상품, 금융 지표, 경제 지표에 대한 수만 개의 심볼에 대한 액세스를 제공합니다. request.*() 함수군을 사용하면 파인 스크립트가 차트에서 사용하는 심볼과 차트 주기에 관계없이 다양한 주기로 사용 가능한 모든 심볼에 대한 데이터를 검색할 수 있습니다.
이러한 함수는 수많은 사용 사례를 가진 강력한 유틸리티입니다. 그러나 이전에는 “단순 문자열” 값을 사용하여 요청의 심볼과 기간을 지정해야 했기 때문에 첫 번째 막대에서 컨텍스트를 알아야 하고 이후에는 변경할 수 없다는 중대한 한계가 있었습니다. 또한 모든 request.*() 호출은 스크립트의 전역 범위 내에서 엄격하게 실행되어야 했습니다. 즉, 코드의 단일 request.*() 인스턴스는 하나의 심볼과 기간에 대해서만 데이터를 가져올 수 있으며 루프, 조건부 구조 또는 내보낸 라이브러리 함수 내부에서는 request.*() 호출이 허용되지 않았습니다.
Pine Script® v6에서는 이러한 제한이 제거되었습니다. 이제 스크립트에서 “시리즈 문자열” 값을 사용하여 request.*()호출의 컨텍스트를 정의할 수 있습니다. 또한 이제 로컬 범위 내에서 request.*() 호출이 허용됩니다. 이러한 변경 사항을 통해 기록 막대에서 심볼을 계산하거나 수정하고 데이터를 동적으로 요청할 수 있으며, 심볼 컬렉션을 만들고 루프 내에서 데이터를 가져오는 등 이전에는 불가능했던 여러 가지 작업을 request.*() 함수를 통해 수행할 수 있습니다. 자세한 내용은 사용 설명서의 동적 요청 섹션을 참조하세요.
동적 요청으로 수행할 수 있는 작업의 예를 보려면 기본 제공 성능 지표의 내부 작동을 확인하세요. 이 스크립트는 쉼표로 구분된 심볼 및 기간 문자열 목록을 배열로 분할한 다음 루프 내부에서 request.security()를 동적으로 호출하여 각 데이터 세트에서 값을 가져옵니다. 과거에는 이와 같은 스크립트에서 여러 개의 input.symbol() 및 input.timeframe() 호출이 필요했을 것이고, 각 심볼-프레임 조합마다 코드에서 별도의 request.security() 호출이 필요했을 것입니다:
추가 참조를 위해 다른 컨텍스트에서 데이터를 가져오는 동적 요청을 활용하는 트레이딩뷰 계정에서 게시한 이 스크립트를 확인하세요.
- 포렉스 히트맵. 이 인디케이터는 사용자가 지정한 통화 코드 목록을 기반으로 통화쌍 조합에 대한 티커 ID를 생성합니다. 루프 내에서 각 쌍 조합에 대한 데이터를 동적으로 요청한 다음 이 데이터를 사용하여 색상으로 구분된 표를 채웁니다.
- 티커 테이프. 이 인디케이터는 사용자 정의 심볼 목록에서 티커 ID 배열을 생성합니다. 루프 내의 배열에서 각 티커 ID에 대한 가격 및 일일 변동 정보를 동적으로 요청한 다음 데이터를 사용하여 회전하는 “테이프” 디스플레이를 업데이트합니다.
- LibraryCOT. 이전에는 라이브러리가 request.*() 호출이 포함된 함수를 내보낼 수 없었기 때문에 이 라이브러리는 CFTC COT(거래자 약정) 데이터를 요청하기 위한 티커 ID를 생성하는 도구만 제공했습니다. 동적 요청에서는 더 이상 이 제한이 적용되지 않습니다. 이제 라이브러리에서 요청.security()를 내부적으로 호출하여 COT 데이터를 직접 검색하는 requestCommitmentOfTraders() 함수를 내보내 프로그래머에게 더 많은 편의성과 다양성을 제공합니다.
또한 이전에는 모든 CFTC 보고서 코드가 “단순” 값을 반환하기 위해 switch 문 안에 포함되어 있어 요청 가능한 티커가 상당히 제한적이었습니다. 동적 요청을 사용하면 “단순 문자열” 티커 ID가 더 이상 필요하지 않으므로 라이브러리가 리포트 코드를 맵에 저장하고 더 많은 심볼을 지원할 수 있습니다.
불리언 최적화
Pine Script® v6의 가장 주목할 만한 개선 사항 중 하나는 겉으로 드러나지 않을 수 있지만 코드 효율성의 차이를 느낄 수 있을 것입니다. 파인에서 “bool” 값의 내부 구현을 재작업했으며, 결과를 결정하는 데 필요하지 않은 경우 and 및 or 연산이 추가 표현식 평가를 중지할 수 있는 단락(또는 “지연”) 평가 기능을 도입했습니다.
이러한 변경으로 트레이딩뷰에서 대부분의 스크립트 성능이 향상되었습니다. 가장 인기 있는 오픈 소스 커뮤니티 스크립트 테스트에서 확인했듯이 조건에 크게 의존하고 “bool” 값을 많이 사용하는 비교적 큰 스크립트에서 효율성의 차이가 특히 두드러집니다.
보너스로, 지연된 “bool” 평가는 종종 더 깔끔하고 간결한 코드를 만들 수 있습니다. 예를 들어 배열의 항목에 의존하는 조건이 있는 경우, 인덱스가 범위를 벗어나면 스크립트가 중지되고 오류가 발생하므로 배열의 크기를 확인하여 항목의 인덱스가 존재하는지 확인해야 할 수 있습니다. 지연 평가 기능을 갖춘 Pine v6에서는 요소에 액세스하기 전에 배열을 검사하는 단일 조건식을 만들 수 있으며, 이는 v5에서는 불가능했습니다.
//@version=6 indicator("Lazy evaluation demo") //@variable A "bool" array without a fixed size. array<bool> myArray = array.new<bool>() // Push a new value into `myArray` when the `close` is above the `open`. if close > open myArray.push(true) // Line 13 causes an error in v5 because `myArray.first()` always executes, even if the first expression is `false`. // It works in v6 though because `myArray.first()` executes only if the first expression evaluates to `true`. if myArray.size() != 0 and myArray.first() label.new(bar_index, high, "Test")
텍스트 크기 및 서식
이제 텍스트(박스, 라벨, 및 테이블)를 표시하는 모든 그림 유형에서 표준 텍스트 편집기에서 사용되는 것과 동일한 활자체 포인트로 지정된 텍스트 크기를 사용할 수 있습니다. 이전에는 size.large(24) 및 size.huge(36)와 같은 임의의 size.* 상수 중에서 선택해야 했습니다. 이제 새로운 타이포그래피 포인트 사양을 사용하면 텍스트 크기를 원하는 대로 정확하게 지정할 수 있습니다. 이전 Pine 버전에서는 불가능했던 거대한 텍스트 크기를 만들 수도 있습니다.
또한 이러한 드로잉 유형에 대한 새로운 text_formatting 매개 변수를 도입하여 텍스트를 이탤릭체, 굵게 또는 둘 다로 만들 수 있습니다.
//@version=6 indicator("Text size showcase", overlay = true) var t = table.new(position.bottom_center, 1, 2, bgcolor = color.yellow, frame_color = color.black, frame_width = 1) if barstate.islastconfirmedhistory t.cell(0, 0, "text_size = size.huge", text_size = size.huge) t.cell(0, 1, "text_size = 60, bold & italicized", text_size = 60, text_formatting = text.format_bold + text.format_italic)
스트래티지 오더 트리밍
액티브 스트래티지 스크립트 사용자는 딥 백테스팅 모드를 사용하지 않는 한 Pine v5에서 전략이 계산을 중지하고 오류가 발생하기 전에 최대 9000개의 거래를 시뮬레이션할 수 있다는 것을 알고 있을 것입니다. 이 제한은 빈번한 거래를 시뮬레이션하고 얼러트 트리거를 생성하는 전략의 경우 특히 불편합니다.
Pine Script® v6에서는 9000 거래 한도에 도달한 후 전략이 더 이상 계산을 중지하거나 오류를 발생시키지 않습니다. 대신 전략은 가장 오래된 주문을 잘라내어 새 주문을 위한 공간을 확보합니다. 트림된 주문은 전략 테스터에 표시되지 않지만 전략은 문제없이 계산을 계속합니다. 트림되지 않은 가장 오래된 주문의 거래 지수를 확인하려면 새로운 strategy.closedtrades.first_index 변수를 사용할 수 있습니다. 이 인덱스는 strategy.closedtrades.*() 함수 호출에서 trade_num 인수로 사용할 수 있습니다.
네거티브 어레이 인덱스
Pine v6에서 array.get(), array.set(), array.insert(), 및 array.remove()함수는 이제 배열의 끝부터 항목을 참조하는 네거티브 index 인수를 사용할 수 있으므로 배열 요소를 역순으로 참조하는 보다 간결하고 편리한 방법을 제공합니다. 예를 들어 array.get(myArray, -2)을 호출하면 array.get(myArray, array.size(myArray) – 2)에 해당하는 myArray의 두 번째부터 마지막 요소를 검색할 수 있습니다.
Pine Script® 환경의 최신 개선 사항에 대한 최신 정보를 확인하려면 사용자 설명서의 릴리스 노트를 주시하세요. v6 섹션에는 이 블로그 게시물에 포함되지 않은 몇 가지 추가 변경 사항도 포함되어 있습니다.
이 기능들이 유용하게 사용되시길 바라며, 최고의 플랫폼을 만들 수 있도록 피드백과 제안을 계속 보내주시기 바랍니다. 트레이딩뷰는 여러분을 위해 만들고 있으며 항상 여러분의 의견을 듣고 싶습니다.
– 트레이딩뷰 팀