Tài nguyên đang được tải lên... tải...

FMZ định lượng: Các nhu cầu phổ biến của thị trường tiền điện tử

Tác giả:Những nhà phát minh định lượng - những giấc mơ nhỏ, Tạo: 2023-12-17 18:43:46, Cập nhật: 2024-11-06 21:18:36

img

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, tỷ lệ truy vấn và theo dõi sự thay đổi tài sản tài khoản là các hoạt động quan trọng. Dưới đây là các trường hợp mã để thực hiện một số nhu cầu phổ biến.

Một, làm thế nào để có được tiền mặt Bitcoin với mức tăng lớn nhất trong 4 giờ?

Khi viết các chương trình chiến lược giao dịch định lượng trên FMZ, nhu cầu cần được phân tích trước tiên.

  • Sử dụng ngôn ngữ nào để viết thiết kế Dự kiến sẽ sử dụng Javascript.
  • Cần có dữ liệu thị trường thời gian thực trên tất cả các đồng tiền Khi thấy nhu cầu này, điều đầu tiên chúng tôi làm là xem tài liệu API của Binance và xem liệu có dữ liệu về thị trường tổng hợp hay không (một thị trường tổng hợp là tốt nhất, một giống một giống). Các công ty này có thể tìm kiếm các giao diện giao dịch tổng hợp:GET https://api.binance.com/api/v3/ticker/price‖ Trên FMZ, truy cập giao diện giao dịch của sàn giao dịch (không yêu cầu chữ ký giao diện công cộng) được sử dụngHttpQueryChức năng.
  • Dữ liệu cần được thống kê trong vòng 4 giờ của cửa sổ cuộn Các nhà nghiên cứu đã đưa ra những ý tưởng về cách thiết kế cấu trúc của chương trình thống kê này.
  • Tính toán giá giảm, sắp xếp Hãy suy nghĩ về một thuật toán giảm giá là:涨跌幅百分比 =(当前价格 - 初始价格)/ 初始价格 * 100Đơn vị là %.

Sau khi giải quyết vấn đề và xác định giải pháp, chúng tôi bắt đầu thiết kế.

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ệuvar dictSymbolsPrice = {}: một đối tượng trống, được sử dụng để lưu trữ thông tin giá của mỗi cặp giao dịch. Chìa khóa là ký hiệu của cặp giao dịch, giá trị là một đối tượng, chứa tên của cặp giao dịch, mảng dữ liệu giá và thông tin giảm giá.
    1. Chức năng chính main (())
    • 2.1 Chuyển vòng vô hạn
      while (true) {
          // ...
      }
      
      Chương trình liên tục theo dõi giá giao dịch trên Binance API thông qua một vòng lặp vô hạn.
    • 2.2. Nhận thông tin về giá cả
      var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
      
      Nhận thông tin về giá hiện tại của cặp giao dịch thông qua API Binance. Nếu không phải là một mảng, hãy 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++) {
          // ...
      }
      
      Đi qua các mảng thông tin giá thu được, cập nhật dữ liệu trong dictSymbolsPrice. Đối với mỗi cặp giao dịch, các mảng thời gian và giá hiện tại được thêm vào mảng dữ liệu tương ứng.
    • 2.4. xử lý bất thường
      } catch(e) {
          Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
      }
      
      Khám phá sự bất thường và ghi lại thông tin bất thường để đảm bảo chương trình có thể tiếp tục thực hiện.
    • 2.5 Tính toán mức giảm giá
      for (var symbol in dictSymbolsPrice) {
          // ...
      }
      
      Đi qua dictSymbolsPrice, tính toán mức giảm giá của mỗi 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. 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++) {
          // ...
      }
      
      Xác định các cặp giao dịch từ cao đến thấp theo mức giảm giá và tạo ra một bảng chứa thông tin về các cặp giao dịch.
    • 2.7. Xuất và trì hoãn nhật ký
      LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
      Sleep(5000)
      
      Xuất ra biểu mẫu 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 lấy thông tin giá thời gian thực của các cặp giao dịch thông qua API Binance, sau đó tính giá giảm và xuất ra sổ đăng ký dưới dạng bảng. Chương trình thực hiện chức năng giám sát giá giao dịch trong thời gian thực bằng cách chạy liên tục. Lưu ý rằng chương trình có xử lý ngoại lệ để đảm bảo không bị gián đoạn khi lấy thông tin giá.

Kiểm tra chạy đĩa thật

img

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

2. Tìm kiếm các khoản phí cho tất cả các hợp đồng tại Binance U

Tìm kiếm tỷ lệ vốn và các mã trên tương tự nhau. Đầu tiên, bạn cần xem tài liệu API của Binance để tìm giao diện liên quan đến tỷ lệ vốn.

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

Thực hiện mã

Vì có quá nhiều hợp đồng, chúng tôi đã xuất khẩu 10 khoản đầu tư 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: "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ác cấu trúc dữ liệu được trả về như sau: Xem tài liệu của Binance và bạn sẽ thấy LastFundingRate là tỷ lệ vốn 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 chạy trên đĩa thật:

img

Phiên bản python của OKX được truy cập trên sàn giao dịch

Một người dùng đã đề xuất một ví dụ về việc cần phiên bản Python, và đó là OKX.

https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1Dữ liệu được trả về bởi 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)

Thử nghiệm chạy trên đĩa thật:

img

Kết thúc

Những ví dụ này cung cấp những ý tưởng thiết kế cơ bản, các phương pháp gọi, các dự án thực tế có thể cần sửa đổi và mở rộng phù hợp với nhu cầu cụ thể. Hy vọng các mã này sẽ 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

98K-band tracking_LongMong rằng giáo viên Chị Mộng sẽ sớm đưa ra một trường hợp về sự thay đổi tài sản của tài khoản @Monitoring.

98K-band tracking_LongCảm ơn

Những nhà phát minh định lượng - những giấc mơ nhỏĐược rồi, đó là trong kế hoạch.