Sumber daya yang dimuat... Pemuatan...

FMZ Quant: Analisis Contoh Desain Persyaratan Umum di Pasar Cryptocurrency (I)

Penulis:FMZ~Lydia, Dibuat: 2023-12-19 16:02:58, Diperbarui: 2024-11-06 21:19:16

img

Dalam ruang perdagangan aset cryptocurrency, memperoleh dan menganalisis data pasar, menanyakan tingkat, dan memantau pergerakan aset akun adalah semua operasi penting.

Bagaimana saya menulis kode untuk mendapatkan mata uang dengan kenaikan tertinggi dalam 4 jam di Binance Spot?

Ketika menulis program strategi perdagangan kuantitatif di platform FMZ, hal pertama yang perlu Anda lakukan ketika Anda menemukan persyaratan adalah menganalisisnya.

  • Bahasa pemrograman apa yang harus digunakan? Rencananya adalah menggunakan JavaScript untuk menerapkannya.
  • Membutuhkan kutipan real-time spot di semua mata uang Hal pertama yang kami lakukan ketika kami melihat persyaratan adalah mencari dokumen API Binance untuk mengetahui apakah ada kutipan agregat (yang terbaik adalah memiliki kutipan agregat, itu banyak pekerjaan untuk mencari satu per satu). Kami menemukan antarmuka kutipan agregat:GET https://api.binance.com/api/v3/ticker/priceAku tidak tahu. Di platform FMZ, gunakanHttpQueryfungsi untuk mengakses antarmuka ticker pertukaran (antarmuka publik yang tidak memerlukan tanda tangan).
  • Perlu menghitung data untuk periode jendela bergulir 4 jam Konsepsi bagaimana merancang struktur program statistik.
  • Menghitung fluktuasi harga dan menyortirnya Berpikir tentang algoritma fluktuasi harga, adalah:price fluctuations (%) = (current price - initial price) / initial price * 100dalam %.

Setelah mencari tahu masalah, serta mendefinisikan program, kami kemudian turun ke bisnis merancang program.

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)
        }
        
        // 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 Kode

    1. Struktur datavar dictSymbolsPrice = {}: Objek kosong untuk menyimpan informasi harga untuk setiap pasangan perdagangan. Kunci adalah simbol pasangan perdagangan, dan nilainya adalah objek yang berisi nama pasangan perdagangan, array data harga, dan informasi tentang fluktuasi harga.
    1. Fungsi utama utama 2.1 Lingkaran tak terbatas
while (true) {
    // ...
}

Program ini terus memantau harga pasangan perdagangan Binance API melalui loop tak terbatas. 2.2. Dapatkan informasi harga

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

Dapatkan informasi harga saat ini dari pasangan perdagangan melalui Binance API. Jika pengembalian bukan array, tunggu 5 detik dan coba lagi. 2.3 Pembaruan data harga

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

Iterasi melalui array informasi harga yang diperoleh dan memperbarui data di dictSymbolsPrice. Untuk setiap pasangan perdagangan, tambahkan timestamp saat ini dan harga ke array data yang sesuai. 2.4 Pengolahan pengecualian

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

Tangkap pengecualian dan log informasi pengecualian untuk memastikan bahwa program dapat terus dijalankan. 2.5. Menghitung fluktuasi harga

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

Iterate melalui dictSymbolsPrice, menghitung fluktuasi harga dari setiap pasangan perdagangan, dan menghapus data tertua jika lebih dari 4 jam. 2.6. Mengurutkan dan menghasilkan tabel

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

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

Atur pasangan perdagangan dalam urutan menurun fluktuasi harga mereka dan menghasilkan tabel yang berisi informasi tentang pasangan perdagangan. 2.7. output log dan keterlambatan

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

Keluarkan tabel dan waktu saat ini dalam bentuk log dan tunggu selama 5 detik untuk melanjutkan babak berikutnya.

Program ini memperoleh informasi harga real-time dari pasangan perdagangan melalui Binance API, kemudian menghitung fluktuasi harga, dan mengeluarkannya ke log dalam bentuk tabel. Program ini dijalankan dalam loop terus menerus untuk mewujudkan fungsi pemantauan real-time harga pasangan perdagangan. Perhatikan bahwa program ini mencakup pemrosesan pengecualian untuk memastikan bahwa eksekusi tidak terganggu oleh pengecualian saat mendapatkan informasi harga.

Live Trading Running Test (Pengujian Perdagangan Langsung)

img

Karena data hanya dapat dikumpulkan sedikit demi sedikit pada awalnya, tidak mungkin untuk menghitung fluktuasi harga secara bergulir tanpa mengumpulkan data yang cukup untuk jendela 4 jam. Oleh karena itu, harga awal digunakan sebagai dasar untuk perhitungan, dan setelah mengumpulkan data yang cukup selama 4 jam, data tertua akan dihilangkan untuk mempertahankan jendela 4 jam untuk perhitungan fluktuasi harga.

2. Periksa berbagai tingkat pendanaan penuh untuk kontrak Binance U-denominasi

Memeriksa tingkat pendanaan mirip dengan kode di atas, pertama-tama, kita perlu memeriksa dokumentasi API Binance untuk menemukan antarmuka terkait tingkat pendanaan. Binance memiliki beberapa antarmuka yang memungkinkan kita menanyakan tingkat dana, di sini kita mengambil antarmuka kontrak berdenominasi U sebagai contoh:

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

Implementasi Kode

Karena ada begitu banyak kontrak, kami mengekspor 10 tingkat pendanaan 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 sebagai berikut, dan periksa dokumentasi Binance, itu menunjukkan 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 coba perdagangan langsung:

img

Mendapatkan tingkat pembiayaan kontrak pertukaran OKX dari versi Python

Seorang pengguna telah meminta versi Python dari contoh, dan itu untuk pertukaran OKX. Berikut adalah contoh:

Data yang dikembalikan oleh antarmukahttps://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"
                } ...

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

Uji coba perdagangan langsung:

img

Penghentian

Contoh-contoh ini memberikan ide-ide desain dasar dan metode panggilan, proyek sebenarnya mungkin perlu membuat perubahan dan ekstensi yang sesuai berdasarkan kebutuhan spesifik.


Lebih banyak