[TOC]
Setelah 9 tahun iterasi teknis, FMZ Quant Trading Platform telah direkonstruksi berkali-kali, meskipun sebagai pengguna kita mungkin tidak menyadarinya.
Untuk membuat desain strategi lebih nyaman, logika perdagangan lebih jelas, dan lebih mudah bagi pemula untuk memulai, platform telah memperbarui antarmuka API yang digunakan oleh strategi. Docker yang menggunakan versi terbaru dapat mengaktifkan fitur baru ini. Platform ini masih kompatibel dengan panggilan antarmuka lama sejauh mungkin. Informasi tentang fitur baru antarmuka API telah diperbarui ke dokumentasi API dari FMZ Quant Trading Platform:
Panduan sintaksis:https://www.fmz.com/syntax-guidePanduan Pengguna:https://www.fmz.com/user-guide
Jadi mari kita lihat dengan cepat antarmuka mana yang telah ditingkatkan dan perubahan apa yang diperlukan untuk menggunakan strategi lama untuk membuatnya kompatibel dengan API saat ini.
Untuk merancang strategi multi-produk dan strategi pemantauan pasar yang lengkap, antarmuka pasar agregat sangat penting. Untuk membuat strategi lebih mudah dikembangkan dan menghindari penemuan ulang acara, FMZ Quant Trading Platform merangkum API pertukaran jenis ini.
Jika pertukaran tidak memiliki antarmuka ini (pertukaran individu), ketika memanggilexchange.GetTickers()
, muncul pesan kesalahan: Tidak didukung.
Fungsi ini tidak memiliki parameter dan akan mengembalikan data pasar real-time dari semua varietas dalam antarmuka pasar agregat bursa.
exchange.GetTickers()
fungsi adalah versi permintaan penuh fitur dariexchange.GetTicker()
fungsi (lihat dengan hati-hati, perbedaan antara kedua nama fungsi ini hanya tunggal dan jamak).
Kami menggunakan lingkungan simulasi titik OKX untuk pengujian:
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 fokus dari upgrade ini.exchange.CreateOrder()
adalah untuk menentukan jenis dan arah pesanan dalam parameter fungsi secara langsung. Dengan cara ini, tidak lagi tergantung pada pasangan perdagangan saat ini, kode kontrak, arah perdagangan dan pengaturan lain dari sistem.
Dalam skenario penempatan pesanan perdagangan multi-spesies dan skenario bersamaan, kompleksitas desain sangat berkurang.exchange.CreateOrder()
fungsi adalahsymbol
, side
, price
, amount
.
Uji menggunakan lingkungan simulasi berjangka 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 menempatkan tiga pesanan berjangka dari berbagai jenis dan arah.
Yang baru ditambahkanexchange.GetHistoryOrders()
Fungsi ini juga membutuhkan dukungan antarmuka pertukaran.
Untuk menanyakan pesanan historis, antarmuka yang diimplementasikan oleh berbagai pertukaran sangat bervariasi:
Deskripsi fungsi rinci tidak diulang di sini, Anda dapat merujuk manual sintaksis dalam dokumentasi API:
https://www.fmz.com/syntax-guide#fun_exchange.gethistoryorders
Diuji menggunakan Binance spot trading environment:
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 dari fungsi pengumpulan data posisi adalahexchange.GetPosition()
. Upgrade ini menambahkan fungsi akuisisi posisi baru untuk lebih cocok dengan semantik nama fungsi:exchange.GetPositions()
. Pada saat yang sama, masih kompatibel / ditingkatkan dengan fungsi GetPosition.
Perhatikan bahwa kedua nama fungsi hanya berbeda dengan s terakhir. Karena GetPositions lebih semantik benar, disarankan untuk menggunakan GetPositions di masa depan.
Peraturanexchange.GetPositions()
fungsi memiliki tiga bentuk panggilan:
Pertukaran.GetPositions ((() Ketika tidak ada parameter yang dilewatkan, data posisi dari semua varietas dalam dimensi saat ini diminta sesuai dengan pengaturan aruspasangan perdagangan / kode kontrak.
exchange.GetPositions ((BTC_USD.swap
, ETH_USDT.swap
, ETH_USDT.quarter
, dll.
BTC_USD.swap: Kontrak abadi berbasis mata uang BTC
exchange.GetPositions ((
Beberapa divisi dimensi kontrak pertukaran khusus:
USDT.futures_combo: Futures_Deribit exchange
Uji menggunakan lingkungan simulasi berjangka 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) + "`")
}
Ketika parameter diteruskan keexchange.GetPositions()
fungsi adalahETH_USDT.swap
, data posisi kontrak abadi berbasis U ETH
Ketika parameter dariexchange.GetPositions()
fungsi tidak diteruskan, data posisi semua kontrak abadi berbasis U yang terdaftar di bursa dapat diperoleh (karena pasangan perdagangan saat ini adalah BTC_USDT dan kontraknya adalah swap, permintaan didasarkan pada pasangan perdagangan saat ini dan kisaran dimensi kontrak).exchange.GetPositions("USDT.swap")
dan menentukan rentang permintaan.
Peningkatan utama fungsi pasarexchange.GetTicker()
Ini memungkinkan fungsi untuk meminta data pasar secara langsung sesuai dengan informasi produk yang ditentukan oleh parameter tanpa pasangan perdagangan saat ini dan kode kontrak. Ini menyederhanakan proses penulisan kode. Pada saat yang sama, masih kompatibel dengan metode panggilan tanpa melewati parameter, dan kompatibel dengan strategi platform lama sejauh mungkin.
Parametersymbol
memiliki format yang berbeda untuk spot/future untuk objek pertukaranexchange
:
AAA_BBB
, AAA mewakili baseCurrency, yaitu mata uang perdagangan, dan BBB mewakili quoteCurrency, yaitu mata uang penetapan harga.
Misalnya: pasangan perdagangan spot BTC_USDT.AAA_BBB.XXX
, AAA mewakili baseCurrency, yaitu mata uang perdagangan, BBB mewakili quoteCurrency, yaitu mata uang penetapan harga, dan XXX mewakili kode kontrak, seperti perpetual contract swap. Nama mata uang semuanya dalam huruf besar, dan kode kontrak dalam huruf kecil.
Misalnya: BTC_USDT.swap, kontrak abadi berbasis 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 batch data pasar untuk simbol tertentu telah menjadi jauh lebih sederhana.
Mirip dengan fungsi GetTicker,exchange.GetDepth()
fungsi juga menambahkan parameter simbol. ini memungkinkan kita untuk secara langsung menentukan simbol ketika meminta data kedalaman.
Diuji menggunakan Binance Futures live environment:
function main() {
exchange.SetCurrency("LTC_USD")
exchange.SetContractType("swap")
Log(exchange.GetDepth())
Log(exchange.GetDepth("ETH_USDT.quarter"))
Log(exchange.GetDepth("BTC_USD.swap"))
}
Mirip dengan fungsi GetTicker,exchange.GetTrades()
fungsi juga menambahkan parameter simbol. ini memungkinkan kita untuk menentukan simbol langsung ketika meminta data transaksi pasar.
Diuji menggunakan Binance Futures live environment:
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) + "`")
}
Upgrade ini juga kompatibel dengan parameter simbol yang ditentukan olehexchange.Go()
fungsi saat memanggil antarmuka API platform secara bersamaan.
Fungsi GetRecords telah sangat disesuaikan kali ini. Selain mendukung parameter simbol untuk secara langsung menentukan informasi jenis data K-line yang diminta, parameter periode asli dipertahankan untuk menentukan periode K-line, dan parameter batas ditambahkan untuk menentukan panjang K-line yang diharapkan saat diminta. Pada saat yang sama, ini juga kompatibel dengan versi lama fungsi GetRecords yang hanya melewati parameter periode.
Metode panggilan dariexchange.GetRecords()
Fungsi adalah:
Diuji menggunakan Binance Futures live environment:
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 menambahkansymbol
parameter, yang dapat digunakan untuk menentukan simbol tertentu dan menanyakan pesanan yang belum selesai (pending orders) dari simbol itu; juga mendukung menanyakan pesanan yang belum selesai (pending orders) dari semua simbol dalam kisaran dimensi yang ditentukan.
Peraturanexchange.GetOrders()
fungsi dapat dipanggil dengan cara berikut:
Uji menggunakan lingkungan simulasi berjangka 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) + "`")
}
Bila tidak ada parameter yang diteruskan, pesanan yang belum selesai (pesanan yang menunggu) dari semua varietas dalam kisaran dimensi pasangan perdagangan saat ini (BTC_USDT) dan kode kontrak (swap) diminta.
Ketika parameterETH_USDT.swap
Dilihat pada tabel di atas, pesanan yang belum selesai (pending orders) dari kontrak abadi berbasis USDT ETH
Ketika string"USDT.swap"
Jika kontrak perpetual berbasis USDT disetujui, pesanan yang belum selesai (pending orders) dari semua kontrak perpetual berbasis USDT diminta.
Ini masih kompatibel dengan nama fungsi akuisisi posisi lama, dan juga menambahkan parameter simbol, yang dapat menentukan informasi jenis data posisi tertentu yang diminta.
Penggunaan fungsi ini sama persis denganexchange.GetPositions()
.
Untukexchange.IO("api", ...)
panggilan fungsi, semua objek pertukaran telah ditingkatkan untuk mendukung langsung melewati alamat permintaan lengkap.
Misalnya, jika Anda ingin memanggil antarmuka OKX:
// Dapatkanhttps://www.okx.com/api/v5/account/max-withdrawal ccy: BTC
Mendukung penulisan langsung ke alamat dasarhttps://www.okx.com
tanpa harus beralih alamat dasar pertama dan kemudian memanggil fungsi IO.
Uji menggunakan lingkungan simulasi berjangka OKX:
function main() {
exchange.IO("simulate", true)
return exchange.IO("api", "GET", "https://www.okx.com/api/v5/account/max-withdrawal", "ccy=BTC")
}
Upgrade ini terutama mempengaruhi parameterid
dariexchange.GetOrder(id)
Parameter id diubah dari id pesanan pertukaran asli ke format string yang berisi produk perdagangan.
Semua ID pesanan yang terkapas pada platform FMZ dalam format ini.
Misalnya:
123456
Sebelum upgrade ini, jika Anda ingin memanggil fungsi GetOrder, order Id yang diteruskan adalah123456
.BTC-USDT
Aku tidak tahu.
Perhatikan bahwa ini mengacu pada kode produk perdagangan yang dinamakan oleh bursa, bukan pasangan perdagangan yang didefinisikan oleh platform FMZ.Setelah upgrade ini, format parameter id yang perlu dilewati keexchange.GetOrder(id)
Fungsi disesuaikan dengan:BTC-USDT,123456
.
Pertama, izinkan saya menjelaskan mengapa desain ini dibuat: Karena fungsi CreateOrder telah ditingkatkan untuk menentukan jenis order secara langsung (jenis order yang ditempatkan mungkin berbeda dari pasangan perdagangan dan kode kontrak yang saat ini ditetapkan). Jika ID order yang dikembalikan tidak berisi informasi jenis, maka ID order ini tidak akan dapat digunakan. Karena saat memeriksa order, kita tidak tahu jenis (kontrak) order untuk. Sebagian besar bursa memerlukan spesifikasi parameter yang menggambarkan kode jenis saat memeriksa dan membatalkan order.
Bagaimana untuk kompatibel dengan dampak ini: Jika Anda menggunakanexchange.IOfungsi untuk memanggil antarmuka pesanan pertukaran secara langsung untuk menempatkan pesanan, nilai yang dikembalikan umumnya berisi simbol asli pertukaran (kode produk) dan id pesanan asli. Kemudian menggabungkan keduanya dengan koma bahasa Inggris akan menjadi ID pesanan yang sesuai dengan definisi platform FMZ. Demikian pula, jika Anda menggunakan antarmuka pesanan yang terkapsul platform FMZ untuk melakukan pesanan, karena awal ID pesanan adalah kode produk perdagangan, jika Anda perlu menggunakan ID pesanan asli, cukup hapus kode produk dan koma.
Dampak dari peningkatan ini padaexchange.CancelOrder()
fungsi adalah sama denganexchange.GetOrder()
function.
Dampak dari peningkatan ini padaexchange.Buy()
fungsi adalah sama denganexchange.GetOrder()
fungsi.
ID pesanan yang dikembalikan olehexchange.Buy()
fungsi adalah struktur baru, misalnya, ID yang dikembalikan saat menempatkan pesanan berjangka di OKX exchange adalah:LTC-USDT-SWAP,1578360858053058560
.
Dampak dari peningkatan ini padaexchange.Sell()
fungsi adalah sama denganexchange.GetOrder()
fungsi.
ID pesanan yang dikembalikan olehexchange.Sell()
fungsi adalah struktur baru, misalnya, ID yang dikembalikan saat menempatkan pesanan berjangka di OKX exchange adalah:ETH-USDT-SWAP,1578360832820125696
.
Hanya objek pertukaran berjangka yang mendukung fungsi ini. Untuk fungsi exchange.GetPosition() untuk mendapatkan data posisi, nama exchange.GetPositions() baru ditambahkan, dan kedua perilaku sama persis.
Definisi lama: fungsi exchange.GetPosition(, ketika dipanggil tanpa menentukan parameter apa pun, memperoleh data posisi kontrak tertentu yang ditetapkan oleh pasangan perdagangan saat ini dan kode kontrak. Setelah penyesuaian dan modifikasi, definisi baru: fungsi exchange.GetPosition(, ketika dipanggil tanpa menentukan parameter apa pun, memperoleh posisi semua varietas dalam kisaran dimensi yang ditentukan oleh pasangan perdagangan dan kode kontrak yang ditetapkan saat ini.
Misalnya, pasangan perdagangan saat ini adalah BTC_USDT dan kode kontraknya adalah swap.
exchange.GetPosition() // Equivalent to calling exchange.GetPosition("USDT.swap")
Fungsi ini akan meminta data posisi kontrak abadi berbasis U dari semua mata uang.
Definisi lama: fungsi exchange.GetOrders(, ketika dipanggil tanpa menentukan parameter apa pun, mendapatkan semua pesanan yang belum selesai dari pasangan perdagangan saat ini. Setelah penyesuaian dan modifikasi, definisi baru adalah: fungsi exchange.GetOrders ((), ketika dipanggil tanpa menentukan parameter apa pun, mendapatkan pesanan yang belum selesai dari semua pasangan perdagangan spot.
Definisi lama: fungsi exchange.GetOrders(, ketika dipanggil tanpa menentukan parameter apa pun, mendapatkan semua pesanan yang belum selesai dari kontrak tertentu yang ditetapkan oleh pasangan perdagangan saat ini dan kode kontrak. Setelah penyesuaian dan modifikasi, definisi baru adalah: fungsi exchange.GetOrders(), ketika dipanggil tanpa menentukan parameter apa pun, mendapatkan semua pesanan yang belum selesai dari kisaran dimensi yang ditentukan oleh pasangan perdagangan saat ini dan kode kontrak.
Misalnya, pasangan perdagangan saat ini adalah BTC_USD dan kode kontraknya adalah kuartal.
exchange.GetOrders() // Equivalent to calling exchange.GetOrders("USD.futures")
Fungsi ini akan meminta data pesanan yang belum terhitung dari semua kontrak berjangka berbasis koin.
Pembaruan ini menambahkan bidang Simbol ke struktur Ticker, yang mencatat informasi pasar dari struktur Ticker saat ini.
Format bidang ini persis sama dengan format parameter simbol dariexchange.GetTicker()
function.
Pembaruan ini menambahkan bidang Simbol untuk struktur Order, dan format bidang ini persis sama dengan format parameter simbol dariexchange.GetTicker()
fungsi.
Pembaruan ini juga memodifikasi bidang ID dari struktur Pesenan, mencatat informasi produk dan informasi pesanan asli dalam format ID pesanan baru.exchange.GetOrder()
fungsi, yang tidak akan diulang di sini.
Pembaruan ini menambahkan kolom Simbol ke struktur Posisi. Format bidang ini persis sama dengan format parameter simbol dariexchange.GetTicker()
function.
Menurut platform strategi API upgrade interface, sistem backtesting platform telah diperbarui secara sinkron; Selain itu sistem backtesting telah menambahkan dukungan untuk:
Pertanian diAccount
struktur dikembalikan olehGetAccount
Fungsi anggota dari obyek pertukaran berjangka telah diperluas.
Ekuitas Total ekuitas mata uang aset margin saat ini. Kecuali untuk beberapa bursa berjangka yang tidak mendukung bidang ini, sebagian besar bursa mendukung bidang ini.
UPnL Keuntungan dan kerugian yang belum direalisasikan dari semua posisi yang dipegang dalam mata uang aset margin saat ini.
Fungsi anggota SetMarginLevel dari objek pertukaran berjangka telah ditingkatkan dan simbol parameter telah ditambahkan.
Contoh pengujian:
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)
}
BidangCtValCcy
mencatat unit nilai kontrak. Unit nilai kontrak dapat: BTC, USD, ETH, dll.
LapanganCtVal
mencatat nilai kontrak produk yang diperdagangkan di bursa, dan satuan adalah mata uang yang dicatat diCtValCcy
contohnya:CtVal
adalah 0,01 danCtValCcy
adalah