콘텐츠로 이동

인사이트 수명 주기

AQE는 다음 상태를 포함하는 상태 머신으로 인사이트를 추적합니다.

  • New
  • Executed
  • Filled
  • Closed
  • Cancelled
  • Rejected

일반적인 경로는 다음과 같습니다.

  • New -> Executed -> Filled -> Closed
  • New -> Rejected
  • Executed -> Cancelled
  • Filled -> Closed

만료, 파이프 실패, 브로커 거부, 거래 업데이트가 모두 이러한 상태 전환에 반영됩니다.

Executed는 주문이 제출된 상태를 뜻하며, 진입 주문은 아직 체결 대기 중일 수 있습니다. 미체결 상태에서는 &mut Insight를 가진 파이프나 다른 런타임 경로에서 진입 가격을 정정할 수 있습니다.

메서드변경 대상적용 가능한 대기 주문
insight.update_limit(ctx, price)진입 지정가Limit 또는 StopLimit
insight.update_stop_limit(ctx, price)진입 스톱 발동 가격Stop 또는 StopLimit

StopLimit 진입에서는 두 가격이 서로 다른 구성 요소입니다. update_stop_limit는 보호용 손절 가격을 변경하지 않습니다. 손절 가격은 update_stop_loss를 사용하세요. 마찬가지로 update_limit는 익절 가격을 변경하지 않습니다.

InsightPipeResult::from_mutation(insight.update_limit(ctx, 101.0), self.name())

이는 InsightState::Executed를 대상으로 하는 InsightPipe::run 메서드 내부의 반환 표현식입니다. 진입 발동 가격을 정정할 때는 update_limit를 update_stop_limit로 바꾸세요. 대기열에 들어간 정정을 완료된 것으로 처리하지 않고 파이프가 브로커 명령을 기다리도록 from_mutation을 사용하세요.

주문 제출 전에는 두 메서드 모두 New 인사이트의 해당 가격을 로컬에서 설정합니다. 제출된 진입 주문의 경우 가격이 유한한 양수여야 하고, 주문 유형이 일치해야 하며, 브로커 주문 ID를 알고 있어야 하고, 브로커가 각각 AmendLimitPrice 또는 AmendStopPrice 기능을 제공해야 합니다. 새 가격은 정정 확인을 받은 뒤 기록됩니다. 진입 주문이 일부라도 체결되었거나 비활성 상태가 되면, 메서드는 진입 가격을 변경하지 않고 상태 이력 메시지를 기록합니다. 진입 주문 정정을 지원하지 않는 브로커는 활성 대기 주문에 대해 오류를 반환합니다.

해당 브로커 어댑터 작업은 브로커 및 데이터 피드를 참조하세요.

AQE는 두 가지 중요한 수명 주기 제어를 지원합니다.

  • period_unfilled는 인사이트가 아직 New 또는 Executed 상태일 때 적용됩니다. 만료된 인사이트는 상태에 따라 거부되거나 취소가 요청됩니다.
  • period_till_tp는 인사이트가 Filled 상태가 된 후 적용됩니다. 만료되면 청산 요청이 발생할 수 있습니다.

이 검사는 UI가 아니라 런타임에서 강제 적용합니다.

다음과 같은 중요한 변경은 모두 state_history에 기록할 수 있습니다.

  • 상태 전환
  • 주문 제출
  • 브로커 접수
  • 체결
  • 부분 청산
  • 취소 요청
  • 거부
  • 만료 처리

이 이력은 AQS와 Backtest Results에서 공통으로 사용하는 상세 보기의 분석 근거가 됩니다.

사용자 지정 이력 메시지 추가하기

섹션 제목: “사용자 지정 이력 메시지 추가하기”

수명 주기 상태를 바꾸지 않고 인사이트에 검토 메모를 첨부하려면 state_log(...)를 사용하세요. 전략 훅은 공유 참조로 인사이트를 받으므로, &mut Insight를 가진 파이프나 다른 런타임 경로에서 메시지를 추가해야 합니다.

use aq_engine::core::insight::{types::InsightState, Insight};
use aq_engine::core::pipeline::{InsightPipe, InsightPipeBuilder, InsightPipeResult};
use aq_engine::core::strategy::StrategyContext;
pub struct ReviewNotePipe;
impl InsightPipe for ReviewNotePipe {
fn version(&self) -> &str {
"1.0"
}
fn run(&mut self, _ctx: &mut dyn StrategyContext, insight: &mut Insight) -> InsightPipeResult {
insight.state_log(Some("Risk check passed".to_string()));
InsightPipeResult::new(
true,
true,
Some("Review note added to insight history".to_string()),
self.name().to_string(),
)
}
}

메모를 추가할 상태에 파이프를 등록하세요.

ctx.add_pipe(
InsightPipeBuilder::new(Box::new(ReviewNotePipe))
.target_state(InsightState::Filled)
.build(),
);

state_log(...)는 현재 상태를 유지하면서 updated_at을 갱신하고, 전달된 메시지를 state_history에 추가합니다. None을 전달하면 AQE는 "State log entry"를 기록합니다.

인사이트 스냅샷에는 filled_price, close_price, broker_realized_pnl, commission, swap 등의 실행 필드가 포함됩니다. 실시간 실행은 이 스냅샷을 AQS Cloud에 동기화하고, 백테스트는 로컬 결과 데이터베이스에 저장합니다.