Type/to search
8
Follow
1364
Followers
Kuantifikasi FMZ: Analisis Contoh Reka Bentuk Permintaan Biasa dalam Pasaran Mata Wang Kripto (I)
Discussions
Created 2023-12-17 18:43:46  Updated 2024-11-06 21:18:36
 3
 2184

img

Dalam bidang perdagangan aset mata wang kripto, mendapatkan dan menganalisis data pasaran, kadar pertanyaan, dan memantau perubahan aset akaun adalah semua operasi utama. Berikut ialah contoh kod untuk melaksanakan beberapa keperluan biasa.

1. Bagaimanakah cara saya menulis kod yang menunjukkan peningkatan terbesar dalam dagangan spot Binance dalam masa 4 jam?

Apabila menulis program strategi perdagangan kuantitatif di FMZ, anda perlu menganalisis keperluan terlebih dahulu. Oleh itu, mengikut keperluan, kami menganalisis perkara berikut:

  • Bahasa pengaturcaraan yang manakah digunakan untuk menulis reka bentuk
    Pelaksanaan terancang menggunakan Javascript.
  • Perlukan data pasaran spot masa nyata untuk semua mata wang
    Apabila kami melihat keperluan ini, perkara pertama yang kami lakukan ialah melihat dokumentasi API Binance untuk melihat sama ada terdapat sebarang data pasaran terkumpul (data pasaran terkumpul adalah yang terbaik, kerana ia akan memakan masa dan susah payah untuk menyemak setiap produk satu demi satu. satu).
    Tanya antara muka maklumat pasaran agregat:GET https://api.binance.com/api/v3/ticker/price
    Pada FMZ, akses antara muka sebut harga pertukaran (antara muka awam yang tidak memerlukan tandatangan) menggunakanHttpQueryfungsi.
  • Perlu mengira data tempoh rolling window selama 4 jam
    Fikirkan tentang cara menstruktur program statistik ini.
  • Kira naik dan turun, susun
    Fikirkan tentang algoritma naik dan turun, adakah ia:涨跌幅百分比 =(当前价格 - 初始价格)/ 初始价格 * 100, unit ialah “%”.

Fikirkan masalah dan tentukan penyelesaian. Kami mula mereka bentuk program.

Reka bentuk kod

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 Kod

    1. Struktur Data
      var dictSymbolsPrice = {}: Objek kosong yang digunakan untuk menyimpan maklumat harga bagi setiap pasangan dagangan. Kuncinya ialah simbol pasangan dagangan, dan nilainya ialah objek yang mengandungi nama pasangan dagangan, susunan data harga dan maklumat perubahan.
    1. Fungsi utama main()
    • 2.1. Gelung tak terhingga

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

      Program ini sentiasa memantau harga pasangan dagangan API Binance melalui gelung tak terhingga.

    • 2.2. Dapatkan maklumat harga

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

      Dapatkan maklumat harga semasa pasangan dagangan melalui API Binance. Jika nilai yang dikembalikan bukan tatasusunan, tunggu 5 saat dan cuba lagi.

    • 2.3. Kemas kini data harga

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

      Lintas tatasusunan maklumat harga yang diperoleh dan kemas kini data dalam dictSymbolsPrice. Untuk setiap pasangan dagangan, tambahkan cap masa semasa dan harga pada tatasusunan data yang sepadan.

    • 2.4. Pengendalian Pengecualian

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

      Tangkap pengecualian dan rekod maklumat pengecualian untuk memastikan program boleh terus dilaksanakan.

    • 2.5. Kira kenaikan atau penurunan

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

      Traverse dictSymbolsPrice, hitung kenaikan atau penurunan setiap pasangan dagangan dan padamkan data terawal jika panjang data melebihi 4 jam.

    • 2.6. Menyusun dan menjana jadual

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

      Isih pasangan dagangan mengikut kenaikan atau penurunan mereka dari tinggi ke rendah, dan jana jadual yang mengandungi maklumat pasangan dagangan.

    • 2.7 Log keluaran dan kelewatan

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

      Keluarkan jadual dan masa semasa dalam bentuk log, dan tunggu selama 5 saat sebelum meneruskan ke kitaran seterusnya.

Program ini memperoleh maklumat harga masa nyata pasangan dagangan melalui API Binance, kemudian mengira kenaikan atau penurunan dan mengeluarkannya ke log dalam bentuk jadual. Program ini dilaksanakan dalam gelung berterusan untuk mencapai fungsi pemantauan masa nyata harga pasangan transaksi. Perlu diingatkan bahawa program ini termasuk pengendalian pengecualian untuk memastikan bahawa pelaksanaan tidak terganggu disebabkan oleh pengecualian apabila mendapatkan maklumat harga.

Ujian operasi cakera sebenar

img

Memandangkan data hanya boleh dikumpul sedikit demi sedikit pada permulaan, adalah mustahil untuk mengira kenaikan dan penurunan secara bergulir jika data yang mencukupi untuk 4 jam belum dikumpul. Oleh itu, pada permulaannya, harga awal digunakan sebagai penanda aras untuk pengiraan Selepas mengumpul data yang mencukupi selama 4 jam, data tertua dihapuskan satu demi satu untuk mengekalkan tempoh tetingkap 4 jam untuk mengira kenaikan dan penurunan.

2. Semak kadar pembiayaan semua kontrak hadapan Binance U-margin

Menyoal kadar pembiayaan adalah serupa dengan kod di atas Pertama, anda perlu menyemak dokumentasi API Binance untuk mencari antara muka berkaitan kadar pembiayaan. Binance mempunyai beberapa antara muka untuk menanyakan kadar pembiayaan Di sini kami mengambil antara muka kontrak berasaskan U sebagai contoh:

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

Pelaksanaan Kod

Oleh kerana terdapat terlalu banyak kontrak, kami mengeluarkan sepuluh teratas dengan kadar pembiayaan 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 seperti berikut Daripada dokumentasi Binance, kita dapat melihat bahawa lastFundingRate ialah kadar pembiayaan 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 }

Ujian operasi cakera sebenar:

img

Versi Python untuk mendapatkan kadar pembiayaan kontrak pertukaran OKX

Seorang pengguna menyebut bahawa versi Python diperlukan, dan ia adalah dari pertukaran OKX. Di sini juga dilaksanakan dengan cara:

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

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

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

Ujian operasi cakera sebenar:

img

END

Contoh-contoh ini menyediakan idea reka bentuk asas dan kaedah panggilan Dalam projek sebenar, pengubahsuaian dan sambungan yang sesuai mungkin diperlukan berdasarkan keperluan khusus. Saya harap kod ini dapat membantu anda memenuhi pelbagai keperluan anda dengan lebih baik dalam perdagangan aset digital mata wang kripto.

Comment
All comments (3)

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

    3 years ago

    好的,这个在计划内。

    3 years ago

    点赞

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