FMZ Quant: Análise de Exemplos de Design de Requisitos Comuns no Mercado de Criptomoedas (II)

Autora:Lydia., Criado: 2023-12-25 16:40:50, Atualizado: 2024-01-02 21:21:39

img

Em resposta aos comentários dos leitores no artigo anterior, eles solicitaram um exemplo de programa para monitorar transferências de conta de contrato.

As bolsas de criptomoedas lidam com um grande número de transações todos os dias, incluindo a transferência de ativos entre diferentes carteiras. Monitorar essas transferências em tempo real é crucial para comerciantes e desenvolvedores.

Analise os Requisitos

Verifiquei a documentação da exchange Binance e descobri que há uma interface de histórico de transferências que pode consultar todas as informações de transferências. Como estamos apenas monitorando os registros de transferências que podem ocorrer, não precisamos obter todo o histórico de transferências. Apenas precisamos verificar os registros de transferências recentes dentro de um certo intervalo com base em uma certa frequência. Se novos registros de transferências forem encontrados, eles serão atualizados e notificados.

Use a interface:

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

Então, como verificar o recorde de transferência recém-adicionado? Depois de ler a documentação do Binance, descobri que há um carimbo de tempo nos dados retornados por essa interface. É muito simples julgar pelo carimbo de tempo. Enquanto houver um registro maior que o carimbo de tempo máximo registrado atualmente, significa que uma nova ação de transferência ocorreu. Basta usar isso para ativá-lo.

O/sapi/v1/asset/transferA detecção não causará problemas para transferências de baixa frequência, a menos que a conta tenha mais de 100 operações de transferência entre o final de uma detecção e o início da próxima detecção.

Por exemplo, verificando a documentação, descobrimos que há muitas direções de transferência, então precisamos monitorar cada direção de transferência.var dicType = {...}para gerir todas as direcções de transferência.

A fim de exibir o conteúdo melhor, usamos uma tabela de barra de status para a saída das últimas 5 informações de transferência na interface estratégia, então construímos um objeto chamadomonitorÉ claro que não se pode gravar informações de transferência ilimitadamente, por isso mantemos apenas 100 registos para cada direção de transferência.

Código de exemplo

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

Visão geral do código:

O código JavaScript fornecido inclui várias funções que constroem um sistema para monitorar transferências de ativos recentes.

  • Função 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.
    
  • Monitor Função de transferência:

    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.
    
  • Função 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 principais:

  • Mapeamento do tipo de transferência 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.
    
  • Monitorização em tempo real:

    The system checks for new transfers continuously, updates the monitor object and records any detected changes.
    
  • Apresentação dos dados:

    Use tables to present each type of transfer data, including relevant details such as assets, amounts, status, transaction IDs, and timestamps.
    
  • Gestão do histórico de transferências recentes:

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

Teste de bot

A transferência foi feita manualmente e o programa detectou a operação de transferência.

img

img

Fim:

O código JavaScript fornecido fornece uma solução poderosa para monitorar transferências de ativos recentes em exchanges de criptomoedas. Sua natureza dinâmica e em tempo real torna-o uma ferramenta valiosa para comerciantes e desenvolvedores que buscam entender os movimentos de ativos entre diferentes carteiras.

Este artigo lança alguma luz sobre o assunto e fornece uma ideia de design.


Mais.