Sumber daya yang dimuat... Pemuatan...

Penjelasan Rinci FMZ Quant API Upgrade: Meningkatkan Pengalaman Desain Strategi

Penulis:FMZ~Lydia, Dibuat: 2024-07-05 09:44:08, Diperbarui: 2024-07-25 15:15:03

[TOC]

img

Penjelasan Rinci FMZ Quant API Upgrade: Meningkatkan Pengalaman Desain Strategi

Pengantar

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.

1. antarmuka API baru

Ditambahkan pertukaran.GetTickers fungsi

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
}

img

Ditambahkan fungsi Exchange.CreateOrder

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)
}

img

Dengan cara ini, hanya tigaexchange.CreateOrder()panggilan fungsi digunakan untuk menempatkan tiga pesanan berjangka dari berbagai jenis dan arah.

Ditambahkan fungsi Exchange.GetHistoryOrders

Yang baru ditambahkanexchange.GetHistoryOrders()Fungsi ini juga membutuhkan dukungan antarmuka pertukaran.

Untuk menanyakan pesanan historis, antarmuka yang diimplementasikan oleh berbagai pertukaran sangat bervariasi:

  • Beberapa mendukung kueri berhalaman, sementara yang lain tidak;
  • Beberapa bursa memiliki periode jendela kueri, yaitu pesanan yang lebih tua dari N hari tidak dapat ditanyakan;
  • Sebagian besar pertukaran mendukung kueri pada waktu tertentu, tetapi beberapa tidak; Antarmuka tersebut dikemas dengan tingkat kompatibilitas tertinggi, dan dalam penggunaan yang sebenarnya, perhatian harus diberikan kepada apakah mereka memenuhi persyaratan dan harapan strategi.

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) +  "`")
}

img

Ditambahkan fungsi exchange.GetPositions

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.

Peraturanexchange.GetPositions()fungsi memiliki tiga bentuk panggilan:

  • Pertukaran.GetPositions ((() Jika tidak ada parameter yang diteruskan, data posisi diminta berdasarkan pengaturan pasangan perdagangan/kode kontrak saat ini.
  • exchange.GetPositions ((ETH_USDT.swap) Saat menentukan informasi produk tertentu (format ETH_USDT.swap didefinisikan oleh platform FMZ), minta data posisi produk tertentu.
  • pertukaran.GetPositions("") Minta antarmuka posisi pertukaran untuk mendapatkan semua dimensi saat ini dari data posisi. (Dibagi sesuai dengan dimensi produk antarmuka pertukaran) 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("")

    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) +  "`")
}

img

Ketika parameter diteruskan keexchange.GetPositions()fungsi adalahETH_USDT.swap, data posisi kontrak abadi berbasis U ETH dapat diperoleh.

img

Ketika parameter diteruskan keexchange.GetPositions()fungsi adalah string kosong , data posisi dari semua kontrak berbasis U dapat diperoleh.

2. Peningkatan antarmuka API

Update Exchange.GetTicker fungsi

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.

Parametersymbolmemiliki format yang berbeda untuk spot/future untuk objek pertukaranexchange:

  • Objek pertukaran spot Formatnya adalah:AAA_BBB, AAA mewakili baseCurrency, yaitu mata uang perdagangan, dan BBB mewakili quoteCurrency, yaitu mata uang penetapan harga. Misalnya: pasangan perdagangan spot BTC_USDT.
  • Objek pertukaran futures Formatnya adalah: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 BTC. Diuji menggunakan Binance Futures live environment:
var 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
}

img

Meminta batch data pasar untuk simbol tertentu telah menjadi jauh lebih sederhana.

Update Exchange.GetDepth fungsi

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"))
}

img

Perbarui fungsi exchange.GetTrades

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) +  "`")
}

img

Upgrade ini juga kompatibel dengan parameter simbol yang ditentukan olehexchange.Go()fungsi saat memanggil antarmuka API platform secara bersamaan.

Update Exchange.GetRecords fungsi

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:

  • pertukaran.GetRecords ((() Jika tidak ada parameter yang ditentukan, data K-line dari produk yang sesuai dengan pasangan perdagangan/kode kontrak saat ini diminta.
  • tukar.GetRecords ((60 * 15) Bila hanya parameter periode K-line yang ditentukan, data K-line dari produk yang sesuai dengan pasangan perdagangan/kode kontrak saat ini diminta.
  • exchange.GetRecords ((BTC_USDT.swap) Ketika hanya informasi produk yang ditentukan, data K-line dari produk yang ditentukan diminta. Periode K-line adalah periode K-line default yang ditetapkan dalam antarmuka backtesting strategi atau dalam perdagangan langsung.
  • exchange.GetRecords ((BTC_USDT.swap, 60 * 60) Tentukan informasi produk dan periode garis K khusus untuk meminta data garis K.
  • exchange.GetRecords ((BTC_USDT.swap, 60, 1000) Tentukan informasi produk, tentukan periode garis K spesifik, dan tentukan panjang garis K yang diharapkan untuk meminta data garis K. Perhatikan bahwa ketika parameter batas melebihi panjang maksimum permintaan tunggal dari pertukaran, permintaan paging akan dihasilkan (yaitu, beberapa panggilan ke antarmuka K-line pertukaran).

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)
}

img

Update fungsi Exchange.GetOrders

Fungsi GetOrders juga menambahkansymbolparameter, yang dapat menentukan jenis pesanan yang belum selesai saat ini (pesanan yang menunggu) secara langsung akan ditanyakan; juga mendukung menanyakan semua pesanan yang menunggu (terlepas dari jenisnya); dan kompatibel dengan metode panggilan asli.

Peraturanexchange.GetOrders()fungsi dapat dipanggil dengan cara berikut:

  • pertukaran.GetOrders ((() Mencari semua pesanan yang belum selesai untuk pasangan perdagangan/kode kontrak saat ini.
  • exchange.GetOrders ((BTC_USDT.swap) Bertanya-tanya semua pesanan yang belum terbayar untuk kontrak abadi dengan margin USDT pada BTC.
  • pertukaran.GetOrders (("") Query semua pesanan yang belum selesai dalam dimensi saat ini dari pertukaran (dibagi sesuai dengan dimensi antarmuka API pertukaran).

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", ""]) {
        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) +  "`")
}

img

Bila tidak ada parameter yang diteruskan, permintaan default adalah untuk semua pesanan yang belum selesai dari pasangan perdagangan BTC_USDT saat ini dan kontrak perpetual swap.

img

KetikaETH_USDT.swapparameter ditentukan, semua pesanan yang belum selesai dari kontrak abadi dari pasangan perdagangan ETH_USDT diminta.

img

Ketika string kosong""Di AS, semua pesanan yang belum selesai dari semua kontrak dengan margin USDT diminta.

Update fungsi exchange.GetPosition

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().

Pembaruanexchange.IOfungsi

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.comtanpa 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")
}

img

3. Dampak antarmuka API

Mempengaruhi fungsi exchange.GetOrder

Upgrade ini terutama mempengaruhi parameteriddariexchange.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:

  • ID pesanan asli pertukaran yang didefinisikan dalam pesanan pertukaran adalah:123456Sebelum upgrade ini, jika Anda ingin memanggil fungsi GetOrder, order Id yang diteruskan adalah123456.
  • Kode produk yang dinamakan oleh bursa yang ditentukan dalam pesanan pertukaran:BTC-USDTAku 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.

Mempengaruhi fungsi Exchange.CancelOrder

Dampak dari peningkatan ini padaexchange.CancelOrder()fungsi adalah sama denganexchange.GetOrder() function.

Memengaruhi fungsi pertukaran.Beli

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.

Mempengaruhi fungsi pertukaran.

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.

4. Penyesuaian Struktural

Struktur Ticker

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.

Struktur Orde

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.

Struktur Posisi

Pembaruan ini menambahkan kolom Simbol ke struktur Posisi. Format bidang ini persis sama dengan format parameter simbol dariexchange.GetTicker() function.

5. Sistem pengujian balik

Untuk memenuhi kebutuhan pengguna, upgrade ini pertama-tama akan kompatibel dengan perdagangan langsung, dan sistem backtesting akan disesuaikan dalam waktu seminggu.

Pembaruan Tambahan

1. bidang baru Ekuitas dan UPnL dalam struktur akun

Pertanian diAccountstruktur dikembalikan olehGetAccountFungsi 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 SetMarginLevel ditingkatkan untuk mendukung parameter simbol

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)
}

Lebih banyak