콘텐츠로 이동

이벤트 추가

add_events를 사용하면 AQE 전략이 주 타임프레임 외에 추가 시장 데이터 이벤트 스트림을 구독할 수 있습니다. 처음 지원되는 이벤트 스트림은 EventStreamType::Bar입니다.

주 전략 타임프레임은 run_backtest(...)에 전달하거나 실시간 런타임에 설정한 타임프레임을 기준으로 항상 자동 등록됩니다. 1m, 15m, 1h 등 보조 데이터용 타임프레임이 필요할 때만 add_events를 호출하세요.

on_start에서 보조 데이터 스트림을 등록하세요.

use aq_engine::core::strategy::{EventStreamType, StrategyContext};
use aq_engine::core::utils::timeframe::{TimeFrame, TimeFrameUnit};
fn on_start(&mut self, ctx: &mut dyn StrategyContext) {
ctx.add_events(
EventStreamType::Bar,
Some(TimeFrame::new(15, TimeFrameUnit::Minute)),
);
}

AQE는 불러온 유니버스의 모든 자산에 해당 스트림을 적용합니다. 전략이 BTC와 ETH를 거래하면 두 심볼 모두에 15m 보조 봉 스트림이 등록됩니다.

ctx.add_events(EventStreamType::Bar, None) 호출은 주 타임프레임을 가리키며, 자동 등록된 주 스트림과의 중복은 제거됩니다.

옵션이 필요하면 EventStreamRequest를 사용하세요.

use aq_engine::core::strategy::{EventStreamRequest, EventStreamType, StrategyContext};
use aq_engine::core::utils::timeframe::{TimeFrame, TimeFrameUnit};
fn on_start(&mut self, ctx: &mut dyn StrategyContext) {
ctx.add_events_with_options(
EventStreamRequest::bar(Some(TimeFrame::new(1, TimeFrameUnit::Hour)))
.allow_trading(true),
);
}

allow_trading은 해당 이벤트 스트림에 대한 전략 및 알파 모델의 인사이트 생성을 제어합니다.

  • false는 보조 데이터 스트림의 기본값입니다. AQE는 이력을 갱신하고 on_bar를 호출하지만, 해당 보조 이벤트에 대해 알파 모델의 generate_insights나 전략의 generate_insights를 호출하지 않습니다.
  • true이면 해당 보조 이벤트에 대해 알파 모델의 generate_insights와 전략의 generate_insights를 실행할 수 있습니다.

브로커 실행은 기존 실행 경로를 따릅니다. 보조 봉은 전략 컨텍스트와 신호 생성에 필요한 정보를 보강하기 위한 것이며, 별도의 브로커 체결 스트림으로 취급해서는 안 됩니다.

주 타임프레임은 기본 심볼을 이력 키로 유지합니다.

let main_history = ctx.history().get(symbol);

보조 타임프레임은 {symbol}:{timeframe}을 사용합니다.

let feature_history = ctx.history().get("BTC:15m");
let faster_history = ctx.history().get("BTC:1m");
let hourly_history = ctx.history().get("ETH:1h");

이렇게 하면 보조 데이터가 주 전략 이력과 분리됩니다. 지표와 사용자 지정 상태는 사용하는 이벤트나 신호에 맞는 키에서 데이터를 읽어야 합니다.

on_bar, 알파 모델, generate_insights 안에서 ctx.current_event()를 사용하면 AQE가 현재 처리하는 이벤트를 검사할 수 있습니다.

fn on_bar(&mut self, ctx: &mut dyn StrategyContext, symbol: &str, _bar: &BarData) {
let Some(event) = ctx.current_event() else {
return;
};
let history = ctx.history().get(&event.history_key);
if event.is_feature {
println!(
"feature bar: {} {} history={} allow_trading={}",
event.symbol,
event.timeframe,
event.history_key,
event.allow_trading,
);
} else {
println!("main bar: {symbol}");
}
}

StrategyEventContext에는 다음 항목이 포함됩니다.

  • event_type
  • symbol
  • timeframe
  • history_key
  • is_feature
  • allow_trading
  • timestamp

컨텍스트는 해당 이벤트의 봉 처리가 끝날 때까지 활성 상태를 유지합니다. 여기에는 이력 갱신, 지표 갱신, on_bar, 알파 모델의 인사이트 생성, 그리고 해당 이벤트에 인사이트 생성이 허용된 경우 전략의 인사이트 생성이 포함됩니다.

보조 데이터 스트림을 사용하는 경우

섹션 제목: “보조 데이터 스트림을 사용하는 경우”

전략에 둘 이상의 시간 간격으로 집계된 시장 데이터가 필요할 때 보조 데이터 스트림을 사용하세요.

  • 신호를 생성하기 전에 15m 구조를 읽는 일봉 전략
  • 1m 변동성 또는 유동성 필터를 사용하는 1h 전략
  • 주 실행 타임프레임의 신호를 상위 타임프레임으로 확인하는 전략

주 타임프레임을 실행 시점의 기본 기준으로 유지하세요. 보조 데이터 스트림에 인사이트 생성을 의도적으로 허용한 경우가 아니라면 컨텍스트 제공 용도로만 사용하세요.