FMZ Quant: Analisis Contoh Reka Bentuk Keperluan Umum di Pasaran Cryptocurrency (II)

Penulis:Lydia, Dicipta: 2023-12-25 16:40:50, Dikemas kini: 2024-01-02 21:21:39

img

Sebagai tindak balas kepada komen daripada pembaca dalam artikel sebelumnya, mereka meminta contoh program untuk memantau pemindahan akaun kontrak.

Pertukaran mata wang kripto mengendalikan sejumlah besar transaksi setiap hari, termasuk pemindahan aset antara dompet yang berbeza. Pemantauan pemindahan ini dalam masa nyata adalah penting bagi peniaga dan pemaju. Dalam artikel ini, kita akan meneroka sekeping kod JavaScript yang direka untuk memantau pemindahan aset baru-baru ini di bursa mata wang kripto dan membincangkan komponen utamanya.

Menganalisis Keperluan

Saya memeriksa dokumentasi pertukaran Binance dan mendapati bahawa terdapat antara muka sejarah pemindahan yang boleh menyoal semua maklumat pemindahan. Oleh kerana kami hanya memantau rekod pemindahan yang mungkin berlaku, kami tidak perlu mendapatkan semua sejarah pemindahan. Kami hanya perlu memeriksa rekod pemindahan baru-baru ini dalam julat tertentu berdasarkan kekerapan tertentu. Jika rekod pemindahan baru ditemui, mereka akan dikemas kini dan dimaklumkan.

Gunakan antara muka:

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

Jadi bagaimana untuk memeriksa rekod pemindahan yang baru ditambahkan? Selepas membaca dokumentasi Binance, saya mendapati bahawa terdapat cap masa dalam data yang dikembalikan oleh antara muka ini. Sangat mudah untuk menilai dengan cap masa. Selagi terdapat rekod yang lebih besar daripada cap masa maksimum yang direkodkan pada masa ini, ini bermakna tindakan pemindahan baru telah berlaku. Hanya gunakan ini untuk mencetuskannya.

Peraturan/sapi/v1/asset/transferantara muka boleh meminta sehingga 100 keping data pada satu masa. Pengesanan tidak akan menyebabkan masalah untuk pemindahan frekuensi rendah, melainkan akaun mempunyai lebih daripada 100 operasi pemindahan antara akhir satu pengesanan dan permulaan pengesanan seterusnya. Pada masa ini, beberapa rekod operasi baru mungkin terlepas, yang mencukupi untuk senario permintaan umum (secara amnya, tidak akan ada strategi untuk memindahkan dana dengan gila...).

Sudah tentu, terdapat banyak butiran dalam reka bentuk sebenar. contohnya, memeriksa dokumentasi, kita mendapati bahawa terdapat banyak arah pemindahan, jadi kita perlu memantau setiap arah pemindahan. kod ditakrifkanvar dicType = {...}untuk menguruskan semua arah pemindahan.

Untuk memaparkan kandungan yang lebih baik, kita menggunakan jadual bar status untuk mengeluarkan 5 terakhir maklumat pemindahan dalam antara muka strategi, jadi kita membina objek bernamamonitoruntuk merakam data. sudah tentu, anda tidak boleh merakam maklumat pemindahan tanpa had, jadi kami hanya menyimpan 100 rekod untuk setiap arah pemindahan. jika jumlahnya melebihi 100, kami akan memadam rekod yang lebih awal.

Contoh Kod

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, "inquiry failure", ret)
    }
    
    return rows
}

var monitor = {}
function monitorTransfers() {
    var dicType = {
        "MAIN_UMFUTURE": "Spot wallet --> U-based contract wallet",
        "MAIN_CMFUTURE": "Spot wallet --> Currency-based contract wallet",
        "UMFUTURE_MAIN": "U-based contract wallet --> Spot wallet",
        "UMFUTURE_MARGIN": "U-based contract wallet --> Leveraged full position wallet",
        "CMFUTURE_MAIN": "Currency-based contract wallet --> Spot wallet",
        "MARGIN_UMFUTURE": "Leveraged full position wallet --> U-based contract wallet",
        "MARGIN_CMFUTURE": "Leveraged full position wallet --> Currency-based contract wallet",
        "CMFUTURE_MARGIN": "Currency-based contract wallet --> Leveraged full position wallet",
        "FUNDING_UMFUTURE": "Funds wallet --> U-based contract wallet",
        "UMFUTURE_FUNDING": "U-based contract wallet --> Funds wallet",
        "FUNDING_CMFUTURE": "Funds wallet --> Currency-based contract wallet",
        "CMFUTURE_FUNDING": "Currency-based contract wallet --> Funds wallet",
        "UMFUTURE_OPTION": "U-based contract wallet --> Options wallet",
        "OPTION_UMFUTURE": "Options wallet --> U-based contract wallet",
        // integrated account
        "MAIN_PORTFOLIO_MARGIN": "Spot wallet --> Unified accounts wallet",
        "PORTFOLIO_MARGIN_MAIN": "Unified accounts wallet --> Spot wallet"
    }
    
    Log("start testing")
    _.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("New transfer records detected", 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("commencement and termination")
}


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

Ringkasan Kod:

Kod JavaScript yang disediakan termasuk beberapa fungsi yang membina sistem bersama untuk memantau pemindahan aset baru-baru ini.

  • Fungsi getRecentTransferHistory:

    Purpose: Obtain the recent asset transfer history from the exchange API according to the specified parameters.
    Parameters: TransType (transfer type), typeDesc (type description).
    API endpoint: /sapi/v1/asset/transfer.
    
  • MonitorFungsi pemindahan:

    Purpose: Iterate over predefined transfer types, retrieve recent transfer history, and record any new transfers.
    Use a dictionary (dicType) to map transfer types to human-readable descriptions.
    Update the monitor object to track the latest transfers of each type.
    
  • Fungsi utama:

    Purpose: Run an infinite loop that monitors transfers continuously and displays the latest data.
    Use the monitorTransfers function regularly.
    Generate a table for each transfer type, including columns such as asset, amount, status, transaction ID, and timestamp.
    

Ciri Utama:

  • Pemetaan jenis pemindahan dinamik:

    The code uses a dictionary (dicType) to map transfer types to descriptive names, providing a clear explanation of the nature of each transfer.
    
  • Pemantauan masa nyata:

    The system checks for new transfers continuously, updates the monitor object and records any detected changes.
    
  • Penyampaian data:

    Use tables to present each type of transfer data, including relevant details such as assets, amounts, status, transaction IDs, and timestamps.
    
  • Pengurusan sejarah pemindahan terkini:

    Maintain a scrolling list of recent transfer records for each type, ensuring a concise and timely display.
    

Ujian Bot

Pemindahan dilakukan secara manual dan program mengesan operasi pemindahan.

img

img

Hujung:

Kod JavaScript yang disediakan menyediakan penyelesaian yang kuat untuk memantau pemindahan aset baru-baru ini di bursa mata wang kripto. Sifat dinamik dan masa nyata menjadikannya alat yang berharga untuk pedagang dan pemaju yang ingin memahami pergerakan aset antara dompet yang berbeza. Kod ini boleh diubah suai dan disesuaikan dengan keperluan tertentu, memberikan asas yang kukuh bagi mereka yang ingin meningkatkan strategi perdagangan mata wang kripto mereka atau mengembangkan keupayaan pemantauan tambahan.

Semoga kerjaya cryptocurrency anda menjadi baik dan berjaya!


Lebih lanjut