FMZ定量化:仮想通貨市場の常用需要設計事例解析 (1)

作者: リン・ハーン小さな夢, 作成日:2023-12-17 18:43:46, 更新日:2023-12-18 09:46:16

img

仮想通貨資産取引の分野では,市場データ,問い合わせ率,および口座資産変動の監視を入手し,分析することが重要な操作である. 以下は,一般的なニーズへの実装方法のコードケースである.

1, 4 時間以内に最大値上がりした通貨を現金で入手するにはどうすればいいですか?

FMZで定量化取引戦略プログラムを書き出すとき,まず需要を分析する必要があります.

  • どのプログラミング言語でデザインを書くか プロジェクトでは,JavaScriptを使用する予定です.
  • 全通貨の現金市場データをリアルタイムに必要とする この需要を見て,最初のことは,Biankanの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"))
      
      取引対の現在の価格情報を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本位契約の全種資金料金を調べる

資金率の問い合わせのコードは上記のコードと類似している.まずは,資金率に関するインターフェースを見つけるためにBinanのAPIドキュメントを閲覧する必要があります.

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

返されたデータ構造は以下のとおりです. ファイナンスドキュメントを見てみると,lastFundingRateは,私たちが求めている資金の割合です.

{
    "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取引所の例として,Pythonのバージョンが必要な例が提示されています.

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

エンド

これらの例は,基本的なデザインアイデアや呼び出し方法を提供し,実際のプロジェクトでは,特定のニーズに応じて適切な変更や拡張が必要かもしれません. これらのコードが,暗号通貨のデジタル資産取引のさまざまなニーズをより良く満たすのに役立つことを願っています.


もっと

98K波段追跡_Long@モニタリングアカウントの資産変化の事例をできるだけ早く発表したい

98K波段追跡_Long賞賛

小さな夢素晴らしい,これは計画の中にあります.