4
Подписаться
1271
Подписчики

Количественная оценка FMZ: анализ примеров общего спроса на рынке криптовалют (часть 2)

Создано: 2023-12-24 22:24:58, Обновлено: 2023-12-25 17:10:56
comments   1
hits   1511

Количественная оценка FMZ: анализ примеров общего спроса на рынке криптовалют (часть 2)

В ответ на комментарий читателя в предыдущей статье, требуется пример программы для мониторинга переводов контрактных счетов. В этом выпуске мы будем использовать Binance Exchange в качестве тестового объекта для достижения этого требования и научимся его проектировать.

Криптовалютные биржи ежедневно обрабатывают большое количество транзакций, включая переводы активов между различными кошельками. Мониторинг этих переводов в режиме реального времени имеет решающее значение для трейдеров и разработчиков. В этой статье мы рассмотрим фрагмент кода JavaScript, предназначенный для мониторинга последних переводов активов на криптовалютной бирже, а также обсудим его ключевые компоненты.

Анализировать требования

Изучив документацию Binance Exchange, я обнаружил, что существует интерфейс истории переводов, который может запрашивать всю информацию о переводах. Поскольку мы отслеживаем только возможные записи о переводах, нам не нужно получать все истории переводов. Нам нужно только проверить последние записи о переводах в определенном диапазоне с определенной частотой. Если будут обнаружены новые записи о переводах, они будут обновлены и уведомлены.

Используйте этот интерфейс:

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

Так как же проверить недавно добавленные записи о переводах? После прочтения документации Binance я обнаружил, что данные, возвращаемые этим интерфейсом, содержат временные метки. Очень просто использовать временные метки для оценки. Пока есть запись с временной меткой, большей, чем текущая запись, это означает, что новый перевод произошло. . Просто используйте это, чтобы активировать его.

/sapi/v1/asset/transferИнтерфейс запрашивает максимум 100 фрагментов данных каждый раз. Это обнаружение не вызовет проблем для низкочастотных переводов, если только у учетной записи не будет более 100 операций перевода между окончанием одного обнаружения и началом следующего обнаружения. В это время некоторые новые записи об операциях могут быть пропущены, что достаточно для сценариев общего спроса (как правило, не будет никаких стратегий для сумасшедшего перевода средств…).

Конечно, в фактическом дизайне есть много деталей. Например, при проверке документа мы обнаруживаем, что есть много направлений вращения, поэтому нам нужно контролировать каждое направление вращения. Кодекс определяетvar dicType = {...}Для управления всеми направлениями переводов.

Для лучшего отображения контента мы используем таблицу строки состояния для вывода информации о последних пяти трансферах в интерфейсе стратегии, поэтому мы создаем таблицу под названием: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 включает несколько функций, которые вместе создают систему мониторинга последних переводов активов. Давайте разберем основные компоненты:

  • Функция getRecentTransferHistory:

Цель: Получить недавнюю историю переводов активов из API биржи в соответствии с указанными параметрами. Параметры: TransType (тип передачи), typeDesc (описание типа). Конечная точка API: /sapi/v1/asset/transfer.

  • Функция monitorTransfers:

Назначение: выполняет итерацию по предопределенным типам передач, извлекает последнюю историю передач и регистрирует все новые передачи. Используйте словарь (dicType) для сопоставления типов переводов с понятными человеку описаниями. Обновите объект монитора, чтобы отслеживать последние передачи каждого типа.

  • основная функция:

Цель: Запустить бесконечный цикл, который непрерывно отслеживает передачи и отображает последние данные. Периодически используйте функцию monitorTransfers. Создайте таблицу для каждого типа перевода, включая такие столбцы, как актив, сумма, статус, идентификатор транзакции и временная метка.

Основные характеристики:

  • Динамическое отображение типа передачи:

Код использует словарь (dicType) для сопоставления типов передачи с описательными именами, предоставляя четкое описание характера каждой передачи.

  • Мониторинг в реальном времени:

Система постоянно проверяет наличие новых передач, обновляет объект мониторинга и регистрирует любые обнаруженные изменения.

  • Представление данных:

Используйте таблицу для представления каждого типа данных о переводе, включая соответствующие сведения, такие как актив, сумма, статус, идентификатор транзакции и временная метка.

  • Управление историей последних переводов:

Ведите прокручиваемый список последних переводов для каждого типа, обеспечивая краткое и своевременное отображение.

Реальный тест

Передача была выполнена вручную, и программа обнаружила операцию передачи.

Количественная оценка FMZ: анализ примеров общего спроса на рынке криптовалют (часть 2)

Количественная оценка FMZ: анализ примеров общего спроса на рынке криптовалют (часть 2)

END:

Предоставленный код JavaScript представляет собой мощное решение для мониторинга последних переводов активов на криптовалютных биржах. Его динамичность и работа в режиме реального времени делают его ценным инструментом для трейдеров и разработчиков, стремящихся понять перемещение активов между различными кошельками. Этот код можно изменять и настраивать в соответствии с конкретными потребностями, что обеспечивает надежную основу для тех, кто хочет улучшить свои стратегии торговли криптовалютой или разработать дополнительные возможности мониторинга.

Эта статья — всего лишь отправная точка для идеи дизайна. Надеюсь, ваш криптовалютный бизнес будет и информативным, и успешным!