
Dalam beberapa artikel yang lalu, kami telah membincangkan akses kepada DEX arus perdana, dan artikel ini akan menumpukan pada penggunaan sebenar dan menjalankan ujian penggunaan strategi sebenar. Platform FMZ baru-baru ini telah menambah sokongan untuk pertukaran terdesentralisasi WOOFi dan EdgeX. Dalam artikel ini, kami akan berlatih menjalankan beberapa strategi pengajaran mudah pada dua pertukaran ini.
Sambungkan dompet anda pada WOOFi, dan kemudian pada halaman API KEY, anda boleh melihat maklumat kunci API, menyalin dan menampalnya dan mengkonfigurasinya pada FMZ.
Gunakan hos terbaharu FMZ, yang sudah menyokong WOOFi DEX dan EdgeX DEX, selepas memuat turun dan menggunakan. Konfigurasikan objek pertukaran pada halaman: https://www.fmz.com/m/platforms/add, dan konfigurasikan AccountId, AccessKey dan SecretKey WOOFi.
Dalam ujian ini, kami menggunakan aPrototaip strategi pembuatan pasaran asas, digabungkan dengan penunjuk turun naik pasaran (ATR), selang antara pesanan belum selesai dikira secara dinamik, dan pengenalan pintar kedudukan dan logik meletakkan pesanan dengan keutamaan pada kedudukan penutup direalisasikan. Strategi ini menyegarkan buku pesanan dalam setiap pusingan, memperoleh semula maklumat kedalaman dan kedudukan, dan membuat pesanan mengikut selang harga yang ditetapkan dan kuantiti pesanan. Keseluruhan proses meliputi:
Melalui strategi ini, kita boleh melihat kecekapan transaksi sebenar, kelewatan pesanan dan pengalaman pemadanan pada WOOFi, meletakkan asas untuk reka bentuk seterusnya bagi strategi yang lebih kompleks.
Kami menggunakan persekitaran ujian dan rangkaian ujian WOOFi: Arbitrum Sepolia.
exchange.SetBase(”https://testnet-api.orderly.org”)
Terdapat faucet pada rangkaian ujian WOOFi yang membolehkan anda mendapatkan USDC untuk ujian dengan mudah.
Kod 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)
}
}
Amalan Strategi di WOOFi



Maklumat API untuk mengkonfigurasi EdgeX pada FMZ pada asasnya sama dengan WOOFi, tetapi pertukaran yang berbeza memerlukan maklumat API yang berbeza. Pada EdgeX, anda hanya perlu mengkonfigurasi AccountId dan SecretKey. Ini juga boleh dilihat pada halaman pengurusan API akaun selepas menggunakan dompet untuk menyambung ke hujung hadapan EdgeX.
Strategi yang akan kami laksanakan pada EdgeX adalah berdasarkanJalur Bollinger Berbilang LapisanLogik dagangan kuantitatif pembukaan terbalik + penutupan pertengahan trek boleh merealisasikan arbitraj turun naik jangka pendek.
Strateginya sangat mudah, idea terasnya ialah:
Anda mungkin tidak percaya, tetapi menulis strategi lengkap di FMZ hanya memerlukan 50 baris kod. Perkembangan semasa model AI yang besar telah banyak merendahkan ambang untuk reka bentuk strategi. Idea strategi yang kami uji boleh dihasilkan dengan mudah oleh AI, dan kualiti penulisan adalah mencukupi. Satu-satunya perkara ialah pembetulan manual diperlukan, tetapi ia telah merendahkan ambang untuk orang biasa menggunakan teknologi dagangan kuantitatif.
Kod 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 buat ujian belakang jangka panjang dahulu:


Gunakan ujian EdgeX

Strategi di atas adalah untuk tujuan pengajaran dan penyelidikan sahaja. Sila berhati-hati semasa memohonnya. Terima kasih kerana membaca.