[TOC]
DEX 거래소의 양적 관행에 대한 세 번째 기사입니다. 이번에는 Vertex 프로토콜의 사용 가이드를 소개합니다.
기존의 분산형 거래소(DEX) 프레임워크 내에서 양적 거래자는 종종 타협해야 합니다. 즉, 자동화된 시장 조성자(AMM) 모델의 높은 슬리피지와 낮은 실행 효율성을 수용하거나, 크로스체인 유동성 분산과 단일 파생상품 기능의 기술적 딜레마에 빠지는 것입니다. Vertex Protocol의 등장은 “탈중앙화 + 기관 수준” 융합 실험을 통해 양적 전략의 온체인 경계를 재정의하고 있습니다. 여기에는 “둘 중 하나를 선택해야 하는” 딜레마가 없으며 속도, 깊이, 자유의 궁극적인 균형만 있습니다.
통합된 멀티체인 유동성 풀, 하이브리드 주문장(CLOB) 및 내장된 통화 시장을 통합한 최초의 DEX인 Vertex는 “중앙화된 경험, 분산된 영혼”을 핵심으로 삼고 양적 거래자를 위한 독특한 경로를 열어줍니다.
속도와 유동성에 대한 새로운 정의
블록체인 기술이 지속적으로 발전함에 따라 전통적인 중앙집중형 거래소(CEX)와 분산형 거래소(DEX) 간의 경계가 점차 모호해지고 있습니다. Vertex 플랫폼의 허브인 Vertex Edge는 거래 속도와 유동성을 재구성할 뿐만 아니라 크로스체인 통합을 통해 탁월한 주문 매칭 기술과 셀프 커스터디의 장점을 완벽하게 결합하여 글로벌 거래자에게 새로운 DeFi 경험을 제공합니다.
크로스체인 유동성 통합: 유동성 파편화 해소 기존 시장에서는 서로 다른 체인 간의 유동성이 분산되는 경우가 많아, 거래자가 최상의 거래 가격과 거래 심도를 누릴 수 없습니다. Vertex Edge는 이러한 맥락에서 탄생했으며 통합된 주문장 네트워크를 통해 여러 체인에서 영구적인 유동성을 동기적으로 공유할 수 있게 되었습니다. 현재 Vertex Edge는 Arbitrum, Base, Sei, Blast, Mantle, Sonic, Abstract 등 7개 주요 체인에서 영구 계약 유동성을 지원하여 트레이더는 더 이상 유동성 분산에 대해 걱정할 필요가 없고, 최적의 가격으로 거래할 수 있으며, 진정으로 글로벌 유동성의 원활한 연결을 달성했습니다.
하이브리드 주문장 거래: 초고속 매칭과 온체인 결제의 완벽한 균형 Vertex Edge는 하이브리드 주문장 거래 모델을 채택했으며 핵심 기술은 다음과 같습니다.
오프체인 오더북 매처: 초고속 오프체인 매칭 메커니즘을 활용해 대부분의 중앙 집중형 거래소와 비슷한 5~15밀리초의 지연 시간으로 주문 매칭을 달성합니다. 온체인 리스크 엔진 및 AMM: 지원되는 각 체인에 리스크 관리 시스템과 자동화된 시장 조작자(AMM)가 배치되어 매칭 후 안전하고 투명한 방식으로 주문이 결제될 수 있도록 보장합니다. 이 아키텍처는 매우 빠른 거래 응답을 보장할 뿐만 아니라, 온체인 결제를 통해 사용자에게 분산형 보안을 제공함으로써 거래자는 자산 자체 보관의 독립성을 유지하면서도 CEX 수준의 성과를 누릴 수 있습니다.
다중 계정 기능: 하나의 지갑에서 여러 계정을 관리하고 보다 효율적으로 자금을 분배합니다. 레버리지 스팟 포지션: 모든 자산을 증거금으로 사용하여 자본 효율성을 높입니다. 유연한 위험 관리: 예금, 포지션, 손익 데이터를 통합된 방식으로 고려하여 위험 노출을 정확하게 통제합니다.
로그인 “vertex protocol” 페이지 주소:
Vertex는 대부분의 DEX와 동일합니다. dapp에 로그인한 후, 인증을 위해 지갑에 연결해야 합니다. Vertex의 하위 계정 시스템은 라벨을 기준으로 구분됩니다. 라벨은 하위 계정 지갑 주소를 얻기 위해 지갑 주소 계산에 참여합니다. 동시에, 이 주소는 주문 및 기타 작업을 수행할 권한이 있습니다.
예를 들어, 다음을 사용합니다.WalletConnect연결 시 지갑 주소는 다음과 같습니다.0x7a5ec2748e9065794491a8d29dcf3f9edb8d7c43
, 기본 라벨은 “기본”이고 계산된 하위 계정 주소는 다음과 같습니다.0x7a5ec2748e9065794491a8d29dcf3f9edb8d7c4364656661756c740000000000
. 기본 태그는 다음과 같습니다.64656661756c740000000000
。
Vertex는 여러 자산의 재충전을 지원합니다. 일반적으로 USDC를 마진으로 재충전하고 연결된 지갑을 직접 사용하여 거래를 이체하는 것을 선택합니다. Vertex에서 출금, 이체, 토큰 전송, 하위 계정 이체 등의 작업에는 USDC가 소모되며 수수료도 낮지 않기 때문에 이러한 작업은 신중하게 호출해야 합니다.
다른 체인으로 전환:
정점에서 다른 체인은 노드, 인덱서, 체인 ID와 같은 다른 구성 정보를 갖습니다. FMZ 캡슐화의 기본 체인은 다음과 같습니다.Arbitrum One
사용할 수 있습니다.Log(HttpQuery("https://gateway.prod.vertexprotocol.com/v1/query?type=contracts"))
체인 ID, 배포된 계약 정보 등을 쿼리합니다.
FMZ.COM에 로그인한 후, 거래소 구성 페이지에서 “암호화폐”를 선택하고 Vertex Exchange를 선택하면 dapp에서 지갑 프록시 키를 직접 구성할 수 있습니다. 물론 지갑 개인 키도 구성할 수 있습니다. Vertex에서 인터페이스를 사용하여 프록시 키 승인/승인 취소 및 기타 작업을 관리할 수 있으며, 이는 더욱 편리합니다.
프록시 키:
예를 들어, Vertex DEX 거래소의 프런트엔드 페이지에서: Chrome 브라우저(디버깅 켜기) -> 애플리케이션 -> 로컬 저장소 -> https://app.vertex -> vertex userSettings
Vertex Exchange 구성
FMZ에서 두 가지를 구성해야 합니다. 첫 번째는 지갑 주소입니다(서명에 사용된 프록시 키의 주소가 아니라 dapp에 연결된 지갑 주소여야 함). 두 번째는 서명에 사용되는 비밀 키입니다(지갑 개인 키나 프록시 키가 될 수 있음). 프록시 키를 사용할 수 있으므로 구성된 지갑 주소와 키는 반드시 쌍이 아닐 수 있습니다.
Vertex의 하위 계정 시스템은 태그로 식별됩니다. FMZ에서 사용되는 기본 태그는 다음과 같습니다.default
태그의 메인 계정을 전환해야 하는 경우 코드에서 사용할 수 있습니다.
exchange.IO("subAccountTag", "default") // 切换到主子账号
exchange.IO("subAccountTag", "test01") // 切换到标签名为 test01 的子账号
거래소 구성 정보를 구성하고 Vertex 인터페이스에 접근할 수 있는 관리자 프로그램을 배포한 후에는 실제 작업을 위한 코드 작성을 시작할 수 있습니다.
우리는 테스트를 위해 메인 하위 계정(태그가 default인 하위 계정)을 사용하고 다음을 사용합니다.Arbitrum회로망.
function main() {
var markets = exchange.GetMarkets()
if (!markets) {
throw "get markets error"
}
var tbl = {
type: "table",
title: "test markets",
cols: [
"key", "Symbol", "BaseAsset", "QuoteAsset", "TickSize", "AmountSize", "PricePrecision", "AmountPrecision", "MinQty",
"MaxQty", "MinNotional", "MaxNotional", "CtVal", "CtValCcy"
],
rows: []
}
for (var symbol in markets) {
var market = markets[symbol]
tbl.rows.push([
symbol, market.Symbol, market.BaseAsset, market.QuoteAsset, market.TickSize, market.AmountSize,
market.PricePrecision, market.AmountPrecision, market.MinQty, market.MaxQty, market.MinNotional, market.MaxNotional, market.CtVal, market.CtValCcy
])
}
LogStatus("`" + JSON.stringify(tbl) + "`")
return markets
}
Vertex의 계약 유형은 USDC 기반 계약이고 마진은 USDC이며 계약의 가치는 해당 통화를 나타냅니다. 예를 들어,BTC_USDC.swap
즉, USDC 기반 BTC 계약의 경우 한 계약은 BTC 포지션을 나타냅니다. 위의 코드는 계약 시장 정보를 요청하고 다양한 내용을 출력하는 방법을 보여줍니다.
function main() {
var depths = [{"symbol": "ETH_USDC"}, {"symbol": "SOL_USDC"}, {"symbol": "BTC_USDC"}]
for (var ele of depths) {
ele["depth"] = exchange.GetDepth(ele["symbol"] + ".swap")
}
var tbls = []
for (var ele of depths) {
var tbl = {"type": "table", "title": ele["symbol"], "cols": ["level", "price", "amount"], "rows": []}
var depth = ele["depth"]
for (var i = 0 ; i < 3 ; i++) {
tbl["rows"].push(["卖" + (i + 1), depth.Asks[i].Price, depth.Asks[i].Amount])
}
tbl["rows"].reverse()
for (var i = 0 ; i < 3 ; i++) {
tbl["rows"].push(["买" + (i + 1), depth.Bids[i].Price, depth.Bids[i].Amount])
}
tbls.push(tbl)
}
LogStatus("`" + JSON.stringify(tbls) + "`")
}
function main() {
var arrTrades = [{"symbol": "ETH_USDC"}, {"symbol": "SOL_USDC"}, {"symbol": "BTC_USDC"}]
for (var ele of arrTrades) {
ele["trades"] = exchange.GetTrades(ele["symbol"] + ".swap")
}
var tbls = []
for (var ele of arrTrades) {
var tbl = {"type": "table", "title": ele["symbol"], "cols": ["Time", "Price", "Amount", "side"], "rows": []}
var trades = ele["trades"]
for (var trade of trades) {
tbl["rows"].push([_D(trade.Time), trade.Price, trade.Amount, trade.Type == 0 ? "买入" : "卖出"])
}
tbls.push(tbl)
}
LogStatus("`" + JSON.stringify(tbls) + "`")
}
function main() {
let c = KLineChart({
overlay: true
})
let bars = exchange.GetRecords("SOL_USDC.swap")
if (!bars) {
return
}
bars.forEach(function(bar, index) {
c.begin(bar)
Log(index, bar)
c.close()
})
}
정점 차트
FMZ 전략 작전 도면
function main() {
var fundings = exchange.GetFundings()
var tbl = {
"type": "table",
"title": "GetFundings",
"cols": ["Symbol", "Interval", "Time", "Rate"],
"rows": [],
}
for (var f of fundings) {
tbl["rows"].push([f.Symbol, f.Interval / 3600000, _D(f.Time), f.Rate * 100 + " %"])
}
LogStatus(_D(), "\n`" + JSON.stringify(tbl) + "`")
}
자금 조달 비율 주기는 1시간입니다.
Max Order Size Gets the max order size possible of a given product for a given subaccount.
function main() {
// GET [GATEWAY_REST_ENDPOINT]/query?type=max_order_size&product_id={product_id}&sender={sender}&price_x18={price_x18}&direction={direction}
// price_x18=3000000000000000000000 : 3000 USDC
// product_id=4 : ETH_USDC.swap
// sender=0x123 : e.g. 0x123
return HttpQuery("https://gateway.prod.vertexprotocol.com/query?type=max_order_size&product_id=4&sender=0x123&price_x18=3000000000000000000000&direction=short")
}
최종 요청에서 반환된 데이터는 다음과 같습니다.{"status":"success","data":{"max_order_size":"170536415320344899"},"request_type":"query_max_order_size"}
3000의 가격을 가진 Ethereum 영구 계약에 대한 현재 계정 사용 가능 자산을 볼 수 있으며, 매도 주문의 최대 주문 수량은 0.17 ETH입니다.
Linked Signer Retrieves current linked signer of a provided subaccount
function main() {
return HttpQuery("https://gateway.prod.vertexprotocol.com/query?type=linked_signer&subaccount=0x123")
}
승인 정보 발견:
{“status”:“success”,“data”:{“linked_signer”:“0x79119…”},“request_type”:“query_linked_signer”} 주소 “0x79119…“는 Vertex 프런트 엔드 페이지에서 지갑에 연결할 때 주문 거래를 승인하기 위한 프록시 주소입니다. 이 권한은 취소되거나 추가될 수 있습니다(API 호출을 통해).
다음은 이 글의 초점입니다. 우리는 오랫동안 분산형 거래소에서 간단하고 빠르게 거래를 진행하기 위해 바빴습니다.
더 간단한 거래를 테스트하고 일반적인 지정가 주문을 해보세요.
function main() {
var id1 = exchange.CreateOrder("ETH_USDC.swap", "buy", 2000, 0.1)
var id2 = exchange.CreateOrder("SOL_USDC.swap", "buy", 60, 2)
Log("ETH_USDC.swap id1:", id1)
Log("SOL_USDC.swap id2:", id2)
var orders = exchange.GetOrders("USDC.swap")
var tbl = {type: "table", title: "test GetOrders", cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []}
for (var order of orders) {
tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
}
LogStatus("`" + JSON.stringify(tbl) + "`")
}
function main() {
var orders = exchange.GetOrders("USDC.swap")
var tbl = {type: "table", title: "test GetOrders", cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []}
for (var order of orders) {
tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
exchange.CancelOrder(order.Id)
}
LogStatus("`" + JSON.stringify(tbl) + "`")
return exchange.GetOrders()
}
function main() {
// 使用市价单下单持仓
exchange.SetCurrency("ETH_USDC")
exchange.SetContractType("swap")
exchange.Buy(-1, 0.01)
var positions = exchange.GetPositions()
var tbl = {type: "table", title: "test GetPosition/GetPositions", cols: ["Symbol", "Amount", "Price", "FrozenAmount", "Type", "Profit", "Margin", "ContractType", "MarginLevel"], rows: []}
for (var p of positions) {
tbl.rows.push([p.Symbol, p.Amount, p.Price, p.FrozenAmount, p.Type, p.Profit, p.Margin, p.ContractType, p.MarginLevel])
}
LogStatus("`" + JSON.stringify(tbl) + "`")
}
Vertex API에서 제공하는 데이터는 Vertex 프런트엔드 페이지에 표시된 내용과 다르다는 점에 유의해야 합니다. 이는 주로 평균 보유 가격과 보유 이익 및 손실의 차이 때문입니다. 이는 Vertex 팀에 피드백되었으며 나중에 업그레이드 및 업데이트될 수 있습니다.
4、Trigger Order
vertex의 Trigger Order는 endPoint와 독립적이므로exchange.IO
함수에 대한 조건부 순서를 지정할 때는 다음을 지정해야 합니다.Trigger: https://trigger.prod.vertexprotocol.com
이제 실제 작업을 계속해 보겠습니다.
function main() {
// isTrigger : true
var nonce = exchange.IO("nonce", true) // 如果是 Trigger Order 订单用到的 nonce 需要指定 isTrigger : true
// flag , reduceOnly
var expiration = exchange.IO("expiration", "GTC", false) // 设置订单为GTC类型,非只减仓
// params
var params = {
"place_order": {
"product_id": 4,
"order": {
"sender": "0x123...",
"priceX18": "4100000000000000000000",
"amount": "-100000000000000000",
"expiration": expiration,
"nonce": nonce
},
"trigger": {
"price_above": "4000000000000000000000"
}
}
}
return exchange.IO("api", "POST", "https://trigger.prod.vertexprotocol.com/v1/execute", "", JSON.stringify(params))
}
트리거 엔드포인트 아래에는 다음도 있습니다.
호출 방법은 트리거 주문 배치와 비슷하므로 여기서는 자세한 내용을 설명하지 않겠습니다.
기본 하위 계정 태그는 다음과 같습니다.default
, 사용자 정의 태그로 전환합니다:subAcc02
。
function main() {
exchange.IO("subAccountTag", "subAcc02")
return exchange.GetAccount()
}
하위 계좌 주소로 자금을 이체할 때 Vertex는 실제로 하위 계좌를 생성합니다.
계정의 nonce를 쿼리하여 매개변수로 전송 인터페이스에 전달해야 합니다.
function main() {
var ret = HttpQuery("https://gateway.prod.vertexprotocol.com/v1/query?type=nonces&address=0x123...")
var obj = JSON.parse(ret)
var nonce = obj["data"]["tx_nonce"]
Log("nonce:", nonce)
var params = {
"transfer_quote": {
"tx": {
// default -> subAcc02
"sender": "0xabc...", // default
"recipient": "0xdef...", // subAcc02
"amount": "7000000000000000000",
"nonce": nonce
}
}
}
return exchange.IO("api", "POST", "https://gateway.prod.vertexprotocol.com/v1/execute", "", JSON.stringify(params))
}
예를 들어: 0xabc…는 태그 기본값이 있는 하위 계정 주소에 해당합니다. 0xdef…는 태그 subAcc02가 있는 하위 계정 주소에 해당합니다. 0x123…은 지갑 주소입니다.
function main() {
var ret = HttpQuery("https://gateway.prod.vertexprotocol.com/v1/query?type=nonces&address=0x123...")
var obj = JSON.parse(ret)
var nonce = obj["data"]["tx_nonce"]
Log("nonce:", nonce)
var params = {
"withdraw_collateral": {
"tx": {
"sender": "0xabc...", // default
"productId": 0, // USDC : 0 , precision : 6
"amount": "10000000", // 10 USDC
"nonce": nonce
}
}
}
return exchange.IO("api", "POST", "https://gateway.prod.vertexprotocol.com/v1/execute", "", JSON.stringify(params))
}
USDC의 정확성에 주의하세요.
function main() {
var ret = HttpQuery("https://gateway.prod.vertexprotocol.com/v1/query?type=nonces&address=0x123...")
var obj = JSON.parse(ret)
var nonce = obj["data"]["tx_nonce"]
Log("nonce:", nonce)
var params = {
"mint_lp": {
"tx": {
"sender": "0xabc...", // default
"productId": 31, // USDT_USDC
"amountBase": "10000000000000000000",
"quoteAmountLow": "9999900000000000000",
"quoteAmountHigh": "10100000000000000000",
"nonce": nonce,
}
}
}
return exchange.IO("api", "POST", "https://gateway.prod.vertexprotocol.com/v1/execute", "", JSON.stringify(params))
}
거래 쌍을 위한 LP 토큰을 Mint하세요USDT_USDC
거래소 풀은 유동성을 추가합니다.
function main() {
var ret = HttpQuery("https://gateway.prod.vertexprotocol.com/v1/query?type=nonces&address=0x123...")
var obj = JSON.parse(ret)
var nonce = obj["data"]["tx_nonce"]
Log("nonce:", nonce)
var params = {
"burn_lp": {
"tx": {
"sender": "0xabc...", // default
"productId": 31, // USDT_USDC
"amount": "7500000000000000000",
"nonce": nonce,
}
}
}
return exchange.IO("api", "POST", "https://gateway.prod.vertexprotocol.com/v1/execute", "", JSON.stringify(params))
}
웹소켓 인터페이스 엔드포인트:wss://gateway.prod.vertexprotocol.com/v1/ws
。
[🚧🚧🚧ing…]
위의 테스트는 최신 커스터디언을 기반으로 합니다. Vertex DEX 애그리게이터를 지원하려면 최신 커스터디언을 다운로드해야 합니다.
여러분의 지지에 감사드리며, 읽어주셔서 감사드립니다.