의사결정 (Decisions)¶
매 실행의 최종 결과는 buy(), sell(), hold(), exit(), release() 중 하나입니다.
buy¶
qty: 주문 수량.0이면max_notional기준 최대 수량을 자동 산정합니다 (auto-fill)tag: 태그 문자열price: 지정가 (None이면 시장가)
sell¶
qty=0은 전량 매도입니다. 현재 보유 수량 전체를 매도합니다.qty>0이면 지정 수량만큼 부분 매도합니다.price를 주면 지정가 전량/부분 매도로 동작하고,price=None이면 시장가로 동작합니다.
hold¶
exit¶
현재 종목을 정리하고 전략에서 해제합니다.
- 미체결 매수 주문을 취소하고, 보유 포지션을 시장가 매도합니다
- 포지션이 0이 되면 전략에서 완전히 해제됩니다
- 해제 대기 중에는 신규 buy/sell이 차단됩니다
- 시장가 전용입니다. 지정가 정리가 필요하면
sell(price=...) + release()조합을 사용하세요
release¶
현재 종목을 현 상태 그대로 전략에서 해제합니다.
- 보유 포지션과 미체결 주문이 미귀속(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"): 매 틱마다 즉시 실행을 허용합니다
이 동작은 실거래, 차트테스트, 백테스트 모두 동일하게 적용됩니다.
마지막 호출 우선 규칙¶
같은 실행에서 여러 번 호출하면 마지막 호출만 채택됩니다.
권장 패턴:
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
- 최대치 초과 -> 상한 보정