리소스 로딩... 로딩...

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

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

FMZ Quant: An Analysis of Common Requirements Design Examples in the Cryptocurrency Market (I)

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

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. 데이터 구조
- 2. Main function main()
  2.1. Infinite loop

while (true) { / / }

The program continuously monitors the Binance API trading pair prices through an infinite loop.
  2.2. Get price information

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

Get the current price information of the trading pair via Binance API. If the return is not an array, wait for 5 seconds and retry.
  2.3. Update price data

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

Iterate through the array of obtained price information and update the data in dictSymbolsPrice. For each trading pair, add the current timestamp and price to the corresponding data array.
  2.4. Exception processing

잡으세요 로그 (e.name:, e.name, e.stack:, e.stack, e.message:, e.message) }

Catch exceptions and log the exception information to ensure that the program can continue to execute.
  2.5. Calculate the price fluctuations

(DictSymbolsPrice에 있는 var 기호) / / }

Iterate through dictSymbolsPrice, calculate the price fluctuations of each trading pair, and remove the earliest data if it is longer than 4 hours.
  2.6. Sort and generate tables

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

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

Sort the trading pairs in descending order of their price fluctuations and generate a table containing information about the trading pairs.
  2.7. Log output and delay

로그 상태 (LogStatus)" + JSON.stringify(tbl) + ") 수면 (5000)

Output the table and the current time in the form of a log and wait for 5 seconds to continue the next round of the loop.

The program obtains the real-time price information of the trading pair through Binance API, then calculates the price fluctuations, and outputs it to the log in the form of a table. The program is executed in a continuous loop to realize the function of real-time monitoring of the prices of trading pairs. Note that the program includes exception processing to ensure that the execution is not interrupted by exceptions when obtaining price information.

### Live Trading Running Test

![FMZ Quant: An Analysis of Common Requirements Design Examples in the Cryptocurrency Market (I)](/upload/asset/28e4c99554fea236762df.png)

Since data can only be collected bit by bit at the beginning, it is not possible to calculate the price fluctuations on a rolling basis without collecting enough data for a 4-hour window. Therefore, the initial price is used as the base for calculation, and after collecting enough data for 4 hours, the oldest data will be eliminated in order to maintain the 4-hour window for calculating the price fluctuations.

## 2. Check the full variety of funding rates for Binance U-denominated contracts
Checking the funding rate is similar to the above code, first of all, we need to check the Binance API documentation to find the funding rate related interface. Binance has several interfaces that allow us to query the rate of funds, here we take the interface of the U-denominated contract as an example:

GEThttps://fapi.binance.com/fapi/v1/premiumIndex

### Code Implementation
Since there are so many contracts, we're exporting the top 10 largest funding rates here.

함수 main() { while (true) { // GEThttps://fapi.binance.com/fapi/v1/premiumIndex시도해봐 var arr = JSON.parse ((HttpQuery))https://fapi.binance.com/fapi/v1/premiumIndex”)) if (!Array.isArray(arr)) { 수면 (5000) 계속해 }

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

}

The returned data structure is as follows, and check the Binance documentation, it shows that lastFundingRate is the funding rate we want.

기호:STMXUSDT 마크 가격: 0.00883606, 인덱스 가격: 0.00883074 평산결정 가격: 0.00876933, 지난금융비율: 0.00026573, 금리율: 0.00005000 다음금융시간:1702828800000, 시간: 1702816229000 }

Live trading running test:

![FMZ Quant: An Analysis of Common Requirements Design Examples in the Cryptocurrency Market (I)](/upload/asset/28d94562e5a8199b5446a.png)

### Getting OKX exchange contract funding rates of Python version
A user has asked for a Python version of the example, and it's for the OKX exchange. Here is an example:

The data returned by the interface ```https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1```:

코드:0 데이터:[ ♪ 금융시간:1702828800000, 금융자료 목록:[ ♪ instId: BTC-USDT-SWAP, 다음금융율: 0.0001102188733642, 분자금율:-0.00375, 금융율: 0.0000821861465884 최대금융율: 0.00375 }...

Specific code:

수입 요청 json를 가져오기 시간 수입 수면 날짜 시간부터 수입 시간

def main ((): while True: while True: while True: #https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1시도해보세요: 응답 = 요청.get(https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1”) arr = response.json (() [data][0][fundingList] 로그 (arr) 만약 그렇지 않다면 (arr, 목록): 잠자리 계속해

        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)

` 실시간 거래 실행 테스트:

FMZ Quant: An Analysis of Common Requirements Design Examples in the Cryptocurrency Market (I)

END

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


더 많은 내용