
이전 기사의 독자의 의견에 대한 답변으로, 계약 계정 이체를 모니터링하는 프로그램 예제가 필요합니다. 이번 호에서는 Binance Exchange를 테스트 객체로 사용하여 이 요구 사항을 달성하고 설계하는 방법을 알아봅니다.
암호화폐 거래소는 매일 수많은 거래를 처리하며, 여기에는 서로 다른 지갑 간의 자산 이체도 포함됩니다. 이러한 전송을 실시간으로 모니터링하는 것은 거래자와 개발자에게 매우 중요합니다. 이 글에서는 암호화폐 거래소에서 최근 자산 이동을 모니터링하도록 설계된 JavaScript 코드를 살펴보고 주요 구성 요소에 대해 설명합니다.
바이낸스 거래소 문서를 살펴본 결과, 모든 전송 정보를 조회할 수 있는 전송 내역 인터페이스가 있다는 것을 알게 되었습니다. 우리는 가능한 이전 기록만 모니터링하고 있으므로 모든 이전 기록을 얻을 필요는 없습니다. 우리는 특정 빈도로 특정 범위 내의 최근 이체 기록만 확인하면 됩니다. 새로운 이전 기록이 발견되면 업데이트되어 알려드립니다.
이 인터페이스를 사용하세요:
// GET /sapi/v1/asset/transfer type, size : 100
그러면 새로 추가된 이체 내역을 어떻게 확인하나요? Binance 설명서를 읽은 후, 이 인터페이스에서 반환된 데이터에 타임스탬프가 포함되어 있음을 발견했습니다. 타임스탬프를 사용하여 판단하는 것은 매우 간단합니다. 현재 레코드보다 타임스탬프가 큰 레코드가 있는 한, 새로운 전송이 발생했습니다. 이것을 사용해서 작동시키세요.
/sapi/v1/asset/transfer인터페이스는 매번 최대 100개의 데이터를 요청합니다. 이 탐지는 계정에 한 탐지의 끝과 다음 탐지의 시작 사이에 100개가 넘는 전송 작업이 없는 한 저주파 전송에 문제를 일으키지 않습니다. 이때 일부 새로운 운영 기록이 누락되었을 수 있지만, 이는 일반적인 수요 시나리오에는 충분합니다(일반적으로 자금을 미친 듯이 이체하는 전략은 없습니다…).
물론 실제 디자인에는 많은 세부 사항이 있습니다. 예를 들어 문서를 확인할 때 회전 방향이 많다는 것을 알게 되므로 각 회전 방향을 모니터링해야 합니다. 코드는 다음을 정의합니다.var dicType = {...}모든 환승 방향을 관리합니다.
콘텐츠를 더 잘 표시하기 위해 전략 인터페이스에서 마지막 5개의 전송 정보를 출력하기 위해 상태 표시줄 테이블을 사용하므로 다음과 같은 테이블을 구성합니다.monitor데이터를 기록하는 데 사용되는 객체. 물론, 전송 정보를 무한정 기록할 수는 없으므로, 각 전송 방향에 대해 100개의 기록만 유지합니다. 100개가 넘는 기록이 있는 경우, 조기 기록은 삭제됩니다.
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)
}
}
제공된 JavaScript 코드에는 최근 자산 이전을 모니터링하는 시스템을 구축하는 여러 가지 기능이 포함되어 있습니다. 주요 구성 요소를 살펴보겠습니다.
목적: 지정된 매개변수에 따라 거래소 API에서 최근 자산 이전 내역을 가져옵니다. 매개변수: TransType(전송 유형), typeDesc(유형 설명). API 엔드포인트: /sapi/v1/asset/transfer.
목적: 미리 정의된 전송 유형을 반복하고, 가장 최근의 전송 내역을 검색하고, 새로운 전송을 기록합니다. 사전(dicType)을 사용하여 전송 유형을 사람이 읽을 수 있는 설명으로 매핑합니다. 모니터 객체를 업데이트하여 각 유형의 최신 전송을 추적합니다.
목적: 지속적으로 전송을 모니터링하고 최신 데이터를 표시하는 무한 루프를 실행합니다. monitorTransfers 함수를 주기적으로 사용하세요. 자산, 금액, 상태, 거래 ID, 타임스탬프 등의 열을 포함하여 각 이체 유형에 대한 표를 생성합니다.
이 코드는 사전(dicType)을 사용하여 전송 유형을 설명적 이름에 매핑하고 각 전송의 특성에 대한 명확한 설명을 제공합니다.
시스템은 지속적으로 새로운 전송을 확인하고, 모니터 객체를 업데이트하며, 감지된 변경 사항을 기록합니다.
자산, 금액, 상태, 거래 ID, 타임스탬프 등 관련 세부 정보를 포함하여 각 유형의 이체 데이터를 표시하기 위해 표를 사용합니다.
각 유형별로 가장 최근의 이체 내역을 스크롤링 목록을 유지하여 간결하고 시기적절한 표시를 보장합니다.
전송이 수동으로 수행되었으며 프로그램이 전송 작업을 감지했습니다.


제공된 JavaScript 코드는 암호화폐 거래소에서 최근 자산 이동을 모니터링하기 위한 강력한 솔루션을 제공합니다. 역동적이고 실시간적인 특성으로 인해 여러 지갑 간의 자산 이동을 이해하려는 거래자와 개발자에게 귀중한 도구입니다. 이 코드는 특정 요구 사항에 맞게 수정 및 사용자 정의가 가능하므로, 암호화폐 거래 전략을 개선하거나 추가 모니터링 기능을 개발하려는 사람들에게 견고한 기반을 제공합니다.
이 글은 디자인 아이디어를 제공하기 위한 시작점일 뿐입니다. 여러분의 암호화폐 사업이 유익하고 성공적이기를 바랍니다!