전략은 자바스크립트 함수 하나입니다. 백테스트와 라이브가 완전히 같은 인터페이스를 씁니다 — 한쪽에만 있는 기능은 없습니다.
function onUpdate(ctx) {
// 봉마다(백테스트) / 갱신마다(라이브) 호출됩니다
// null, 주문 객체 하나, 또는 주문 객체 배열을 반환하세요
}
무엇을 만들 수 있나요
시장: 암호화폐 현물(업비트·바이낸스 등 연동 거래소), 무기한 선물(바이낸스 USDT-M·COIN-M 등 — 레버리지, 롱/숏, 격리/교차 마진), 한국 주식(증권사 오픈API — 한국 주식 거래 시작하기), 미국·해외 주식(IBKR — 실기기 확인 전), 외환·CFD(MetaTrader 5 — 실거래 경로 진행 중). 시장마다 백테스트·모의·실거래 범위가 다릅니다.
선물 거래소 실거래: 일부 파생 거래소는 실거래 전에 키 화면의 [연결 시험](소액 주문 왕복)을 거칩니다. 내 계정으로 시험을 통과하면 그 즉시 그 거래소에서 실거래·자동 실행을 쓸 수 있습니다(키를 바꾸면 다시 시험). API 가 거래와 출금을 분리하지 못하는 거래소는 경고를 읽고 직접 동의해야 키가 등록되고, 시드 문구는 받지 않습니다 — 자세한 건 보안.
다종목 스캐너: 한 전략이 같은 거래소의 여러 종목(최대 200개)을 동시에 봅니다 — 종목별 포지션·주문·상태 자동 분리.
한 전략에서 두 거래소에 동시 주문(legs — 거래소 간 차익거래·헷지): 백테스트(잡 포함)·페이퍼·라이브 실주문까지 지원합니다. 다리별 지갑·수수료·킬스위치 연동, 라이브는 모든 다리의 API 키가 있어야 시작합니다(한 다리만 실행되는 반쪽 헷지 방지 — 조용한 강등 없음). 통화가 다른 다리의 손익은 합산하지 않습니다(참고용 근사 USD 만 표기).
보조 종목 참조: 다른 종목·다른 거래소의 시세를 신호로 씁니다(ctx.ref 슬롯 — 예: 바이낸스 BTC 를 보며 업비트에서 거래). 백테스트·모의·실거래 모두 지원.
여러 거래소 동시 운용: 거래소마다 실행을 따로 띄워도 됩니다 — 에이전트 하나가 여러 거래소 키를 보유하고 전부 병렬로 돌립니다(업비트 A전략 + 바이낸스 선물 B전략).
멀티 에이전트 클러스터: 스캐너 종목을 여러 에이전트에 자동 분배해 병렬 실행합니다(엘리트 플랜 + 온보딩 후 활성화).
데이터: 캔들(1분~1일)·거래량·호가·펀딩비·미결제약정(OI)/청산 + 기본 지표(미 국채 금리·달러·VIX·유가 등 — 에이전트가 모아 ctx.data('base.이름') 로) + 내 DB(전략 코드의 DATA 선언 — 접속 정보는 에이전트에만) + 외부 신호(웹훅·폴링 — ctx.signal, 외부 신호). 모르는 값은 null — 0 으로 위조하지 않습니다.
환율(김프용 USD/KRW · 원화↔USDT 환산): 기본 제공 환율이 없습니다 — 서버가 환율을 더 이상 수집하지 않습니다. 직접 가져옵니다: 가장 쉬운 길은 웹훅 신호ctx.signal — 예: TradingView 1분봉 USDKRW 알림(봉 마감마다)을 /api/hooks/t/<토큰>?slot=usdkrw 로, 본문 {"rate": {{close}}, "t": "{{timenow}}"} → 전략에서 const s = ctx.signal('usdkrw'); const rate = s && Number(s.payload.rate), 나이(s.age, 초)로 오래된 값을 거릅니다(서버 한도 슬롯당 분당 12건). 백테스트에는 보내기 시작한 뒤의 기록만 as-of 로 보입니다. 그 밖에 실거래·모의는 ctx.http(환율 제공사 주소를 선언하고 실행에서 승인), 백테스트까지 쓰려면 ctx.data(DATA 에 내 환율 표, 또는 약 10일 늦게 발표되는 일별 base.usdkrw_h10). 환율이 없으면 null = 김프 없음. 예전 ctx.fx 는 저장된 전략이 멈추지 않게 남겨 둔 것이라 항상 null 입니다.
주문: 시장가·지정가·분할 진입, 라이브 전용 스마트 주문(추격·트리거).
안전장치: 지갑(최대 손실 = 지갑), 주문 속도 제한·승인 천장, dry-run. (기준액 없이 배포된 옛 실거래 실행·legs 는 예전 손실 킬스위치가 그대로 걸립니다.)
검증: 최대 10만 봉 백테스트, 종료일 고정으로 여러 구간 검증(walk-forward) + 스튜디오 틱 판단시간 예측·라이브 틱 실측 모니터(서버가 일 잘하나 실행 카드에서 확인).
전략 스튜디오 — 내 전략 목록과 코드 편집기전략 목록 — 엔진별 묶음 · 수익률/MDD
아직 안 되는 것 (지원하는 척하지 않습니다):
다리별 분산 실행(legs 를 여러 에이전트에)의 실거래 — 분산 실행(계산 에이전트 + 다리별 집행 에이전트)은 페이퍼에서만 됩니다. 실주문은 두 기기 실측 뒤에 엽니다. 실거래 legs 는 지금 한 에이전트가 모든 다리 키를 갖고 실행합니다.
클러스터 자동 재배분 — 분배는 정적입니다. 에이전트가 이탈하면 그 종목들은 대기하며 화면에 정직하게 표시됩니다(몰래 다른 에이전트로 옮기지 않음).
일부 국내 증권사의 실계좌 검증 — 실계좌로 주문·체결 왕복을 아직 확인하지 못한 증권사: LS증권, NH투자증권 나무 PLUG, NH투자증권 N2 PLUG, 토스증권. 배포 때 '미검증 경고'로 이유를 알려줍니다. 틀리면 증권사 오류 코드가 그대로 표시됩니다. 처음엔 소액으로 확인하세요.
규칙
순수 함수 — 네트워크·import·async 금지. 아래 ctx 만 사용합니다.
qty 는 언제나 코인 수량입니다(현금 아님).
지표는 데이터가 모자라면 null — 반드시 null 검사를 하세요.
내 변수는 ctx.state 에 보관하면 호출 간 유지됩니다.
ctx.ref 슬롯은 논리명('hedge' 등)으로 — 실제 종목은 배포 때 연결됩니다.
ctx 기능이 있는지 검사하는 코드(typeof ctx.watch === 'function' 등)는 쓰지 마세요. 전략이 쓰는 기능을 에이전트가 지원하는지는 배포할 때 플랫폼이 확인하고, 부족하면 필요한 버전을 알려주며 배포를 막습니다.
ctx.watch 는 차트·실행 카드에 대기 가격을 표시만 합니다 — 주문이 아닙니다. 주문은 onUpdate 의 반환값뿐입니다.
가격 말고 다른 조건(RSI 등)도 있으면 선언에 conds 로 함께 넣으세요 — 판단에 쓴 그 값(같은 기간·같은 봉)으로: conds: [{ label: 'RSI(14) 마감', now: rsi, op: '<', ref: 30, closed: true }]. 하나라도 거짓이면 실행 카드가 "조건 대기"로 보여 주고 도달 추정을 숨깁니다.
스마트(작업 주문): { side, qty, type: 'smart', chase?, slices?, trigger?, hardStopMs? } — 시간에 걸쳐 집행합니다. 체이싱(호가 추격→마감 시 크로스)·분할·스톱/트레일링 트리거·강제 마감을 조합할 수 있고, 라이브·페이퍼에서 집행됩니다. 백테스트는 시장가로 근사하니 라이브 페이퍼로 검증하세요.
지정가 사다리: { book: [{ key, side, qty, price | at: 'top' }], tol?, refreshMs? } — '걸려 있어야 할 지정가 목록'을 매 틱 그대로 내면 됩니다. 이미 걸린 것과 맞춰 허용 한도 안이면 그대로(재주문 없음), 밖이면 고치고, 빠진 key 는 취소합니다. 한도 = max(0.05%, 현재가와의 거리 × 0.2) — 가까운 주문은 조이고 먼 주문은 넉넉히, 가까운 것부터 처리합니다. 기본은 메이커 전용(postOnly). at: 'top' 은 매수 최고가+1틱(체결될 자리면 최고가). refreshMs 를 주면 한도 안이어도 그 시간마다 1틱 이상 다를 때 고칩니다(실거래는 유량 여유가 있을 때만). 체결된 key 는 한 번 뺐다가 다시 내야 또 겁니다. 백테스트는 틱이 없어 맨 위를 최고가에 줄세웁니다(결과에 표시).
전체 취소: { cancel: 'all' } — 대기 지정가와 작업 주문 전부 취소(체이싱은 개별 주문 취소로 못 멈춥니다).
밖으로 보내기 (ctx.http) — 알림·외부 API
전략이 텔레그램·디스코드·슬랙 알림이나 외부 API 를 부를 수 있습니다(에이전트 1.348.0 이상). 키는 코드에 넣지 않습니다 — 에이전트의 HTTP 보관소에 두고, 코드는 자리 이름만 씁니다.
HTTP 선언에 없는 주소로는 안 나갑니다. run 마다 에이전트 화면에서 자리 ↔ 보관소 항목을 직접 승인해야 보내집니다(선언이나 코드가 바뀌면 다시 승인).
보관소는 등록할 때 도메인을 크게 보여주고, 닮은 도메인(te1egram.org 등)·처음 보는 도메인은 도메인을 다시 입력해야 저장됩니다. 키는 지정한 출처로만 붙고 응답에서 지워집니다.
틱당 5건·응답 64KB·리다이렉트 안 따라감·사설 IP 차단. 결과는 다음 틱에 ctx.http.result(id).
백테스트는 보내지 않습니다 — 결과의 httpNotSent 에 건수만 남습니다.
코드에 키 모양 문자열이 있으면 저장 때 경고하고, AI 에게는 자리표시자로 가려서 보여주며, git 공개 발행에서 그 전략은 빠집니다.
아래 표가 ctx 의 전부입니다(자동완성과 같은 출처에서 생성). AI 에게 전략 코드를 받으려면 AI 전략 만들기를 쓰거나, AI 문서를 통째로 붙여넣으세요.
ctx
이 표는 에디터 자동완성·AI 문서(/llms.txt)와 같은 출처(코드)에서 생성됩니다 — 여기 없는 함수는 존재하지 않습니다.
상태
ctx.candle현재 봉 { t, o, h, l, c, v } — t 는 실데이터면 실제 봉 시각(epoch ms), 합성 시세만 봉 번호. ★라이브·페이퍼도 실제 봉 시작 시각(에이전트 1.66.0+ — 그 이전 라이브는 링버퍼 인덱스(499)로 굳어 있었다: 요일·시간대 로직을 쓰면 반드시 1.66.0 이상에서 확인할 것). 시각을 모르는 경로는 null(인덱스를 시각인 척 주지 않는다)
ctx.price현재가(종가)
ctx.closes현재 봉까지의 종가 **배열**(미래 없음) — 숫자가 아니다. 직전 마감 봉 종가 = ctx.closes.at(-2), 지금 봉 = ctx.closes.at(-1). 배열 자체를 비교·계산하면 던진다(2026-10-10)
ctx.alloc지갑 { denom, status, target, current, pendingReturn, reserved, lockedByMargin, lastForced, rev, changes } — 읽기 전용, 숫자는 denom 단위. status≠'ok' 면 줄이기만 된다. legs 는 { ex: 값 }. 옛 실거래 run(기준액 없음)은 null
ctx.highs봉별 고가 배열(closes 와 같은 길이). 모르면 null · 직전 마감 봉 = .at(-2)
ctx.lows봉별 저가 배열(highs 와 같은 규칙)
ctx.opens봉별 시가 배열(highs 와 같은 규칙)
ctx.times봉 시작 시각 배열(epoch ms) · 모르면 null
ctx.i현재 봉 번호
ctx.position보유 수량(코인). 선물(usdm)에선 부호 수량 — +롱/−숏
ctx.entryPx평균 진입가 — 선물: 포지션 평균 진입가 · spot: 보유 중 평균 매수 단가(체결가 가중, 수수료 제외 · 라이브/페이퍼는 이 실행이 직접 산 체결 기준 — 직접 안 산 보유가 섞이면 null · 코인을 들고 시작한 실행은 배포 때 유저가 넣은 매수 단가(기본 현재 시세, 비우면 null)). 포지션 없으면/모르면 null
ctx.rsiW(n=14, ago=0)Wilder RSI — 20n 봉 필요 · 무변동 50
ctx.atrW(n=14, ago=0)Wilder ATR — 20n 봉 필요
ctx.adxW(n=14, ago=0)Wilder ADX {adx,plusDI,minusDI} — 20n 봉 필요
오더북
ctx.book()호가 전체 { bids, asks } (좋은 가격 순)
ctx.bid()최우선 매수호가
ctx.ask()최우선 매도호가
ctx.mid()중간가
ctx.spread()호가 차이(절대값)
ctx.spreadPct()호가 차이(중간가 대비 %)
ctx.fillPrice(side, qty)시장가 예상 체결 { avgPx, filled }. filled<qty면 유동성 부족
ctx.depth(side, px)px 까지 쌓인 누적 물량
주문
ctx.openOrders()대기 중인 지정가 목록(읽기 전용, 행에 ex — 작업주문은 workOrders 로)
ctx.workOrders()활성 작업주문(스마트 — 체이싱·분할·트리거 대기) 목록. 백테스트는 트리거 대기분만(체이싱은 봉 해상도에 개념 없음)
스캐너(여러 종목)
ctx.sym이번 호출의 종목(예: "BTC")
ctx.ex이번 틱 종목이 속한 거래소(예: 'upbit'). legs 백테스트·라이브에선 실값, 호출부가 거래소를 안 알려준 단일 백테스트는 null
ctx.quote이번 틱 다리의 표시통화(예: 'KRW', 'USDT'). 다리별 금액 계산(예: KRW 다리 6,000원 vs USDT 다리 6달러)의 분기 재료. 모르면 null — 지어내지 않는다
ctx.wallets()거래소(다리)별 지갑 맵 { upbit: { quote, cash, reserved? }, … } — 단일 실행도 한 다리짜리 맵(거래소를 모르면 'default' 키). 통화가 달라 합산값은 없다 — 환산이 필요하면 환율을 ctx.http·ctx.data 로 직접 가져온다
ctx.marketType시장 종류 'spot'|'usdm'|'coinm'|'cfd' — spot 이 아니면 position 이 부호 수량(+롱/−숏), liqPx·uPnl·leverage·funding 필드가 채워진다(entryPx 는 spot 에서도 평균 매수 단가). forex 는 기본 cfd(펀딩 없음·liqPx=스탑아웃가)
ctx.syms시세를 받은 종목 이름 목록
ctx.markets()전 종목 요약 [{ sym, ex, price, ch1, ch5, ch60 }] — ch 는 퍼센트(2 = +2%. change()의 소수 단위와 다름!). 봉이 모자라면 null. 단일 종목 실행에선 그 한 종목만 담긴 배열(빈 배열 아님). ex 는 legs 면 그 다리 거래소, 모르면 null
ctx.scan스캔 상태 { hit, active, maxActive, via?, candidates? } — hit = { names:[조건], by:{ 이름:{ barTs, closeAt } }, ex? } | null(마감 뒤 holdBars 봉). 활성 종목(적중·보유·주문)에만 불린다. via(legs)·candidates(경합 봉)는 SCAN 절. SCAN 없으면 null
ctx.market(sym)한 종목 요약 (없으면 null)
ctx.pos(sym, ex?)그 종목 보유 수량(이번 틱 다리 기준). 2번째 인자로 다른 다리(거래소) 지정 조회 — 모르는 다리는 null(0 은 "없음"을 단정하는 거짓)
ctx.positions종목별 보유 수량 스냅샷 { SYM: qty } — 이미 든 종목을 피할 때
ctx.symState현재 종목 전용 저장소(자동 분리) — 종목별 손절가·보유 플래그는 여기에. state.__sym[sym] 과 같은 객체
거래량
ctx.vol현재 봉 거래량 (모르면 null)
ctx.volumes봉별 거래량 배열 (모르면 null)
ctx.volPrev직전 **확정** 봉의 거래량 (봉 중에도 값이 있다 · 모르면 null). 1.86.0 미만 라이브에서는 항상 null
ctx.avgVol(n)최근 n개 **확정** 봉의 평균 거래량 (형성 중 봉은 제외 · 봉이 모자라거나 모르면 null). ★1.86.0 미만 라이브은 형성 중 봉을 평균에 넣었다 — 값이 낮게 나오고 봉 안에서 답이 바뀐다
멀티에셋
ctx.ref(slot)보조 종목 현재가. 슬롯명은 논리명(예: 'hedge')
ctx.refs사용 가능한 슬롯명 목록
파생 심리(OI·청산)
ctx.binanceOi()(라이브·페이퍼) 현재 종목 최신 미결제약정 { ts, oi, oiUsd } — 바이낸스 USDT-M 5분 집계. 백테스트·수집 전·모르면 null
ctx.binanceLiqs(n)(라이브·페이퍼) 최근 n분(기본 5·최대 60) 강제청산 합계 { longUsd, shortUsd, cnt } — longUsd=롱 청산(하방 압력의 해소). 백테스트·모르면 null. ★행이 없는 분은 "청산 0" 과 "수집 공백" 을 구분할 수 없음
외부 신호(웹훅)
ctx.signal(slot)외부 신호(TradingView 웹훅 등) 조회 { payload, at, age } — payload 는 보낸 JSON 그대로(파싱·해석 안 함), at 은 신호 시각(epoch ms), age 는 경과 초(내림). 백테스트는 현재 봉 시각 이하의 가장 최근 신호(as-of — 미래 신호는 안 보인다), 라이브·페이퍼는 60초 캐시 스냅샷. 신호가 아직 없거나 모르는 slot 이면 null(0·빈객체로 지어내지 않음 — 반드시 null 검사)
ctx.signals(slot, { since, limit })봉 사이 신호 **전부** [{ payload, at, age }] 오름차순 — since 초과~현재 봉 이하(없으면 직전 봉부터). limit 기본 50·상한 500(넘으면 truncated·dropped — 라이브에서 보관분보다 과거면 dropped null). 모르는 slot null · 0건 []. 뉴스·공시처럼 여러 건 오는 원천용(ctx.signal 은 최신 하나)
ctx.signalSeries(slot, { field, agg, interval, halfLifeH, label, sym })LLM 신호 슬롯의 칸 하나를 **이 전략 봉 축 배열**로(마지막 = 지금 봉). agg: count·mean·max·min·sum·decay(halfLifeH 기본 6)·labelCount. 귀속 = 신호 at · 닫힌 봉만 · 모르는 slot null. 빈 봉: count·sum 0 · mean·max·min null · decay 감쇠. 정밀도보다 짧은 봉은 null+경고(topic data)
ctx.data(key)외부 데이터 as-of 값. 이름 '<출처>.<이름>': base.<x> = 에이전트 기본 수집(선언 불필요, 예: 'base.vix') · <DB 별칭>.<이름> = 코드의 const DATA 에 적은 SQL(예: 'main.fg'). 옛 이름(base_vix · 계정 데이터셋 키 fg)도 같은 값 + legacy-key 경고. ★const DATA·점 이름은 에이전트 1.436.0 이상 — 그 아래 에이전트는 DATA 잡을 집지 않는다(제출이 AGENT_TOO_OLD·AGENT_NONE_ELIGIBLE 로 이유를 말한다 — 업데이트 안내). 현재 봉 시각 이하 최신 행(look-ahead 금지), 라이브·페이퍼는 주입된 최신값. 값 그대로. null = 모른다 — 이유는 결과 datasets[] 의 why·warn·src·rows(null≠0). ★행의 ts 기준 — DB 에 들어온 시각은 안 본다(dataAxis:'ts' + [PIT] 고지). 반드시 null 검사
ctx.dataKeys주입된 데이터의 정본 이름 목록(예: ['base.vix','main.fg'] — 옛 이름으로 불러도 정본. 빈 배열 = 외부 데이터 없음)
로그
ctx.log(...)디버그. 라이브는 분당 20건 서버 전송 제한 — 초과분은 VPS 로컬 파일(runstate/run-<id>.log)에 전량 보존. 백테스트는 500건 상한
ctx.logOnce(...)디버그 1회 — ctx.log 와 같지만 **같은 문장은 실행당 한 번만** 찍는다(서식 문장 200자가 같으면 같은 문장). 시작 설정·"데이터 부족" 같은 매 틱 반복 안내용. 숫자가 바뀌는 문장은 다른 문장이다(가격을 넣으면 매번 찍힌다). 라이브·페이퍼는 에이전트 재시작·코드 재배포 뒤 다시 한 번 찍는다. 기억 상한(라이브 200·백테스트 1000문장)을 넘은 새 문장은 1회 보장 없이 ctx.log 처럼 찍힌다. 라이브에서 1회 문장은 분당 20건 제한을 받지 않는다(상한이 있어서)
ctx.warn(...)중요. 라이브에서 스로틀 없이 항상 서버 전송 + 직전 로그 맥락 동봉 — 촘촘한 검증·이상 신호는 log 대신 이걸 쓰세요
ctx.watch(list)체결 조건 선언 — [{side:'buy'|'sell', price?:number, trigger?:'above'|'below', at?:epochSec, qty?:number, note?:string, sym?:string}] 를 매 틱 선언하면 run 카드가 '[선언] 매수 61,200 (−1.8%)' 로, 실거래·페이퍼 차트가 그 가격에 **점선**과 도달 추정 범위('약 5m~20m', 최근 14봉 ATR 기준 — 시각 예측 아님)로 그린다. 가격 없는 선언(at·이벤트)은 카드에만. 다종목(syms) 전략은 **종목 틱마다** 그 종목 것만 선언한다 — 종목별로 따로 보관되고(sym 생략 = 이번 틱 종목), 그 틱에 안 부르면 그 종목 선언만 지워진다(에이전트 1.243.0+, 이전엔 마지막 종목 것만 남았다). 틱마다 덮어씀(누적 아님), 최대 8개, note 60자. ★ trigger = 가격이 어느 쪽에서 닿아야 하나 — 'below'(내려와 닿으면: 저점 매수·손절/트레일 스탑 매도) / 'above'(올라와 닿으면: 익절 매도·돌파 매수). 주면 카드가 '조건 충족'을 판정하고 스탑이면 '스탑 매도'로 표시한다. 안 주면 거리만 보이고 충족 판정은 안 한다(방향을 지어내지 않는다, 에이전트 1.273.0+). ★ 가격 외 조건이 더 있으면 conds:[{label, now, op:'<'|'<='|'>'|'>=', ref, closed?}, {label, ok:true|false}] (최대 4) — **판단에 쓴 그 값**을 싣는다(같은 기간·같은 봉). 충족은 플랫폼이 now·op·ref 로 판정하고, 하나라도 거짓이면 카드가 '조건 대기'로 그리고 도달 추정을 안 보인다(에이전트 1.278.0+, 이전엔 조건만 빠진다). closed:true = 마감 봉 값(다음 마감까지 안 바뀜). 백테스트는 무시, 라이브·페이퍼만 보고. 반환값 없음
ctx.http.send(req)HTTP — const HTTP={origins:[...],creds:{slot:origin}} 선언 + run 승인 필요. send({id,url}|{id,cred,path,method,json}) 큐잉 → 다음 평가 ctx.http.result(id): null·{ok:false,code}·{ok:true,status,json|text}. 비밀은 보관소(코드가 못 봄). 백테스트는 안 보냄(code:'backtest')
ctx.alert(msg)조건 근접 알림 — 전략이 "진입 조건에 근접했다"고 스스로 판정해 유저에게 알림을 보낸다. msg 는 문자열로 강제(200자 컷)·반환값 없음. 라이브·페이퍼는 run 당 60초 쿨다운으로 발송(60초 내 재호출은 무시 — 로그에 남음), 백테스트는 발송 없이 로그에 [알림] 으로만 기록(상한 50개, 초과는 개수만 alertsDropped)
주문 객체 키
side'buy' | 'sell'
qty수량(코인). 현금이 아니다
type'limit'=지정가, 'smart'=작업 주문(시간에 걸쳐 집행 — 체이싱·분할·트리거). 기본은 시장가. smart 는 라이브·페이퍼에서 집행되고 백테스트는 시장가로 근사
price지정가일 때의 가격
postOnlytrue 면 즉시 체결될 지정가는 거부(메이커만)
chasesmart: 호가 추격 { escalateMs?=20000, deadlineMs?=45000, bandTicks?, minRepegMs? } — 호가 조인(메이커)→1틱 전진→마감 시 크로스(테이커). 기본 켜짐, false 면 끔
slicessmart: 분할 { n, everyMs } — 수량을 n조각으로 everyMs 간격 집행
triggersmart: 조건 대기 { type:'stop'|'trail', px?, offset? } — 조건이 닿기 전엔 주문이 안 나간다. 실데이터 백테스트도 봉 h/l 로 발동 판정(2026-08, 체결 라벨 stop/trail)
hardStopMssmart: 이 시간이 지나면 무조건 종료(남은 수량 포기)
reduceOnly정리 표시 — 줄이기만(포지션보다 크면 0 에서 잘림, 포지션이 없으면 거절). 닫는 주문엔 늘 붙인다
cancel'all' 이면 대기 주문 전체 취소
book지정가 사다리: [{ key, side, qty, price | at:'top', postOnly?(기본 true), reduceOnly? }] — 매 틱 같은 목록을 내면 걸린 것과 맞춘다(한도 안이면 호출 0). 상세는 llms 토픽 orders