
Dalam beberapa artikel terakhir, kami telah membahas akses ke DEX utama, dan artikel ini akan berfokus pada penggunaan aktual dan melakukan pengujian penerapan strategi aktual. Platform FMZ baru-baru ini menambahkan dukungan untuk bursa terdesentralisasi WOOFi dan EdgeX. Dalam artikel ini, kita akan berlatih menjalankan beberapa strategi pengajaran sederhana pada kedua pertukaran tersebut.
Hubungkan dompet Anda di WOOFi, lalu pada halaman KUNCI API, Anda dapat melihat informasi kunci API, menyalin dan menempelkannya, dan mengonfigurasinya di FMZ.
Gunakan host terbaru FMZ, yang sudah mendukung WOOFi DEX dan EdgeX DEX, setelah mengunduh dan menyebarkan. Konfigurasikan objek pertukaran di halaman: https://www.fmz.com/m/platforms/add, dan konfigurasikan AccountId, AccessKey, dan SecretKey WOOFi.
Dalam pengujian ini, kami menggunakanPrototipe strategi pembuatan pasar dasar, dikombinasikan dengan indikator volatilitas pasar (ATR), interval antara order yang tertunda dihitung secara dinamis, dan identifikasi posisi yang cerdas serta logika penempatan order dengan prioritas pada penutupan posisi terwujud. Strategi ini menyegarkan buku pesanan di setiap putaran, memperoleh kembali informasi kedalaman dan posisi, dan menempatkan pesanan sesuai dengan interval harga dan jumlah pesanan yang ditetapkan. Seluruh proses meliputi:
Melalui strategi ini, kita dapat mengamati efisiensi transaksi aktual, penundaan pesanan, dan pengalaman pencocokan di WOOFi, yang menjadi dasar bagi desain strategi yang lebih kompleks selanjutnya.
Kami menggunakan lingkungan pengujian dan jaringan pengujian WOOFi: Arbitrum Sepolia.
exchange.SetBase(”https://testnet-api.orderly.org”)
Terdapat keran di jaringan uji WOOFi yang memudahkan Anda memperoleh USDC untuk pengujian.
Kode strategi:
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)
}
}
Praktik Strategi di WOOFi



Informasi API untuk mengonfigurasi EdgeX pada FMZ pada dasarnya sama dengan WOOFi, tetapi bursa yang berbeda memerlukan informasi API yang berbeda. Di EdgeX, Anda hanya perlu mengonfigurasi AccountId dan SecretKey. Ini juga dapat dilihat di halaman manajemen API akun setelah menggunakan dompet untuk terhubung ke antarmuka depan EdgeX.
Strategi yang akan kami terapkan pada EdgeX didasarkan padaBollinger Bands Berlapis-lapisLogika perdagangan kuantitatif dari pembukaan terbalik + penutupan tengah jalur dapat mewujudkan arbitrase volatilitas jangka pendek.
Strateginya sangat sederhana, ide intinya adalah:
Anda mungkin tidak percaya, tetapi menulis strategi lengkap di FMZ hanya membutuhkan 50 baris kode. Perkembangan model AI besar saat ini telah menurunkan ambang batas untuk desain strategi. Ide-ide strategi yang kami uji dapat dengan mudah diproduksi oleh AI, dan kualitas penulisannya memadai. Satu-satunya hal adalah bahwa koreksi manual diperlukan, tetapi hal ini telah sangat menurunkan ambang batas bagi orang awam untuk menggunakan teknologi perdagangan kuantitatif.
Kode strategi:
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)
}
}
Mari kita lakukan backtest jangka panjang terlebih dahulu:


Terapkan pengujian EdgeX

Strategi di atas hanya untuk tujuan pengajaran dan penelitian. Harap berhati-hati saat menerapkannya. Terima kasih telah membaca.