avatar of 发明者量化-小小梦 发明者量化-小小梦
tập trung vào tin nhắn riêng tư
4
tập trung vào
1271
Người theo dõi

FMZ Quantification: Phân tích các ví dụ thiết kế nhu cầu phổ biến trong thị trường tiền điện tử (I)

Được tạo ra trong: 2023-12-17 18:43:46, cập nhật trên: 2024-11-06 21:18:36
comments   3
hits   1814

FMZ Quantification: Phân tích các ví dụ thiết kế nhu cầu phổ biến trong thị trường tiền điện tử (I)

Trong lĩnh vực giao dịch tài sản tiền điện tử, việc thu thập và phân tích dữ liệu thị trường, truy vấn tỷ giá và theo dõi những thay đổi về tài sản trong tài khoản đều là những hoạt động quan trọng. Sau đây là các ví dụ mã để thực hiện một số yêu cầu phổ biến.

1. Làm thế nào để viết mã hiển thị mức tăng lớn nhất trong giao dịch giao ngay trên Binance trong vòng 4 giờ?

Khi viết chương trình chiến lược giao dịch định lượng trên FMZ, trước tiên bạn cần phân tích các yêu cầu. Vì vậy, theo nhu cầu, chúng tôi phân tích các điểm sau:

  • Ngôn ngữ lập trình nào được sử dụng để viết thiết kế? Kế hoạch triển khai sử dụng Javascript.
  • Cần dữ liệu thị trường giao ngay theo thời gian thực cho tất cả các loại tiền tệ Khi chúng tôi thấy yêu cầu này, điều đầu tiên chúng tôi làm là xem qua tài liệu API của Binance để xem có dữ liệu thị trường tổng hợp nào không (dữ liệu thị trường tổng hợp sẽ là tốt nhất, vì sẽ tốn thời gian và công sức để kiểm tra từng sản phẩm một) một). Truy vấn giao diện thông tin thị trường tổng hợp:GET https://api.binance.com/api/v3/ticker/price。 Trên FMZ, truy cập giao diện báo giá trao đổi (giao diện công khai không yêu cầu chữ ký) bằng cách sử dụngHttpQuerychức năng.
  • Cần phải đếm dữ liệu của chu kỳ cửa sổ lăn 4 giờ Hãy suy nghĩ về cách xây dựng chương trình thống kê này.
  • Tính toán sự tăng giảm, sắp xếp Hãy nghĩ về thuật toán tăng và giảm, nó là:涨跌幅百分比 =(当前价格 - 初始价格)/ 初始价格 * 100, đơn vị là “%”.

Hãy suy nghĩ kỹ về vấn đề và đưa ra giải pháp. Chúng tôi bắt đầu thiết kế chương trình.

Thiết kế mã

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

Phân tích mã

  • 1. Cấu trúc dữ liệu var dictSymbolsPrice = {}: Một đối tượng rỗng dùng để lưu trữ thông tin giá cho từng cặp giao dịch. Khóa là biểu tượng của cặp giao dịch và giá trị là một đối tượng chứa tên của cặp giao dịch, một mảng dữ liệu giá và thông tin thay đổi.

    1. Hàm chính main()
    • 2.1. Vòng lặp vô hạn
    while (true) {
        // ...
    }
    

    Chương trình liên tục theo dõi giá cặp giao dịch của Binance API thông qua một vòng lặp vô hạn.

    • 2.2. Nhận thông tin giá
    var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
    

    Nhận thông tin giá hiện tại của cặp giao dịch thông qua Binance API. Nếu giá trị trả về không phải là một mảng, hãy đợi 5 giây và thử lại.

    • 2.3. Cập nhật dữ liệu giá
    for (var i = 0; i < arr.length; i++) {
        // ...
    }
    

    Duyệt qua mảng thông tin giá thu được và cập nhật dữ liệu trong dictSymbolsPrice. Đối với mỗi cặp giao dịch, hãy thêm dấu thời gian và giá hiện tại vào mảng dữ liệu tương ứng.

    • 2.4. Xử lý ngoại lệ
    } catch(e) {
        Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
    }
    

    Phát hiện ngoại lệ và ghi lại thông tin ngoại lệ để đảm bảo chương trình có thể tiếp tục thực thi.

    • 2.5. Tính toán sự tăng hoặc giảm
    for (var symbol in dictSymbolsPrice) {
        // ...
    }
    

    Duyệt dictSymbolsPrice, tính toán mức tăng hoặc giảm của từng cặp giao dịch và xóa dữ liệu sớm nhất nếu độ dài dữ liệu vượt quá 4 giờ.

    • 2.6. Sắp xếp và tạo bảng
    var entries = Object.entries(dictSymbolsPrice)
    entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange)
    
    
    for (var i = 0; i < entries.length; i++) {
        // ...
    }
    

    Sắp xếp các cặp giao dịch theo mức tăng hoặc giảm từ cao đến thấp và tạo bảng chứa thông tin về cặp giao dịch.

    • 2.7. Đầu ra nhật ký và độ trễ
    LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
    Sleep(5000)
    

    Xuất bảng và thời gian hiện tại dưới dạng nhật ký và đợi 5 giây trước khi tiếp tục chu kỳ tiếp theo.

Chương trình thu thập thông tin giá theo thời gian thực của cặp giao dịch thông qua Binance API, sau đó tính toán mức tăng hoặc giảm và xuất ra nhật ký dưới dạng bảng. Chương trình được thực hiện theo vòng lặp liên tục để đạt được chức năng theo dõi giá cặp giao dịch theo thời gian thực. Cần lưu ý rằng chương trình bao gồm chức năng xử lý ngoại lệ để đảm bảo việc thực thi không bị gián đoạn do các ngoại lệ khi lấy thông tin giá.

Kiểm tra hoạt động đĩa thực tế

FMZ Quantification: Phân tích các ví dụ thiết kế nhu cầu phổ biến trong thị trường tiền điện tử (I)

Vì dữ liệu chỉ có thể được thu thập từng bit một khi bắt đầu nên không thể tính toán được mức tăng và giảm liên tục nếu không thu thập đủ dữ liệu trong 4 giờ. Do đó, lúc đầu, giá ban đầu được sử dụng làm chuẩn mực để tính toán. Sau khi thu thập đủ dữ liệu trong 4 giờ, dữ liệu cũ nhất sẽ được loại bỏ từng cái một để duy trì khoảng thời gian cửa sổ 4 giờ để tính toán mức tăng và giảm.

2. Kiểm tra tỷ lệ tài trợ của tất cả các hợp đồng tương lai Binance U-margin

Truy vấn tỷ lệ tài trợ tương tự như mã trên. Trước tiên, bạn cần kiểm tra tài liệu API của Binance để tìm giao diện liên quan đến tỷ lệ tài trợ. Binance có một số giao diện để truy vấn tỷ lệ tài trợ. Ở đây chúng tôi lấy giao diện của hợp đồng dựa trên U làm ví dụ:

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

Triển khai mã

Vì có quá nhiều hợp đồng nên chúng tôi sẽ đưa ra mười hợp đồng có tỷ lệ tài trợ cao nhất ở đây.

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

Cấu trúc dữ liệu trả về như sau. Từ tài liệu Binance, chúng ta có thể thấy lastFundingRate là tỷ lệ tài trợ mà chúng ta muốn.

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

Kiểm tra hoạt động của đĩa thực tế:

FMZ Quantification: Phân tích các ví dụ thiết kế nhu cầu phổ biến trong thị trường tiền điện tử (I)

Phiên bản Python để lấy tỷ lệ tài trợ hợp đồng trao đổi OKX

Một người dùng đã đề cập rằng cần có phiên bản Python và phiên bản này đến từ sàn giao dịch OKX. Nhân tiện cũng thực hiện như sau:

https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1Dữ liệu trả về từ giao diện:

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

Mã cụ thể:

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)

Kiểm tra hoạt động của đĩa thực tế:

FMZ Quantification: Phân tích các ví dụ thiết kế nhu cầu phổ biến trong thị trường tiền điện tử (I)

END

Những ví dụ này cung cấp ý tưởng thiết kế cơ bản và phương pháp gọi. Trong các dự án thực tế, có thể cần phải sửa đổi và mở rộng phù hợp dựa trên nhu cầu cụ thể. Tôi hy vọng những mã này có thể giúp bạn đáp ứng tốt hơn các nhu cầu khác nhau của mình trong giao dịch tài sản kỹ thuật số tiền điện tử.