
Để trả lời bình luận của độc giả trong bài viết trước, cần có một ví dụ chương trình để theo dõi chuyển khoản tài khoản hợp đồng. Trong số này, chúng tôi sẽ sử dụng Binance Exchange làm đối tượng thử nghiệm để đạt được yêu cầu này và tìm hiểu cách thiết kế nó.
Các sàn giao dịch tiền điện tử xử lý một lượng lớn giao dịch mỗi ngày, bao gồm việc chuyển tài sản giữa các ví khác nhau. Việc theo dõi các giao dịch chuyển tiền này theo thời gian thực rất quan trọng đối với các nhà giao dịch và nhà phát triển. Bài viết này sẽ khám phá một đoạn mã JavaScript được thiết kế để theo dõi các giao dịch chuyển nhượng tài sản gần đây trên sàn giao dịch tiền điện tử và thảo luận về các thành phần chính của nó.
Sau khi tham khảo tài liệu của Binance Exchange, tôi thấy có một giao diện lịch sử chuyển tiền có thể truy vấn mọi thông tin chuyển tiền. Vì chúng tôi chỉ theo dõi các hồ sơ chuyển nhượng có thể có nên chúng tôi không cần phải thu thập tất cả lịch sử chuyển nhượng. Chúng ta chỉ cần kiểm tra các bản ghi chuyển khoản gần đây trong một phạm vi nhất định ở tần suất nhất định. Nếu tìm thấy bất kỳ hồ sơ chuyển nhượng mới nào, chúng tôi sẽ cập nhật và thông báo.
Sử dụng giao diện này:
// GET /sapi/v1/asset/transfer type, size : 100
Vậy làm thế nào để kiểm tra các bản ghi chuyển nhượng mới được thêm vào? Sau khi đọc tài liệu Binance, tôi thấy rằng dữ liệu được trả về bởi giao diện này có chứa dấu thời gian. Rất đơn giản để sử dụng dấu thời gian để đánh giá. Miễn là có một bản ghi có dấu thời gian lớn hơn bản ghi hiện tại, điều đó có nghĩa là một giao dịch mới đã xảy ra. . Chỉ cần sử dụng điều này để kích hoạt nó.
/sapi/v1/asset/transferGiao diện yêu cầu tối đa 100 dữ liệu mỗi lần. Phát hiện này sẽ không gây ra vấn đề cho các lần chuyển dữ liệu tần suất thấp trừ khi tài khoản có hơn 100 thao tác chuyển dữ liệu giữa thời điểm kết thúc một lần phát hiện và thời điểm bắt đầu lần phát hiện tiếp theo. Vào thời điểm này, một số hồ sơ hoạt động mới có thể bị bỏ sót, nhưng điều này đủ cho các kịch bản nhu cầu chung (nói chung sẽ không có bất kỳ chiến lược nào để chuyển tiền một cách điên cuồng…).
Tất nhiên, có rất nhiều chi tiết trong thiết kế thực tế. Ví dụ, khi kiểm tra tài liệu, chúng tôi thấy có nhiều hướng xoay, vì vậy chúng tôi cần theo dõi từng hướng xoay. Mã định nghĩavar dicType = {...}Để quản lý tất cả các hướng chuyển giao.
Để hiển thị nội dung tốt hơn, chúng tôi sử dụng bảng thanh trạng thái để xuất năm thông tin chuyển giao cuối cùng trong giao diện chiến lược, do đó chúng tôi xây dựng một bảng có tên là:monitorĐối tượng được sử dụng để ghi lại dữ liệu. Tất nhiên bạn không thể ghi lại thông tin chuyển giao vô thời hạn, vì vậy chúng tôi chỉ lưu giữ 100 bản ghi cho mỗi hướng chuyển giao. Nếu có nhiều hơn 100 bản ghi, các bản ghi trước đó sẽ bị xóa.
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)
}
}
Mã JavaScript được cung cấp bao gồm một số hàm cùng nhau xây dựng nên một hệ thống để theo dõi các giao dịch chuyển nhượng tài sản gần đây. Chúng ta hãy phân tích các thành phần chính:
Mục đích: Lấy lịch sử chuyển nhượng tài sản gần đây từ API trao đổi theo các tham số đã chỉ định. Các tham số: TransType (kiểu truyền), typeDesc (mô tả kiểu). Điểm cuối API: /sapi/v1/asset/transfer.
Mục đích: Lặp lại các loại chuyển nhượng được xác định trước, truy xuất lịch sử chuyển nhượng gần đây nhất và ghi lại mọi chuyển nhượng mới. Sử dụng từ điển (dicType) để ánh xạ các loại chuyển giao thành các mô tả dễ đọc đối với con người. Cập nhật đối tượng giám sát để theo dõi lần chuyển giao mới nhất của từng loại.
Mục đích: Chạy vòng lặp vô hạn liên tục theo dõi việc chuyển dữ liệu và hiển thị dữ liệu mới nhất. Sử dụng chức năng monitorTransfers theo định kỳ. Tạo bảng cho từng loại chuyển khoản, bao gồm các cột như tài sản, số tiền, trạng thái, ID giao dịch và dấu thời gian.
Mã này sử dụng một từ điển (dicType) để ánh xạ các kiểu chuyển giao thành các tên mô tả, cung cấp mô tả rõ ràng về bản chất của từng lần chuyển giao.
Hệ thống liên tục kiểm tra các giao dịch chuyển tiền mới, cập nhật đối tượng giám sát và ghi lại mọi thay đổi được phát hiện.
Sử dụng bảng để trình bày từng loại dữ liệu chuyển tiền, bao gồm các thông tin chi tiết có liên quan như tài sản, số tiền, trạng thái, ID giao dịch và dấu thời gian.
Duy trì danh sách các giao dịch chuyển tiền gần đây nhất cho từng loại, đảm bảo hiển thị ngắn gọn và kịp thời.
Việc chuyển giao được thực hiện thủ công và chương trình đã phát hiện ra hoạt động chuyển giao.


Mã JavaScript được cung cấp mang đến giải pháp mạnh mẽ để theo dõi các giao dịch chuyển nhượng tài sản gần đây trên các sàn giao dịch tiền điện tử. Tính chất năng động và thời gian thực của nó khiến nó trở thành một công cụ có giá trị cho các nhà giao dịch và nhà phát triển muốn hiểu được sự chuyển động của tài sản giữa các ví khác nhau. Mã này có thể được sửa đổi và tùy chỉnh theo nhu cầu cụ thể, cung cấp nền tảng vững chắc cho những người muốn nâng cao chiến lược giao dịch tiền điện tử hoặc phát triển thêm khả năng giám sát.
Bài viết này chỉ là điểm khởi đầu để cung cấp ý tưởng thiết kế. Tôi hy vọng doanh nghiệp tiền điện tử của bạn sẽ vừa mang tính thông tin vừa thành công!