FMZ Kuantitatif: Penyelesaian contoh reka bentuk permintaan biasa di pasaran mata wang kripto

Penulis:Mimpi kecil, Dicipta: 2023-12-17 18:43:46, Dikemas kini: 2023-12-18 09:46:16

img

Dalam bidang perdagangan aset mata wang kripto, mendapatkan dan menganalisis data pasaran, kadar pertanyaan, dan memantau perubahan aset akaun adalah operasi penting. Berikut adalah contoh kod untuk beberapa keperluan biasa.

1, bagaimana anda boleh menulis mata wang dengan kenaikan terbesar dalam masa 4 jam untuk mendapatkan wang tunai?

Dalam menulis program strategi dagangan kuantitatif di FMZ, keperluan yang dihadapi perlu dianalisis terlebih dahulu. Oleh itu, berdasarkan keperluan, kami menganalisis perkara berikut:

  • Bahasa pemrograman mana yang digunakan untuk menulis reka bentuk Perancangan untuk menggunakan Javascript.
  • Permintaan data pasaran tunai masa nyata untuk semua mata wang Perkara pertama yang kami lakukan untuk melihat permintaan ini adalah melihat dokumen API Binance untuk melihat sama ada terdapat data pasaran agregat (dengan pasaran agregat adalah yang terbaik, satu varieti, satu varieti memeriksa perbelanjaan). Periksa antara muka pasaran agregat:GET https://api.binance.com/api/v3/ticker/priceSaya tidak tahu. Penggunaan antara muka pasaran (antara muka awam tanpa tanda tangan) untuk mengakses bursa di FMZHttpQueryFungsi tersebut.
  • Data yang diperlukan untuk statistik kitaran tetingkap bergulir selama 4 jam Perancangan struktur untuk merancang program ini.
  • Mengira kejatuhan, susunan Berfikir tentang algoritma kenaikan dan penurunan adalah:涨跌幅百分比 =(当前价格 - 初始价格)/ 初始价格 * 100, satuan ialah %.

Setelah memikirkan masalah dan menentukan penyelesaian, kami mulakan proses reka bentuk sendiri.

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

Penguraian kod

    1. Struktur datavar dictSymbolsPrice = {}: objek kosong yang digunakan untuk menyimpan maklumat harga bagi setiap pasangan dagangan. Kunci adalah simbol pasangan dagangan, nilai adalah objek yang mengandungi nama pasangan dagangan, susunan data harga, dan maklumat kejatuhan.
    1. Fungsi utama main (())
    • 2.1. Lingkaran tanpa henti
      while (true) {
          // ...
      }
      
      Program ini terus memantau harga transaksi pada API Binance melalui gelung tanpa henti.
    • 2.2. Mendapatkan maklumat harga
      var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
      
      Mengambil maklumat mengenai harga semasa pasangan dagangan melalui API Binance. Jika yang dikembalikan bukan aritmatika, tunggu 5 saat dan cuba lagi.
    • 2.3 Mengemas kini data harga
      for (var i = 0; i < arr.length; i++) {
          // ...
      }
      
      Melalui matriks maklumat harga yang diperoleh, mengemas kini data di dictSymbolsPrice. Untuk setiap pasangan transaksi, senar masa dan harga semasa ditambahkan ke matriks data yang sesuai.
    • 2.4. Pengendalian Kelainan
      } catch(e) {
          Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
      }
      
      Mengambil ketidakselarasan dan merakam maklumat ketidakselarasan untuk memastikan program dapat terus dijalankan.
    • 2.5. Mengira kadar penurunan
      for (var symbol in dictSymbolsPrice) {
          // ...
      }
      
      Melalui dictSymbolsPrice, mengira penurunan margin untuk setiap pasangan dagangan, dan menghapuskan data terdahulu jika panjang data melebihi 4 jam.
    • 2.6. Mengurut dan menghasilkan 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 dari tinggi ke rendah mengikut penurunan kenaikan dan menghasilkan jadual yang mengandungi maklumat mengenai pasangan dagangan.
    • 2.7. Pengeluaran dan penangguhan log
      LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
      Sleep(5000)
      
      Mengeksport jadual dan masa semasa dalam bentuk log, dan menunggu 5 saat untuk meneruskan pusingan seterusnya.

Program ini memperoleh maklumat harga sebenar dari pasangan dagangan melalui API Binance, kemudian mengira penurunan dan outputnya ke log dalam bentuk jadual. Program ini mempunyai fungsi untuk memantau transaksi terhadap harga secara langsung melalui pelaksanaan berulang. Perlu diingat bahawa program ini mengandungi pemprosesan pengecualian untuk memastikan pelaksanaan tidak terganggu oleh pengecualian semasa mendapatkan maklumat harga.

Ujian berjalan pada cakera sebenar

img

Oleh kerana data hanya dikumpulkan sedikit demi sedikit pada mulanya, jika tidak dikumpulkan data yang mencukupi selama 4 jam, maka tidak boleh menggulirkan penurunan kenaikan harga. Oleh itu, pada mulanya, harga awal dikira sebagai penanda aras, dan setelah mengumpulkan data yang mencukupi selama 4 jam, data tertua dihapuskan secara berturut-turut untuk mengekalkan tempoh jendela 4 jam.

2. Cari harga untuk semua jenis kontrak Bitcoin U

Perbandingan antara permintaan kadar dana dan kod di atas adalah serupa, pertama sekali anda perlu melihat dokumen API Binance untuk mencari antara muka yang berkaitan dengan kadar dana. Binance mempunyai beberapa antara muka yang boleh meminta kadar dana, di sini kita menggunakan antara muka kontrak U-bit sebagai contoh:

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

Pelaksanaan kod

Oleh kerana kontrak terlalu banyak, kami di sini adalah 10 eksport terbesar dengan kadar modal yang tinggi.

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, anda dapat mengetahui Last Funding Rate adalah kadar dana yang kita mahukan.

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

Percubaan berjalan pada cakera sebenar:

img

Pertukaran kontrak mata wang untuk mendapatkan versi python

Pengguna telah mengemukakan contoh yang memerlukan versi Python, dan ini adalah pertukaran OKX.

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"
                } ...

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)

Percubaan berjalan pada cakera sebenar:

img

END

Contoh-contoh ini memberikan idea reka bentuk asas, kaedah panggilan, dan projek sebenar mungkin memerlukan perubahan dan pengembangan yang sesuai mengikut keperluan tertentu. Kami berharap kod ini dapat membantu anda memenuhi lebih baik pelbagai keperluan dalam perdagangan aset digital mata wang kripto.


Lebih lanjut

Pengesanan 98K-band_LongDiharap guru-guru kecil akan membuat contoh perubahan aset akaun @monitoring secepat mungkin.

Pengesanan 98K-band_LongPujian

Mimpi kecilBaiklah, ini dalam rancangan.