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 分散型取引所のサポートを追加しました。この記事では、これら 2 つの取引所でいくつかの簡単な指導戦略を実行する練習をします。

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 を簡単に取得できるフォーセットがあります。

戦略コード:

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

上記の戦略は教育および研究目的のみに使用されます。ご使用の際はご注意ください。読んでいただきありがとうございます。