FMZ-Quantifizierung: Analyse gängiger Nachfragedesignbeispiele im Kryptowährungsmarkt (Teil 2)

Erstellt in: 2023-12-24 22:24:58, aktualisiert am: 2023-12-25 17:10:56
comments   1
hits   1030

FMZ-Quantifizierung: Analyse gängiger Nachfragedesignbeispiele im Kryptowährungsmarkt (Teil 2)

Als Reaktion auf den Leserkommentar im vorherigen Artikel wird ein Programmbeispiel zur Überwachung von Vertragskontoübertragungen benötigt. In dieser Ausgabe verwenden wir Binance Exchange als Testobjekt, um diese Anforderung zu erfüllen und zu lernen, wie man es entwirft.

Kryptowährungsbörsen verarbeiten täglich eine große Anzahl von Transaktionen, darunter auch die Übertragung von Vermögenswerten zwischen verschiedenen Wallets. Die Überwachung dieser Übertragungen in Echtzeit ist für Händler und Entwickler von entscheidender Bedeutung. In diesem Artikel wird ein JavaScript-Codeausschnitt untersucht, der zur Überwachung aktueller Vermögensübertragungen an einer Kryptowährungsbörse entwickelt wurde, und seine wichtigsten Komponenten erläutert.

Anforderungen analysieren

Nach Durchsicht der Dokumentation von Binance Exchange habe ich festgestellt, dass es eine Schnittstelle für den Überweisungsverlauf gibt, über die sämtliche Überweisungsinformationen abgefragt werden können. Da wir nur mögliche Überweisungsdatensätze überwachen, müssen wir nicht sämtliche Überweisungshistorien abrufen. Wir müssen nur die letzten Überweisungsaufzeichnungen innerhalb eines bestimmten Bereichs in einer bestimmten Häufigkeit überprüfen. Wenn neue Übertragungsdatensätze gefunden werden, werden sie aktualisiert und eine Benachrichtigung gesendet.

Verwenden Sie diese Schnittstelle:

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

Wie überprüfen Sie also die neu hinzugefügten Übertragungsdatensätze? Nachdem ich die Binance-Dokumentation gelesen hatte, stellte ich fest, dass die von dieser Schnittstelle zurückgegebenen Daten Zeitstempel enthalten. Es ist sehr einfach, Zeitstempel zur Beurteilung zu verwenden. Solange es einen Datensatz mit einem Zeitstempel gibt, der größer als der aktuelle Datensatz ist, bedeutet dies, dass eine neue Übertragung ist aufgetreten. . Verwenden Sie dies einfach, um es auszulösen.

/sapi/v1/asset/transferDie Schnittstelle fordert jedes Mal maximal 100 Daten an. Diese Erkennung verursacht bei Übertragungen mit niedriger Frequenz keine Probleme, es sei denn, das Konto weist zwischen dem Ende einer Erkennung und dem Beginn der nächsten Erkennung mehr als 100 Übertragungsvorgänge auf. Zu diesem Zeitpunkt fehlen möglicherweise einige neue Vorgangsdatensätze, was für allgemeine Nachfrageszenarien ausreichend ist (im Allgemeinen wird es keine Strategien für den verrückten Transfer von Geldern geben …).

Natürlich gibt es im tatsächlichen Design viele Details. Wenn wir beispielsweise das Dokument überprüfen, stellen wir fest, dass es viele Drehrichtungen gibt, sodass wir jede Drehrichtung überwachen müssen. Der Code definiertvar dicType = {...}Zur Verwaltung aller Überweisungsrichtungen.

Um den Inhalt besser anzuzeigen, verwenden wir eine Statusleistentabelle, um die letzten fünf Übertragungsinformationen in der Strategieschnittstelle auszugeben. Daher erstellen wir eine Tabelle mit dem Namen:monitorObjekt zum Aufzeichnen von Daten. Natürlich können Sie Überweisungsinformationen nicht unbegrenzt aufzeichnen, daher speichern wir nur 100 Datensätze pro Überweisungsrichtung. Wenn mehr als 100 Datensätze vorhanden sind, werden die vorzeitigen Datensätze gelöscht.

Codebeispiele

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

Codeübersicht:

Der bereitgestellte JavaScript-Code enthält mehrere Funktionen, die zusammen ein System zur Überwachung aktueller Vermögensübertragungen bilden. Lassen Sie uns die Hauptkomponenten aufschlüsseln:

  • Funktion „getRecentTransferHistory“:

Zweck: Abrufen des aktuellen Vermögensübertragungsverlaufs von der Exchange-API gemäß den angegebenen Parametern. Parameter: TransType (Übertragungstyp), typeDesc (Typbeschreibung). API-Endpunkt: /sapi/v1/asset/transfer.

  • Funktion „monitorTransfers“:

Zweck: Durchläuft die vordefinierten Übertragungsarten, ruft den aktuellsten Übertragungsverlauf ab und zeichnet alle neuen Übertragungen auf. Verwenden Sie ein Wörterbuch (dicType), um Übertragungstypen menschenlesbaren Beschreibungen zuzuordnen. Aktualisieren Sie das Monitorobjekt, um die letzte Übertragung jedes Typs zu verfolgen.

  • Hauptfunktion:

Zweck: Führen Sie eine Endlosschleife aus, die Übertragungen kontinuierlich überwacht und die neuesten Daten anzeigt. Verwenden Sie regelmäßig die Funktion „monitorTransfers“. Erstellen Sie für jede Übertragungsart eine Tabelle mit Spalten wie Vermögenswert, Betrag, Status, Transaktions-ID und Zeitstempel.

Hauptmerkmale:

  • Dynamische Zuordnung des Übertragungstyps:

Der Code verwendet ein Wörterbuch (dicType), um Übertragungstypen beschreibenden Namen zuzuordnen und so eine klare Beschreibung der Art jeder Übertragung bereitzustellen.

  • Echtzeitüberwachung:

Das System prüft kontinuierlich, ob neue Übertragungen vorliegen, aktualisiert das Monitorobjekt und protokolliert alle erkannten Änderungen.

  • Datenpräsentation:

Verwenden Sie eine Tabelle, um die einzelnen Arten von Übertragungsdaten darzustellen, einschließlich relevanter Details wie Vermögenswert, Betrag, Status, Transaktions-ID und Zeitstempel.

  • Verwaltung des letzten Überweisungsverlaufs:

Führen Sie für jeden Typ eine Scroll-Liste mit den aktuellsten Überweisungen, um eine übersichtliche und aktuelle Anzeige zu gewährleisten.

Echter Test

Eine Übertragung wurde manuell durchgeführt und das Programm hat den Übertragungsvorgang erkannt.

FMZ-Quantifizierung: Analyse gängiger Nachfragedesignbeispiele im Kryptowährungsmarkt (Teil 2)

FMZ-Quantifizierung: Analyse gängiger Nachfragedesignbeispiele im Kryptowährungsmarkt (Teil 2)

END:

Der bereitgestellte JavaScript-Code bietet eine leistungsstarke Lösung zur Überwachung aktueller Vermögensübertragungen an Kryptowährungsbörsen. Seine Dynamik und Echtzeit-Natur machen es zu einem wertvollen Werkzeug für Händler und Entwickler, die die Bewegung von Vermögenswerten zwischen verschiedenen Geldbörsen verstehen möchten. Dieser Code kann geändert und an spezifische Anforderungen angepasst werden und bietet eine solide Grundlage für alle, die ihre Handelsstrategien für Kryptowährungen verbessern oder zusätzliche Überwachungsfunktionen entwickeln möchten.

Dieser Artikel ist nur ein Ausgangspunkt, um eine Designidee zu liefern. Ich hoffe, Ihr Kryptowährungsgeschäft wird sowohl informativ als auch erfolgreich sein!