avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada mesej peribadi
4
fokus pada
1271
Pengikut

Kuantifikasi FMZ: Analisis Contoh Reka Bentuk Permintaan Biasa dalam Pasaran Mata Wang Kripto (I)

Dicipta dalam: 2023-12-17 18:43:46, dikemas kini pada: 2024-11-06 21:18:36
comments   3
hits   1810

Kuantifikasi FMZ: Analisis Contoh Reka Bentuk Permintaan Biasa dalam Pasaran Mata Wang Kripto (I)

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

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

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

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

Kuantifikasi FMZ: Analisis Contoh Reka Bentuk Permintaan Biasa dalam Pasaran Mata Wang Kripto (I)

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.

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.

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

Kuantifikasi FMZ: Analisis Contoh Reka Bentuk Permintaan Biasa dalam Pasaran Mata Wang Kripto (I)

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:

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

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

Ujian operasi cakera sebenar:

Kuantifikasi FMZ: Analisis Contoh Reka Bentuk Permintaan Biasa dalam Pasaran Mata Wang Kripto (I)

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.