FMZ Quant: Analisis Contoh Reka Bentuk Keperluan Umum di Pasaran Cryptocurrency (I)

Penulis:Lydia, Dicipta: 2023-12-19 16:02:58, Dikemas kini: 2024-01-02 21:21:58

img

Dalam ruang perdagangan aset cryptocurrency, mendapatkan dan menganalisis data pasaran, menanyakan kadar, dan memantau pergerakan aset akaun adalah semua operasi kritikal.

Bagaimana saya menulis kod untuk mendapatkan mata wang dengan kenaikan tertinggi dalam masa 4 jam di Binance Spot?

Apabila menulis program strategi perdagangan kuantitatif di platform FMZ, perkara pertama yang perlu anda lakukan apabila anda menghadapi keperluan adalah untuk menganalisisnya.

  • Bahasa pengaturcaraan mana yang perlu digunakan? Rancangan adalah untuk menggunakan Javascript untuk melaksanakannya.
  • Memerlukan sebut harga spot masa nyata dalam semua mata wang Perkara pertama yang kami lakukan apabila kami melihat keperluan adalah mencari dokumen API Binance untuk mengetahui sama ada terdapat sebarang sebut harga agregat (yang terbaik adalah mempunyai sebut harga agregat, ia adalah banyak kerja untuk mencari satu demi satu). Kami menemui antara muka petikan agregat:GET https://api.binance.com/api/v3/ticker/price. Pada platform FMZ, gunakanHttpQueryfungsi untuk mengakses antara muka ticker pertukaran (antara muka awam yang tidak memerlukan tandatangan).
  • Perlu mengira data untuk tempoh tetingkap bergulir 4 jam Konsepsi bagaimana untuk mereka bentuk struktur program statistik.
  • Mengira turun naik harga dan menyusun mereka Berfikir tentang algoritma turun naik harga, adalah ia:price fluctuations (%) = (current price - initial price) / initial price * 100dalam %.

Selepas menyelesaikan masalah, dan juga menentukan program, kami mula merancang 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)
        }
        
        // Calculate price fluctuations
        var tbl = {
            type : "table",
            title : "Price fluctuations",
            cols : ["trading pair", "current price", "price 4 hours ago", "price fluctuations", "data length", "earliest data time", "latest data time"],
            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 datavar dictSymbolsPrice = {}: Objek kosong untuk menyimpan maklumat harga untuk setiap pasangan dagangan. Kunci adalah simbol pasangan dagangan, dan nilainya adalah objek yang mengandungi nama pasangan dagangan, pelbagai data harga, dan maklumat mengenai turun naik harga.
    1. Fungsi utama utama 2.1 Gelung tanpa akhir
while (true) {
    // ...
}

Program ini terus memantau harga pasangan perdagangan Binance API melalui gelung tanpa akhir. 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 pulangan bukan array, tunggu selama 5 saat dan cuba lagi. 2.3 Mengemas kini data harga

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

Iterate melalui array maklumat harga yang diperoleh dan mengemas kini data dalam dictSymbolsPrice. Untuk setiap pasangan dagangan, tambah stempel masa dan harga semasa ke array data yang sepadan. 2.4 Pemprosesan pengecualian

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

Menangkap pengecualian dan log maklumat pengecualian untuk memastikan bahawa program boleh terus dijalankan. 2.5. Mengira turun naik harga

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

Iterate melalui dictSymbolsPrice, mengira turun naik harga setiap pasangan dagangan, dan membuang data terdahulu jika lebih lama daripada 4 jam. 2.6. Susun dan hasilkan jadual

var entries = Object.entries(dictSymbolsPrice)
entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange)

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

Mengurutkan pasangan dagangan mengikut urutan penurunan turun turun fluktuasi harga mereka dan menghasilkan jadual yang mengandungi maklumat mengenai pasangan dagangan. 2.7. output log dan kelewatan

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

Keluarkan jadual dan masa semasa dalam bentuk log dan tunggu selama 5 saat untuk meneruskan pusingan seterusnya.

Program ini memperoleh maklumat harga masa nyata pasangan dagangan melalui Binance API, kemudian mengira turun naik harga, dan mengeluarkan ke log dalam bentuk jadual. Program ini dijalankan dalam gelung berterusan untuk merealisasikan fungsi pemantauan masa nyata harga pasangan dagangan. Perhatikan bahawa program ini termasuk pemprosesan pengecualian untuk memastikan bahawa pelaksanaan tidak terganggu oleh pengecualian ketika mendapatkan maklumat harga.

Ujian Perdagangan Langsung

img

Oleh kerana data hanya boleh dikumpulkan sedikit demi sedikit pada mulanya, tidak mungkin untuk mengira turun naik harga secara bergolak tanpa mengumpul data yang mencukupi untuk tetingkap 4 jam. Oleh itu, harga awal digunakan sebagai asas untuk pengiraan, dan selepas mengumpul data yang mencukupi selama 4 jam, data tertua akan dihapuskan untuk mengekalkan tetingkap 4 jam untuk pengiraan turun naik harga.

2. Semak pelbagai kadar pembiayaan penuh untuk kontrak Binance U-denominasi

Memeriksa kadar pembiayaan adalah sama dengan kod di atas, pertama sekali, kita perlu memeriksa dokumentasi API Binance untuk mencari antara muka yang berkaitan dengan kadar pembiayaan. Binance mempunyai beberapa antara muka yang membolehkan kita menyoal kadar dana, di sini kita mengambil antara muka kontrak yang berjenama U sebagai contoh:

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

Pelaksanaan Kod

Oleh kerana terdapat banyak kontrak, kami mengeksport 10 kadar pembiayaan terbesar 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: "Top 10 funding rates for U-denominated contracts",
                cols: ["contracts", "funding rate", "marked price", "index price", "current rate time", "next rate time"],
                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, dan periksa dokumentasi Binance, ia menunjukkan bahawa lastFundingRate adalah kadar pembiayaan yang kita mahukan.

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

Ujian berjalan perdagangan langsung:

img

Mendapatkan kadar pembiayaan kontrak pertukaran OKX versi Python

Seorang pengguna telah meminta versi Python contoh, dan ia adalah untuk pertukaran OKX.

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

{
    "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": "Top 10 funding rates for U-denominated contracts",
                "cols": ["contracts", "next rate", "minimum", "current", "maximum"],
                "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 berjalan perdagangan langsung:

img

END

Contoh-contoh ini memberikan idea reka bentuk asas dan kaedah panggilan, projek sebenar mungkin perlu membuat perubahan dan pelanjutan yang sesuai berdasarkan keperluan tertentu.


Lebih lanjut