Les ressources ont été chargées... Je charge...

FMZ Quant: Une analyse des exemples de conception des exigences communes sur le marché des crypto-monnaies (II)

Auteur:FMZ~Lydia, Créé: 2023-12-25 16:40:50, Mis à jour: 2024-01-02 21:21:39

img

En réponse aux commentaires des lecteurs dans l'article précédent, ils ont demandé un exemple de programme pour surveiller les transferts de comptes contractuels.

Les échanges de crypto-monnaie traitent un grand nombre de transactions chaque jour, y compris le transfert d'actifs entre différents portefeuilles. La surveillance de ces transferts en temps réel est cruciale pour les traders et les développeurs.

Analysez les besoins

J'ai vérifié la documentation de l'échange Binance et j'ai constaté qu'il existe une interface d'historique de transfert qui peut interroger toutes les informations de transfert. Puisque nous ne surveillons que les enregistrements de transfert qui peuvent se produire, nous n'avons pas besoin d'obtenir tout l'historique de transfert. Nous avons seulement besoin de vérifier les enregistrements de transfert récents dans une certaine plage basée sur une certaine fréquence. Si de nouveaux enregistrements de transfert sont trouvés, ils seront mis à jour et notifiés.

Utilisez l'interface:

// GET /sapi/v1/asset/transfer type, size : 100

Alors, comment vérifier l'enregistrement de transfert nouvellement ajouté? Après avoir lu la documentation de Binance, j'ai constaté qu'il y a un horodatage dans les données renvoyées par cette interface. Il est très simple de juger par l'horodatage. Tant qu'il y a un enregistrement supérieur à l'horodatage maximum actuellement enregistré, cela signifie qu'une nouvelle action de transfert s'est produite. Utilisez simplement ceci pour le déclencher.

Le/sapi/v1/asset/transferL'interface peut demander jusqu'à 100 pièces de données à la fois. La détection ne causera pas de problèmes pour les transferts à basse fréquence, à moins que le compte n'ait plus de 100 opérations de transfert entre la fin d'une détection et le début de la prochaine détection. À ce moment-là, certains nouveaux enregistrements d'opération peuvent être manqués, ce qui est suffisant pour les scénarios de demande générale (généralement, il n'y aura pas de stratégie pour transférer des fonds de manière folle...).

Bien sûr, il y a beaucoup de détails dans la conception réelle. par exemple, en vérifiant la documentation, nous avons constaté qu'il ya beaucoup de directions de transfert, nous devons donc surveiller chaque direction de transfert.var dicType = {...}pour gérer toutes les directions de transfert.

Afin d'afficher le contenu mieux, nous utilisons une table de barre d'état pour la sortie des 5 dernières informations de transfert dans l'interface de stratégie, nous avons donc construit un objet nommémonitorBien sûr, vous ne pouvez pas enregistrer les informations de transfert illimitément, donc nous ne conservons que 100 enregistrements pour chaque direction de transfert.

Exemple de code

function getRecentTransferHistory(TransType, typeDesc) {
	// GET /sapi/v1/asset/transfer type, size : 100
    
    var rows = null 
    var ret = exchange.IO("api", "GET", "/sapi/v1/asset/transfer", `type=${TransType}&size=100`)
    Log("/sapi/v1/asset/transfer" + `type=${TransType}&size=100`)
    if (ret && typeof(ret.rows) != "undefined" && Array.isArray(ret.rows)) {
        rows = ret.rows
    } else if (ret && typeof(ret.total) != "undefined" && ret.total == 0) {
        rows = []
    } else {
    	Log(TransType, typeDesc, "inquiry failure", ret)
    }
    
    return rows
}

var monitor = {}
function monitorTransfers() {
    var dicType = {
        "MAIN_UMFUTURE": "Spot wallet --> U-based contract wallet",
        "MAIN_CMFUTURE": "Spot wallet --> Currency-based contract wallet",
        "UMFUTURE_MAIN": "U-based contract wallet --> Spot wallet",
        "UMFUTURE_MARGIN": "U-based contract wallet --> Leveraged full position wallet",
        "CMFUTURE_MAIN": "Currency-based contract wallet --> Spot wallet",
        "MARGIN_UMFUTURE": "Leveraged full position wallet --> U-based contract wallet",
        "MARGIN_CMFUTURE": "Leveraged full position wallet --> Currency-based contract wallet",
        "CMFUTURE_MARGIN": "Currency-based contract wallet --> Leveraged full position wallet",
        "FUNDING_UMFUTURE": "Funds wallet --> U-based contract wallet",
        "UMFUTURE_FUNDING": "U-based contract wallet --> Funds wallet",
        "FUNDING_CMFUTURE": "Funds wallet --> Currency-based contract wallet",
        "CMFUTURE_FUNDING": "Currency-based contract wallet --> Funds wallet",
        "UMFUTURE_OPTION": "U-based contract wallet --> Options wallet",
        "OPTION_UMFUTURE": "Options wallet --> U-based contract wallet",
        // integrated account
        "MAIN_PORTFOLIO_MARGIN": "Spot wallet --> Unified accounts wallet",
        "PORTFOLIO_MARGIN_MAIN": "Unified accounts wallet --> Spot wallet"
    }
    
    Log("start testing")
    _.each(dicType, function(v, k) {
        var rows = getRecentTransferHistory(k, v)
        var maxTS = 0
        _.each(rows, function(row) {
            if (typeof(monitor[k]) == "undefined") {
            	monitor[k] = {"transType": k, "typeDesc": v, "recentRecords": [], "lastTS": 0}            	
            }

            if (row["timestamp"] > monitor[k]["lastTS"]) {
                monitor[k]["recentRecords"].push(row)
                
                if (monitor[k]["lastTS"] != 0) {
                	Log("New transfer records detected", k, v, row, "#FF0000")
                }                
            }
            maxTS = Math.max(maxTS, row["timestamp"])     
        })
        if (rows && rows.length == 0) {
            return 
        }
        monitor[k]["lastTS"] = maxTS

        var sortedArrayAscending = monitor[k]["recentRecords"].slice().sort((a, b) => a.timestamp - b.timestamp)
        monitor[k]["recentRecords"] = sortedArrayAscending

        if (monitor[k]["recentRecords"].length > 100) {
        	monitor[k]["recentRecords"].shift()
        }
        Sleep(1000)
    })
    Log("commencement and termination")
}


function main() {
    LogReset()
    while (true) {
        monitorTransfers()

        var tbls = []
        _.each(monitor, function(v, k) {
        	var tbl = {
        		"type": "table", 
        		"title": v["typeDesc"], 
        		"cols": ["asset", "amount", "status", "tranId", "time"], 
        		"rows": []
        	}

            var arr = v["recentRecords"].slice().sort((a, b) => b.timestamp - a.timestamp)
            for (var i = 0; i < arr.length; i++) {
            	if (i < 5) {
            		tbl["rows"].push([arr[i]["asset"], arr[i]["amount"], arr[i]["status"], arr[i]["tranId"], _D(arr[i]["timestamp"])])
            	}            	
            }
            tbls.push(tbl)
        })        

    	LogStatus(_D(), "\n", "`" + JSON.stringify(tbls) + "`")
    	Sleep(1000 * 30)
    }
}

Résumé du code:

Le code JavaScript fourni comprend plusieurs fonctions qui construisent ensemble un système pour surveiller les transferts d'actifs récents.

  • La fonction getRecentTransferHistory est

    Purpose: Obtain the recent asset transfer history from the exchange API according to the specified parameters.
    Parameters: TransType (transfer type), typeDesc (type description).
    API endpoint: /sapi/v1/asset/transfer.
    
  • Fonction de transfert:

    Purpose: Iterate over predefined transfer types, retrieve recent transfer history, and record any new transfers.
    Use a dictionary (dicType) to map transfer types to human-readable descriptions.
    Update the monitor object to track the latest transfers of each type.
    
  • fonction principale:

    Purpose: Run an infinite loop that monitors transfers continuously and displays the latest data.
    Use the monitorTransfers function regularly.
    Generate a table for each transfer type, including columns such as asset, amount, status, transaction ID, and timestamp.
    

Principales caractéristiques:

  • Cartographie dynamique du type de transfert:

    The code uses a dictionary (dicType) to map transfer types to descriptive names, providing a clear explanation of the nature of each transfer.
    
  • Surveillance en temps réel:

    The system checks for new transfers continuously, updates the monitor object and records any detected changes.
    
  • Présentation des données:

    Use tables to present each type of transfer data, including relevant details such as assets, amounts, status, transaction IDs, and timestamps.
    
  • Gestion de l'historique des transferts récents:

    Maintain a scrolling list of recent transfer records for each type, ensuring a concise and timely display.
    

Testez le bot

Un transfert a été effectué manuellement et le programme a détecté l'opération de transfert.

img

img

- Je ne sais pas.

Le code JavaScript fourni fournit une solution puissante pour surveiller les transferts d'actifs récents sur les échanges de crypto-monnaie. Sa nature dynamique et en temps réel en fait un outil précieux pour les traders et les développeurs qui cherchent à comprendre les mouvements d'actifs entre différents portefeuilles. Ce code peut être modifié et personnalisé en fonction de besoins spécifiques, fournissant une base solide pour ceux qui cherchent à améliorer leurs stratégies de trading de crypto-monnaie ou à développer des capacités de surveillance supplémentaires.

Que votre carrière en crypto-monnaie soit à la fois instructive et réussie!


Plus de