
これまでのいくつかの記事では、主流のDEXへのアクセスについて説明してきましたが、この記事では実際の使用方法に焦点を当て、実際の戦略展開テストを実施します。 FMZ プラットフォームは最近、WOOFi および EdgeX 分散型取引所のサポートを追加しました。この記事では、これら 2 つの取引所でいくつかの簡単な指導戦略を実行する練習をします。
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での戦略実践



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)
}
}
まずは長期バックテストをしてみましょう。


EdgeXテストをデプロイする

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