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.
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/transfer
L'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émonitor
Bien 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.
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)
}
}
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
Obtenir l'historique des transferts d'actifs récents à partir de l'API de l'échange selon les paramètres spécifiés. Paramètres: TransType (type de transfert), typeDesc (description du type). Le point final de l'API est /sapi/v1/actif/transfert.
Fonction de transfert:
Objectif: Iteration sur des types de transfert prédéfinis, récupération de l'historique des transferts récents et enregistrement de tout nouveau transfert. Utilisez un dictionnaire (dicType) pour cartographier les types de transfert dans des descriptions lisibles par l'homme. Mettre à jour l'objet de moniteur pour suivre les derniers transferts de chaque type.
fonction principale:
Objectif: Exécuter une boucle infinie qui surveille les transferts en continu et affiche les dernières données. Utilisez régulièrement la fonction MonitorTransfers. Générer un tableau pour chaque type de transfert, y compris des colonnes telles que l'actif, le montant, l'état, l'identifiant de transaction et l'horodatage.
Cartographie dynamique du type de transfert:
Le code utilise un dictionnaire (dicType) pour cartographier les types de transfert à des noms descriptifs, fournissant une explication claire de la nature de chaque transfert.
Surveillance en temps réel:
Le système vérifie en permanence la présence de nouveaux transferts, met à jour l'objet du moniteur et enregistre les modifications détectées.
Présentation des données:
Utilisez des tableaux pour présenter chaque type de données de transfert, y compris les détails pertinents tels que les actifs, les montants, l'état, les identifiants de transaction et les horodatages.
Gestion de l'historique des transferts récents:
Tenir une liste déroulante des enregistrements de transfert récents pour chaque type, afin d'assurer une affichage concise et rapide.
Un transfert a été effectué manuellement et le programme a détecté l'opération de transfert.
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!