| name | add-strategy |
| description | Adds a new trading strategy across 5 locations (mod.rs, routes, backtest, SDUI schema, frontend). Use when implementing a new strategy. |
| disable-model-invocation | true |
| user-invocable | true |
| argument-hint | <전략명_snake_case> [전략 설명] |
| allowed-tools | Read, Grep, Edit, Write, Bash(cargo *) |
| context | fork |
| agent | rust-impl |
전략 추가 워크플로우
새 전략 $ARGUMENTS[0]을 추가합니다.
⚠️ 반드시 5곳을 모두 수정해야 합니다. 하나라도 빠지면 런타임 에러가 발생합니다.
0단계: 기존 전략 참조
먼저 가장 유사한 기존 전략을 참고 자료로 읽습니다:
ls crates/trader-strategy/src/strategies/
추천 참조 전략: rsi.rs (가장 기본적인 구조)
1단계: 전략 구현 파일 생성
위치: crates/trader-strategy/src/strategies/$ARGUMENTS[0].rs
필수 구현 사항
use crate::traits::Strategy;
use trader_core::domain::{
context::StrategyContext,
signal::Signal,
};
use rust_decimal::Decimal;
pub struct YourStrategy {
}
impl Strategy for YourStrategy {
fn name(&self) -> &str { "your_strategy" }
fn on_market_data(
&mut self,
ctx: &StrategyContext,
) -> Vec<Signal> {
vec![]
}
}
체크포인트
2단계: 모듈 등록
위치: crates/trader-strategy/src/strategies/mod.rs
pub mod $ARGUMENTS[0];
pub use $ARGUMENTS[0]::*;
3단계: API 라우트 연동
위치: crates/trader-api/src/routes/strategies.rs
3곳을 수정합니다:
create_strategy_instance() — match 분기에 전략 추가
get_strategy_default_name() — 한글 이름 반환
get_strategy_default_timeframe() — 기본 타임프레임
get_strategy_default_symbols() — 권장 심볼 목록
4단계: 백테스트 엔진 연동
위치: crates/trader-api/src/routes/backtest/engine.rs
- import 추가
run_strategy_backtest() 또는 run_multi_strategy_backtest() match 분기에 추가
5단계: UI 스키마 및 프론트엔드
5-1. SDUI 스키마
위치: config/sdui/strategy_schemas.json
strategies 객체에 전략 스키마 추가 (~50줄):
- 전략 파라미터별 UI 컴포넌트 정의
type, min, max, default, step 등
5-2. 프론트엔드 타임프레임
위치: frontend/src/pages/Strategies.tsx
getDefaultTimeframe() switch 문에 case 추가
6단계: 검증
# 1. 컴파일 확인
cargo check -p trader-strategy
cargo check -p trader-api
# 2. 테스트 실행
cargo test -p trader-strategy -- $ARGUMENTS[0]
# 3. Clippy
cargo clippy -p trader-strategy -p trader-api -- -D warnings
검증 실패 시
- 에러 메시지에서 파일/라인 확인
- 해당 파일 수정
- 검증 명령 재실행 — 통과할 때까지 반복
모든 검증 통과 후 사용자에게 결과를 보고합니다.