FMZ Quant: Análisis de ejemplos de diseño de requisitos comunes en el mercado de criptomonedas (II)

El autor:- ¿ Por qué?, Creado: 2023-12-25 16:40:50, Actualizado: 2024-01-02 21:21:39

img

En respuesta a los comentarios de los lectores en el artículo anterior, solicitaron un ejemplo de programa para monitorear las transferencias de cuentas contractuales.

Los intercambios de criptomonedas manejan un gran número de transacciones todos los días, incluida la transferencia de activos entre diferentes billeteras. Monitorear estas transferencias en tiempo real es crucial para los comerciantes y desarrolladores. En este artículo, exploraremos un código JavaScript diseñado para monitorear las transferencias de activos recientes en un intercambio de criptomonedas y discutiremos sus componentes clave.

Analizar las necesidades

He comprobado la documentación del intercambio Binance y he encontrado que hay una interfaz de historial de transferencias que puede consultar toda la información de transferencias. Como solo estamos monitoreando los registros de transferencias que pueden ocurrir, no necesitamos obtener todo el historial de transferencias. Solo necesitamos verificar los registros de transferencias recientes dentro de un cierto rango basados en una cierta frecuencia. Si se encuentran nuevos registros de transferencias, se actualizarán y se notificarán.

Utilice la interfaz:

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

Entonces, ¿cómo comprobar el registro de transferencia recién agregado? Después de leer la documentación de Binance, encontré que hay una marca de tiempo en los datos devueltos por esta interfaz. Es muy simple juzgar por la marca de tiempo. Siempre que haya un registro más grande que la marca de tiempo máxima registrada actualmente, significa que se ha producido una nueva acción de transferencia. Sólo use esto para activarlo.

El/sapi/v1/asset/transferLa interfaz puede solicitar hasta 100 piezas de datos a la vez. La detección no causará problemas para 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 comienzo de la siguiente detección. En este momento, algunos nuevos registros de operación pueden faltar, lo que es suficiente para escenarios de demanda general (en general, no habrá estrategia para transferir fondos de forma loca...).

Por supuesto, hay muchos detalles en el diseño real. por ejemplo, revisando la documentación, encontramos que hay muchas direcciones de transferencia, por lo que tenemos que monitorear cada dirección de transferencia.var dicType = {...}para gestionar todas las direcciones de transferencia.

Con el fin de mostrar el contenido mejor, usamos una tabla de la barra de estado para la salida de la última 5 información de transferencia en la interfaz de la estrategia, por lo que construimos un objeto llamadomonitorPor supuesto, no se puede registrar información de transferencia ilimitadamente, por lo que sólo mantenemos 100 registros para cada dirección de transferencia.

Código de ejemplo

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

Resumen del código:

El código JavaScript proporcionado incluye varias funciones que construyen un sistema para monitorear las transferencias de activos recientes.

  • Función getRecentTransferHistory:

    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.
    
  • Función de transferencia de monitoreo:

    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.
    
  • Función principal:

    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.
    

Características clave:

  • Mapeo del tipo de transferencia dinámica:

    The code uses a dictionary (dicType) to map transfer types to descriptive names, providing a clear explanation of the nature of each transfer.
    
  • Control en tiempo real:

    The system checks for new transfers continuously, updates the monitor object and records any detected changes.
    
  • Presentación de los datos:

    Use tables to present each type of transfer data, including relevant details such as assets, amounts, status, transaction IDs, and timestamps.
    
  • Gestión del historial de transferencias recientes:

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

Prueba de bot

La transferencia se realizó manualmente y el programa detectó la operación de transferencia.

img

img

- ¿ Qué?

El código JavaScript proporcionado proporciona una poderosa solución para monitorear las transferencias de activos recientes en los 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 los movimientos de activos entre diferentes billeteras.

Este artículo arroja algo de luz sobre el tema y proporciona una idea de diseño. ¡Que su carrera de criptomoneda sea informativa y exitosa!


Más.