FMZ Quant: Phân tích các ví dụ thiết kế yêu cầu chung trong thị trường tiền điện tử (I)

Tác giả:Lydia., Tạo: 2023-12-19 16:02:58, Cập nhật: 2024-01-02 21:21:58

img

Trong không gian giao dịch tài sản tiền điện tử, thu thập và phân tích dữ liệu thị trường, truy vấn tỷ lệ và theo dõi chuyển động tài sản tài khoản đều là các hoạt động quan trọng.

Làm thế nào để tôi viết mã để có được đồng tiền tăng cao nhất trong 4 giờ trên Binance Spot?

Khi viết một chương trình chiến lược giao dịch định lượng trên nền tảng FMZ, điều đầu tiên bạn cần làm khi bạn gặp một yêu cầu là phân tích nó.

  • Tôi nên sử dụng ngôn ngữ lập trình nào? Kế hoạch là sử dụng JavaScript để thực hiện nó.
  • Yêu cầu báo giá tại chỗ trong thời gian thực trong tất cả các loại tiền tệ Điều đầu tiên chúng tôi đã làm khi chúng tôi thấy yêu cầu là tìm kiếm tài liệu API Binance để tìm hiểu xem có bất kỳ báo giá tổng hợp nào không (tốt nhất là có báo giá tổng hợp, nó là rất nhiều công việc để tìm kiếm từng cái một). Chúng tôi tìm thấy giao diện trích dẫn tổng hợp:GET https://api.binance.com/api/v3/ticker/price. Trên nền tảng FMZ, sử dụngHttpQuerychức năng để truy cập giao diện ticker trao đổi (công thức giao diện công khai không yêu cầu chữ ký).
  • Cần đếm dữ liệu cho một thời gian cửa sổ lăn 4 giờ Xác định khái niệm về cách thiết kế cấu trúc của chương trình thống kê.
  • Tính toán biến động giá và sắp xếp chúng Suy nghĩ về thuật toán biến động giá, nó là:price fluctuations (%) = (current price - initial price) / initial price * 100trong %.

Sau khi giải quyết vấn đề, cũng như xác định chương trình, 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)
        }
        
        // 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)
    }
}

Phân tích mã

    1. Cấu trúc dữ liệuvar dictSymbolsPrice = {}: Một đối tượng trống để lưu trữ thông tin giá cho mỗi cặp giao dịch. Chìa 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 về biến động giá.
    1. Chức năng chính 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 Binance API thông qua một vòng lặp vô hạn. 2.2. Tìm thông tin về giá cả

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 kết quả không phải là một mảng, chờ 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++) {
    // ...
}

Lặp lại thông 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, 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)
}

Bắt các ngoại lệ và ghi lại thông tin ngoại lệ để đảm bảo rằng chương trình có thể tiếp tục thực hiện. 2.5. Tính toán biến động giá

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

Lặp lại thông qua dictSymbolsPrice, tính biến động giá của mỗi cặp giao dịch và loại bỏ dữ liệu sớm nhất nếu dài hơn 4 giờ. 2.6. Loại 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++) {
    // ...
}

Loại các cặp giao dịch theo thứ tự giảm của biến động giá và tạo ra một bảng chứa thông tin về các cặp giao dịch. 2.7. Log output và delay

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

Tạo ra bảng và thời gian hiện tại dưới dạng nhật ký và chờ 5 giây để tiếp tục vòng lặp tiếp theo.

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

Kiểm tra hoạt động giao dịch trực tiếp

img

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

2. Kiểm tra đầy đủ các tỷ lệ tài trợ cho các hợp đồng được mệnh giá bằng U của Binance

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

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

Thực hiện mã

Vì có rất nhiều hợp đồng, chúng tôi đang xuất khẩu 10 tỷ lệ tài trợ lớn 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: "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)
    }
}

Cấu trúc dữ liệu được trả về như sau, và kiểm tra tài liệu Binance, nó cho thấy rằng lastFundingRate là tỷ lệ tài trợ mà chúng tôi muốn.

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

Thử nghiệm giao dịch trực tiếp:

img

Nhận được tỷ lệ tài trợ hợp đồng trao đổi OKX của phiên bản Python

Một người dùng đã yêu cầu một phiên bản Python của ví dụ, và nó là cho trao đổi OKX.

Dữ liệu được trả về bởi giao diệnhttps://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"
                } ...

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

Thử nghiệm giao dịch trực tiếp:

img

Kết thúc

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


Thêm nữa