FMZ 정량화: 암호화폐 시장의 일반적인 요구 디자인 사례 분석 (II)

저자:작은 꿈, 창작: 2023-12-24 22:24:58, 업데이트: 2023-12-25 17:10:56

img

지난 기사에서 독자가 언급한 바와 같이, 모니터링 계약 계좌 회계 예제를 필요로하는 절차가 필요하고, 이 기사에서 우리는 바이오인 거래소를 테스트 대상으로 사용하여이 요구를 실현하고, 함께 설계하는 방법을 배우려고합니다.

암호화폐 거래소는 매일 수많은 거래를 처리하고 있으며, 여기에는 다양한 지갑 간의 자산 분할이 포함됩니다. 이러한 분할을 실시간으로 모니터링하는 것이 거래자와 개발자에게 중요합니다. 이 문서에서는 암호화폐 거래소에서 가장 최근의 자산 분할을 모니터링하고 핵심 구성 요소를 논의하는 자바스크립트 코드를 탐구합니다.

필요를 분석

이 거래소의 문서를 살펴본 결과, 모든 회전 정보를 검색할 수 있는 회전 역사 인터페이스가 있다는 것을 알게 되었다. 우리는 단지 일어날 수 있는 회전 기록을 모니터링하기 때문에 모든 회전 역사를 얻을 필요가 없다. 우리는 단지 특정 빈도에 따라 최근 범위의 회전 기록을 검사해야 한다. 새로운 회전 기록이 발견되면 업데이트, 알림이 필요하다.

이 인터페이스를 사용하세요:

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

그렇다면 새로운 스카이브 기록은 어떻게 확인해야 할까요? 비안안 문서에 보면 이 인터페이스가 반환하는 데이터에 시간표가 있다는 것을 알게 되는데, 시간표로 판단하는 것은 매우 간단합니다. 현재 기록된 최대 시간표보다 더 큰 기록만 있으면 새로운 스카이브 회전이 일어난다는 것을 나타냅니다.

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

코드 개요:

제공된 자바스크립트 코드는 몇 가지 기능으로 구성되어 있으며, 최근 자산 분할을 모니터링하는 시스템을 구성합니다.

  • getRecentTransferHistory 함수:

    목적: 지정한 매개 변수에 따라 거래소 API에서 최근 자산 이동 역사를 얻는다. 매개 변수: TransType (변경형), typeDesc (변경형) API 끝점: /sapi/v1/asset/transfer.

  • monitorTransfers 함수:

    목적: 미리 정의된 회전 유형을 탐색하고, 최근 회전 역사를 검색하고, 새로운 회전을 기록합니다. dicType를 사용하여 쉽게 읽을 수 있는 설명으로 회전형의 매핑을 수행합니다. 업데이트된 모니터 객체에서 각 유형의 최신 회선을 추적합니다.

  • main 함수:

    목적: 무한한 순환을 실행하고, 지속적인 모니터링, 회전 및 최신 데이터를 표시합니다. monitorTransfers 기능을 정기적으로 사용합니다. 각 회전 유형에 대해 자산, 금액, 상태, 트랜잭션 ID 및 시간표와 같은 열을 포함하는 테이블을 생성합니다.

이 글의 주요 특징은:

  • 동적 회전형 지도:

    코드 사용 사전 (dicType) 은 각 지표의 특성에 대한 명확한 설명을 제공하기 위해 지표형 유형을 설명 이름에 매핑합니다.

  • 실시간 감시:

    이 시스템은 새로운 회전을 지속적으로 검사하고, 모니터 객체를 업데이트하고, 감지된 변경사항을 기록합니다.

  • 이 자료는 다음과 같습니다:

    테이블을 사용하여 자산, 금액, 상태, 트랜잭션 ID 및 시간표 등과 관련된 세부 사항을 포함하여 각 유형의 분할 데이터를 표시하십시오.

  • 최근 역사 관리로 변경되었습니다:

    각 유형에 대한 최신 스크립트 기록의 롤링 목록을 유지하여 간결하고 적절한 표시를 보장합니다.

실제 디스크 테스트

수동으로 한 번 회전한 후, 프로그램이 회전 동작을 감지합니다.

img

img

끝:

제공된 자바스크립트 코드는 암호화폐 거래소에서의 최근 자산 분할을 모니터링하는 강력한 솔루션을 제공합니다. 그것의 역동적이고 실시간 특성으로 인해 거래자와 개발자가 다른 지갑들 사이의 자산 이동을 이해하려는 귀중한 도구가 됩니다. 이 코드는 특정 요구에 따라 수정 및 사용자 정의 할 수 있으며, 암호화폐 거래 전략을 강화하거나 추가 모니터링 기능을 개발하려는 사람들에게 단단한 기반을 제공합니다.

이 글은 여러분의 암호화폐 경력이 정보와 성공으로 가득 차도록 디자인 아이디어를 제공합니다.


더 많은

98K-파운드 추적_Long조그마한 꿈의 선생님, 현실의 더 이상 A 꿈의 선생님, 가장 큰 사랑 당신을