Type/to search
8
Follow
1364
Followers
Kuantifikasi FMZ: Analisis Contoh Desain Permintaan Umum di Pasar Cryptocurrency (I)
Discussions
Created 2023-12-17 18:43:46  Updated 2024-11-06 21:18:36
 3
 2185

img

Di bidang perdagangan aset mata uang kripto, memperoleh dan menganalisis data pasar, menanyakan kurs, dan memantau perubahan aset akun semuanya merupakan operasi utama. Berikut ini adalah contoh kode untuk mengimplementasikan beberapa persyaratan umum.

1. Bagaimana cara menulis kode yang menunjukkan peningkatan terbesar dalam perdagangan spot Binance dalam waktu 4 jam?

Saat menulis program strategi perdagangan kuantitatif di FMZ, Anda perlu terlebih dahulu menganalisis persyaratannya. Jadi sesuai kebutuhan, kami menganalisis poin-poin berikut:

  • Bahasa pemrograman apa yang digunakan untuk menulis desain tersebut?
    Implementasi yang direncanakan menggunakan Javascript.
  • Butuh data pasar spot real-time untuk semua mata uang
    Ketika kami melihat persyaratan ini, hal pertama yang kami lakukan adalah melihat dokumentasi API Binance untuk melihat apakah ada data pasar agregat (data pasar agregat akan menjadi yang terbaik, karena akan memakan waktu dan melelahkan untuk memeriksa setiap produk satu per satu) satu).
    Menanyakan antarmuka informasi pasar agregat:GET https://api.binance.com/api/v3/ticker/price
    Di FMZ, akses antarmuka kutipan pertukaran (antarmuka publik yang tidak memerlukan tanda tangan) menggunakanHttpQueryfungsi.
  • Perlu menghitung data periode jendela bergulir 4 jam
    Pikirkan tentang cara menyusun program statistik ini.
  • Hitung kenaikan dan penurunan, urutkan
    Pikirkan tentang algoritma naik dan turun, apakah itu:涨跌幅百分比 =(当前价格 - 初始价格)/ 初始价格 * 100, satuannya adalah “%”.

Pikirkan masalahnya dan tentukan solusinya. Kami mulai merancang programnya.

Desain kode

javascript
var dictSymbolsPrice = {} function main() { while (true) { // GET https://api.binance.com/api/v3/ticker/price try { var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price")) if (!Array.isArray(arr)) { Sleep(5000) continue } var ts = new Date().getTime() for (var i = 0; i < arr.length; i++) { var symbolPriceInfo = arr[i] var symbol = symbolPriceInfo.symbol var price = symbolPriceInfo.price if (typeof(dictSymbolsPrice[symbol]) == "undefined") { dictSymbolsPrice[symbol] = {name: symbol, data: []} } dictSymbolsPrice[symbol].data.push({ts: ts, price: price}) } } catch(e) { Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message) } // 计算涨跌幅 var tbl = { type : "table", title : "涨跌幅", cols : ["交易对", "当前价格", "4小时前价格", "涨跌幅", "数据长度", "最早数据时间", "最新数据时间"], rows : [] } for (var symbol in dictSymbolsPrice) { var data = dictSymbolsPrice[symbol].data if (data[data.length - 1].ts - data[0].ts > 1000 * 60 * 60 * 4) { dictSymbolsPrice[symbol].data.shift() } data = dictSymbolsPrice[symbol].data dictSymbolsPrice[symbol].percentageChange = (data[data.length - 1].price - data[0].price) / data[0].price * 100 } var entries = Object.entries(dictSymbolsPrice) entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange) for (var i = 0; i < entries.length; i++) { if (i > 9) { break } var name = entries[i][1].name var data = entries[i][1].data var percentageChange = entries[i][1].percentageChange var currPrice = data[data.length - 1].price var currTs = _D(data[data.length - 1].ts) var prePrice = data[0].price var preTs = _D(data[0].ts) var dataLen = data.length tbl.rows.push([name, currPrice, prePrice, percentageChange + "%", dataLen, preTs, currTs]) } LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`") Sleep(5000) } }

Analisis Kode

    1. Struktur Data
      var dictSymbolsPrice = {}: Objek kosong yang digunakan untuk menyimpan informasi harga untuk setiap pasangan perdagangan. Kuncinya adalah simbol pasangan perdagangan, dan nilainya adalah objek yang berisi nama pasangan perdagangan, serangkaian data harga, dan informasi perubahan.
    1. Fungsi utama main()
    • 2.1. Perulangan tak terbatas

      javascript
      while (true) { // ... }

      Program ini terus memantau harga pasangan perdagangan API Binance melalui putaran tak terbatas.

    • 2.2. Dapatkan informasi harga

      javascript
      var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))

      Dapatkan informasi harga terkini dari pasangan perdagangan melalui API Binance. Jika nilai yang dikembalikan bukan array, tunggu 5 detik dan coba lagi.

    • 2.3. Memperbarui data harga

      javascript
      for (var i = 0; i < arr.length; i++) { // ... }

      Telusuri susunan informasi harga yang diperoleh dan perbarui data dalam dictSymbolsPrice. Untuk setiap pasangan perdagangan, tambahkan stempel waktu dan harga saat ini ke susunan data yang sesuai.

    • 2.4. Penanganan Pengecualian

      javascript
      } catch(e) { Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message) }

      Menangkap pengecualian dan mencatat informasi pengecualian untuk memastikan bahwa program dapat terus dijalankan.

    • 2.5. Hitung kenaikan atau penurunannya

      javascript
      for (var symbol in dictSymbolsPrice) { // ... }

      Lintasi dictSymbolsPrice, hitung kenaikan atau penurunan setiap pasangan perdagangan, dan hapus data paling awal jika panjang data melebihi 4 jam.

    • 2.6. Mengurutkan dan membuat tabel

      javascript
      var entries = Object.entries(dictSymbolsPrice) entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange) for (var i = 0; i < entries.length; i++) { // ... }

      Urutkan pasangan perdagangan berdasarkan kenaikan atau penurunannya dari tinggi ke rendah, dan buat tabel yang berisi informasi pasangan perdagangan.

    • 2.7. Keluaran log dan penundaan

      javascript
      LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`") Sleep(5000)

      Keluarkan tabel dan waktu saat ini dalam bentuk log, dan tunggu selama 5 detik sebelum melanjutkan ke siklus berikutnya.

Program ini memperoleh informasi harga real-time dari pasangan perdagangan melalui API Binance, lalu menghitung kenaikan atau penurunan dan mengeluarkannya ke log dalam bentuk tabel. Program ini dijalankan dalam putaran berkelanjutan untuk mencapai fungsi pemantauan harga pasangan transaksi secara real-time. Perlu dicatat bahwa program ini menyertakan penanganan pengecualian untuk memastikan bahwa eksekusi tidak terganggu karena pengecualian saat memperoleh informasi harga.

Uji operasi disk nyata

img

Karena data hanya dapat dikumpulkan sedikit demi sedikit di awal, mustahil untuk menghitung kenaikan dan penurunan secara bergulir jika data yang cukup untuk 4 jam belum terkumpul. Oleh karena itu, pada awalnya, harga awal digunakan sebagai patokan perhitungan. Setelah mengumpulkan data yang cukup selama 4 jam, data terlama dihilangkan satu per satu untuk mempertahankan periode jendela 4 jam guna menghitung kenaikan dan penurunan.

2. Periksa tingkat pendanaan semua kontrak berjangka U-margin Binance

Menanyakan tingkat pendanaan mirip dengan kode di atas. Pertama, Anda perlu memeriksa dokumentasi API Binance untuk menemukan antarmuka terkait tingkat pendanaan. Binance memiliki beberapa antarmuka untuk menanyakan tingkat pendanaan. Berikut ini kami ambil antarmuka kontrak berbasis U sebagai contoh:

GET https://fapi.binance.com/fapi/v1/premiumIndex

Implementasi Kode

Karena terlalu banyak kontrak, kami tampilkan sepuluh kontrak teratas dengan tingkat pendanaan tertinggi di sini.

javascript
function main() { while (true) { // GET https://fapi.binance.com/fapi/v1/premiumIndex try { var arr = JSON.parse(HttpQuery("https://fapi.binance.com/fapi/v1/premiumIndex")) if (!Array.isArray(arr)) { Sleep(5000) continue } arr.sort((a, b) => parseFloat(b.lastFundingRate) - parseFloat(a.lastFundingRate)) var tbl = { type: "table", title: "U本位合约资金费率前十", cols: ["合约", "资金费率", "标记价格", "指数价格", "当期费率时间", "下期费率时间"], rows: [] } for (var i = 0; i < 9; i++) { var obj = arr[i] tbl.rows.push([obj.symbol, obj.lastFundingRate, obj.markPrice, obj.indexPrice, _D(obj.time), _D(obj.nextFundingTime)]) } LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`") } catch(e) { Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message) } Sleep(1000 * 10) } }

Struktur data yang dikembalikan adalah sebagai berikut. Dari dokumentasi Binance, kita dapat melihat bahwa lastFundingRate adalah tingkat pendanaan yang kita inginkan.

javascript
{ "symbol":"STMXUSDT", "markPrice":"0.00883606", "indexPrice":"0.00883074", "estimatedSettlePrice":"0.00876933", "lastFundingRate":"0.00026573", "interestRate":"0.00005000", "nextFundingTime":1702828800000, "time":1702816229000 }

Uji operasi disk nyata:

img

Versi Python untuk mendapatkan nilai tukar kontrak OKX

Seorang pengguna menyebutkan bahwa versi Python diperlukan, dan versi tersebut berasal dari bursa OKX. Berikut ini juga diimplementasikan dengan cara:

https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1Data yang dikembalikan oleh antarmuka:

python
{ "code":"0", "data":[ { "fundingTime":1702828800000, "fundingList":[ { "instId":"BTC-USDT-SWAP", "nextFundingRate":"0.0001102188733642", "minFundingRate":"-0.00375", "fundingRate":"0.0000821861465884", "maxFundingRate":"0.00375" } ...

Kode khusus:

python
import requests import json from time import sleep from datetime import datetime def main(): while True: # https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1 try: response = requests.get("https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1") arr = response.json()["data"][0]["fundingList"] Log(arr) if not isinstance(arr, list): sleep(5) continue arr.sort(key=lambda x: float(x["fundingRate"]), reverse=True) tbl = { "type": "table", "title": "U本位合约资金费率前十", "cols": ["合约", "下期费率", "最小", "当期", "最大"], "rows": [] } for i in range(min(9, len(arr))): obj = arr[i] row = [ obj["instId"], obj["nextFundingRate"], obj["minFundingRate"], obj["fundingRate"], obj["maxFundingRate"] ] tbl["rows"].append(row) LogStatus(_D(), "\n", '`' + json.dumps(tbl) + '`') except Exception as e: Log(f"Error: {str(e)}") sleep(10)

Uji operasi disk nyata:

img

END

Contoh-contoh ini menyediakan ide desain dasar dan metode pemanggilan. Dalam proyek yang sebenarnya, modifikasi dan perluasan yang sesuai mungkin diperlukan berdasarkan kebutuhan spesifik. Saya harap kode-kode ini dapat membantu Anda memenuhi berbagai kebutuhan dalam perdagangan aset digital mata uang kripto dengan lebih baik.

Comment
All comments (3)

    期待小梦老师 尽快出一个@监控账户资产变动的案例

    3 years ago

    好的,这个在计划内。

    3 years ago

    点赞

    3 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)