FMZ Quant: 암호화폐 시장에서 공통 요구 사항 디자인 예의 분석 (I)

저자:리디아, 창작: 2023-12-19 16:02:58, 업데이트: 2024-01-02 21:21:58

img

암호화폐 자산 거래 공간에서 시장 데이터를 얻고 분석하고, 쿼리율을 조사하고, 계정 자산 움직임을 모니터링하는 것은 모두 중요한 작업입니다. 아래는 몇 가지 일반적인 요구 사항에 대한 구현의 코드 예입니다.

1. 바이낸스 스팟에서 4시간 동안 가장 높은 상승률을 보이는 화폐를 얻는 코드를 어떻게 작성해야 할까요?

FMZ 플랫폼에서 양적 거래 전략 프로그램을 작성할 때, 요구 사항에 직면했을 때 가장 먼저 해야 할 일은 그것을 분석하는 것입니다. 그래서 요구 사항에 따라 우리는 다음과 같은 내용을 분석했습니다:

  • 어떤 프로그래밍 언어를 사용해야 할까요? 자바스크립트를 사용하여 구현할 계획입니다.
  • 모든 통화에서 실시간 스팟 코팅을 요구합니다. 요구사항을 봤을 때 첫 번째로 한 일은 Binance API 문서를 검색해서 집계된 코트가 있는지 확인하는 것이었습니다. 집계된 코트가 있는 것이 좋습니다. 하나씩 검색하는 것은 많은 작업입니다. 우리는 집계된 인용구 인터페이스를 찾았습니다.GET https://api.binance.com/api/v3/ticker/price- 그래요 FMZ 플랫폼에서,HttpQuery교환 틱어 인터페이스 (서명 없이 공개된 인터페이스) 를 액세스하는 기능
  • 4시간의 롤링 윈도우 기간 동안 데이터를 계산해야 합니다. 통계 프로그램의 구조를 설계하는 방법을 개념화하십시오.
  • 가격 변동을 계산하고 분류 가격 변동 알고리즘을 생각해보면,price fluctuations (%) = (current price - initial price) / initial price * 100%

문제를 해결하고 프로그램을 정의한 후 우리는 프로그램을 설계하는 일을 시작했습니다.

코드 설계

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

코드 분석

    1. 데이터 구조var dictSymbolsPrice = {}: 각 거래 쌍의 가격 정보를 저장하는 빈 객체. 키는 거래 쌍의 기호이며 값은 거래 쌍의 이름, 가격 데이터 배열 및 가격 변동에 대한 정보를 포함하는 객체입니다.
    1. 주요 기능 2.1. 무한 순환
while (true) {
    // ...
}

이 프로그램은 무궁무진한 루프를 통해 Binance API 거래 쌍 가격을 지속적으로 모니터링합니다. 2.2. 가격 정보를 얻으십시오

var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))

바이낸스 API를 통해 거래 쌍의 현재 가격 정보를 얻으십시오. 반환이 배열이 아닌 경우 5 초 동안 기다려 다시 시도하십시오. 2.3 가격 데이터를 업데이트

for (var i = 0; i < arr.length; i++) {
    // ...
}

얻은 가격 정보 배열을 통해 반복하고 dictSymbolsPrice에서 데이터를 업데이트합니다. 각 거래 쌍에 대해 해당 데이터 배열에 현재 시간표와 가격을 추가하십시오. 2.4 예외 처리

} catch(e) {
    Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
}

예외를 캡처하고 예외 정보를 로그하여 프로그램이 계속 실행될 수 있도록 합니다. 2.5. 가격 변동을 계산

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

dictSymbolsPrice를 통해 반복하여 각 거래 쌍의 가격 변동을 계산하고 4시간 이상 지속되는 경우 가장 오래된 데이터를 제거합니다. 2.6. 테이블을 정렬 및 생성

var entries = Object.entries(dictSymbolsPrice)
entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange)

for (var i = 0; i < entries.length; i++) {
    // ...
}

거래 쌍의 가격 변동 순서 하락 순서로 분류하고 거래 쌍에 대한 정보를 포함하는 테이블을 생성합니다. 2.7. 로그 출력 및 지연

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

테이블과 현재 시간을 로그 형태로 출력하고 다음 라운드를 계속하기 위해 5초 기다립니다.

이 프로그램은 바이낸스 API를 통해 거래 쌍의 실시간 가격 정보를 얻고, 그 다음 가격 변동을 계산하고 테이블 형태로 로그에 출력합니다. 이 프로그램은 거래 쌍의 가격을 실시간으로 모니터링하는 기능을 실현하기 위해 연속적인 루프에서 실행됩니다. 이 프로그램은 가격 정보를 얻는 경우 예외로 인해 실행이 중단되지 않도록 예외 처리를 포함하고 있습니다.

라이브 트레이딩 실행 테스트

img

데이터 수집은 초기에는 조금씩만 가능하기 때문에 4시간 분량의 데이터를 수집하지 않고서는 계속적으로 가격 변동을 계산할 수 없습니다. 따라서 초기 가격을 계산 기준으로 사용하고, 4시간 동안 충분한 데이터를 수집한 후 가장 오래된 데이터를 제거하여 가격 변동을 계산하는 4시간 분량을 유지합니다.

2. 바이낸스 U-DENOMINATED 계약에 대한 자금 조달 비율의 전체 범위를 확인

자금율 확인은 위의 코드와 비슷합니다. 우선 자금율 관련 인터페이스를 찾기 위해 Binance API 문서를 확인해야합니다. Binance는 자금율을 조회 할 수있는 여러 인터페이스를 가지고 있습니다.

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

코드 구현

계약이 너무 많기 때문에 우리는 10대 투자율을 여기에 수출합니다.

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

반환된 데이터 구조는 다음과 같습니다. 그리고 바이낸스 문서를 확인해보세요.

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

실시간 거래 실행 테스트:

img

파이썬 버전의 OKX 교환 계약금융율을 얻는

한 사용자가 파이썬 버전의 예제를 요청했고, OKX 교환용입니다. 다음은 예시입니다:

인터페이스에서 반환된 데이터https://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"
                } ...

특정 코드:

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)

실시간 거래 실행 테스트:

img

END

이 예제들은 기본적인 디자인 아이디어와 호출 방법을 제공하는데, 실제 프로젝트는 특정 필요에 따라 적절한 변경 및 확장 작업을 수행해야 할 수 있습니다. 이러한 코드가 암호화폐 디지털 자산 거래의 다양한 요구를 더 잘 충족시키는 데 도움이 될 수 있기를 바랍니다.


더 많은