콘텐츠로 이동

제어 흐름

QuantiqDSL은 Python의 기본 제어 흐름 구문을 지원합니다.

조건문 (if/elif/else)

rsi = ta.rsi(c.close, 14)

if rsi[0] < 30:
    buy(tag="RSI 과매도")
elif rsi[0] > 70:
    sell(tag="RSI 과매수")
else:
    hold(tag="중립 구간")

중첩 조건문

c = chart("1D")
rsi = ta.rsi(c.close, 14)
sma = ta.sma(c.close, 20)

if c.close > sma:
    # 상승 추세
    if rsi[0] < 40:
        buy(tag="추세 상승 + RSI 저점")
    else:
        hold(tag="추세 상승, 진입 대기")
else:
    # 하락 추세
    if rsi[0] > 60:
        sell(tag="추세 하락 + RSI 고점")
    else:
        hold(tag="추세 하락, 관망")

반복문 (for)

for 반복문은 range(), 리스트, enumerate(), zip() 등과 함께 사용할 수 있습니다.

# range 사용
total = 0.0
for i in range(10):
    total = total + c.close[i]
avg = total / 10
log("최근 10봉 평균:", avg)

# 리스트 순회
periods = [5, 10, 20, 50]
for p in periods:
    sma = ta.sma(c.close, p)
    c.line(f"SMA {p}", sma, color="blue")

# enumerate 사용
timeframes = ["5T", "15T", "1H"]
for idx, tf in enumerate(timeframes):
    sc = chart(tf)
    log(f"[{idx}] {tf} 종가:", sc.close[0])

반복문 (while)

while 반복문도 사용 가능합니다.

# 특정 조건까지 과거 바 탐색
idx = 0
while idx < c.bars and c.close.is_valid(idx):
    if c.close[idx] < c.low[0]:
        log(f"{idx}봉 전에 현재 저가 이하 발견")
        break
    idx = idx + 1

무한 루프 주의

QuantiqDSL은 실행 시간 제한(timeout)이 있으므로 무한 루프는 자동 종료됩니다. 그래도 while 사용 시에는 반드시 종료 조건을 명확히 작성하세요.

루프 제어

break

반복문을 즉시 종료합니다.

# 최근 20봉 중 거래량 폭증 봉 찾기
spike_bar = -1
for i in range(20):
    avg_vol = ta.sma(c.volume, 20)
    if c.volume[i] > avg_vol[i] * 3:
        spike_bar = i
        break

if spike_bar >= 0:
    log(f"{spike_bar}봉 전 거래량 폭증 감지")

continue

현재 반복을 건너뛰고 다음 반복으로 진행합니다.

# 유효한 값만 처리
for i in range(50):
    if not c.close.is_valid(i):
        continue
    log(f"[{i}] 종가:", c.close[i])

관련 문서