Files
auto-trade/common-docs/features/autotrade-prompt-flow-guide.md

6.9 KiB

자동매매 프롬프트 흐름 추적 가이드 (UI -> 함수 -> AI -> 주문)

이 문서는 "전략 프롬프트를 입력하면 실제로 어디 함수로 흘러가고, 어디서 AI가 호출되는지"를 코드 라인 기준으로 설명합니다.

1) 한 줄 요약

사용자가 UI에 프롬프트를 입력하면, 시작/검증 시점에 compile API로 전달되어 전략 JSON으로 바뀌고, 실행 중에는 그 전략 JSON + 실시간 시세로 신호를 생성해 주문 여부를 결정합니다.

2) 구조 그림

[브라우저 UI]
AutotradeControlPanel.tsx
  └─ 프롬프트 입력 + 시작/검증 클릭
        │
        ▼
[브라우저 엔진 훅]
useAutotradeEngine.ts
  └─ prepareStrategy()에서 compile/validate 실행
        │
        ▼
[브라우저 API 클라이언트]
autotrade.api.ts
  └─ /api/autotrade/strategies/compile 호출
        │
        ▼
[Next 서버 route]
strategies/compile/route.ts
  └─ OpenAI / subscription_cli / fallback 분기
        │
        ▼
[AI Provider]
openai.ts 또는 cli-provider.ts
  └─ 전략 JSON 반환
        │
        ▼
[브라우저 엔진 훅]
useAutotradeEngine.ts
  └─ compiledStrategy 저장 후 실행 루프 시작
        │
        ▼
[신호 루프]
/api/autotrade/signals/generate -> 리스크 게이트 -> 주문 API

3) 프롬프트 입력 -> 전략 컴파일 (상세 추적)

  1. 프롬프트 입력 UI

  2. 시작/검증 버튼 클릭

  3. 엔진 훅에서 전략 준비

  4. 브라우저 API 클라이언트

  5. Next API route에서 provider 분기

  6. OpenAI 실제 호출 지점

  7. 컴파일 결과 반영

4) 실행 중 "자동 프롬프트"가 도는 방식

중요: 실행 중 매 틱마다 자연어 프롬프트를 다시 보내지 않습니다.

  1. 시작 시점에만 프롬프트를 전략 JSON으로 컴파일합니다.
  2. 실행 루프에서는 "컴파일된 전략 JSON + 현재 시세 스냅샷"으로 신호를 만듭니다.

관련 코드:

  1. 신호 요청 주기(12초): SIGNAL_REQUEST_INTERVAL_MS
  2. 신호 API 호출: generateAutotradeSignal(...)
  3. 서버 신호 route: signals/generate/route.ts#L74
  4. 신호 생성 OpenAI 함수: generateSignalWithOpenAi

신호 요청 시 스냅샷 실제 필드:

  1. symbol
  2. currentPrice
  3. changeRate
  4. open
  5. high
  6. low
  7. tradeVolume
  8. accumulatedVolume
  9. recentPrices

5) 신호 -> 주문 판단 (자동 실행 핵심)

  1. 신호 생성 결과 수신: runtime.setLastSignal(signal)
  2. 리스크 게이트 검사: evaluateSignalBlockers(...)
  3. 통과 시 주문 API 호출: fetchOrderCash(...)

즉, AI가 buy/sell을 주더라도 리스크 게이트를 통과하지 못하면 주문은 실행되지 않습니다.

6) AI를 못 쓰는 경우

  1. 전략 폴백: createFallbackCompiledStrategy
  2. 신호 폴백: createFallbackSignalCandidate

AI(OpenAI/CLI) 응답 실패 시에도 시스템이 멈추지 않고 보수적으로 동작하도록 설계되어 있습니다.

7) Codex CLI인지 Gemini CLI인지 확인하는 법

  1. 자동매매 로그에서 확인

    • 신호 수신 [subscription_cli:codex:gpt-5-codex] 또는 신호 수신 [subscription_cli:gemini:flash]
    • 로그 코드: useAutotradeEngine.ts
  2. Network 응답에서 확인

    • 전략 컴파일 응답: compiledStrategy.providerVendor
    • 신호 생성 응답: signal.providerVendor
  3. 실패 시 어떤 순서로 시도했는지 확인

    • 파싱 실패 문구에 selected=vendor:model; attempts=vendor:model:status 포함
    • status=timeout이면 CLI 실행시간 초과입니다. AUTOTRADE_SUBSCRIPTION_CLI_TIMEOUT_MS를 늘리세요(권장: 60000).
    • 생성 코드: summarizeSubscriptionCliExecution
  4. 모델 선택 환경변수

    • AUTOTRADE_CODEX_MODEL (예: gpt-5-codex)
    • AUTOTRADE_GEMINI_MODEL (예: auto, pro, flash, flash-lite)
    • AUTOTRADE_SUBSCRIPTION_CLI_MODEL (vendor 전용 값이 없을 때 공통 fallback)
  5. 모델 선택 UI (환경변수보다 우선)

    • 자동매매 설정창에서 subscriptionCliVendor, subscriptionCliModel 선택 시 해당 값이 API payload로 전달되어 CLI 실행 인자에 우선 적용됩니다.