마켓메이커 보호 (MMP)
마켓메이커를 위한 체결 윈도우 제한 및 자동 취소 동작입니다.
개요
MMP는 다음과 같은 방식으로 급격한 불리한 체결로부터 마켓메이커를 보호합니다:
- 롤링 시간 윈도우 내에서 누적 체결 지표를 추적
- 제한 초과 시 주문 취소
- 동일한 지갑+기초자산에 대한 다른 모든 MMP 활성화 주문을 자동 취소
설정
MMP 설정 지정
엔드포인트: POST /mmp-config
요청: SetMmpConfigRequest
{
"wallet": "0x...",
"currency": "BTC",
"interval_ms": 60000,
"frozen_time_ms": 300000,
"qty_limit": 1000000,
"delta_limit": 10.0,
"vega_limit": 5.0,
"enabled": true,
"nonce": 1,
"signature": "0x..."
}
필드:
wallet: 지갑 주소currency: 기초자산 통화 (예:"BTC","ETH")interval_ms: 롤링 윈도우 길이 (밀리초)frozen_time_ms: 트리거 후 동결 지속 시간 (밀리초)qty_limit: 선택적 수량 제한 (계약 단위)delta_limit: 선택적 델타 제한vega_limit: 선택적 베가 제한enabled: 해당 지갑+통화에 대해 MMP 활성화 여부
응답: ApiResponse<MmpConfigData>
MMP 설정 조회
엔드포인트: GET /mmp-config?wallet=...¤cy=...
쿼리 파라미터:
wallet(필수)currency(선택적 필터)
응답: MmpConfigResponse
{
"success": true,
"data": [
{
"wallet_address": "0x...",
"currency": "BTC",
"interval_ms": 60000,
"frozen_time_ms": 300000,
"qty_limit": 1000000,
"delta_limit": 10.0,
"vega_limit": 5.0,
"enabled": true
}
]
}
MMP 설정 삭제
엔드포인트: DELETE /mmp-config
요청: DeleteMmpConfigRequest
{
"wallet": "0x...",
"currency": "BTC",
"nonce": 1,
"signature": "0x..."
}
응답: ApiResponse<String>
MMP 상태 초기화
엔드포인트: POST /mmp-config/reset
요청: ResetMmpRequest
{
"wallet": "0x...",
"currency": "BTC",
"nonce": 1,
"signature": "0x..."
}
응답: ApiResponse<String>
참고: MMP 체결 윈도우 상태를 초기화합니다 (누적 지표 삭제, 통화 동결 해제).
MMP 동작 (반드시 이해해야 할 사항)
체결 처리 순서
MMP 평가는 체결 이후(POST-FILL)에 이루어집니다:
- 엔진이 먼저 매칭하고 체결을 수락합니다
- 그 후 MMP가 누적 지표를 확인합니다
- 제한이 초과된 경우:
- MMP가 트리거됩니다
- 활성 주문의 잔여 수량 처리가 중단됩니다
- 주문이
CANCELED상태가 되며 사유는"MMP triggered during fill processing"입니다 - 엔진이
MmpTriggered이벤트를 발행합니다 - 엔진이 동일한 지갑+기초자산에 대한 다른 모든 MMP 활성화 미체결 주문을 자동 취소합니다
시사점: MMP가 트리거되기 전에 설정된 임계값을 초과하는 체결이 발생할 수 있습니다.
트리거 조건
설정된 제한 중 하나라도 초과되면 MMP가 트리거됩니다:
- 수량 제한:
cumulative_qty > qty_limit - 델타 제한:
|cumulative_delta| > delta_limit - 베가 제한:
|cumulative_vega| > vega_limit
누적 지표는 롤링 윈도우(interval_ms)에 걸쳐 계산됩니다.
취소 동작
MMP가 트리거되면:
- 활성 주문: 잔여 수량 처리가 중단되고, 주문이
CANCELED상태가 되며 사유는"MMP triggered during fill processing"입니다 - 기타 주문: 동일한 지갑+기초자산에 대한 다른 모든 MMP 활성화 미체결 주문이
"Order canceled by MMP trigger"사유로 자동 취소됩니다
참고: MMP가 활성화된 주문만 취소됩니다. mmp_enabled=false인 주문은 영향을 받지 않습니다.
동결 동작
MMP가 트리거된 후:
- 해당 통화는
frozen_time_ms밀리초 동안 동결됩니다 - 동결 상태에서는 새로운 체결이 거부될 수 있습니다 (구현에 따라 다름)
체결 지표 계산
수량
- 출처: 체결
size(계약 단위) - 누적: 롤링 윈도우 내 모든 체결의 합계
델타
- 출처: 체결 심볼과 GreeksCache로부터 계산
- 누적: 롤링 윈도우 내 모든 체결 델타의 합계
베가
- 출처: 체결 심볼과 GreeksCache로부터 계산
- 누적: 롤링 윈도우 내 모든 체결 베가의 합계
롤링 윈도우
윈도우 만료 처리
interval_ms보다 오래된 체결은 윈도우에서 자동으로 제거됩니다:
- 제거는 주기적으로 실행됩니다 (백그라운드 작업)
- 오래된 체결이 제거될 때 누적 지표가 감소합니다
윈도우 초기화
POST /mmp-config/reset을 통해 MMP 상태를 초기화합니다:
- 윈도우 내 모든 체결 삭제
- 누적 지표를 0으로 초기화
- 통화 동결 해제
MMP 이벤트
MmpTriggered 이벤트
내부 이벤트 (현재 WS 클라이언트로 전달되지 않음):
MmpTriggeredMessage {
wallet: WalletAddress,
currency: String,
reason: String, // "qty_limit" | "delta_limit" | "vega_limit"
}
모범 사례
설정
- 적절한 제한 설정: 리스크 허용 범위와 일반적인 체결 규모를 기반으로 설정하세요
- 통화별 설정 사용: 기초자산별로 설정하세요 (BTC, ETH 등)
- MMP 트리거 모니터링: 트리거 발생 빈도가 높다면 제한 설정이 잘못되었거나 시장 상황이 불리하다는 신호일 수 있습니다
주문 관리
- MMP를 선택적으로 활성화: 보호가 필요한 주문에만
mmp_enabled=true를 설정하세요 - 일관된 통화 사용: 동일한 기초자산에 대한 모든 주문이 MMP 설정에서 동일한 통화를 사용하도록 하세요
- MMP 취소 처리: MMP 트리거에 의한 취소를 감지하고 호가 제시를 조정하는 로직을 구현하세요
모니터링
- MMP 트리거 추적:
"MMP triggered during fill processing"및"Order canceled by MMP trigger"사유를 모니터링하세요 - 체결 윈도우 검토: MMP 설정을 통해 누적 지표를 확인하세요 (현재 API로는 노출되지 않음)
- 제한 조정: MMP가 너무 자주 트리거되면 제한을 높이고, 너무 드물게 트리거되면 제한을 낮추세요
일반적인 문제
MMP가 너무 자주 트리거됨
원인:
- 일반적인 체결 규모에 비해 제한이 너무 낮음
- 불리한 시장 상황
- 빠른 호가 제시로 인한 다수의 체결
해결책:
qty_limit,delta_limit, 또는vega_limit을 높이세요interval_ms를 늘려 윈도우 내 더 많은 체결을 허용하세요- 호가 제시 빈도를 줄이세요
MMP가 트리거되지 않음
원인:
- 제한이 너무 높음
- 주문에 MMP가 활성화되지 않음 (
mmp_enabled=false) - 통화 불일치 (MMP 설정 통화 != 주문 기초자산)
해결책:
- 제한을 낮추세요
- 주문에
mmp_enabled=true가 설정되어 있는지 확인하세요 - MMP 설정 통화가 주문 기초자산과 일치하는지 확인하세요
예상치 못한 취소
증상: 예상하지 못한 상황에서 주문이 "Order canceled by MMP trigger" 사유로 취소됩니다.
원인: 동일한 지갑+기초자산에 대한 다른 주문이 MMP를 트리거했습니다.
해결책: MMP가 트리거되면 동일한 기초자산에 대한 모든 MMP 활성화 주문을 검토하세요.