avatar of 发明者量化-小小梦 发明者量化-小小梦
Seguir Mensajes Privados
4
Seguir
1271
Seguidores

Cuantificación de FMZ: análisis de ejemplos comunes de diseño de demanda en el mercado de criptomonedas (parte 2)

Creado el: 2023-12-24 22:24:58, Actualizado el: 2023-12-25 17:10:56
comments   1
hits   1513

Cuantificación de FMZ: análisis de ejemplos comunes de diseño de demanda en el mercado de criptomonedas (parte 2)

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.

Analizar requisitos

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.

Ejemplos de código

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

Descripción general del código:

El código JavaScript proporcionado incluye varias funciones que juntas construyen un sistema para monitorear transferencias de activos recientes. Analicemos los componentes principales:

  • Función getRecentTransferHistory:

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.

  • Función monitorTransfers:

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.

  • Función principal:

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.

Características principales:

  • Mapeo dinámico del tipo de transferencia:

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.

  • Monitoreo en tiempo real:

El sistema comprueba continuamente si hay nuevas transferencias, actualiza el objeto de monitorización y registra cualquier cambio detectado.

  • Presentación de datos:

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.

  • Gestión del historial de transferencias recientes:

Mantenga una lista desplazable de las transferencias más recientes para cada tipo, garantizando una visualización concisa y oportuna.

Prueba real

Se realizó una transferencia manualmente y el programa detectó la operación de transferencia.

Cuantificación de FMZ: análisis de ejemplos comunes de diseño de demanda en el mercado de criptomonedas (parte 2)

Cuantificación de FMZ: análisis de ejemplos comunes de diseño de demanda en el mercado de criptomonedas (parte 2)

END:

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!