
Em resposta ao comentário do leitor no artigo anterior, é necessário um exemplo de programa para monitorar transferências de contas de contrato. Nesta edição, usaremos a Binance Exchange como objeto de teste para atingir esse requisito e aprender como projetá-la.
As bolsas de criptomoedas processam um grande número de transações todos os dias, incluindo transferências de ativos entre diferentes carteiras. Monitorar essas transferências em tempo real é fundamental para comerciantes e desenvolvedores. Este artigo explorará um trecho de código JavaScript projetado para monitorar transferências recentes de ativos em uma exchange de criptomoedas e discutirá seus principais componentes.
Depois de consultar a documentação da Binance Exchange, descobri que há uma interface de histórico de transferências que pode consultar todas as informações de transferência. Como estamos monitorando apenas possíveis registros de transferência, não precisamos obter todos os históricos de transferência. Precisamos apenas verificar os registros de transferência recentes dentro de um determinado intervalo e com uma determinada frequência. Se novos registros de transferência forem encontrados, eles serão atualizados e notificados.
Use esta interface:
// GET /sapi/v1/asset/transfer type, size : 100
Então, como você verifica os registros de transferência recém-adicionados? Depois de ler a documentação da Binance, descobri que os dados retornados por esta interface contêm timestamps. É muito simples usar timestamps para julgar. Enquanto houver um registro com um timestamp maior que o registro atual, significa que uma nova transferência ocorreu. . Basta usar isso para acioná-lo.
/sapi/v1/asset/transferA interface solicita no máximo 100 pedaços de dados a cada vez. Essa 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 fim de uma detecção e o início da próxima detecção. Neste momento, alguns novos registros de operações podem ser perdidos, o que é suficiente para cenários de demanda geral (geralmente não haverá estratégias para transferir fundos de forma descontrolada…).
Claro, há muitos detalhes no design real. Por exemplo, ao verificar o documento, descobrimos que há muitas direções de rotação, então precisamos monitorar cada direção de rotação. O código definevar dicType = {...}Para gerenciar todas as direções de transferência.
Para melhor exibir o conteúdo, usamos uma tabela de barra de status para exibir as últimas cinco informações de transferência na interface de estratégia, então construímos uma tabela chamada:monitorObjeto usado para registrar dados. Claro que você não pode registrar informações de transferência indefinidamente, então mantemos apenas 100 registros para cada direção de transferência. Se houver mais de 100 registros, os registros prematuros serão excluídos.
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)
}
}
O código JavaScript fornecido inclui diversas funções que, juntas, criam um sistema para monitorar transferências recentes de ativos. Vamos analisar os principais componentes:
Objetivo: Obter o histórico recente de transferência de ativos da API de câmbio de acordo com os parâmetros especificados. Parâmetros: TransType (tipo de transferência), typeDesc (descrição do tipo). Ponto de extremidade da API: /sapi/v1/asset/transfer.
Objetivo: Itera sobre os tipos de transferência predefinidos, recupera o histórico de transferência mais recente e registra todas as novas transferências. Use um dicionário (dicType) para mapear tipos de transferência para descrições legíveis por humanos. Atualize o objeto monitor para rastrear a transferência mais recente de cada tipo.
Objetivo: Executar um loop infinito que monitora continuamente as transferências e exibe os dados mais recentes. Use a função monitorTransfers periodicamente. Gere uma tabela para cada tipo de transferência, incluindo colunas como ativo, valor, status, ID da transação e registro de data e hora.
O código usa um dicionário (dicType) para mapear tipos de transferência para nomes descritivos, fornecendo uma descrição clara da natureza de cada transferência.
O sistema verifica continuamente novas transferências, atualiza o objeto do monitor e registra quaisquer alterações detectadas.
Use uma tabela para apresentar cada tipo de dado de transferência, incluindo detalhes relevantes como ativo, valor, status, ID da transação e registro de data e hora.
Mantenha uma lista de rolagem das transferências mais recentes para cada tipo, garantindo uma exibição concisa e oportuna.
Uma transferência foi realizada manualmente e o programa detectou a operação de transferência.


O código JavaScript fornecido fornece uma solução poderosa para monitorar transferências recentes de ativos em bolsas de criptomoedas. Sua natureza dinâmica e em tempo real o torna uma ferramenta valiosa para traders e desenvolvedores que buscam entender a movimentação de ativos entre diferentes carteiras. Este código pode ser modificado e personalizado de acordo com necessidades específicas, fornecendo uma base sólida para aqueles que buscam aprimorar suas estratégias de negociação de criptomoedas ou desenvolver recursos adicionais de monitoramento.
Este artigo é apenas um ponto de partida para fornecer uma ideia de design. Espero que seu negócio de criptomoeda seja informativo e bem-sucedido!