콘텐츠로 이동

의사결정 (Decisions)

매 실행의 최종 결과는 buy(), sell(), hold(), exit(), release() 중 하나입니다.

buy

buy(qty=0, tag="", price=None)
  • qty: 주문 수량. 0이면 max_notional 기준 최대 수량을 자동 산정합니다 (auto-fill)
  • tag: 태그 문자열
  • price: 지정가 (None이면 시장가)

sell

sell(qty=0, tag="", price=None)
  • qty=0전량 매도입니다. 현재 보유 수량 전체를 매도합니다.
  • qty>0이면 지정 수량만큼 부분 매도합니다.
  • price를 주면 지정가 전량/부분 매도로 동작하고, price=None이면 시장가로 동작합니다.

hold

hold(tag="")

exit

exit(tag="")

현재 종목을 정리하고 전략에서 해제합니다.

  • 미체결 매수 주문을 취소하고, 보유 포지션을 시장가 매도합니다
  • 포지션이 0이 되면 전략에서 완전히 해제됩니다
  • 해제 대기 중에는 신규 buy/sell이 차단됩니다
  • 시장가 전용입니다. 지정가 정리가 필요하면 sell(price=...) + release() 조합을 사용하세요

release

release(tag="")

현재 종목을 현 상태 그대로 전략에서 해제합니다.

  • 보유 포지션과 미체결 주문이 미귀속(manual)으로 이관됩니다
  • 즉시 해제되며, 이후 DSL 평가 대상에서 제외됩니다
  • 이관된 미체결 주문은 미귀속에서 체결/취소까지 추적됩니다

조건식 컨텍스트 (condition)

조건식 전략에서 매칭 상태를 참조할 수 있습니다.

변수 타입 설명
condition.matched bool 현재 종목이 조건식에 매칭 중인지
condition.bars_since_match int 최초 매칭 후 경과 봉 수 (매칭 아니면 -1)

고정 종목 전략에서는 항상 matched=True, bars_since_match=-1입니다.

if not condition.matched:
    exit(tag="condition_departed")

if condition.bars_since_match > 20:
    release(tag="timeout")

rule과 사용자 결정의 우선순위

매 이벤트마다 두 단계로 처리됩니다.

1단계: 내 코드 실행  →  buy / sell / hold / exit / release 결정
2단계: rule.* 평가  →  stop_loss, trailing_stop 등이 발동했는지 확인

규칙은 두 가지입니다.

규칙 1 — exit() / release()를 호출하면 rule 평가를 건너뜁니다.

내가 직접 포지션을 정리하겠다는 명시적 선언이므로, 별도 rule 체크 없이 그대로 실행됩니다.

규칙 2 — buy() / hold() / sell() 상태에서 rule이 발동하면 rule이 이깁니다.

일부 매도(sell(qty=5))든, 매수 중이든, 아무것도 안 하고 있든 — rule이 트리거되면 전량 EXIT로 오버라이드됩니다. rule이 발동하지 않으면 내 결정이 그대로 실행됩니다.

# 예시: stop_loss 3% 설정 상태에서
buy(tag="진입 신호")
# → rule.stop_loss가 트리거됐다면: EXIT (손절 우선)
# → 트리거 안 됐다면: BUY 실행

왜 이런 구조인가요?

exit()/release()는 이미 전체 청산 의도이므로 rule이 개입할 여지가 없습니다. 반면 sell(qty=5) 같은 부분 매도는 리스크 규칙보다 "약한" 행동일 수 있으므로, rule이 발동하면 전량 청산으로 강제됩니다.

order_on과 주문 실행 타이밍

rule.order_on("5T")을 설정하면 5T 봉이 확정된 시점에서만 주문이 실행됩니다.

  • BUY/SELL: order_on 봉이 확정되지 않은 틱에서는 HOLD로 블록됩니다
  • EXIT: order_on 게이트가 그대로 적용됩니다. rule.stop_loss 등 rule 트리거 EXIT도 동일합니다
  • RELEASE: order_on과 무관하게 즉시 실행됩니다
  • rule.order_on("tick"): 매 틱마다 즉시 실행을 허용합니다

이 동작은 실거래, 차트테스트, 백테스트 모두 동일하게 적용됩니다.

마지막 호출 우선 규칙

같은 실행에서 여러 번 호출하면 마지막 호출만 채택됩니다.

buy(tag="first")
sell(tag="second")
# 최종: SELL

권장 패턴:

if not condition.matched:
    exit(tag="departed")
elif buy_cond:
    buy(tag="buy signal")
elif sell_cond:
    sell(tag="sell signal")
else:
    hold(tag="no signal")

tag 활용

tag는 매매 사유를 기록하는 문자열입니다. 로그/분석에서 어떤 조건으로 매매했는지 추적할 때 유용합니다.

qty 제한

런타임에서는 비정상 수량을 보정합니다.

  • 음수 -> 0
  • 최대치 초과 -> 상한 보정

다음 단계

관련 문서