avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada Pesan pribadi
4
fokus pada
1271
Pengikut

Kuantifikasi FMZ: Analisis Contoh Desain Permintaan Umum di Pasar Cryptocurrency (I)

Dibuat di: 2023-12-17 18:43:46, diperbarui pada: 2024-11-06 21:18:36
comments   3
hits   1810

Kuantifikasi FMZ: Analisis Contoh Desain Permintaan Umum di Pasar Cryptocurrency (I)

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

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
    while (true) {
        // ...
    }
    

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

    • 2.2. Dapatkan informasi harga
    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
    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
    } 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
    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
    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
    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

Kuantifikasi FMZ: Analisis Contoh Desain Permintaan Umum di Pasar Cryptocurrency (I)

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.

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.

{
    "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:

Kuantifikasi FMZ: Analisis Contoh Desain Permintaan Umum di Pasar Cryptocurrency (I)

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:

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

Kode khusus:

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:

Kuantifikasi FMZ: Analisis Contoh Desain Permintaan Umum di Pasar Cryptocurrency (I)

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.