Quantification FMZ: analyse de l'exemple de conception des besoins courants sur le marché des crypto-monnaies (1)

Auteur:Le petit rêve, Créé à partir de: 2018-12-17 18:43:46, Mis à jour à partir de: 2018-12-18 09:46:16

img

Dans le domaine de la négociation d'actifs cryptographiques, l'acquisition et l'analyse des données du marché, des taux de consultation et la surveillance des changements d'actifs des comptes sont des opérations essentielles. Voici des cas de code pour certaines exigences courantes.

1 Comment écrire la devise qui a connu la plus forte hausse en 4 heures pour obtenir le Bitcoin en espèces?

Lorsque vous écrivez une stratégie de trading quantitative sur FMZ, vous devez d'abord analyser les besoins rencontrés.

  • Quel langage de programmation utilisez-vous pour écrire une conception? Il est prévu d'utiliser Javascript.
  • Il faut des données de marché en temps réel sur toutes les devises La première chose que nous avons faite en voyant cette demande est de jeter un coup d'œil à la documentation de l'API de Binance pour voir si les données sur le marché sont agrégées (le marché agrégé est le meilleur, une variété par variété). Pour consulter l'interface du marché de l'agrégation:GET https://api.binance.com/api/v3/ticker/priceJe ne sais pas. Utilisation de l'interface de marché (interface publique sans signature) pour accéder à l'échange sur FMZHttpQueryLes fonctions.
  • Il faut compter les quatre heures de cycles de la fenêtre. La conception de la structure de la conception de ce programme statistique.
  • Calculer la chute de la marque, trier Il y a une différence entre les algorithmes de la baisse de prix et les algorithmes de la baisse de prix.涨跌幅百分比 =(当前价格 - 初始价格)/ 初始价格 * 100L'unité de mesure est %.

Après avoir réfléchi au problème et déterminé la solution, nous avons commencé le processus de conception manuelle.

La conception du 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)
    }
}

Déchiffrer le code

    1. Structure des donnéesvar dictSymbolsPrice = {}: un objet vide, utilisé pour stocker des informations de prix pour chaque paire de transactions. La clé est le symbole de la paire de transactions, la valeur est un objet qui contient le nom de la paire de transactions, l'ensemble des données de prix et les informations de baisse de prix.
    1. Fonction principale main (())
    • 2.1. Cycles sans fin
      while (true) {
          // ...
      }
      
      Le programme surveille en permanence les prix des transactions dans l'API Binance à travers 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 des informations sur le prix actuel de la paire de transactions via l'API Binance. Si ce n'est pas une arithmétique, attendez 5 secondes et réessayez.
    • 2.3 Mettre à jour les prix
      for (var i = 0; i < arr.length; i++) {
          // ...
      }
      
      Parcourez les ensembles d'informations sur les prix obtenus et mettez à jour les données de dictSymbolsPrice. Pour chaque paire de transactions, ajoutez le temps et le prix actuels à l'ensemble de données correspondant.
    • 2.4. Traitement des anomalies
      } catch(e) {
          Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
      }
      
      Capturez les anomalies et enregistrez les informations d'anomalie pour s'assurer que le programme peut continuer à fonctionner.
    • 2.5. Calcul de la baisse de la marge
      for (var symbol in dictSymbolsPrice) {
          // ...
      }
      
      Parcourir le dictSymbolsPrice, calculer la baisse de couleur de chaque paire de transactions et supprimer les données les plus anciennes si la durée des données est supérieure à 4 heures.
    • 2.6. Sortir et générer des tableaux
      var entries = Object.entries(dictSymbolsPrice)
      entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange)
      
      for (var i = 0; i < entries.length; i++) {
          // ...
      }
      
      Sortir les paires de transactions de haut en bas en fonction de la chute de l'ancrage et générer un tableau contenant des informations sur les paires de transactions.
    • 2.7. Exportation et report des journaux
      LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
      Sleep(5000)
      
      Exporter la table et l'heure actuelle sous forme de journal et attendre 5 secondes avant de poursuivre le cycle suivant.

Le programme obtient des informations sur les prix en temps réel des paires de transactions via l'API Binance, puis calcule les dépréciations et les exporte dans les journaux sous forme de tableaux. Le programme permet de surveiller en temps réel les prix des transactions en exécutant des cycles constants.

Test de fonctionnement du disque

img

Comme les données ne peuvent être collectées qu'un peu à la fois au début, il est impossible de calculer la chute de l'échelle sans avoir collecté suffisamment de données pendant 4 heures.

2°, consultez les tarifs de financement pour toutes les variétés de contrats sur le site de Binance

La première chose à faire est de consulter la documentation de l'API de Binance pour trouver l'interface correspondant au taux de change.

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

Mise en œuvre du code

Nous sommes dans le top 10 des exportateurs les plus rentables car nous avons trop de contrats.

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: le dernier taux de financement est le taux de financement que nous voulons.

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

Les tests sont effectués sur disque:

img

Les taux de financement des contrats d'échange OKX pour les versions de python

Un utilisateur a proposé un exemple de version Python, et c'est OKX.

https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1Les donné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"
                } ...

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

Les tests sont effectués sur disque:

img

Résultats

Ces exemples fournissent des idées de conception de base, des méthodes d'appel et des modèles qui peuvent être modifiés et étendus en fonction de vos besoins spécifiques dans des projets concrets. Nous espérons que ces codes vous aideront à mieux répondre à vos besoins en matière de transactions de crypto-monnaie et d'actifs numériques.


Plus de

98K-band tracking _LongJ'espère que les professeurs vont trouver un cas de changement d'actifs sur le compte @monitoring dès que possible.

98K-band tracking _LongFélicitations

Le petit rêveBien, c'est dans le plan.