weltiq

Log in Start free
← API · MCP 레퍼런스 · OpenAPI · API 키 발급 · 커넥터

weltiq API · MCP 사용 매뉴얼

버전 2026-09-06 · 기준 URL https://weltiq.ai · 코드가 진실: weltiq/api/server.py(REST), weltiq/api/mcp_server.py(MCP). 요약 레퍼런스는 /docs, OpenAPI 탐색기는 /api-docs.

weltiq는 하나의 주문 인터페이스입니다. 지금은 실시간 시세 위에서 거래소 실제 수수료·슬리피지로 체결하는 모의 엔진이 돌고, 내 거래소 키(커넥터)를 붙이면 같은 요청이 같은 정책 검사를 달고 거래소 데모/실주문으로 갑니다. 봇·스크립트는 REST, 내 Claude는 MCP로 씁니다.


목차

  1. 5분 빠른 시작
  2. API 키 발급
  3. 인증 · 스코프 · 한도 · 크레딧
  4. REST 튜토리얼
  5. MCP 튜토리얼 — 내 Claude 연결
  6. 예제 코드 (Python · JavaScript · curl)
  7. 가능한 것 — 기능 목록
  8. 한계점 · 설계상 없는 것
  9. 오류 코드
  10. FAQ

1. 5분 빠른 시작

  1. 가입weltiq.ai/login에서 이메일+비밀번호(8자 이상) 또는 Google로 가입합니다. 무료이며 크레딧 100이 지급됩니다. 이메일 가입은 확인 메일의 링크를 24시간 안에 열어야 커넥터 등록 같은 소유권 전제 기능이 열립니다(Google 가입은 즉시 확인).
  2. API 키 발급 — 로그인 후 설정 → API 키(/settings/keys). 라벨과 스코프를 고르고 발급하면 wq_… 비밀키가 한 번만 표시됩니다. 복사해 안전한 곳에 보관하세요.
  3. 첫 호출
export WELTIQ_API_KEY=wq_...
curl -s https://weltiq.ai/v1/markets -H "Authorization: Bearer $WELTIQ_API_KEY" -H "User-Agent: my-bot/1.0"
{"markets": [{"venue": "binance-spot", "status": "live", "symbols": 5, "last_bar": "2026-09-05T18:18:00+00:00", "age_seconds": 39.1},
             {"venue": "binance-usdm", "status": "live", "symbols": 2, "last_bar": "2026-09-05T18:17:00+00:00", "age_seconds": 34.2}, "…"]}
  1. 첫 백테스트 — 카탈로그 템플릿을 최근 봉으로 리플레이합니다. 모의 엔진과 같은 체결 규칙입니다.
curl -s -X POST https://weltiq.ai/v1/backtest -H "Authorization: Bearer $WELTIQ_API_KEY" -H "Content-Type: application/json" \
  -d '{"template_id":"TPL-002","venue":"binance-spot","symbol":"BTCUSDT","tf":"1m","hours":24}'
{"run_id": "bt_3aacbdfc14ed8243", "n_bars": 1439, "n_fills": 1, "pnl": "0", "fees": "0.79646004", "n_trades": 0,
 "deployment_id": "dep_ba_b4d525458e44d62e", "warning": null, "data_mode": "idealized", "lookahead": null}
  1. Claude에 연결 — 터미널에서 한 줄:
claude mcp add --transport http weltiq https://weltiq.ai/mcp --header "Authorization: Bearer $WELTIQ_API_KEY"

이제 Claude에게 "BTCUSDT 최근 24시간 봉으로 TPL-002 백테스트해 줘"라고 말하면 됩니다.


2. API 키 발급

2.1 절차

단계 어디서 무엇을
1 /login 가입·로그인 (이메일+비밀번호 또는 Google)
2 설정 → API 키 (/settings/keys) 라벨 입력 (예: my-bot, claude-readonly)
3 같은 화면 스코프 체크: read-data · run-backtest · operate-sim (필요한 것만)
4 Issue key wq_… 비밀키가 지금 한 번만 표시됨 → 복사 → 보관
5 목록 키 ID(wqk_…)·라벨·스코프·발급 시각·상태. 필요 없으면 Revoke

2.2 키를 몇 개 만들까

용도 스코프 이유
분석용 Claude (weltiq-analyst MCP) read-data 애널리스트 서버는 read-data 단독 키만 받습니다 (방화벽)
실행용 Claude / 봇 (weltiq MCP, REST) read-data + run-backtest + operate-sim 백테스트·슬롯·1회성 주문
대시보드·리포트 스크립트 read-data 계좌·체결·저널만 읽기

세션(브라우저)은 항상 세 스코프를 다 가집니다. API 키는 발급 시 준 것만 가집니다.

2.3 키 API (세션 전용)

GET    /v1/keys                → {"keys":[{"key_id":"wqk_a8572d1484b2","label":"docs-sample","scopes":[…],"created_at":"…","revoked_at":null}]}
POST   /v1/keys {label, scopes[]} → {"key_id":"wqk_…","secret":"wq_…","scopes":[…],"label":"…"}   # secret은 이 응답에만
DELETE /v1/keys/{key_id}

3. 인증 · 스코프 · 한도 · 크레딧

3.1 인증

3.2 스코프

스코프 허용
read-data 시장·봉·워치리스트·브리핑·시그널 패키지·템플릿 공개 카드·인스턴스·백테스트 기록·계좌·체결·미체결·수수료 비교·봉투 조회·커넥터 목록·저널·빌링·AI 분석·복기
run-backtest 백테스트 실행·템플릿 인스턴스화·엔지니어 AI(설명/조정/변형)·아이디어 수식화(Pro)
operate-sim 1회성 주문·취소·상주 슬롯 실행/정지·승격 요청
(세션만) 키 관리·봉투 생성/폐기·커넥터 등록/폐기·워치리스트 새로고침·플랜 업그레이드

3.3 요율 한도 (분당, 사용자당)

버킷 무료 Pro
기본 엔드포인트 120 600
백테스트 10 60
AI 엔드포인트 20 120

초과 시 429 rate_limited. 다음 분에 재시도하세요.

3.4 크레딧

GET /v1/billing → {"balance":"99.836100","plan":"free",
  "plan_features":{"paper_slots":1,"custom_strategy":false,"custom_backtest":false,"pro_templates":false,"pro_signals":false,"live_connector":false},
  "ledger":[{"delta":"-0.010000","reason":"usage_api","meta":{"kind":"api_order","quantity":"1"}}, {"delta":"-0.143900","reason":"usage_backtest","meta":{"kind":"backtest","quantity":"1439"}}, {"delta":"100","reason":"signup_bonus"}]}

4. REST 튜토리얼

아래 응답은 2026-09-06 실서비스에서 받은 것을 줄인 것입니다.

4.1 시장 데이터

거래소와 신선도

GET /v1/markets

status: live(마지막 1분봉이 3분 이내) · stale(주말·휴장·수집 지연) · off(미지원). 현재 venue: binance-spot, binance-usdm, bybit-spot, bybit-linear, us-equity, krx (cme는 off).

확정 봉

GET /v1/bars?venue=binance-spot&symbol=BTCUSDT&tf=1m&hours=1
→ {"venue":"binance-spot","symbol":"BTCUSDT","tf":"1m","bars":[{"t":"2026-09-05T17:19:00+00:00","o":"80017.84","h":"80054","l":"80017.83","c":"80054","v":"6.09837"}, …]}

tf = 1m|1h|1d, hours ≤ 720, 호출당 최대 5,000봉. 마감된 봉만 옵니다 (진행 중인 봉 없음 — 엔진도 마감 봉만 봅니다).

워치리스트·시그널

GET  /v1/watchlist                        # 기법·무효화·48h 만료가 붙은 시그널 목록
POST /v1/signal-package {"venue":"binance-spot","symbol":"BTCUSDT"}   # 방향 편향·기법·후보 템플릿 (워치리스트에 없는 심볼은 404)
GET  /v1/briefing                         # 일일 브리핑

워치리스트 새로고침(POST /v1/watchlist/refresh)은 브라우저 세션에서만 됩니다 (6시간마다 자동 수집).

4.2 템플릿 · 인스턴스 · 백테스트

GET /v1/templates?q=breakout
→ {"templates":[{"template_id":"TPL-001","name":"52주 신고가 돌파","category_name":"주식 추세추종·돌파","targets":"한국·미국·홍콩 주식",
   "signal_summary":"RS·거래량 상위의 52주 고점 돌파","exit_summary":"추세 이탈·ATR 손절·수일~수주",
   "tags":{"technique":"Breakout","span":"Swing","risk":"Standard"},"tier":"pro","dsl_status":"ready","forecast_load":"low","has_doc":true}, …]}

GET /v1/templates/TPL-002
→ {"template_id":"TPL-002","name":"20일 고가 돌파","tier":"free","dsl_status":"ready",
   "fit":"유동성 높은 주식·BTC의 단기 모멘텀 국면. 일봉·1h 슬롯.","rules":"entry: 20-bar high breakout → exit: stop 0.02 · target 0.04"}

공개 카드에는 규칙 한 줄 요약만 있습니다. 규칙 문서·파라미터·DSL 자체는 서버 밖으로 나가지 않습니다.

내 인스턴스 만들기 → doc_hash

POST /v1/templates/TPL-002/instantiate
→ {"template_id":"TPL-002","doc_hash":"22c512f3…b8e3","lineage_id":"ln_0f9866e198425121","strategy":{"name":"20일 고가 돌파","line":"entry: 20-bar high breakout → exit: stop 0.02 · target 0.04"}}

doc_hash가 이후 백테스트·슬롯의 식별자입니다. Pro 템플릿은 Pro 플랜에서만 인스턴스화됩니다.

백테스트

POST /v1/backtest {"doc_hash":"22c512f3…","venue":"binance-spot","symbol":"BTCUSDT","tf":"1m","hours":24}
→ {"run_id":"bt_3aacbdfc14ed8243","n_bars":1439,"n_fills":1,"pnl":"0","fees":"0.79646004","n_trades":0,"data_mode":"idealized","warning":null}

엔지니어 AI(run-backtest)

POST /v1/ai/engineer {"template_id":"TPL-002","symbol":"BTCUSDT","messages":[{"role":"user","content":"손절을 1.5%로 줄이면?"}]}
→ {"reply":"…","changes":[{"path":"exit.stop","from":"0.02","to":"0.015"}],"doc_hash":"…"}
POST /v1/ai/engineer/variants   # 근접 변형 2~3안 동시 백테스트 (Pro)
POST /v1/ai/formalize {"idea":"BTC가 20일 고점을 돌파하면 사고 5% 손절","symbols":["BTCUSDT"]}   # 자연어 → 인스턴스 (Pro)

4.3 상주 슬롯 (24시간 전략 실행)

POST /v1/slots {"doc_hash":"22c512f3…","symbol":"BTCUSDT","tf":"1m","stop_max_loss":"50","stop_after_hours":2}
→ {"deployment_id":"dep_pa_8ffe4bf32eb06173","sleeve_id":"sl_pa_…","portfolio_id":"pf_u_…","mode":"paper","stop":{"max_loss":"50","until":"2026-09-05T20:18:42+00:00"}}

GET /v1/slots
→ {"slots":[{"deployment_id":"dep_pa_8ffe4bf32eb06173","status":"running","symbol":"BTCUSDT","tf":"1m",
   "stop":{"until":"…","max_loss":"50"},"stopped_reason":null,
   "live":{"at":"2026-09-05T18:18:47+00:00","attached":true,"last_bar":null,"position":null,"daily_pnl":"0"}}]}

DELETE /v1/slots/dep_pa_8ffe4bf32eb06173 → {"deployment_id":"…","status":"stopped"}   # 포지션 청산

4.4 봉투 → 1회성 주문 → 청산 (재량 주문)

봉투(브라우저에서 생성). 재량 주문이 할 수 있는 범위를 사람이 미리 승인합니다. Paper › Order 화면 또는 세션으로:

POST /v1/envelopes {"symbols":["BTCUSDT"],"max_order_notional":"500","max_daily_notional":"2000","days":7}
→ {"envelope_id":"ev_27cab40edb97253a","valid_until":"2026-09-12T18:18:58+00:00"}
GET /v1/envelopes → {"envelopes":[{"envelope_id":"ev_…","symbols":["BTCUSDT"],"max_order_notional":"500","max_daily_notional":"2000","status":"active", …}],"daily_notional_used":"0"}

API 키·MCP로는 봉투를 만들 수 없습니다 (403). 대리인이 자기 한도를 넓힐 수 없다는 규칙입니다.

진입 주문. 가설(thesis.why)과 처분 조건(px_below·px_above)이 필수입니다.

POST /v1/orders/oneoff
{"venue":"binance-spot","symbol":"BTCUSDT","side":"buy","type":"market","qty":"0.001",
 "thesis":{"why":"4시간 지지선 유지 — 소량 진입"},"invalidation":{"px_below":"60000","px_above":"120000"}}
→ {"queue_id":"dq_0aec82394e071eb0","status":"queued","est_notional":"79.97","closing":false,"target":"paper"}

가설이 없으면:

422 {"detail":{"code":"thesis_required","detail":"thesis 없이 포지션은 태어나지 않는다 (불변 12)"}}

결과 확인 (보통 1~2초, binance-usdm은 최대 30초).

GET /v1/orders/oneoff
→ {"orders":[{"queue_id":"dq_0aec82394e071eb0","venue":"binance-spot","symbol":"BTCUSDT","side":"buy","order_type":"market","qty":"0.001",
   "status":"filled","result":{"fills":[{"px":"80019.836182500","fee":"0.08001984","qty":"0.001"}],"state":"filled","closed":false,"intent_id":"dq_0aec82394e071eb0_i"},
   "created_at":"…","processed_at":"…","target":"paper","auto":false}]}

status: queued → filled | rejected | expired. 거절이면 result.code에 이유가 있습니다.

처분 규칙. px_below/px_above 중 하나에 닿으면 엔진이 자동 청산합니다(큐에 auto: true로 남음). 롱은 px_below가 손절, px_above가 목표가입니다. 조건 없이 들어갈 수는 없고, 들어간 뒤에는 직접 청산할 때까지 보유합니다.

청산. 보유 포지션의 반대 방향 주문은 청산으로 처리됩니다: reduce-only, 보유 수량까지, 조건 불필요, 봉투 명목에 계상하지 않음.

POST /v1/orders/oneoff {"venue":"binance-spot","symbol":"BTCUSDT","side":"sell","type":"market","qty":"0.001","thesis":{"why":"청산"}}
→ {"queue_id":"dq_9ec99a661531472d","status":"queued","est_notional":"0","closing":true,"target":"paper"}

지정가. "type":"limit","price":"79000". 대기 지정가는 미체결 목록(GET /v1/orders)에 상태 머신과 함께 보이며, DELETE /v1/orders/{intent_id}로 취소합니다. 확정 전까지 잔량은 위험으로 계상됩니다.

정책 게이트. 엔진이 검사하는 것: 봉투(심볼·주문당·일 명목), 방향권(한 심볼에 반대 방향 중첩 금지), 자기체결(STP), 데이터 신선도, 포트폴리오 예산. 거절 코드는 9장.

4.5 체결 · 원장 · 수수료 비교

GET /v1/fills?mode=paper
→ {"fills":[{"intent_id":"dq_9ec99a661531472d_i","qty":0.001,"px":80003.8138175,"fee":0.08000381,"fee_ccy":"USDT","liquidity":"taker","at":"…","symbol":"BTCUSDT","side":"sell","mode":"paper"}]}

GET /v1/account
→ {"accounts":[{"account_id":"acc_u_…","venue":"binance-spot","mode":"paper","base_ccy":"USDT"}],
   "balances":[{"book":"cash","ccy":"USDT","amt":-0.17604601},{"book":"fees","ccy":"USDT","amt":0.16002365},{"book":"position_value","ccy":"USDT","amt":0.01602236}]}

복식 원장: 체결마다 cash·position_value·fees의 합이 0입니다. 위 예는 0.001 BTC 왕복 후 수수료 0.16 USDT와 가격 변동 0.016 USDT가 남은 상태입니다.

GET /v1/fees/compare?mode=paper&days=1
→ {"n_fills":2,"actual_venues":["binance-spot"],"actual_fee":"0.16002365","turnover":"160.02","fee_rate":"0.00100000","maker_share":"0",
   "venues":[{"venue":"binance-spot","class":"crypto-spot","is_actual":true,"maker_rate":"0.001","taker_rate":"0.001","fee":"0.16002365","delta":"0","if_all_maker":"0.16002365"},
             {"venue":"bybit-spot","class":"crypto-spot","same_class":true,"fee":"0.16002365","delta":"0", …}, …]}

내 체결을 다른 거래소 수수료 규칙으로 다시 계산합니다. 기본은 같은 상품군(현물끼리·무기한끼리), venues=a,b로 지정하면 다른 군도 참고치로 계산합니다. if_all_maker는 전부 메이커였을 때의 수수료입니다.

4.6 저널

GET /v1/journal?limit=2
→ {"events":[{"id":4281,"at":"…","kind":"oneoff_queued","principal":"external_client","input_origin":"user","payload":{"queue_id":"dq_…","envelope_id":"ev_…"}}, …],
   "kinds":["api_key_issued","envelope_created","oneoff_queued","slot_created","slot_stopped","template_instantiated"]}

모든 행위가 누가(사람/외부 클라이언트/에이전트)·무엇을·누구를 대신해 했는지로 남습니다. 운영자 행위는 해시체인으로 봉인됩니다.

4.7 커넥터 — 내 거래소 키로 주문

내 거래소 API 키를 등록하면 같은 주문이 거래소 데모(테스트넷) 또는 실계정으로 갑니다.

브로커 paper (모의) live (실거래)
binance 바이낸스 선물 데모/테스트넷 (USDⓈ-M) fapi.binance.com
bybit 바이비트 데모 트레이딩 (USDT 무기한) api.bybit.com
kis (한국투자) 모의투자(VTS) — 준비 중 준비 중

등록은 브라우저에서만 — 설정 → Connectors(/settings/connectors). 등록 시 잔고 조회로 키를 검증합니다. 거래소에서 키를 만들 때 출금·이체 권한은 끄고 거래 권한만 주세요 (권한 자동 검사는 준비 중). 키는 사용자별 봉투 암호화로 저장되며 집행 셀만 주문 시점에 복호화합니다. 거래소 쪽 키에는 IP 제한을 거는 것을 권합니다 (집행 셀 IP는 등록 화면에 표시).

GET /v1/connectors → {"connectors":[{"cred_id":"bk_ae4cab810fc9e645","broker":"bybit","mode":"paper","label":"weltiq-demo","key_hint":"R0VT","status":"active","verify_note":"Bybit linear demo ok · USDT balance 50000 …"}]}

주문에서 실행 대상 고르기targetcred_id:

POST /v1/orders/oneoff {"venue":"bybit-linear","symbol":"BTCUSDT","side":"buy","type":"market","qty":"0.002",
  "thesis":{"why":"데모에서 체결 비교"},"invalidation":{"px_below":"60000"},"target":"bk_ae4cab810fc9e645"}

4.8 이메일 알림

주요 이벤트는 계정 이메일로 갑니다: 재량 주문 체결·거절, 무효 조건 자동 청산, 슬롯 자동 정지, 크레딧 부족, 공지, 보안(키·커넥터 변경). 받을 종류는 설정 → 알림(/settings/notifications)에서 고릅니다. 보안 알림은 끌 수 없습니다.

GET /v1/notifications → {"prefs":{"order_filled":true,"weekly_review":false,"security":true, …},"kinds":[{"kind":"order_filled","group":"trading","label":"재량 주문 체결","selectable":true}, …]}
PUT /v1/notifications {"prefs":{"order_filled":false,"weekly_review":true}}      # 세션 전용

4.9 AI 애널리스트

POST /v1/ai/analyze {"symbol":"BTCUSDT","venue":"binance-spot"}
→ {"report_id":"rp_…","stats":{"n_bars":1439,"return_pct":"0.5483","vol_of_returns_pct":"…"},"view":{"summary":"BTCUSDT는 24시간 동안 79,442~80,200 달러 범위에서 +0.55% 상승…","observations":[…],"risks":[…]}}
POST /v1/ai/chat     # 같은 근거 위 대화
POST /v1/ai/review?days=30&lang=ko   # 내 거래·계좌 정형 복기: 지표·규칙 소견·규율 상태 good/watch/alert

관찰과 리스크만 말하고 권유는 하지 않습니다. 크레딧이 차감됩니다.


5. MCP 튜토리얼 — 내 Claude 연결

원격 MCP 서버 두 개(streamable HTTP). 같은 REST 위의 얇은 어댑터라 스코프·요율·저널이 그대로 적용됩니다.

서버 URL 받는 키 성격
weltiq https://weltiq.ai/mcp 모든 키 (도구는 키 스코프를 따름) 실행 계통
weltiq-analyst https://weltiq.ai/mcp/analyst read-data 단독 키만 정보 계통

5.1 설정

Claude Code

claude mcp add --transport http weltiq https://weltiq.ai/mcp --header "Authorization: Bearer $WELTIQ_API_KEY"
claude mcp add --transport http weltiq-analyst https://weltiq.ai/mcp/analyst --header "Authorization: Bearer $WELTIQ_READONLY_KEY"

/dl/claude-code-mcp.sh로 같은 스크립트를 받을 수 있습니다.

Claude Desktop / 다른 MCP 클라이언트claude_desktop_config.json(또는 클라이언트의 mcpServers 설정)에:

{"mcpServers": {
  "weltiq":         {"url": "https://weltiq.ai/mcp",         "headers": {"Authorization": "Bearer wq_..."}},
  "weltiq-analyst": {"url": "https://weltiq.ai/mcp/analyst", "headers": {"Authorization": "Bearer wq_..."}}}}

/dl/claude-mcp.json에 같은 템플릿이 있습니다.

로컬 stdio(자체 호스팅·개발)

WELTIQ_API_KEY=wq_... python -m weltiq.api.mcp_server            # 실행 계통
WELTIQ_API_KEY=wq_... python -m weltiq.api.mcp_server analyst    # 정보 계통

5.2 도구 목록

weltiq (실행) — 21개

도구 스코프 하는 일
markets · bars(venue, symbol, tf, hours) read-data 거래소 신선도, 확정 봉
templates(q, category, status) · template(template_id) read-data 카탈로그 검색, 공개 카드
instantiate(template_id) run-backtest 내 인스턴스 → doc_hash
backtest(venue, symbol, template_id | doc_hash, tf, hours) · backtests(symbol) · instances run-backtest / read-data 백테스트, 기록, 인스턴스
slots · slot_run(symbol, stop_max_loss, stop_after_hours, doc_hash | template_id, tf, signal_kind) · slot_stop(deployment_id) operate-sim 상주 실행
account · fills(mode) · orders · journal(limit) read-data 원장, 체결, 미체결, 저널
fees_compare(mode, days, venues) read-data 거래소별 수수료 비교
envelopes read-data 봉투 조회 (생성은 브라우저)
order_oneoff(venue, symbol, side, qty, thesis_why, px_below, px_above, order_type, price, target, live_ack) operate-sim 1회성 주문 (paper 또는 커넥터)
oneoff_orders · order_cancel(intent_id) operate-sim 큐 확인, 취소
connectors read-data 내 커넥터 목록 (target으로 쓸 cred_id)

weltiq-analyst (정보) — 5개

도구 하는 일
watchlist · signal_package(symbol) 시그널 목록, 종목별 패키지
analyze_symbol(symbol, venue) · review_account(days, lang) 종목 분석, 내 거래 복기 (크레딧 과금)
fees_compare_analyst(mode, days, venues) 수수료 비교 (읽기)

5.3 대화 예시

아래는 실제로 어떤 도구가 불리는지 보여 줍니다. 결과 숫자는 시점에 따라 다릅니다.

예시 1 — 후보 고르기부터 백테스트까지

나: 돌파(breakout) 계열 무료 템플릿을 찾아서 BTCUSDT 1분봉 최근 48시간으로 백테스트하고 결과를 표로 정리해 줘.

Claude가 하는 일: templates(q="breakout") → 무료(tier: free, dsl_status: ready)만 고름 → 각 템플릿에 backtest(venue="binance-spot", symbol="BTCUSDT", template_id=…, tf="1m", hours=48) → pnl·fees·n_trades 표.

예시 2 — 상주 슬롯 띄우고 지켜보기

나: TPL-002를 BTCUSDT 1분봉으로 슬롯에 올려. 손실 한도 30 USDT, 6시간 뒤 자동 정지.

Claude: instantiate("TPL-002")slot_run(symbol="BTCUSDT", doc_hash=…, tf="1m", stop_max_loss="30", stop_after_hours=6) → 잠시 후 slotslive.attached·포지션 확인. 무료 플랜에서 두 번째 슬롯은 slot_limit으로 거절됩니다.

예시 3 — 재량 주문 (봉투는 미리 브라우저에서)

나: BTCUSDT 0.001 시장가로 사. 근거는 "4시간 지지선 유지". 손절 60,000, 목표 120,000.

Claude: envelopes로 활성 봉투 확인 → order_oneoff(venue="binance-spot", symbol="BTCUSDT", side="buy", qty="0.001", thesis_why="4시간 지지선 유지", px_below="60000", px_above="120000")oneoff_orders로 체결 확인. 봉투가 없으면 envelope_required가 돌아오고, Claude는 봉투를 만들 수 없으니 사용자에게 화면에서 만들라고 안내해야 합니다.

예시 4 — 커넥터로 데모 주문 비교

나: 같은 주문을 내부 페이퍼와 내 바이비트 데모에 나란히 내고 체결가를 비교해 줘.

Claude: connectors → bybit paper의 cred_idorder_oneoff(venue="bybit-linear", …, target="paper")order_oneoff(…, target="bk_…")oneoff_orders에서 두 체결가 차이(bp) 계산.

예시 5 — 분석 전용 Claude

나 (weltiq-analyst만 연결된 세션): 내 지난 30일 거래를 복기해 줘.

Claude: review_account(days=30, lang="ko") → 지표·규칙 소견·규율 상태. 이 세션에는 주문 도구가 아예 없습니다.

5.4 MCP에서 알아둘 것


6. 예제 코드

6.1 Python — 템플릿 스윕 백테스트

import os, httpx

API = "https://weltiq.ai"
H = {"Authorization": f"Bearer {os.environ['WELTIQ_API_KEY']}", "User-Agent": "weltiq-example/1.0"}
c = httpx.Client(base_url=API, headers=H, timeout=120)

free = [t for t in c.get("/v1/templates").json()["templates"]
        if t["tier"] == "free" and t["dsl_status"] == "ready"]
rows = []
for t in free[:5]:                                   # 무료 플랜: 백테스트 분당 10회
    r = c.post("/v1/backtest", json={"template_id": t["template_id"], "venue": "binance-spot",
                                     "symbol": "BTCUSDT", "tf": "1h", "hours": 24 * 30})
    if r.status_code == 429:
        raise SystemExit("rate limited — wait a minute")
    b = r.json()
    rows.append((t["template_id"], t["name"], b["n_trades"], b["pnl"], b["fees"], b["data_mode"]))
for row in sorted(rows, key=lambda x: float(x[3]), reverse=True):
    print(*row, sep="\t")

6.2 Python — 재량 주문 봇 골격 (봉투는 화면에서 미리)

import os, time, httpx
from decimal import Decimal

API = "https://weltiq.ai"
c = httpx.Client(base_url=API, headers={"Authorization": f"Bearer {os.environ['WELTIQ_API_KEY']}",
                                        "User-Agent": "weltiq-bot/1.0"}, timeout=60)

def last_close(venue, symbol):
    bars = c.get("/v1/bars", params={"venue": venue, "symbol": symbol, "tf": "1m", "hours": 1}).json()["bars"]
    return Decimal(bars[-1]["c"])

def place(venue, symbol, side, qty, why, stop=None, target=None, conn_target="paper"):
    inv = {k: str(v) for k, v in (("px_below", stop), ("px_above", target)) if v is not None}
    r = c.post("/v1/orders/oneoff", json={"venue": venue, "symbol": symbol, "side": side, "type": "market",
                                          "qty": str(qty), "thesis": {"why": why}, "invalidation": inv,
                                          "target": conn_target})
    if r.status_code != 200:
        raise RuntimeError(r.json()["detail"])       # {"code": "envelope_required", …} 등
    return r.json()["queue_id"]

def wait(queue_id, timeout=45):
    for _ in range(timeout):
        o = next((o for o in c.get("/v1/orders/oneoff").json()["orders"] if o["queue_id"] == queue_id), None)
        if o and o["status"] != "queued":
            return o
        time.sleep(1)
    raise TimeoutError(queue_id)

px = last_close("binance-spot", "BTCUSDT")
q = place("binance-spot", "BTCUSDT", "buy", "0.001", "예제: 1분봉 종가 기준 소량 진입",
          stop=px * Decimal("0.97"), target=px * Decimal("1.05"))
o = wait(q)
print(o["status"], o["result"])
if o["status"] == "filled":
    print(wait(place("binance-spot", "BTCUSDT", "sell", "0.001", "예제: 청산"))["result"])

6.3 JavaScript (Node 18+) — 계좌·체결 대시보드용 읽기

const API = "https://weltiq.ai";
const H = { Authorization: `Bearer ${process.env.WELTIQ_API_KEY}`, "User-Agent": "weltiq-dash/1.0" };
const get = (p) => fetch(API + p, { headers: H }).then(r => r.json());

const [account, fills, fees, slots] = await Promise.all([
  get("/v1/account"), get("/v1/fills?mode=paper"), get("/v1/fees/compare?mode=paper&days=7"), get("/v1/slots")]);
for (const b of account.balances) console.log(b.book, b.ccy, b.amt);
console.log("fills", fills.fills.length, "fee 7d", fees.actual_fee, "best venue",
  fees.venues.sort((a, b) => Number(a.fee) - Number(b.fee))[0]?.venue);
for (const s of slots.slots) console.log(s.deployment_id, s.symbol, s.status, s.live?.daily_pnl);

6.4 curl 치트시트

K="Authorization: Bearer $WELTIQ_API_KEY"; U="User-Agent: curl-weltiq/1.0"; J="Content-Type: application/json"
curl -s https://weltiq.ai/v1/markets -H "$K" -H "$U"
curl -s "https://weltiq.ai/v1/bars?venue=bybit-linear&symbol=BTCUSDT&tf=1h&hours=48" -H "$K" -H "$U"
curl -s -X POST https://weltiq.ai/v1/templates/TPL-002/instantiate -H "$K" -H "$U"
curl -s -X POST https://weltiq.ai/v1/slots -H "$K" -H "$U" -H "$J" -d '{"doc_hash":"<hash>","symbol":"BTCUSDT","tf":"1m","stop_max_loss":"50","stop_after_hours":12}'
curl -s -X POST https://weltiq.ai/v1/orders/oneoff -H "$K" -H "$U" -H "$J" -d '{"venue":"binance-spot","symbol":"BTCUSDT","side":"buy","type":"limit","qty":"0.001","price":"79000","thesis":{"why":"되돌림 매수"},"invalidation":{"px_below":"76000"}}'
curl -s https://weltiq.ai/v1/orders -H "$K" -H "$U"                       # 대기 지정가·상태 머신
curl -s -X DELETE https://weltiq.ai/v1/orders/<intent_id> -H "$K" -H "$U"
curl -s "https://weltiq.ai/v1/journal?limit=20" -H "$K" -H "$U"

7. 가능한 것 — 기능 목록

영역 기능 무료 Pro 세션
시장 데이터 6개 venue 신선도, 1m/1h/1d 확정 봉(≤5,000/호출) read-data
시그널 워치리스트·시그널 패키지·브리핑 ✓(Pro 시그널) read-data
워치리스트 새로고침 수동 수집 트리거
템플릿 카탈로그 100, 공개 카드 read-data
인스턴스화 무료 템플릿 / Pro 템플릿 ✓ / ✗ ✓ / ✓ run-backtest
백테스트 저장 봉 리플레이, 미래참조 대조, 기록 ✓ (10/분) ✓ (60/분) run-backtest
엔지니어 AI 설명·설정 검토·변경 적용 run-backtest
변형·수식화 근접 변형 동시 백테스트, 자연어→인스턴스 run-backtest
상주 슬롯 24시간 모의 실행, 자동 정지 1개 3개 operate-sim
봉투 재량 주문 범위 사전 승인 조회만 생성·폐기
1회성 주문 시장가·지정가, 처분 조건, 청산, 취소 operate-sim
커넥터 바이낸스 선물·바이비트 무기한 데모/실거래 키 등록, target 주문 ✓ (데모) ✓ (데모; 실거래는 게이트) 목록·target 주문 등록·폐기
원장·체결 복식 원장, 체결, 미체결 상태 머신 read-data
수수료 비교 거래소별 재계산, 전부 메이커 시나리오 read-data
AI 애널리스트 종목 분석·대화·정형 복기 (크레딧) read-data
저널 위임 저널 조회 read-data
빌링 잔액·원장·사용량 read-data
승격 요청 모의 실적으로 심사 요청 operate-sim
MCP 실행 서버 21 도구, 애널리스트 서버 5 도구 키 스코프

8. 한계점 · 설계상 없는 것

8.1 일부러 없는 것 (계약)

8.2 현재 상태의 제약 (2026-09-06)

항목 제약 비고
한국 주식(krx) 데이터 stale, KIS 커넥터 등록 broker_not_yet 주중 장중 확인·개통 예정
미국 주식(us-equity) 모의만, 주말 stale 실거래 커넥터 미정
binance-usdm 재량 주문 체결까지 최대 ~30초 봉 신선도를 REST로 판정하는 폴러 특성. 현물·바이비트는 1~2초
옵션·CME cme off, 옵션 템플릿은 not_executable 로드맵
실거래(live) 커넥터 주문 live_ack 필요 + 승격 사다리 뒤 — 현재 미개방 데모/테스트넷은 열려 있음
커넥터 교차 지정가 즉시 체결돼도 큐에는 잠시 submitted로 보임 사후 동기화로 채워짐
확정 봉만 제공 진행 중 봉·호가(L2)·체결 스트림 없음 엔진도 마감 봉 기준 (D1 계약)
봉 추출 호출당 5,000봉, 1m은 720시간, 대량 추출 스로틀 플랫폼 내 사용 목적
요율 통계 트래픽은 평균·최대 ms만 (p95 미계측)
주문 집행 주기 큐 폴링 5초(알림으로 즉시 깨움), 봉 마감 전략은 tf 주기 틱 단위 실행은 별도 티어 로드맵
웹훅·푸시 없음 — 폴링(oneoff_orders, slots, journal)
계정 삭제·데이터 반출 API 없음 (설정 화면·문의)

9. 오류 코드

응답은 {"detail": {"code": "...", "detail": "..."}} (또는 {"detail": "invalid token"}). MCP는 {"error": …, "detail": …}.

코드 HTTP 뜻 · 대응
invalid token 401 키 없음·폐기됨·오타
scope_denied 401/403 키에 필요한 스코프가 없음 → 스코프 있는 키 발급
session_required 403 브라우저 세션에서만 되는 행위 (키·봉투·커넥터·워치리스트 새로고침)
scope_mix (MCP) 애널리스트 서버에 실행 스코프 섞인 키 → read-data 단독 키
rate_limited 429 분당 한도 초과 → 다음 분
plan_required 403 Pro 기능 (feature 필드에 이름)
insufficient_credits 402 크레딧 소진
thesis_required · thesis_verbatim 422 가설 없음 · AI 산출 통째 복붙
invalidation_required · invalidation_not_declarative 422 진입에 처분 조건 없음 · 기계 판정 불가 조건
envelope_required · envelope_gone 422 이 심볼의 활성 봉투 없음 · 만료/폐기
order_notional_exceeded · daily_notional_exceeded · portfolio_budget 422 주문당·일 명목·포트폴리오 예산 초과
no_price · limit_px_required 422 시세 없어 명목 추정 불가 · 지정가에 가격 없음
unknown_connector · connector_venue_mismatch · live_ack_required 422 target 커넥터 없음/타인 · venue 불일치 · 실거래 확인 문구 없음
key_verify_failed · broker_not_yet 422 커넥터 키 검증 실패(서명·IP 제한·권한) · 브로커 미지원
direction_conflict 큐 result 한 심볼에 반대 방향 중첩
reduce_only_wrong_side · reduce_only_exceeds_position 큐 result 청산 방향·수량이 보유와 안 맞음
stp_self_cross 큐 result 내 반대 지정가와 교차
policy_denied 큐 result 정책 규칙 위반 (사유 목록 포함)
data_stale 대기 시세가 신선하지 않음 — 큐에 queued로 남아 다음 주기 재시도 (봉투가 만료되면 expired/envelope_gone)
duplicate_intent 큐 result 같은 의도 재제출 (멱등)
slot_limit · invalid_stop · not_executable 422/403 플랜 슬롯 상한 · 중지 조건 오류 · 실행 문서 없는 템플릿(옵션)
llm_key_missing · llm_upstream 503 AI 모델 설정/업스트림 오류

10. FAQ

Q. 계좌를 안 만들어도 되나요? 네. 무료 가입만 하면 실시간 시세 위 모의거래·백테스트·AI 분석을 쓸 수 있고, 증권사·거래소 계좌는 필요 없습니다. 내 거래소 키를 붙이는 커넥터는 선택입니다.

Q. API 키는 어디서 발급하고, 잃어버리면요? 설정 → API 키(/settings/keys). 비밀키는 발급 순간 한 번만 보입니다. 잃어버리면 새로 발급하고 옛 키를 폐기하세요. 서버에는 해시만 있어 복구가 불가능합니다.

Q. 키 하나로 Claude Code와 봇을 같이 써도 되나요? 됩니다. 다만 애널리스트 MCP(/mcp/analyst)는 read-data 단독 키만 받으니, 분석 전용 세션을 원하면 키를 따로 발급하세요. 용도별로 키를 나누면 저널에서 누가 무엇을 했는지 구분하기도 쉽습니다.

Q. session_required가 나옵니다. 그 행위는 브라우저에서만 됩니다: 키 발급·폐기, 봉투 생성·폐기, 커넥터 등록·폐기, 워치리스트 새로고침, 플랜 변경. 대리인이 자기 권한을 넓히지 못하게 하는 규칙입니다.

Q. 주문이 envelope_required로 거절됩니다. 그 심볼을 허용하는 활성 봉투가 없습니다. Paper › Order 화면에서 종목·주문당 명목·일 명목·유효 일수를 정해 봉투를 만든 뒤 다시 보내세요. 청산 주문은 봉투 명목에 계상되지 않습니다.

Q. 진입 주문에 왜 가설과 처분 조건이 필수인가요? 가설 없는 포지션은 만들지 않는다는 것이 weltiq의 불변 규칙입니다. 처분 조건(px_below/px_above)은 엔진이 기계적으로 판정해 자동 청산하므로, "나중에 보고 정하겠다"는 진입은 받지 않습니다.

Q. 매도를 냈는데 숏이 아니라 청산이 됐어요. 보유 포지션의 반대 방향 주문은 청산으로 처리합니다(reduce-only, 보유 수량까지). 반대 방향 신규 포지션은 방향권 규칙상 같은 심볼에 중첩할 수 없습니다. 먼저 청산한 뒤 새로 진입하세요.

Q. 체결이 실제와 얼마나 비슷한가요? 실시간 호가로 거래소 실제 수수료·슬리피지 모델을 적용합니다. 같은 주문을 거래소 데모와 나란히 낸 실측에서 바이낸스 테스트넷 중앙값 0.64bp, 바이비트 데모 0.04bp 차이였습니다(페이퍼가 1bp 보수적). 데모/테스트넷은 자체 오더북이라 실시장과 다를 수 있습니다.

Q. 주문을 넣었는데 queued에서 안 움직입니다. 집행 셀이 큐를 5초 주기로 가져갑니다(알림으로 즉시 깨움). binance-usdm은 봉 신선도 판정 때문에 최대 30초 걸릴 수 있습니다. 시세가 stale이면(주말 주식 등) 신선해질 때까지 queued로 대기하고, 그 사이 봉투가 만료되면 expired가 됩니다. 기다리기 싫으면 화면에서 큐 항목을 취소하세요.

Q. 백테스트 결과의 data_mode: idealized는 무슨 뜻인가요? 저장된 확정 봉으로 리플레이했고 보수적 봉 판정(봉 내 손절 우선)을 적용했다는 표시입니다. compare_lookahead: true로 미래 참조 대조를 함께 받을 수 있습니다. 백테스트 결과는 참고이지 예측이 아닙니다.

Q. 전략 규칙 원문을 API로 받을 수 있나요? 없습니다. 공개 카드(한 줄 요약·적합 시장·예측 의존도)까지만이고, 엔지니어 AI가 앱 안에서 설명·조정해 줍니다. 규칙 자체는 플랜·로그인과 무관하게 서버 밖으로 나가지 않습니다.

Q. 내 전략 문서를 올려서 돌릴 수 있나요? Pro의 formalize(자연어 → 인스턴스)와 엔지니어 AI의 명시적 변경으로 내 인스턴스(doc_hash)를 만듭니다. 임의 코드 업로드는 없습니다.

Q. 실거래 주문은 언제 열리나요? 커넥터 실거래 키는 지금도 등록·검증되지만 주문은 live_ack 확인 문구와 승격 사다리(모의 실적 심사) 뒤에 있습니다. 데모/테스트넷 주문은 열려 있습니다.

Q. 거래소 API 키는 어떻게 보관되나요? 사용자별 봉투 암호화로 저장하고, 주문 시점에 집행 셀만 복호화합니다. 등록 시 잔고 조회로 검증합니다. 거래소에서 키를 만들 때 출금·이체 권한은 끄고, 거래소 쪽에서 집행 셀 IP만 허용하도록 IP 제한을 걸어 두세요.

Q. 요율 한도를 넘으면 어떻게 되나요? 429 rate_limited. 분당 창이 지나면 풀립니다. 백테스트(무료 10/분)는 순차로 돌리고, 429를 받으면 60초 쉬는 코드를 넣으세요.

Q. 크레딧은 어디에 쓰이나요? AI 호출(토큰), 백테스트(봉 수), API 주문 수. 잔액이 음수면 유료 연산이 402로 막힙니다. GET /v1/billing에서 원장을, GET /v1/usage에서 종류별 집계를 볼 수 있습니다.

Q. 웹훅이나 실시간 스트림이 있나요? 없습니다. oneoff_orders·slots·journal을 폴링하세요. 봉은 확정 봉만 제공합니다. 사람에게는 이메일 알림(체결·거절·자동 청산·슬롯 정지)이 갑니다 — 설정 → 알림에서 고릅니다.

Q. Python requests로 호출하면 403이 납니다. User-Agent가 기본값(python-requests/urllib)이면 엣지에서 차단됩니다. User-Agent: my-bot/1.0처럼 이름을 붙이세요.

Q. 시간대는요? 모든 시각은 UTC ISO-8601(+00:00)입니다. 봉의 t는 봉 시작 시각입니다.

Q. 저널에는 무엇이 남나요? 키 발급, 봉투 생성, 주문 큐잉, 슬롯 시작·정지, 템플릿 인스턴스화 등 모든 행위가 누가(사람/외부 클라이언트/에이전트)·무엇을·누구를 대신해 했는지로 남습니다. 운영자 행위는 해시체인으로 봉인돼 사후 변조가 드러납니다.

Q. OpenAPI 스펙이 있나요? /api-docs에서 Swagger UI로 모든 엔드포인트와 스키마를 볼 수 있습니다.


이 문서는 2026-09-06 실서비스 응답으로 검증했습니다. 동작이 문서와 다르면 문서가 아니라 코드가 맞습니다 — weltiq/api/server.py, weltiq/api/mcp_server.py.