메타데이터¶
메타데이터 함수는 전략의 버전, 설명, 사용자 정의 파라미터를 선언합니다. 스크립트 상단에 배치하는 것이 관례입니다.
version()¶
전략 스크립트의 버전을 지정합니다.
파라미터:
| 이름 | 타입 | 설명 |
|---|---|---|
ver |
str |
버전 문자열 |
Note
현재 지원 버전은 "1.0"입니다. 향후 DSL 문법이 변경될 경우 버전 기반으로 호환성을 관리합니다.
description()¶
전략에 대한 설명 텍스트를 지정합니다. 전략 목록에서 표시됩니다.
파라미터:
| 이름 | 타입 | 설명 |
|---|---|---|
desc |
str |
전략 설명 텍스트 |
param()¶
사용자 정의 파라미터를 선언합니다. 이 선언 자체가 스크립트 파라미터 기본값의 SSOT입니다.
param("rsi_period", "RSI 계산 기간", 14)
param("oversold_level", "과매도 기준선", 30)
param("overbought_level", "과매수 기준선", 70)
param("strategy_name", "전략 표시 이름", "RSI Strategy")
파라미터:
| 이름 | 타입 | 설명 |
|---|---|---|
name |
str |
파라미터 이름 |
description |
str |
파라미터 설명 |
default |
int, float, str |
기본값 |
파라미터 사용¶
선언한 파라미터는 script_params 딕셔너리를 통해 접근합니다.
param("period", "RSI 계산 기간", 14)
param("threshold", "매수 기준값", 30)
c = chart("1D")
rsi = ta.rsi(c.close, script_params["period"])
if rsi[0] < script_params["threshold"]:
buy(tag="RSI 과매도")
파라미터 활용 이점
- 파라미터 기본값을 코드에 명시적으로 남길 수 있습니다.
- 동일한 전략 코드를 여러 실행 컨텍스트에서 재사용할 수 있습니다.
- 동일한 전략 코드로 다양한 설정을 테스트할 수 있습니다.
수정 경계
canonical 문법은 param(name, description, default) 입니다. 스튜디오에는 별도의 파라미터 편집 패널이 없으므로, 기본값을 바꾸려면 param()의 세 번째 인자를 직접 수정해야 합니다.
실행 시점의 script_params 변경은 전략 탭의 로컬 전략 스코프에서만 적용되며 cloud에 저장되지 않습니다.
Cloud parser cache field naming
커뮤니티 스크립트 업로드/수정 payload에서 parser cache를 함께 보낼 때의 canonical 필드 이름은 runtime_parser_result_json입니다. cloud 응답에서는 runtimeParserResultJson으로 내려옵니다.
예전 이름인 params_json, param_parsed_metadata_json, param_metadata_json은 더 이상 지원하지 않습니다. 새 연동에서는 runtime_parser_result_json만 사용해야 합니다.
예제: 파라미터화된 볼린저밴드 전략¶
version("1.0")
description("파라미터화된 볼린저밴드 전략")
param("bb_period", "볼린저밴드 기간", 20)
param("bb_std", "표준편차 배수", 2.0)
param("timeframe", "조회 타임프레임", "1D")
c = chart(script_params["timeframe"])
upper, mid, lower = ta.bbands(c.close, script_params["bb_period"], script_params["bb_std"])
c.line("Upper", upper, color="red")
c.line("Mid", mid, color="gray")
c.line("Lower", lower, color="green")
if c.close[0] < lower[0]:
buy(tag="하단밴드 이탈 — 반등 기대")
elif c.close[0] > upper[0]:
sell(tag="상단밴드 이탈 — 과열")
else:
hold()