FMZ 정량화: 암호화폐 시장의 일반적인 요구 디자인 사례 분석 (1)

저자:작은 꿈, 창작: 2023-12-17 18:43:46, 업데이트: 2023-12-18 09:46:16

img

암호화폐 자산 거래 분야에서 시장 데이터, 쿼리 요금, 그리고 계정 자산 변화 모니터링을 획득하고 분석하는 것이 핵심적인 작업이다. 다음은 몇 가지 일반적인 요구를 구현하는 방법의 코드 사례이다.

1, 4시간 동안 가장 큰 상승세를 기록한 동전을 어떻게 써야 할까요?

FMZ에서 양적 거래 전략 프로그램을 작성할 때, 요구사항을 먼저 분석해야 합니다. 따라서 요구사항에 따라 다음을 분석합니다.

  • 어떤 프로그래밍 언어를 사용하여 디자인을 작성하세요? 자바스크립트를 사용하기로 계획되어 있습니다.
  • 모든 화폐에 대한 실시간 현금 시장 데이터 이 필요성을 본 첫 번째 일은 Binance의 API 문서를 살펴보고 통합 시장 데이터가 있는지 확인하는 것입니다. 이 사이트의 경우, 이 사이트의 경우,GET https://api.binance.com/api/v3/ticker/priceᅳ FMZ에서 거래소의 거래 인터페이스 (신명 없이 공개된 인터페이스) 를 사용HttpQuery이 함수들은
  • 4시간의 스크롤 윈도우 주기를 통계적으로 계산해야 합니다. 이 통계자료의 구조를 어떻게 설계할 것인가에 대한 개념.
  • 하락을 계산하고 정렬합니다. 이 알고리즘은 다음과 같은 것을 고려합니다.涨跌幅百分比 =(当前价格 - 初始价格)/ 初始价格 * 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)
        }
        
        // 计算涨跌幅
        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)
    }
}

코드 해독

    1. 데이터 구조var dictSymbolsPrice = {}: 각 거래 쌍의 가격 정보를 저장하는 빈 객체. 키는 거래 쌍의 기호이며, 값은 거래 쌍의 이름, 가격 데이터 배열 및 유동 부진 정보를 포함하는 객체이다.
    1. 주 함수 main ((()
    • 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++) {
          // ...
      }
      
      검색된 가격 정보 배열을 탐색하고, diktsymbolsPrice의 데이터를 업데이트한다. 각 거래 쌍에 대해, 현재 시간대와 가격을 해당 데이터 배열에 추가한다.
    • 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초 후에 다음 라운드를 계속합니다.

이 프로그램은 Binance API를 통해 거래 쌍에 대한 실시간 가격 정보를 얻고, 그 후 오차를 계산하고, 테이블 형태로 로그에 출력합니다. 이 프로그램은 지속적인 루핑 실행을 통해 거래에 대한 가격의 실시간 모니터링 기능을 구현합니다. 이 프로그램은 가격 정보를 획득하는 동안 이상으로 중단되지 않도록 예외 처리를 포함한다는 점에 유의해야합니다.

실제 디스크 실행 테스트

img

초기에는 데이터가 조금씩 수집되기 때문에, 충분한 4시간의 데이터가 수집되지 않을 때, 회전할 수 없는 계산 하락이다. 그래서 초기에는 초기 가격으로 기준으로 계산하고, 충분한 4시간의 데이터를 수집한 후, 4시간 창 기간을 유지하기 위해 가장 오래된 데이터를 순차적으로 삭제한다.

2 금융권 본인 계약에 대한 모든 종류의 기금 요금을 문의하십시오

이 코드는 이보다 더 큰 크기를 가지고 있습니다. 이 코드는 Bitcoin의 API 문서를 참조하여 이 코드에 대한 인터페이스를 찾을 수 있습니다. 이 코드는 U-비트 계약의 인터페이스를 사용하여 이 코드에 대한 인터페이스를 찾을 수 있습니다.

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

이 자료의 구조는 다음과 같습니다. 이 자료를 살펴보면, Last Funding Rate가 우리가 원하는 기금 비율입니다.

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

실제 디스크 실행 테스트:

img

python 버전의 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": "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)

실제 디스크 실행 테스트:

img

END

이 예시들은 기본적인 디자인 아이디어와 실제 프로젝트에서 특정 요구에 따라 적절한 수정 및 확장이 필요할 수 있는 호출 방법을 제공합니다. 이 코드가 암호화폐 디지털 자산 거래의 다양한 요구를 더 잘 충족시키는 데 도움이 될 것으로 기대됩니다.


더 많은

98K-파운드 추적_Long@모니토리언 계정 자산 변화 사례를 조만간 발표할 것을 기대합니다.

98K-파운드 추적_Long찬사를 드립니다.

작은 꿈이 모든 것이 계획에 포함되어 있습니다.