FMZ Quant: 仮想通貨市場における共通要件設計例の分析 (I)

作者: リン・ハーンリディア, 作成日:2023-12-19 16:02:58, 更新日:2024-01-02 21:21:58

img

仮想通貨資産取引領域では,市場データを取得し分析し,クエリ率を問いかける,アカウント資産の動きを監視することはすべて重要な操作である.以下は,いくつかの一般的な要件のための実装のコード例である.

1 バイナンススポットで4時間以内に最も上昇した通貨を得るためのコードをどのように書くか?

FMZプラットフォームで定量的な取引戦略プログラムを書き出すとき,まず必要なことは,要件を分析することです. したがって,要件に基づいて,私たちは以下の内容を分析しました:

  • どのプログラミング言語を使うか? 計画では JavaScript を使って実装します
  • すべての通貨でリアルタイムで現金引金を要求する. Binance APIのドキュメントを検索して 集計されたコートがあるかどうか調べました (集計されたコートがある方が良いです. 一つずつ調べるのは大変です) 集計された引数インターフェースを見つけましたGET https://api.binance.com/api/v3/ticker/price- わかった FMZのプラットフォームでは,HttpQueryExchange ticker インターフェイス (署名を必要としない公開インターフェイス) にアクセスする機能.
  • 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"))

取引ペアの現在の価格情報をBinance 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秒待ってループの次のラウンドを続けます

このプログラムは,取引ペアのリアルタイム価格情報をBinance APIを通じて取得し,その後価格変動を計算し,テーブル形式でログに出力します. プログラムは,取引ペアの価格のリアルタイムモニタリングの機能を実現するために連続ループで実行されます. プログラムには,価格情報を取得する際に例外によって実行が中断されないようにするために例外処理が含まれていることに注意してください.

ライブ・トレード・ランニング・テスト

img

データが最初は少しずつ収集できるため,4時間間の値引きに十分なデータを収集しない限り,価格変動をローリングベースで計算することは不可能である.したがって,初期価格が計算のベースとして使用され,4時間間の十分なデータを収集した後,最も古いデータは削除され,価格変動を計算する4時間の値引きを維持する.

2. ビナンス U 単位で決済された契約の資金提供料の全範囲をチェック

資金のレートをチェックすることは上記のコードに似ている.まず,資金のレートに関連するインターフェースを見つけるためにBinance APIドキュメントをチェックする必要があります.Binanceには資金のレートをクエリできるいくつかのインターフェースがあります.ここで,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: "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

Python バージョンの OKX 交換契約の資金提供率を取得

ユーザが Python 版の例を求めているので,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

エンド

これらの例は基本的な設計アイデアと呼び出し方法を提供します.実際のプロジェクトは,特定のニーズに基づいて適切な変更と拡張を行う必要があります.これらのコードが暗号通貨デジタル資産取引のさまざまなニーズをよりよく満たすのに役立ちます.


もっと