초심자 트랙¶
QuantiqDSL을 처음 접하는 분을 위한 학습 순서입니다. 4개 단계를 순서대로 따라가면 기본 전략을 직접 작성하고 실행할 수 있게 됩니다.
각 단계는 20~40분 분량입니다.
1단계: 첫 전략 작성과 실행 이해¶
읽을 문서
이 단계에서 배우는 것
QuantiqDSL 스크립트는 이벤트(가격 변동, 봉 마감)가 발생할 때마다 처음부터 끝까지 다시 실행됩니다. 마치 스프레드시트 수식이 값이 바뀔 때마다 다시 계산되는 것처럼요.
version("1.0") # 버전 선언 (필수)
description("첫 전략") # 전략 설명 (필수)
c = chart("1D") # 일봉 데이터 불러오기
fast = ta.sma(c.close, 5)
slow = ta.sma(c.close, 20)
if fast.cross_up(slow):
buy(tag="골든크로스") # 매수 결정
elif fast.cross_down(slow):
sell(tag="데드크로스") # 매도 결정
else:
hold() # 현재 포지션 유지
체크포인트
- [ ]
version(),description()역할을 설명할 수 있다 - [ ] 스크립트가 이벤트마다 처음부터 다시 실행된다는 것을 이해했다
- [ ]
buy(),sell(),hold()중 반드시 하나만 최종 결정이 된다는 것을 안다
2단계: 데이터 읽기¶
읽을 문서
이 단계에서 배우는 것
chart() 함수는 OHLCV 시계열 데이터를 반환합니다. [0]은 현재 바, [1]은 한 바 이전입니다.
price와 c.close[0]의 차이:
price |
c.close[0] |
|
|---|---|---|
| 값 | 현재 실시간 가격 | 현재 봉의 종가 (확정 전까지는 현재가와 동일) |
| 언제 유용한가 | 실시간 조건 판단 | 봉 마감 기준 판단 |
체크포인트
- [ ]
c.close[0],c.close[1]로 당일·전일 종가를 읽을 수 있다 - [ ]
pricevsc.close[0]차이를 설명할 수 있다 - [ ]
script_params로 파라미터 값을 읽을 수 있다
3단계: 기본 지표로 전략 만들기¶
읽을 문서
이 단계에서 배우는 것
ta.* 네임스페이스에서 기술 지표를 호출합니다. 반환값은 TSeries(시계열)이므로 인덱스로 접근하거나 교차 감지 메서드를 사용할 수 있습니다.
c = chart("1D")
# 이동평균
sma5 = ta.sma(c.close, 5) # 5일 단순이동평균
ema20 = ta.ema(c.close, 20) # 20일 지수이동평균
# RSI
rsi = ta.rsi(c.close, 14)
# 사용 예시
if rsi[0] < 30 and sma5.cross_up(ema20):
buy(tag="RSI 과매도 + 골든크로스")
체크포인트
- [ ]
ta.sma,ta.ema,ta.rsi를 사용한 전략을 직접 작성했다 - [ ]
cross_up(),cross_down()메서드를 사용할 수 있다 - [ ]
if/elif/else구조로 하나의 결정만 내리도록 코드를 작성할 수 있다
4단계: 안전한 코드 작성¶
읽을 문서
이 단계에서 배우는 것
QuantiqDSL은 안전한 샌드박스 환경에서 실행됩니다. 다음 구문은 사용할 수 없습니다.
# 금지 구문 (에러 발생)
import pandas as pd # ❌ import 금지
def my_func(): # ❌ def 금지
class MyClass: # ❌ class 금지
result = eval("...") # ❌ eval 금지
대신 내장 함수와 ta.*, math.* 네임스페이스를 활용합니다.
# 올바른 방법
c = chart("1D")
avg = math.mean([c.close[i] for i in range(5)]) # ✅
result = ta.sma(c.close, 5)[0] # ✅
체크포인트
- [ ] 금지 구문 5가지(
import,def,class,eval,exec)를 외웠다 - [ ]
math.*네임스페이스에서 유용한 함수를 찾아봤다 - [ ] 허용된 내장 함수 목록을 확인했다
전략 작성 체크리스트¶
모든 전략을 저장하기 전에 이 항목을 확인하세요.
version("1.0") # ✅ version() 누락 없음
description("전략 설명") # ✅ description() 누락 없음
c = chart("1D") # ✅ 타임프레임 문자열 확인 (1T, 5T, 1H, 1D)
# ✅ if/elif/else로 하나의 결정만 나도록 작성
if 조건:
buy(tag="이유")
elif 다른조건:
sell(tag="이유")
else:
hold() # ✅ else 분기에 hold() 또는 다른 결정
version()선언이 첫 줄에 있다- 타임프레임 문자열에 오타가 없다 (
"1D","5T","1H"등) - 모든 분기에서 결정 함수가 정확히 한 번 호출된다
- 인덱스 접근 전
c.close.is_valid(n)필요 여부를 검토했다
다음 단계¶
초심자 트랙을 완료했다면 중급자 트랙으로 이동하세요. 멀티 타임프레임, 상태 유지(var), 선언형 청산 규칙을 배웁니다.