콘텐츠로 이동

초심자 트랙

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]은 한 바 이전입니다.

c = chart("1D")

c.close[0]   # 오늘 종가
c.close[1]   # 어제 종가
c.volume[0]  # 오늘 거래량

pricec.close[0]의 차이:

price c.close[0]
현재 실시간 가격 현재 봉의 종가 (확정 전까지는 현재가와 동일)
언제 유용한가 실시간 조건 판단 봉 마감 기준 판단

체크포인트

  • [ ] c.close[0], c.close[1]로 당일·전일 종가를 읽을 수 있다
  • [ ] price vs c.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), 선언형 청산 규칙을 배웁니다.