Sumber daya yang dimuat... Pemuatan...

Kuantitas FMZ: Perbedaan antara permintaan umum pasar cryptocurrency dan contoh desain (1)

Penulis:Penemu Kuantitas - Mimpi Kecil, Dibuat: 2023-12-17 18:43:46, Diperbarui: 2024-11-06 21:18:36

img

Dalam bidang perdagangan aset cryptocurrency, mendapatkan dan menganalisis data pasar, tingkat permintaan, dan memantau perubahan aset akun adalah operasi penting. Berikut adalah contoh kode untuk beberapa kebutuhan umum.

1, bagaimana cara menulis mata uang dengan kenaikan terbesar dalam 4 jam untuk mendapatkan uang tunai?

Ketika menulis program strategi perdagangan kuantitatif di FMZ, kebutuhan yang dihadapi perlu dianalisis terlebih dahulu. Jadi berdasarkan kebutuhan, kami menganalisis beberapa hal berikut:

  • Bahasa pemrograman mana yang digunakan untuk membuat desain Perencanaan implementasi menggunakan Javascript.
  • Data pasar real-time untuk semua mata uang diperlukan Hal pertama yang kami lakukan adalah melihat dokumen API Binance untuk melihat apakah ada data pasar agregat (pasar agregat adalah yang terbaik, satu varietas, satu varietas). Di sini Anda dapat melihat beberapa situs web yang menawarkan layanan ini.GET https://api.binance.com/api/v3/ticker/priceSaya tidak tahu. Di FMZ, akses ke antarmuka pasar (antarmuka publik tanpa tanda tangan) digunakanHttpQueryFungsi tersebut.
  • Data yang dibutuhkan untuk menghitung siklus jendela bergulir selama 4 jam "Selama ini, kami telah mengembangkan strategi untuk membuat sistem statistik yang lebih efisien dan efisien.
  • Menghitung penurunan, mengurutkan Pertimbangkan apakah algoritma penurunan harga adalah:涨跌幅百分比 =(当前价格 - 初始价格)/ 初始价格 * 100, satuan adalah %.

Setelah memikirkan masalah dan menentukan solusinya, kami mulai merancang sendiri.

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

Menganalisis kode

    1. Struktur datavar dictSymbolsPrice = {}: objek kosong yang digunakan untuk menyimpan informasi harga untuk setiap pasangan perdagangan. Kunci adalah simbol pasangan perdagangan, nilai adalah objek yang berisi nama pasangan perdagangan, susunan data harga, dan informasi penurunan harga.
    1. Fungsi utama main (())
    • 2.1. Lingkaran tak terbatas
      while (true) {
          // ...
      }
      
      Program ini terus memantau harga transaksi pada API Binance melalui siklus tak terbatas.
    • 2.2. Mendapatkan informasi harga
      var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
      
      Mendapatkan informasi harga saat ini dari pasangan melalui API Binance. Jika yang dikembalikan bukan suatu aritmatika, tunggu 5 detik dan coba lagi.
    • 2.3 Pembaruan data harga
      for (var i = 0; i < arr.length; i++) {
          // ...
      }
      
      Melalui arsip informasi harga yang diperoleh, memperbarui data di dictSymbolsPrice. Untuk setiap pasangan transaksi, timestamp dan harga saat ini ditambahkan ke arsip data yang sesuai.
    • 2.4. Penanganan Keanehan
      } catch(e) {
          Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
      }
      
      Mengambil kesalahan dan mencatat informasi kesalahan untuk memastikan bahwa program dapat terus berjalan.
    • 2.5. Perhitungan penurunan margin
      for (var symbol in dictSymbolsPrice) {
          // ...
      }
      
      Melalui dictSymbolsPrice, perhitungkan penurunan margin untuk setiap pasangan perdagangan, dan hapus data tertua jika panjang data 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++) {
          // ...
      }
      
      Mengurutkan pasangan transaksi dari tinggi ke rendah sesuai dengan penurunan volatilitas dan menghasilkan tabel yang berisi informasi tentang pasangan transaksi.
    • 2.7. Ekspor dan penundaan log
      LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
      Sleep(5000)
      
      Mengekspor tabel dan waktu saat ini dalam bentuk log, dan menunggu 5 detik untuk melanjutkan siklus berikutnya.

Program ini memperoleh informasi harga real-time dari pasangan perdagangan melalui API Binance, kemudian menghitung penurunan, dan mengekspornya ke log dalam bentuk tabel. Program ini memiliki fungsi untuk memantau transaksi terhadap harga secara real-time melalui eksekusi looping. Perlu dicatat bahwa program ini mencakup penanganan keanehan untuk memastikan bahwa eksekusi tidak terganggu karena keanehan saat memperoleh informasi harga.

Pengujian berjalan pada cakram

img

Karena data hanya dikumpulkan sedikit demi sedikit pada awalnya, jika tidak dikumpulkan cukup data selama 4 jam, maka tidak mungkin untuk menghitung penurunan penurunan. Jadi, pada awalnya, harga awal dihitung sebagai acuan, dan setelah mengumpulkan cukup data selama 4 jam, data tertua dihapus secara berturut-turut untuk mempertahankan periode jendela 4 jam.

2. Carilah harga untuk semua jenis kontrak Binance U

Permintaan tingkat modal dan kode di atas mirip. Pertama, Anda perlu melihat dokumentasi API Binance untuk menemukan antarmuka yang terkait dengan tingkat modal.

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

Implementasi kode

Karena banyaknya kontrak, kami adalah salah satu dari sepuluh perusahaan yang paling tinggi dalam hal biaya ekspor.

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, melihat dokumen Binance menunjukkan bahwa Last Funding Rate adalah tingkat dana yang kita inginkan.

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

Percobaan berjalan pada hardisk:

img

Pendaftaran untuk versi python dari OKX

Ada pengguna yang mengajukan contoh yang membutuhkan versi Python, dan itu adalah OKX Exchange.

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 spesifik:

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)

Percobaan berjalan pada hardisk:

img

Penghentian

Contoh-contoh ini memberikan ide-ide desain dasar, metode panggilan, dan proyek-proyek yang sebenarnya mungkin perlu diubah dan diperluas sesuai dengan kebutuhan tertentu. Kami berharap kode ini dapat membantu Anda memenuhi kebutuhan yang lebih baik dalam perdagangan aset digital cryptocurrency.


Lebih banyak

Pelacakan 98K-band_LongKami berharap guru kecil Dream akan segera menemukan kasus perubahan aset akun @Monitoring.

Pelacakan 98K-band_LongPujian

Penemu Kuantitas - Mimpi KecilBaiklah, ini dalam rencana.