
En respuesta al comentario del lector en el artículo anterior, se requiere un ejemplo de programa para monitorear las transferencias de cuentas de contratos. En este número, utilizaremos Binance Exchange como objeto de prueba para lograr este requisito y aprenderemos a diseñarlo.
Los intercambios de criptomonedas procesan una gran cantidad de transacciones cada día, incluidas transferencias de activos entre diferentes billeteras. Monitorear estas transferencias en tiempo real es fundamental para los comerciantes y desarrolladores. Este artículo explorará un fragmento de código JavaScript diseñado para monitorear transferencias de activos recientes en un intercambio de criptomonedas y analizará sus componentes clave.
Después de consultar la documentación de Binance Exchange, descubrí que hay una interfaz de historial de transferencias que puede consultar toda la información de transferencia. Dado que solo monitoreamos los posibles registros de transferencia, no necesitamos obtener todos los historiales de transferencia. Solo necesitamos comprobar los registros de transferencias recientes dentro de un cierto rango con una cierta frecuencia. Si se encuentran nuevos registros de transferencia, se actualizarán y se notificarán.
Utilice esta interfaz:
// GET /sapi/v1/asset/transfer type, size : 100
Entonces, ¿cómo verificar los registros de transferencia recién agregados? Después de leer la documentación de Binance, descubrí que los datos que devuelve esta interfaz contienen marcas de tiempo. Es muy sencillo utilizar las marcas de tiempo para juzgar. Siempre que haya un registro con una marca de tiempo mayor que el registro actual, significa que se realizará una nueva transferencia. Ha ocurrido. . Simplemente use esto para activarlo.
/sapi/v1/asset/transferLa interfaz solicita un máximo de 100 datos cada vez. Esta detección no causará problemas en las transferencias de baja frecuencia a menos que la cuenta tenga más de 100 operaciones de transferencia entre el final de una detección y el inicio de la siguiente. En este momento, es posible que se pierdan algunos registros de operaciones nuevas, lo cual es suficiente para escenarios de demanda general (generalmente no habrá estrategias para transferir fondos a lo loco…).
Por supuesto, hay muchos detalles en el diseño real. Por ejemplo, al revisar el documento, descubrimos que hay muchas direcciones de rotación, por lo que debemos controlar cada dirección de rotación. El código definevar dicType = {...}Para gestionar todas las direcciones de transferencia.
Para mostrar mejor el contenido, utilizamos una tabla de barra de estado para mostrar la información de las últimas cinco transferencias en la interfaz de estrategia, por lo que construimos una tabla llamada:monitorObjeto utilizado para registrar datos. Por supuesto, no se puede registrar información de transferencias de forma indefinida, por lo que solo mantenemos 100 registros para cada dirección de transferencia. Si hay más de 100 registros, los registros prematuros se eliminarán.
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, "查询失败", ret)
}
return rows
}
var monitor = {}
function monitorTransfers() {
var dicType = {
"MAIN_UMFUTURE": "现货钱包 --> U本位合约钱包",
"MAIN_CMFUTURE": "现货钱包 --> 币本位合约钱包",
"UMFUTURE_MAIN": "U本位合约钱包 --> 现货钱包",
"UMFUTURE_MARGIN": "U本位合约钱包 --> 杠杆全仓钱包",
"CMFUTURE_MAIN": "币本位合约钱包 --> 现货钱包",
"MARGIN_UMFUTURE": "杠杆全仓钱包 --> U本位合约钱包",
"MARGIN_CMFUTURE": "杠杆全仓钱包 --> 币本位合约钱包",
"CMFUTURE_MARGIN": "币本位合约钱包 --> 杠杆全仓钱包",
"FUNDING_UMFUTURE": "资金钱包 --> U本位合约钱包",
"UMFUTURE_FUNDING": "U本位合约钱包 --> 资金钱包",
"FUNDING_CMFUTURE": "资金钱包 --> 币本位合约钱包",
"CMFUTURE_FUNDING": "币本位合约钱包 --> 资金钱包",
"UMFUTURE_OPTION": "U本位合约钱包 --> 期权钱包",
"OPTION_UMFUTURE": "期权钱包 --> U本位合约钱包",
// 统一账户
"MAIN_PORTFOLIO_MARGIN": "现货钱包 --> 统一账户钱包",
"PORTFOLIO_MARGIN_MAIN": "统一账户钱包 --> 现货钱包"
}
Log("开始检测")
_.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("检测到新增划转记录", 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("开始结束")
}
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)
}
}
El código JavaScript proporcionado incluye varias funciones que juntas construyen un sistema para monitorear transferencias de activos recientes. Analicemos los componentes principales:
Propósito: Obtener el historial reciente de transferencias de activos de la API de intercambio de acuerdo con los parámetros especificados. Parámetros: TransType (tipo de transferencia), typeDesc (descripción del tipo). Punto final de API: /sapi/v1/asset/transfer.
Propósito: itera sobre los tipos de transferencia predefinidos, recupera el historial de transferencias más reciente y registra todas las transferencias nuevas. Utilice un diccionario (dicType) para asignar tipos de transferencia a descripciones legibles para humanos. Actualice el objeto de monitor para rastrear la última transferencia de cada tipo.
Propósito: Ejecutar un bucle infinito que monitorea continuamente las transferencias y muestra los datos más recientes. Utilice la función monitorTransfers periódicamente. Genere una tabla para cada tipo de transferencia, incluidas columnas como activo, monto, estado, ID de transacción y marca de tiempo.
El código utiliza un diccionario (dicType) para asignar tipos de transferencia a nombres descriptivos, proporcionando una descripción clara de la naturaleza de cada transferencia.
El sistema comprueba continuamente si hay nuevas transferencias, actualiza el objeto de monitorización y registra cualquier cambio detectado.
Utilice una tabla para presentar cada tipo de datos de transferencia, incluidos detalles relevantes como activo, monto, estado, ID de transacción y marca de tiempo.
Mantenga una lista desplazable de las transferencias más recientes para cada tipo, garantizando una visualización concisa y oportuna.
Se realizó una transferencia manualmente y el programa detectó la operación de transferencia.


El código JavaScript proporcionado proporciona una solución poderosa para monitorear transferencias de activos recientes en intercambios de criptomonedas. Su naturaleza dinámica y en tiempo real lo convierte en una herramienta valiosa para los comerciantes y desarrolladores que buscan comprender el movimiento de activos entre diferentes billeteras. Este código se puede modificar y personalizar según necesidades específicas, proporcionando una base sólida para aquellos que buscan mejorar sus estrategias de comercio de criptomonedas o desarrollar capacidades de monitoreo adicionales.
Este artículo es solo un punto de partida para brindar una idea de diseño. ¡Espero que su negocio de criptomonedas sea informativo y exitoso!