avatar of 发明者量化-小小梦 发明者量化-小小梦
Suivre Messages privés
4
Suivre
1271
Abonnés

Quantification FMZ : Analyse d'exemples courants de conception de la demande sur le marché des cryptomonnaies (I)

Créé le: 2023-12-17 18:43:46, Mis à jour le: 2024-11-06 21:18:36
comments   3
hits   1811

Quantification FMZ : Analyse d’exemples courants de conception de la demande sur le marché des cryptomonnaies (I)

Dans le domaine du trading d’actifs de crypto-monnaie, l’obtention et l’analyse des données de marché, l’interrogation des taux et la surveillance des variations des actifs du compte sont toutes des opérations clés. Voici des exemples de code permettant d’implémenter certaines exigences courantes.

1. Comment écrire le code pour obtenir la devise avec la plus forte augmentation sur Binance spot en 4 heures ?

Lorsque vous rédigez un programme de stratégie de trading quantitatif sur FMZ, vous devez d’abord analyser les exigences. Ainsi, en fonction des besoins, nous analysons les points suivants :

  • Quel langage de programmation est utilisé pour écrire la conception Mise en œuvre prévue à l’aide de Javascript.
  • Besoin de données de marché au comptant en temps réel pour toutes les devises Lorsque nous avons vu cette exigence, la première chose que nous avons faite a été de parcourir la documentation de l’API de Binance pour voir s’il y avait des données de marché agrégées (des données de marché agrégées seraient les meilleures, car il serait long et laborieux de vérifier chaque produit un par un). un). Interroger l’interface d’informations agrégées sur le marché :GET https://api.binance.com/api/v3/ticker/price。 Sur FMZ, accédez à l’interface de cotation boursière (interface publique qui ne nécessite pas de signature) en utilisantHttpQueryfonction.
  • Il faut compter les données de la période de fenêtre glissante de 4 heures Réfléchissez à la manière de structurer ce programme statistique.
  • Calculer la montée et la descente, trier Pensez à l’algorithme de montée et de descente, est-ce :涨跌幅百分比 =(当前价格 - 初始价格)/ 初始价格 * 100, l’unité est « % ».

Réfléchissez au problème et décidez d’une solution. Nous avons commencé à concevoir le programme.

Conception de code

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

Analyse de code

  • 1. Structure des données var dictSymbolsPrice = {}:Un objet vide utilisé pour stocker les informations de prix pour chaque paire de trading. La clé est le symbole de la paire de trading et la valeur est un objet contenant le nom de la paire de trading, un tableau de données de prix et des informations de changement.

    1. Fonction principale main()
    • 2.1. Boucle infinie
    while (true) {
        // ...
    }
    

    Le programme surveille en permanence les prix des paires de trading de l’API Binance via une boucle infinie.

    • 2.2. Obtenir des informations sur les prix
    var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
    

    Obtenez les informations de prix actuelles de la paire de trading via l’API Binance. Si la valeur renvoyée n’est pas un tableau, attendez 5 secondes et réessayez.

    • 2.3. Mettre à jour les données de prix
    for (var i = 0; i < arr.length; i++) {
        // ...
    }
    

    Parcourez le tableau d’informations de prix obtenu et mettez à jour les données dans dictSymbolsPrice. Pour chaque paire de trading, ajoutez l’horodatage et le prix actuels au tableau de données correspondant.

    • 2.4. Gestion des exceptions
    } catch(e) {
        Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
    }
    

    Capturez les exceptions et enregistrez les informations sur les exceptions pour garantir que le programme peut continuer à s’exécuter.

    • 2.5. Calculer l’augmentation ou la diminution
    for (var symbol in dictSymbolsPrice) {
        // ...
    }
    

    Parcourez dictSymbolsPrice, calculez l’augmentation ou la diminution de chaque paire de trading et supprimez les données les plus anciennes si la longueur des données dépasse 4 heures.

    • 2.6. Tri et génération de tableaux
    var entries = Object.entries(dictSymbolsPrice)
    entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange)
    
    
    for (var i = 0; i < entries.length; i++) {
        // ...
    }
    

    Triez les paires de trading en fonction de leur augmentation ou de leur diminution du plus élevé au plus bas et générez un tableau contenant les informations sur les paires de trading.

    • 2.7. Sortie du journal et délai
    LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
    Sleep(5000)
    

    Affichez le tableau et l’heure actuelle sous forme de journal et attendez 5 secondes avant de passer au cycle suivant.

Le programme obtient les informations de prix en temps réel de la paire de trading via l’API Binance, puis calcule l’augmentation ou la diminution et les envoie au journal sous la forme d’un tableau. Le programme est exécuté en boucle continue pour réaliser la fonction de surveillance en temps réel des prix des paires de transactions. Il convient de noter que le programme inclut une gestion des exceptions pour garantir que l’exécution ne soit pas interrompue en raison d’exceptions lors de l’obtention d’informations sur les prix.

Test de fonctionnement du disque réel

Quantification FMZ : Analyse d’exemples courants de conception de la demande sur le marché des cryptomonnaies (I)

Étant donné que les données ne peuvent être collectées que bit par bit au début, il est impossible de calculer la hausse et la baisse sur une base continue si suffisamment de données n’ont pas été collectées pour 4 heures. Par conséquent, au début, le prix initial est utilisé comme référence pour le calcul. Après avoir collecté suffisamment de données pendant 4 heures, les données les plus anciennes sont éliminées une par une pour maintenir une fenêtre de 4 heures pour le calcul de la hausse et de la baisse.

2. Vérifiez les taux de financement de tous les contrats à terme Binance U-margin

L’interrogation du taux de financement est similaire au code ci-dessus. Tout d’abord, vous devez consulter la documentation de l’API de Binance pour trouver l’interface liée au taux de financement. Binance dispose de plusieurs interfaces permettant d’interroger les taux de financement. Nous prenons ici l’interface des contrats basés sur U comme exemple :

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

Implémentation du code

Comme il y a trop de contrats, nous présentons ici les dix premiers avec les taux de financement les plus élevés.

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

La structure de données renvoyée est la suivante. À partir de la documentation Binance, nous pouvons voir que lastFundingRate est le taux de financement que nous souhaitons.

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

Test de fonctionnement du disque réel :

Quantification FMZ : Analyse d’exemples courants de conception de la demande sur le marché des cryptomonnaies (I)

Version Python pour obtenir le taux de financement du contrat d’échange OKX

Un utilisateur a mentionné qu’une version Python est nécessaire, et elle provient de l’échange OKX. Ici aussi, c’est implémenté d’ailleurs :

https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1Données renvoyées par l’interface :

{
    "code":"0",
    "data":[
        {
            "fundingTime":1702828800000,
            "fundingList":[
                {
                    "instId":"BTC-USDT-SWAP",
                    "nextFundingRate":"0.0001102188733642",
                    "minFundingRate":"-0.00375",
                    "fundingRate":"0.0000821861465884",
                    "maxFundingRate":"0.00375"
                } ...

Code spécifique :

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)

Test de fonctionnement du disque réel :

Quantification FMZ : Analyse d’exemples courants de conception de la demande sur le marché des cryptomonnaies (I)

END

Ces exemples fournissent des idées de conception de base et des méthodes d’appel. Dans les projets réels, des modifications et des extensions appropriées peuvent être nécessaires en fonction des besoins spécifiques. J’espère que ces codes pourront vous aider à mieux répondre à vos différents besoins en matière de trading d’actifs numériques de crypto-monnaie.