avatar of 发明者量化-小小梦 发明者量化-小小梦
집중하다 사신
4
집중하다
1271
수행원

DEX 거래소 양적 연습(4) - WOOFi/EdgeX 전략 접근 테스트

만든 날짜: 2025-04-10 15:36:06, 업데이트 날짜: 2025-04-11 13:35:33
comments   0
hits   674

DEX 거래소 양적 연습(4) - WOOFi/EdgeX 전략 접근 테스트

지난 몇 편의 기사에서 우리는 주류 DEX에 대한 접근성을 논의했으며, 이 기사에서는 실제 사용에 초점을 맞추고 실제 전략 배포 테스트를 실시하겠습니다. FMZ 플랫폼은 최근 WOOFi와 EdgeX 분산형 거래소에 대한 지원을 추가했습니다. 이 글에서는 이 두 가지 교류를 바탕으로 몇 가지 간단한 교육 전략을 실행하는 연습을 하겠습니다.

WOOFi

WOOFi에 지갑을 연결한 다음 API 키 페이지에서 API 키 정보를 보고 복사하여 붙여넣은 후 FMZ에서 구성할 수 있습니다.

다운로드 및 배포 후, 이미 WOOFi DEX와 EdgeX DEX를 지원하는 FMZ의 최신 호스트를 사용하세요. https://www.fmz.com/m/platforms/add 페이지에서 교환 객체를 구성하고 WOOFi의 AccountId, AccessKey, SecretKey를 구성합니다.

이 테스트에서는 다음을 사용했습니다.기본 시장 조성 전략 프로토타입시장 변동성 지표(ATR)와 결합하여 보류 주문 간격을 동적으로 계산하고, 포지션의 지능적 식별과 마감 포지션을 우선시하는 주문 로직을 실현합니다. 이 전략은 각 라운드마다 주문장을 새로 고치고, 깊이와 포지션 정보를 다시 수집하고, 설정된 가격 간격과 주문 수량에 따라 주문을 넣습니다. 전체 프로세스에는 다음이 포함됩니다.

  • 실시간 시장 정보 추출 및 지표 분석
  • 롱 및 숏 방향 모두에서 보류 주문에 대한 논리적 제어
  • 마감 및 개시 포지션의 판단 및 전환
  • 포지션과 계정 상태를 시각적으로 출력합니다.

이 전략을 통해 WOOFi에서 실제 거래 효율성, 주문 지연, 매칭 경험을 관찰할 수 있으며, 이를 통해 이후 더욱 복잡한 전략을 설계하는 기반을 마련할 수 있습니다.

우리는 WOOFi의 테스트 환경과 테스트 네트워크인 Arbitrum Sepolia를 사용합니다.

exchange.SetBase(”https://testnet-api.orderly.org”)

WOOFi 테스트 네트워크에는 테스트용 USDC를 쉽게 얻을 수 있는 faucet이 있습니다.

전략 코드:

function createOrders(e, symbol, side, ordersNum, beginPrice, firstAmount, spacing, pos) {
    if (side == "buy" || side == "closesell") {
        if (spacing > 0) {
            throw "spacing error"
        }
    } else if (side == "sell" || side == "closebuy") {
        if (spacing < 0) {
            throw "spacing error"
        }
    } else {
        throw "side error"
    }
    
    var holdAmount = 0
    if (pos) {
        holdAmount = pos.Amount
    }

    var amount = firstAmount
    for (var i = 0 ; i < ordersNum ; i++) {
        var id = null 
        amount = amount * 2
        var price = beginPrice + i * spacing

        if (price <= 0 || amount <= 0) {
            Log("continue loop:", price, amount, "#FF0000")
            continue 
        }

        if (holdAmount - amount >= 0) {
            id = e.CreateOrder(symbol, side == "buy" ? "closesell" : "closebuy", price, holdAmount)
            holdAmount = 0
        } else {
            id = e.CreateOrder(symbol, side, price, amount)
        }

        Sleep(100)
    }
}

function cancelAll(e, symbol) {
    while (true) {
        var orders = _C(e.GetOrders, symbol)
        var sideOrders = []
        for (var o of orders) {
            sideOrders.push(o)
        }
        if (sideOrders.length == 0) {
            break
        }

        for (var o of sideOrders) {
            e.CancelOrder(o.Id, o)
        }

        Sleep(500)
    }
}

function main() {
    LogReset(1)
    LogProfitReset()
    exchange.SetBase("https://testnet-api.orderly.org")

    // 参数
    var symbol = "ETH_USDC.swap"
    var ordersNum = 5
    var orderAmount = 0.01
    var priceSpace = 0

    // 初始化
    exchange.SetPrecision(2, 3)    
    var msg = []
    var buyOrdersNum = ordersNum
    var sellOrdersNum = ordersNum

    while (true) {
        cancelAll(exchange, symbol)

        var r = _C(exchange.GetRecords, symbol, 60 * 5)
        var art = TA.ATR(r, 20)
        priceSpace = art[art.length - 1]
        var pos = _C(exchange.GetPositions, symbol)        

        // depth
        var depth = _C(exchange.GetDepth, symbol)
        if (depth.Bids.length == 0 || depth.Asks.length == 0) {
            msg.push("invalid depth")
        } else {
            var bid1Price = depth.Bids[0].Price
            var ask1Price = depth.Asks[0].Price

            var longPos = null
            var shortPos = null
            for (var p of pos) {
                if (p.Type == PD_LONG) {
                    longPos = p
                } else if (p.Type == PD_SHORT) {
                    shortPos = p
                }
            }

            // long
            createOrders(exchange, symbol, "buy", buyOrdersNum, bid1Price, orderAmount, -priceSpace, shortPos)
            // short
            createOrders(exchange, symbol, "sell", sellOrdersNum, ask1Price, orderAmount, priceSpace, longPos)
        }
        
        var acc = _C(exchange.GetAccount)
        var orders = _C(exchange.GetOrders, symbol)
        LogProfit(acc.Equity, "&")

        var posTbl = {"type": "table", "title": "pos", "cols": ["Symbol", "Type", "Price", "Amount"], "rows": []}
        for (var p of pos) {
            posTbl["rows"].push([p.Symbol, p.Type == PD_LONG ? "多" : "空", p.Price, p.Amount])
        }

        var ordersTbl = {"type": "table", "title": "orders", "cols": ["Symbol", "Type", "Price", "Amount"], "rows": []}
        for (var o of orders) {
            ordersTbl["rows"].push([o.Symbol, o.Type == ORDER_TYPE_BUY ? "买" : "卖", o.Price, o.Amount])
        }

        LogStatus(_D(), "priceSpace:", priceSpace, "\n`" + JSON.stringify([posTbl, ordersTbl]) + "`")
        Sleep(1000 * 60)
        LogReset(1000)
    }
}

WOOFi에서의 전략 연습

DEX 거래소 양적 연습(4) - WOOFi/EdgeX 전략 접근 테스트

DEX 거래소 양적 연습(4) - WOOFi/EdgeX 전략 접근 테스트

DEX 거래소 양적 연습(4) - WOOFi/EdgeX 전략 접근 테스트

EdgeX

FMZ에서 EdgeX를 구성하기 위한 API 정보는 기본적으로 WOOFi와 동일하지만, 거래소마다 필요한 API 정보가 다릅니다. EdgeX에서는 AccountId와 SecretKey만 구성하면 됩니다. 이러한 정보는 지갑을 사용하여 EdgeX 프런트 엔드에 연결한 후 계정 API 관리 페이지에서도 볼 수 있습니다.

EdgeX에 구현하려는 전략은 다음을 기반으로 합니다.다층 볼린저 밴드역방향 오픈 + 중도 청산의 양적 거래 논리를 통해 단기 변동성 차익거래를 실현할 수 있습니다.

전략은 매우 간단합니다. 핵심 아이디어는 다음과 같습니다.

  • 여러 가지 볼린저 표준 편차를 활용하면 시장 변동성의 강도를 정량화할 수 있습니다.
  • 포지션을 늘리고 늘리는 것에는 논리가 있습니다. 돌파구가 강할수록 포지션도 커집니다.
  • 포지션을 닫는 데에는 명확한 논리가 있으며, 포지션이 중간 트랙으로 돌아가면 철수하게 됩니다.
  • 거래량은 표준편차 배수에 비례합니다. 강력한 돌파는 더 큰 포지션으로 이어집니다.

믿기 ​​어려울지 모르지만, FMZ에서 완전한 전략을 작성하는 데는 불과 50줄의 코드만 필요합니다. 현재 대규모 AI 모델의 개발로 인해 전략 설계의 문턱이 크게 낮아졌습니다. 우리가 테스트한 전략적 아이디어는 AI가 쉽게 생성할 수 있으며, 글쓰기 품질은 충분합니다. 수동 수정이 필요할 뿐이지만, 이를 통해 일반인이 양적 거래 기술을 사용하는 데 필요한 문턱이 크게 낮아졌습니다.

전략 코드:

function main() {
    var symbol = "ETH_USDT.swap"
    var arrUp = []
    var arrDown = []
    let c = KLineChart({
        overlay: true
    }) 
    while (true) {
        var bolls = []
        var r = _C(exchange.GetRecords, symbol)
        for (var i = 0; i < 3; i++) {
            var boll = TA.BOLL(r, 20, i + 1)
            bolls.push(boll)
            var up = boll[0][boll[0].length - 1]
            var mid = boll[1][boll[1].length - 1]
            var down = boll[2][boll[2].length - 1]
            var close = r[r.length - 1].Close
            if (close > up && i >= arrUp.length) {
                exchange.CreateOrder(symbol, "sell", -1, 0.01 * (i + 1))
                arrUp.push({"symbol": symbol, "amount": 0.01 * (i + 1)})
            } else if (close < down && i >= arrDown.length) {
                exchange.CreateOrder(symbol, "buy", -1, 0.01 * (i + 1))
                arrDown.push({"symbol": symbol, "amount": 0.01 * (i + 1)})
            } else if ((arrUp.length > 0 && close < mid) || (arrDown.length > 0 && close > mid)) {
                var pos = exchange.GetPositions(symbol)
                for (var p of pos) {
                    if (p.Type == PD_LONG) {
                        exchange.CreateOrder(symbol, "closebuy", -1, p.Amount)
                    } else if (p.Type == PD_SHORT) {
                        exchange.CreateOrder(symbol, "closesell", -1, p.Amount)
                    }
                }
                arrUp = []
                arrDown = []
            }
        }
        r.forEach(function(bar, index) {
            c.begin(bar)
            for (var i in bolls) {
                var b = bolls[i]
                c.plot(b[0][index], 'up_' + (i + 1))
                c.plot(b[1][index], 'mid_' + (i + 1))
                c.plot(b[2][index], 'down_' + (i + 1))
            }
            c.close()
        })
        LogStatus(_D(), "\n", arrUp, "\n", arrDown)
        Sleep(500)
    }
}

먼저 장기 백테스트를 해 보겠습니다.

DEX 거래소 양적 연습(4) - WOOFi/EdgeX 전략 접근 테스트

DEX 거래소 양적 연습(4) - WOOFi/EdgeX 전략 접근 테스트

EdgeX 테스트 배포

DEX 거래소 양적 연습(4) - WOOFi/EdgeX 전략 접근 테스트

END

위의 전략은 교육 및 연구 목적으로만 사용됩니다. 적용할 때는 주의하시기 바랍니다. 읽어주셔서 감사합니다.