[TOC]
Selepas 9 tahun pengulangan teknikal, Platform Perdagangan Kuantiti FMZ telah dibina semula berkali-kali, walaupun sebagai pengguna kita mungkin tidak menyedarinya. Dalam dua tahun yang lalu, platform ini telah membuat banyak pengoptimuman dan peningkatan dari segi pengalaman pengguna, termasuk peningkatan yang komprehensif antara muka UI, pengayaan alat perdagangan kuantitatif yang biasa digunakan, dan penambahan lebih banyak sokongan data backtesting.
Untuk membuat reka bentuk strategi lebih mudah, logik perdagangan lebih jelas, dan lebih mudah untuk pemula untuk memulakan, platform ini telah menaik taraf antara muka API yang digunakan oleh strategi. Docker yang menggunakan versi terbaru dapat mengaktifkan ciri-ciri baru ini. Platform ini masih serasi dengan panggilan antara muka lama sejauh mungkin. Maklumat mengenai ciri-ciri baru antara muka API telah dikemas kini ke dokumentasi API Platform Dagangan Kuantum FMZ:
Panduan sintaks:https://www.fmz.com/syntax-guidePanduan Pengguna:https://www.fmz.com/user-guide
Jadi mari kita lihat dengan cepat antarmuka yang telah dinaik taraf dan apa perubahan yang diperlukan untuk menggunakan strategi lama untuk menjadikannya serasi dengan API semasa.
Untuk merancang strategi pelbagai produk dan strategi pemantauan pasaran yang lengkap, antara muka pasaran agregat adalah penting. Untuk menjadikan strategi lebih mudah untuk membangunkan dan mengelakkan mencipta semula peristiwa, Platform Dagangan Kuantum FMZ merangkumi API pertukaran jenis ini.
Jika pertukaran tidak mempunyai antara muka ini (pertukaran individu), apabila memanggilexchange.GetTickers()
, mesej ralat dipaparkan: Tidak disokong.
Fungsi ini tidak mempunyai sebarang parameter dan ia akan mengembalikan data pasaran masa nyata semua jenis dalam antara muka pasaran agregat bursa.
exchange.GetTickers()
fungsi adalah versi permintaan penuh ciriexchange.GetTicker()
fungsi (lihat dengan teliti, perbezaan antara kedua-dua nama fungsi ini hanya tunggal dan jamak).
Kami menggunakan persekitaran simulasi titik OKX untuk ujian:
function main() {
exchange.IO("simulate", true)
var tickers = exchange.GetTickers()
if (!tickers) {
throw "tickers error"
}
var tbl = {type: "table", title: "test tickers", cols: ["Symbol", "High", "Open", "Low", "Last", "Buy", "Sell", "Time", "Volume"], rows: []}
for (var i in tickers) {
var ticker = tickers[i]
tbl.rows.push([ticker.Symbol, ticker.High, ticker.Open, ticker.Low, ticker.Last, ticker.Buy, ticker.Sell, ticker.Time, ticker.Volume])
}
LogStatus("`" + JSON.stringify(tbl) + "`")
return tickers.length
}
Yang baru ditambahkanexchange.CreateOrder()
fungsi adalah tumpuan peningkatan ini.exchange.CreateOrder()
adalah untuk menentukan jenis dan arah pesanan dalam parameter fungsi secara langsung. Dengan cara ini, ia tidak lagi bergantung kepada pasangan dagangan semasa, kod kontrak, arah dagangan dan tetapan lain sistem.
Dalam senario penempatan pesanan perdagangan pelbagai spesies dan senario serentak, kerumitan reka bentuk sangat dikurangkan.exchange.CreateOrder()
fungsi adalahsymbol
, side
, price
, amount
.
Ujian menggunakan persekitaran simulasi niaga hadapan OKX:
function main() {
exchange.IO("simulate", true)
var id1 = exchange.CreateOrder("ETH_USDT.swap", "buy", 3300, 1)
var id2 = exchange.CreateOrder("BTC_USDC.swap", "closebuy", 70000, 1)
var id3 = exchange.CreateOrder("LTC_USDT.swap", "sell", 110, 1)
Log("id1:", id1, ", id2:", id2, ", id3:", id3)
}
Dengan cara ini, hanya tigaexchange.CreateOrder()
panggilan fungsi digunakan untuk meletakkan tiga pesanan niaga hadapan pelbagai jenis dan arah.
Yang baru ditambahkanexchange.GetHistoryOrders()
Fungsi ini juga memerlukan sokongan antara muka pertukaran.
Untuk menanyakan pesanan sejarah, antara muka yang dilaksanakan oleh pelbagai pertukaran sangat berbeza:
Penerangan fungsi terperinci tidak diulangi di sini, anda boleh merujuk manual sintaks dalam dokumentasi API:
https://www.fmz.com/syntax-guide#fun_exchange.gethistoryorders
Diuji menggunakan persekitaran dagangan Binance:
function main() {
var orders = exchange.GetHistoryOrders("ETH_USDT")
// Write to chart
var tbl = {type: "table", title: "test GetHistoryOrders", cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []}
for (var order of orders) {
tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
}
LogStatus("orders.length:", orders.length, "\n", "`" + JSON.stringify(tbl) + "`")
}
Versi lama fungsi pemerolehan data kedudukan adalahexchange.GetPosition()
. Kemas kini ini menambah fungsi pemerolehan kedudukan baru untuk lebih sesuai dengan semantik penamaan fungsi:exchange.GetPositions()
. Pada masa yang sama, ia masih serasi / dinaik taraf dengan fungsi GetPosition.
Peraturanexchange.GetPositions()
Fungsi mempunyai tiga bentuk panggilan:
function main() {
exchange.IO("simulate", true)
exchange.SetCurrency("BTC_USDT")
exchange.SetContractType("swap")
var p1 = exchange.GetPositions()
var p2 = exchange.GetPositions("")
var tbls = []
for (var positions of [p1, p2]) {
var tbl = {type: "table", title: "test GetPosition/GetPositions", cols: ["Symbol", "Amount", "Price", "FrozenAmount", "Type", "Profit", "Margin", "ContractType", "MarginLevel"], rows: []}
for (var p of positions) {
tbl.rows.push([p.Symbol, p.Amount, p.Price, p.FrozenAmount, p.Type, p.Profit, p.Margin, p.ContractType, p.MarginLevel])
}
tbls.push(tbl)
}
LogStatus("`" + JSON.stringify(tbls) + "`")
}
Apabila parameter yang diteruskan kepadaexchange.GetPositions()
fungsi ialahETH_USDT.swap
, data kedudukan kontrak kekal berasaskan U ETH
Apabila parameter yang diteruskan kepadaexchange.GetPositions()
fungsi adalah rentetan kosong
Peningkatan utama fungsi pasaranexchange.GetTicker()
Ini membolehkan fungsi untuk meminta data pasaran secara langsung mengikut maklumat produk yang ditentukan oleh parameter tanpa pasangan dagangan semasa dan kod kontrak. Ia memudahkan proses penulisan kod. Pada masa yang sama, ia masih serasi dengan kaedah panggilan tanpa lulus parameter, dan serasi dengan strategi platform lama sejauh mungkin.
Parametersymbol
mempunyai format yang berbeza untuk spot/futures untuk objek pertukaranexchange
:
AAA_BBB
, AAA mewakili baseCurrency, iaitu mata wang dagangan, dan BBB mewakili quoteCurrency, iaitu mata wang penetapan harga.
Sebagai contoh: pasangan dagangan spot BTC_USDT.AAA_BBB.XXX
, AAA mewakili baseCurrency, iaitu mata wang dagangan, BBB mewakili quoteCurrency, iaitu mata wang penetapan harga, dan XXX mewakili kod kontrak, seperti pertukaran kontrak kekal.
Sebagai contoh: BTC_USDT.swap, kontrak kekal berasaskan U BTCvar symbols = ["BTC_USDT.swap", "BTC_USDT.quarter", "BTC_USD.swap", "BTC_USD.next_quarter", "ETH_USDT.swap"]
function main() {
exchange.SetCurrency("ETH_USD")
exchange.SetContractType("swap")
var arr = []
var t = exchange.GetTicker()
arr.push(t)
for (var symbol of symbols) {
var ticker = exchange.GetTicker(symbol)
arr.push(ticker)
}
var tbl = {type: "table", title: "test GetTicker", cols: ["Symbol", "High", "Open", "Low", "Last", "Buy", "Sell", "Time", "Volume"], rows: []}
for (var ticker of arr) {
tbl.rows.push([ticker.Symbol, ticker.High, ticker.Open, ticker.Low, ticker.Last, ticker.Buy, ticker.Sell, ticker.Time, ticker.Volume])
}
LogStatus("`" + JSON.stringify(tbl) + "`")
return arr
}
Meminta kumpulan data pasaran untuk simbol tertentu telah menjadi lebih mudah.
Sama seperti fungsi GetTicker,exchange.GetDepth()
fungsi juga menambah parameter simbol. ini membolehkan kita untuk menentukan simbol secara langsung apabila meminta data kedalaman.
Diuji menggunakan persekitaran langsung Binance Futures:
function main() {
exchange.SetCurrency("LTC_USD")
exchange.SetContractType("swap")
Log(exchange.GetDepth())
Log(exchange.GetDepth("ETH_USDT.quarter"))
Log(exchange.GetDepth("BTC_USD.swap"))
}
Sama seperti fungsi GetTicker,exchange.GetTrades()
fungsi juga menambah parameter simbol. ini membolehkan kita untuk menentukan simbol secara langsung apabila meminta data transaksi pasaran.
Diuji menggunakan persekitaran langsung Binance Futures:
function main() {
var arr = []
var arrR = []
var symbols = ["LTC_USDT.swap", "ETH_USDT.quarter", "BTC_USD.swap"]
for (var symbol of symbols) {
var r = exchange.Go("GetTrades", symbol)
arrR.push(r)
}
for (var r of arrR) {
arr.push(r.wait())
}
var tbls = []
for (var i = 0; i < arr.length; i++) {
var trades = arr[i]
var symbol = symbols[i]
var tbl = {type: "table", title: symbol, cols: ["Time", "Amount", "Price", "Type", "Id"], rows: []}
for (var trade of trades) {
tbl.rows.push([trade.Time, trade.Amount, trade.Price, trade.Type, trade.Id])
}
tbls.push(tbl)
}
LogStatus("`" + JSON.stringify(tbls) + "`")
}
Peningkatan ini juga serasi dengan parameter simbol yang ditentukan olehexchange.Go()
fungsi apabila memanggil antara muka API platform secara serentak.
Fungsi GetRecords telah disesuaikan dengan baik kali ini. Selain menyokong parameter simbol untuk menentukan maklumat jenis data K-line yang diminta secara langsung, parameter tempoh asal dikekalkan untuk menentukan tempoh K-line, dan parameter had ditambah untuk menentukan panjang K-line yang diharapkan ketika meminta. Pada masa yang sama, ia juga serasi dengan versi lama fungsi GetRecords yang hanya lulus dalam parameter tempoh.
Kaedah panggilanexchange.GetRecords()
Fungsi adalah:
Diuji menggunakan persekitaran langsung Binance Futures:
function main() {
exchange.SetCurrency("ETH_USDT")
exchange.SetContractType("swap")
var r1 = exchange.GetRecords()
var r2 = exchange.GetRecords(60 * 60)
var r3 = exchange.GetRecords("BTC_USDT.swap")
var r4 = exchange.GetRecords("BTC_USDT.swap", 60)
var r5 = exchange.GetRecords("LTC_USDT.swap", 60, 3000)
Log("r1 time difference between adjacent bars:", r1[1].Time - r1[0].Time, "Milliseconds, Bar length:", r1.length)
Log("r2 time difference between adjacent bars:", r2[1].Time - r2[0].Time, "Milliseconds, Bar length:", r2.length)
Log("r3 time difference between adjacent bars:", r3[1].Time - r3[0].Time, "Milliseconds, Bar length:", r3.length)
Log("r4 time difference between adjacent bars:", r4[1].Time - r4[0].Time, "Milliseconds, Bar length:", r4.length)
Log("r5 time difference between adjacent bars:", r5[1].Time - r5[0].Time, "Milliseconds, Bar length:", r5.length)
}
Fungsi GetOrders juga menambahsymbol
parameter, yang boleh menentukan jenis pesanan yang tidak selesai semasa (pesanan menunggu) yang akan ditanyakan secara langsung; ia juga menyokong menanyakan semua pesanan menunggu (tidak kira jenis); dan serasi dengan kaedah panggilan asal.
Peraturanexchange.GetOrders()
fungsi boleh dipanggil dengan cara berikut:
Ujian menggunakan persekitaran simulasi niaga hadapan OKX:
function main() {
exchange.IO("simulate", true)
exchange.SetCurrency("BTC_USDT")
exchange.SetContractType("swap")
// Write to chart
var tbls = []
for (var symbol of ["null", "ETH_USDT.swap", ""]) {
var tbl = {type: "table", title: symbol, cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []}
var orders = null
if (symbol == "null") {
orders = exchange.GetOrders()
} else {
orders = exchange.GetOrders(symbol)
}
for (var order of orders) {
tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
}
tbls.push(tbl)
}
LogStatus("`" + JSON.stringify(tbls) + "`")
}
Apabila tidak ada parameter yang diteruskan, permintaan lalai adalah untuk semua pesanan yang belum selesai menunggu pasangan dagangan BTC_USDT semasa dan kontrak swap kekal.
ApabilaETH_USDT.swap
Apabila parameter ditentukan, semua pesanan yang belum selesai dari kontrak kekal pasangan dagangan ETH_USDT diminta.
Apabila rentetan kosong""
adalah diluluskan, semua pesanan yang belum selesai dari semua kontrak margin USDT diminta.
Ia masih serasi dengan penamaan fungsi pemerolehan kedudukan lama, dan juga menambah parameter simbol, yang boleh menentukan maklumat jenis data kedudukan tertentu yang diminta.
Penggunaan fungsi ini adalah sama sepertiexchange.GetPositions()
.
Untukexchange.IO("api", ...)
panggilan fungsi, semua objek pertukaran telah dinaik taraf untuk menyokong penyampaian langsung alamat permintaan lengkap.
Sebagai contoh, jika anda ingin memanggil antara muka OKX:
// Dapatkanhttps://www.okx.com/api/v5/akaun/max-withdrawal ccy: BTC
Menyokong penulisan langsung ke alamat pangkalanhttps://www.okx.com
tanpa perlu menukar alamat asas terlebih dahulu dan kemudian memanggil fungsi IO.
Ujian menggunakan persekitaran simulasi niaga hadapan OKX:
function main() {
exchange.IO("simulate", true)
return exchange.IO("api", "GET", "https://www.okx.com/api/v5/account/max-withdrawal", "ccy=BTC")
}
Peningkatan ini terutamanya mempengaruhi parameterid
daripadaexchange.GetOrder(id)
parameter id diubah dari id pesanan pertukaran asal kepada format rentetan yang mengandungi produk perdagangan.
Semua ID pesanan yang dikemas dalam platform FMZ adalah dalam format ini.
Contohnya:
123456
Sebelum peningkatan ini, jika anda ingin memanggil fungsi GetOrder, perintah Id yang dihantar adalah123456
.BTC-USDT
.
Perhatikan bahawa ini merujuk kepada kod produk dagangan yang dinamakan oleh bursa, bukan pasangan dagangan yang ditakrifkan oleh platform FMZ.Selepas peningkatan ini, format id parameter yang perlu diteruskan ke dalamexchange.GetOrder(id)
Fungsi disesuaikan dengan:BTC-USDT,123456
.
Pertama, izinkan saya menerangkan mengapa reka bentuk ini dibuat: Kerana fungsi CreateOrder telah dinaik taraf untuk menentukan jenis pesanan secara langsung (jenis pesanan yang diletakkan mungkin berbeza dengan pasangan dagangan dan kod kontrak yang ditetapkan pada masa ini). Jika ID pesanan yang dikembalikan tidak mengandungi maklumat jenis, maka ID pesanan ini tidak dapat digunakan. Kerana ketika memeriksa pesanan, kita tidak tahu jenis (kontrak) pesanan itu. Kebanyakan pertukaran memerlukan spesifikasi parameter yang menerangkan kod jenis ketika memeriksa dan membatalkan pesanan.
Bagaimana untuk menjadi serasi dengan kesan ini: Jika anda menggunakanexchange.IOfungsi untuk memanggil antara muka pesanan pertukaran secara langsung untuk meletakkan pesanan, nilai yang dikembalikan biasanya mengandungi simbol asal pertukaran (kod produk) dan id pesanan asal. Kemudian menggabungkan kedua-duanya dengan koma bahasa Inggeris akan menjadi ID pesanan yang mematuhi definisi platform FMZ. Begitu juga, jika anda menggunakan antarmuka pesanan yang dikapsulkan platform FMZ untuk membuat pesanan, kerana permulaan ID pesanan adalah kod produk perdagangan, jika anda perlu menggunakan ID pesanan asal, hanya hapus kod produk dan koma.
Kesan peningkatan ini padaexchange.CancelOrder()
fungsi adalah sama denganexchange.GetOrder()
function.
Kesan peningkatan ini padaexchange.Buy()
fungsi adalah sama denganexchange.GetOrder()
fungsi.
ID pesanan yang dikembalikan olehexchange.Buy()
fungsi adalah struktur baru, contohnya, ID yang dikembalikan apabila meletakkan pesanan niaga hadapan di bursa OKX adalah:LTC-USDT-SWAP,1578360858053058560
.
Kesan peningkatan ini padaexchange.Sell()
fungsi adalah sama denganexchange.GetOrder()
fungsi.
ID pesanan yang dikembalikan olehexchange.Sell()
fungsi adalah struktur baru, contohnya, ID yang dikembalikan apabila meletakkan pesanan niaga hadapan di bursa OKX adalah:ETH-USDT-SWAP,1578360832820125696
.
Kemas kini ini menambah medan Simbol ke struktur Ticker, yang merakam maklumat pasaran struktur Ticker semasa.
Format medan ini adalah sama dengan format parameter simbolexchange.GetTicker()
function.
Kemas kini ini menambah medan Simbol untuk struktur Perintah, dan format medan ini adalah sama dengan format parameter simbolexchange.GetTicker()
fungsi.
Kemas kini ini juga mengubah suai medan ID struktur pesanan, merakam maklumat produk dan maklumat pesanan asal dalam format ID pesanan baru.exchange.GetOrder()
fungsi, yang tidak akan diulangi di sini.
Kemas kini ini menambah medan Simbol ke struktur Kedudukan. Format medan ini adalah sama dengan format parameter simbolexchange.GetTicker()
function.
Untuk memenuhi keperluan pengguna, peningkatan ini pertama akan serasi dengan perdagangan langsung, dan sistem backtesting akan disesuaikan dalam masa seminggu.
Tanah-tanahAccount
struktur dikembalikan olehGetAccount
fungsi ahli objek pertukaran niaga hadapan telah diperluaskan.
Ekuiti Jumlah ekuiti mata wang aset margin semasa. Kecuali beberapa bursa niaga hadapan yang tidak menyokong medan ini, kebanyakan bursa menyokong medan ini. Ia digunakan terutamanya untuk mengira keuntungan dan kerugian margin akaun masa nyata.
UPnL Keuntungan dan kerugian yang belum direalisasikan dari semua kedudukan yang dipegang dalam mata wang aset margin semasa.
Fungsi ahli SetMarginLevel objek pertukaran niaga hadapan telah dinaik taraf dan simbol parameter telah ditambah.
Contoh ujian:
function main() {
exchange.SetCurrency("ETH_USDT")
exchange.SetContractType("swap")
// The current trading pair is ETH_USDT, the contract code is swap, and the leverage value is set to 10
exchange.SetMarginLevel(10)
// Directly specify the trading pair BTC_USDT, contract code swap, and set the leverage value to 20
exchange.SetMarginLevel("BTC_USDT.swap", 20)
}