외부 신호 (TradingView·데이터 API)
전략이 밖에서 온 신호를 읽게 하는 기능입니다. 트레이딩뷰 알림, 온체인·심리 지표 API, 직접 만든 서비스 — 무엇이든 됩니다. 받는 방법은 두 가지고, 전략에서 읽는 방법은 하나입니다.
1) 웹훅 — 상대가 우리에게 보내는 방식
설정 → 외부 신호에서 주소를 발급하고, 트레이딩뷰 알림의 Webhook URL 칸에 붙여넣으세요.
- 주소는 서비스마다 따로 발급하세요. 발급할 때 이름을 붙입니다(예: '트레이딩뷰', '내 스크립트'). 나중에 어느 주소를 지울지 그 이름으로 고릅니다
- 주소 하나가 유출되면 그 주소만 삭제하면 됩니다 — 나머지 연동은 그대로 동작합니다. 주소가 하나뿐이면 지우는 순간 모든 연동이 같이 죽습니다
- 주소 하나 = 슬롯 하나. 발급할 때 슬롯 이름(예:
tv,btc4h)을 정하면 그 주소로 온 신호는 항상 그 슬롯에 쌓입니다 — 주소 뒤에 뭘 붙일 필요가 없습니다 - 그래서 주소를 아는 쪽이 슬롯 이름을 바꿔 내 다른 신호를 덮어쓰는 일이 구조적으로 불가능합니다. 다른 슬롯으로 보내려 하면 조용히 옮기지 않고 거부합니다(오설정을 알려주기 위해)
- 발급한 주소는 목록의 주소 보기로 언제든 다시 볼 수 있습니다 — 잃어버렸다고 재발급할 필요가 없어요
- 목록에는 마지막 수신 시각이 표시됩니다 — "이 주소로 아직 신호가 오나"를 여기서 확인하세요
- 보낸 내용은 그대로 저장됩니다. JSON 이면 JSON 그대로, 일반 텍스트면
{ text: "..." }로 - 한도는 슬롯 하나로 셉니다(무료 3개 → 엘리트 30개). 주소와 폴링 잡이 같은 칸을 나눠 쓰므로, 주소 2개 + 폴링 1개면 무료 플랜이 꽉 찹니다. 화면 위 '슬롯 n/max' 가 그 숫자입니다
2) 폴링 — 우리가 상대에게 주기적으로 물어보는 방식
공개 API 든 유료 API 든, 주소와 (필요하면) API 키를 등록하면 내 에이전트가 주기마다 호출해 신호로 쌓습니다.
- 호출하는 건 내 서버(에이전트)입니다. 소리트레이딩 서버가 대신 부르지 않습니다 — 내 IP·내 키로 나가므로 상대 API 의 제한을 정상적으로 쓰게 됩니다
- API 키는 헤더에 넣습니다. 암호화 보관되고 내 에이전트에게만 전달됩니다 (저장 후에는 이름만 보입니다)
- 주기는 요금제별 최소값이 있습니다 — 무료 1시간 · 베이직 30분 · 프로 15분 · 엘리트 1초
- 짧은 주기여도 소리트레이딩 서버로 가는 보고는 10초로 묶입니다 — 전략은 내 에이전트의 기록을 읽으므로 지연은 0 입니다
- GraphQL 처럼 본문이 필요한 API 는 고급에서
POST를 고르고 본문을 넣으세요. Content-Type 은 목록에서 고르거나 직접 입력할 수 있습니다(기본application/json)
과거까지 한 번에 채우기
응답이 목록이면 과거 이력을 한 번에 채울 수 있습니다. 고급에서 두 칸을 채우세요.
- 배열 위치(itemsPath) — 응답에서 목록이 있는 곳. 예: 응답 최상위에
data라는 배열이 있으면data - 시각 필드(timeField) — 목록 각 항목의 시각 필드 이름. 예:
timestamp
둘 다 채워야 동작합니다. 비워두면 응답 통째로 1건으로 저장됩니다.
예시(공포탐욕지수): 주소https://api.alternative.me/fng/?limit=90· 배열 위치data· 시각 필드timestamp→ 90일치가 한 번에 들어옵니다.
전략에서 읽기
두 방식 모두 같은 함수로 읽습니다.
- 반환은
{ payload, at, age }—payload는 보낸 내용 그대로,at은 신호 시각,age는 몇 초 전인지 - 신호가 없으면
null입니다 (0 이나 빈 값으로 지어내지 않습니다) - 오래된 신호를 거르려면
age로 직접 판단하세요 (예: 1시간 이내만 사용) - 내용은 해석하지 않습니다. 필드 이름·형식은 보낸 쪽 마음대로이므로, 전략 코드가 직접 파싱해야 합니다 (AI 에게 맡기면 알아서 써줍니다)
백테스트에서도 쓰입니다
쌓인 신호는 백테스트에서 봉마다 그 시점 기준으로 재생됩니다(미래 참조 없음).
정직한 한계: 백테스트는 신호를 모으기 시작한 이후 기간만 검증할 수 있습니다. 웹훅을 연결하기 전의 과거는 존재하지 않고, 트레이딩뷰의 계산을 우리가 재현하지도 않습니다(그건 지어내는 것입니다). 그래서 일찍 연결할수록 검증 가능한 기간이 길어집니다. 폴링은 응답에 과거가 들어 있으면 그만큼 즉시 채워집니다.
보관 위치
- 전체 이력은 내 에이전트(내 서버) 에 쌓입니다 — 용량 한도는 내 디스크입니다
- 소리트레이딩 서버는 짧은 버퍼만 들고 있습니다: 아직 에이전트에 못 넘긴 신호(최대 2000건)와 이미 넘긴 신호의 요약(100건). 설정 화면의 '최근 수신'은 이 버퍼를 보여줍니다
- 에이전트가 꺼져 있어도 신호는 버퍼에 남았다가 다시 켜질 때 전달됩니다
슬롯 이름
슬롯은 신호를 구분하는 이름입니다(tv, fng, onchain …). 영소문자·숫자·-·_ 1~20자로 직접 정합니다. 웹훅과 폴링은 같은 이름 공간을 쓰므로 한 이름을 둘이 같이 쓸 수 없고, 웹훅 주소와 폴링 잡을 합쳐 요금제별 개수 안에서 씁니다(무료 3개 → 엘리트 30개).