6.9 KiB
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) 프롬프트 입력 -> 전략 컴파일 (상세 추적)
-
프롬프트 입력 UI
- 컴포넌트:
AutotradeControlPanel.tsx#L335 - 입력 이벤트:
handlePromptChange - store 반영:
patchSetupForm({ prompt }) - 같은 화면에서 구독형 CLI vendor/model도 선택 가능:
subscriptionCliVendor,subscriptionCliModel
- 컴포넌트:
-
시작/검증 버튼 클릭
- 시작 버튼 핸들러:
handleStartAutotrade - 검증 버튼 핸들러:
handlePreviewValidation
- 시작 버튼 핸들러:
-
엔진 훅에서 전략 준비
- 함수:
prepareStrategy() - compile 호출:
compileAutotradeStrategy(...)
- 함수:
-
브라우저 API 클라이언트
- 함수:
compileAutotradeStrategy - HTTP 호출:
POST /api/autotrade/strategies/compile - 전달 필드:
aiMode,subscriptionCliVendor,subscriptionCliModel,prompt,selectedTechniques,confidenceThreshold
- 함수:
-
Next API route에서 provider 분기
- 엔드포인트:
strategies/compile/route.ts#L44 - fallback 전략 준비:
createFallbackCompiledStrategy - OpenAI 분기:
compileStrategyWithOpenAi - 구독형 CLI 분기:
compileStrategyWithSubscriptionCliDetailed
- 엔드포인트:
-
OpenAI 실제 호출 지점
- OpenAI 전략 함수:
compileStrategyWithOpenAi - 공통 호출기:
callOpenAiJson - 외부 API:
https://api.openai.com/v1/chat/completions
- OpenAI 전략 함수:
-
컴파일 결과 반영
- compiledStrategy 저장:
setCompiledStrategy(...) - validate 저장:
setValidation(...)
- compiledStrategy 저장:
4) 실행 중 "자동 프롬프트"가 도는 방식
중요: 실행 중 매 틱마다 자연어 프롬프트를 다시 보내지 않습니다.
- 시작 시점에만 프롬프트를 전략 JSON으로 컴파일합니다.
- 실행 루프에서는 "컴파일된 전략 JSON + 현재 시세 스냅샷"으로 신호를 만듭니다.
관련 코드:
- 신호 요청 주기(12초):
SIGNAL_REQUEST_INTERVAL_MS - 신호 API 호출:
generateAutotradeSignal(...) - 서버 신호 route:
signals/generate/route.ts#L74 - 신호 생성 OpenAI 함수:
generateSignalWithOpenAi
신호 요청 시 스냅샷 실제 필드:
symbolcurrentPricechangeRateopenhighlowtradeVolumeaccumulatedVolumerecentPrices
5) 신호 -> 주문 판단 (자동 실행 핵심)
- 신호 생성 결과 수신:
runtime.setLastSignal(signal) - 리스크 게이트 검사:
evaluateSignalBlockers(...) - 통과 시 주문 API 호출:
fetchOrderCash(...)
즉, AI가 buy/sell을 주더라도 리스크 게이트를 통과하지 못하면 주문은 실행되지 않습니다.
6) AI를 못 쓰는 경우
- 전략 폴백:
createFallbackCompiledStrategy - 신호 폴백:
createFallbackSignalCandidate
AI(OpenAI/CLI) 응답 실패 시에도 시스템이 멈추지 않고 보수적으로 동작하도록 설계되어 있습니다.
7) Codex CLI인지 Gemini CLI인지 확인하는 법
-
자동매매 로그에서 확인
신호 수신 [subscription_cli:codex:gpt-5-codex]또는신호 수신 [subscription_cli:gemini:flash]- 로그 코드:
useAutotradeEngine.ts
-
Network 응답에서 확인
- 전략 컴파일 응답:
compiledStrategy.providerVendor - 신호 생성 응답:
signal.providerVendor
- 전략 컴파일 응답:
-
실패 시 어떤 순서로 시도했는지 확인
- 파싱 실패 문구에
selected=vendor:model; attempts=vendor:model:status포함 status=timeout이면 CLI 실행시간 초과입니다.AUTOTRADE_SUBSCRIPTION_CLI_TIMEOUT_MS를 늘리세요(권장: 60000).- 생성 코드:
summarizeSubscriptionCliExecution
- 파싱 실패 문구에
-
모델 선택 환경변수
AUTOTRADE_CODEX_MODEL(예:gpt-5-codex)AUTOTRADE_GEMINI_MODEL(예:auto,pro,flash,flash-lite)AUTOTRADE_SUBSCRIPTION_CLI_MODEL(vendor 전용 값이 없을 때 공통 fallback)
-
모델 선택 UI (환경변수보다 우선)
- 자동매매 설정창에서
subscriptionCliVendor,subscriptionCliModel선택 시 해당 값이 API payload로 전달되어 CLI 실행 인자에 우선 적용됩니다.
- 자동매매 설정창에서