[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.
Perhatikan bahawa kedua-dua nama fungsi hanya berbeza dengan s terakhir. Kerana GetPositions lebih tepat secara semantik, disyorkan untuk menggunakan GetPositions pada masa akan datang.
Peraturanexchange.GetPositions()
Fungsi mempunyai tiga bentuk panggilan:
pertukaran.GetPositions ((() Apabila tiada parameter lulus, data kedudukan semua jenis dalam dimensi semasa diminta mengikut tetapan arusPasangan dagangan / Kod kontrak.
pertukaran.GetPositions ((BTC_USD.swap
, ETH_USDT.swap
, ETH_USDT.quarter
, dan lain-lain
BTC_USD.swap: Kontrak kekal berasaskan mata wang BTC
pertukaran.GetPositions ((
Beberapa bahagian dimensi kontrak pertukaran khas:
USDT.futures_combo: Futures_Deribit pertukaran
Ujian menggunakan persekitaran simulasi niaga hadapan OKX:
function main() {
exchange.IO("simulate", true)
exchange.SetCurrency("BTC_USDT")
exchange.SetContractType("swap")
var p1 = exchange.GetPositions()
var p2 = exchange.GetPositions("BTC_USDT.swap")
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 parameterexchange.GetPositions()
Jika anda tidak menghantar data yang tidak dikesan, data kedudukan semua kontrak kekal berasaskan U yang disenaraikan di bursa boleh diperoleh (kerana pasangan dagangan semasa adalah BTC_USDT dan kontrak adalah swap, permintaan berdasarkan pasangan dagangan semasa dan julat dimensi kontrak).exchange.GetPositions("USDT.swap")
dan menentukan julat permintaan.
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 digunakan untuk menentukan simbol tertentu dan menyoal pesanan yang belum selesai (pesanan menunggu) simbol itu; ia juga menyokong menyoal pesanan yang belum selesai (pesanan menunggu) semua simbol dalam julat dimensi yang ditentukan.
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", "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, pesanan yang belum selesai (pesanan menunggu) dari semua jenis dalam julat dimensi pasangan dagangan semasa (BTC_USDT) dan kod kontrak (swap) diminta.
Apabila parameterETH_USDT.swap
diperuntukkan, pesanan yang belum selesai (pesanan menunggu) kontrak kekal berasaskan USDT ETH
Apabila tali"USDT.swap"
Apabila pesanan tidak selesai (pesanan yang menunggu) semua kontrak kekal berasaskan 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
.
Hanya objek pertukaran niaga hadapan menyokong fungsi ini. Untuk fungsi exchange.GetPosition( untuk mendapatkan data kedudukan, nama exchange.GetPositions( baru ditambahkan, dan kedua-dua tingkah laku sama persis.
Definisi lama: fungsi exchange.GetPosition(, apabila dipanggil tanpa menentukan sebarang parameter, memperoleh data kedudukan kontrak tertentu yang ditetapkan oleh pasangan dagangan semasa dan kod kontrak. Selepas penyesuaian dan pengubahsuaian, definisi baru: fungsi exchange.GetPosition(, apabila dipanggil tanpa menentukan sebarang parameter, memperoleh kedudukan semua jenis dalam julat dimensi yang ditentukan oleh pasangan dagangan dan kod kontrak yang ditetapkan semasa.
Sebagai contoh, pasangan dagangan semasa adalah BTC_USDT dan kod kontrak adalah swap. Pada masa ini, hubungi:
exchange.GetPosition() // Equivalent to calling exchange.GetPosition("USDT.swap")
Fungsi ini akan meminta data kedudukan kontrak kekal berasaskan U semua mata wang.
Definisi lama: fungsi exchange.GetOrders(), apabila dipanggil tanpa menentukan sebarang parameter, mendapat semua pesanan yang belum selesai dari pasangan dagangan semasa. Selepas penyesuaian dan pengubahsuaian, definisi baru adalah: fungsi exchange.GetOrders(), apabila dipanggil tanpa menentukan sebarang parameter, mendapat pesanan yang belum selesai dari semua pasangan dagangan segera.
Definisi lama: fungsi exchange.GetOrders(, apabila dipanggil tanpa menentukan sebarang parameter, mendapat semua pesanan yang belum selesai kontrak tertentu yang ditetapkan oleh pasangan dagangan semasa dan kod kontrak. Selepas penyesuaian dan pengubahsuaian, definisi baru adalah: fungsi exchange.GetOrders(), apabila dipanggil tanpa menentukan sebarang parameter, mendapat semua pesanan yang belum selesai dari julat dimensi yang ditentukan oleh pasangan dagangan semasa dan kod kontrak.
Sebagai contoh, pasangan dagangan semasa adalah BTC_USD dan kod kontrak adalah suku.
exchange.GetOrders() // Equivalent to calling exchange.GetOrders("USD.futures")
Fungsi ini akan meminta data pesanan yang belum selesai dari semua kontrak niaga hadapan berasaskan syiling.
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.
Menurut peningkatan antara muka API strategi platform, sistem pengujian belakang platform telah dikemas kini secara serentak; Di samping itu, sistem pengujian belakang telah menambah sokongan untuk:
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)
}
LapanganCtValCcy
mencatatkan unit nilai kontrak. Unit nilai kontrak boleh menjadi: BTC, USD, ETH, dll.
LapanganCtVal
mencatat nilai kontrak produk dagangan di bursa, dan unit adalah mata wang yang dicatatkan dalamCtValCcy
contohnya:CtVal
adalah 0.01 danCtValCcy
adalah