Type/to search
8
Follow
1364
Followers
Количественная оценка FMZ: анализ примеров общего спроса на рынке криптовалют (I)
Discussions
Created 2023-12-17 18:43:46  Updated 2024-11-06 21:18:36
 3
 2185

img

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

1. Как написать код, который покажет наибольший рост спотовой торговли Binance за 4 часа?

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

  • Какой язык программирования используется для написания дизайна?
    Планируется реализация с использованием Javascript.
  • Нужны данные спотового рынка в режиме реального времени для всех валют
    Когда мы увидели это требование, первое, что мы сделали, — просмотрели документацию API Binance, чтобы узнать, есть ли какие-либо агрегированные рыночные данные (агрегированные рыночные данные были бы лучшим вариантом, поскольку было бы долго и утомительно проверять каждый продукт по отдельности). один).
    Запрос интерфейса агрегированной рыночной информации:GET https://api.binance.com/api/v3/ticker/price
    На FMZ получите доступ к интерфейсу биржевых котировок (публичный интерфейс, не требующий подписи) с помощьюHttpQueryфункция.
  • Необходимо подсчитать данные скользящего периода в 4 часа.
    Подумайте, как структурировать эту статистическую программу.
  • Рассчитайте подъем и спад, отсортируйте
    Подумайте об алгоритме подъема и спада, он:涨跌幅百分比 =(当前价格 - 初始价格)/ 初始价格 * 100, единица измерения — «%».

Обдумайте проблему и найдите решение. Мы приступили к разработке программы.

Дизайн кода

javascript
var dictSymbolsPrice = {} function main() { while (true) { // GET https://api.binance.com/api/v3/ticker/price try { var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price")) if (!Array.isArray(arr)) { Sleep(5000) continue } var ts = new Date().getTime() for (var i = 0; i < arr.length; i++) { var symbolPriceInfo = arr[i] var symbol = symbolPriceInfo.symbol var price = symbolPriceInfo.price if (typeof(dictSymbolsPrice[symbol]) == "undefined") { dictSymbolsPrice[symbol] = {name: symbol, data: []} } dictSymbolsPrice[symbol].data.push({ts: ts, price: price}) } } catch(e) { Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message) } // 计算涨跌幅 var tbl = { type : "table", title : "涨跌幅", cols : ["交易对", "当前价格", "4小时前价格", "涨跌幅", "数据长度", "最早数据时间", "最新数据时间"], rows : [] } for (var symbol in dictSymbolsPrice) { var data = dictSymbolsPrice[symbol].data if (data[data.length - 1].ts - data[0].ts > 1000 * 60 * 60 * 4) { dictSymbolsPrice[symbol].data.shift() } data = dictSymbolsPrice[symbol].data dictSymbolsPrice[symbol].percentageChange = (data[data.length - 1].price - data[0].price) / data[0].price * 100 } var entries = Object.entries(dictSymbolsPrice) entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange) for (var i = 0; i < entries.length; i++) { if (i > 9) { break } var name = entries[i][1].name var data = entries[i][1].data var percentageChange = entries[i][1].percentageChange var currPrice = data[data.length - 1].price var currTs = _D(data[data.length - 1].ts) var prePrice = data[0].price var preTs = _D(data[0].ts) var dataLen = data.length tbl.rows.push([name, currPrice, prePrice, percentageChange + "%", dataLen, preTs, currTs]) } LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`") Sleep(5000) } }

Анализ кода

    1. Структура данных
      var dictSymbolsPrice = {}: Пустой объект, используемый для хранения информации о ценах для каждой торговой пары. Ключ — это символ торговой пары, а значение — объект, содержащий название торговой пары, массив данных о ценах и информацию об изменениях.
    1. Основная функция main()
    • 2.1 Бесконечный цикл

      javascript
      while (true) { // ... }

      Программа непрерывно отслеживает цены торговых пар API Binance через бесконечный цикл.

    • 2.2. Получить информацию о ценах

      javascript
      var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))

      Получите текущую информацию о ценах торговой пары через API Binance. Если возвращаемое значение не является массивом, подождите 5 секунд и повторите попытку.

    • 2.3.Обновить данные о ценах

      javascript
      for (var i = 0; i < arr.length; i++) { // ... }

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

    • 2.4 Обработка исключений

      javascript
      } catch(e) { Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message) }

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

    • 2.5. Рассчитайте увеличение или уменьшение

      javascript
      for (var symbol in dictSymbolsPrice) { // ... }

      Пройдитесь по dictSymbolsPrice, рассчитайте увеличение или уменьшение каждой торговой пары и удалите самые ранние данные, если длина данных превышает 4 часа.

    • 2.6 Сортировка и генерация таблиц

      javascript
      var entries = Object.entries(dictSymbolsPrice) entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange) for (var i = 0; i < entries.length; i++) { // ... }

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

    • 2.7. Вывод журнала и задержка

      javascript
      LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`") Sleep(5000)

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

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

Тест реальной работы диска

img

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

2. Проверьте ставки финансирования всех фьючерсных контрактов Binance U-margin.

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

GET https://fapi.binance.com/fapi/v1/premiumIndex

Реализация кода

Поскольку контрактов слишком много, мы выводим здесь десятку с самыми высокими ставками финансирования.

javascript
function main() { while (true) { // GET https://fapi.binance.com/fapi/v1/premiumIndex try { var arr = JSON.parse(HttpQuery("https://fapi.binance.com/fapi/v1/premiumIndex")) if (!Array.isArray(arr)) { Sleep(5000) continue } arr.sort((a, b) => parseFloat(b.lastFundingRate) - parseFloat(a.lastFundingRate)) var tbl = { type: "table", title: "U本位合约资金费率前十", cols: ["合约", "资金费率", "标记价格", "指数价格", "当期费率时间", "下期费率时间"], rows: [] } for (var i = 0; i < 9; i++) { var obj = arr[i] tbl.rows.push([obj.symbol, obj.lastFundingRate, obj.markPrice, obj.indexPrice, _D(obj.time), _D(obj.nextFundingTime)]) } LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`") } catch(e) { Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message) } Sleep(1000 * 10) } }

Возвращаемая структура данных выглядит следующим образом. Из документации Binance мы видим, что lastFundingRate — это желаемая нами ставка финансирования.

javascript
{ "symbol":"STMXUSDT", "markPrice":"0.00883606", "indexPrice":"0.00883074", "estimatedSettlePrice":"0.00876933", "lastFundingRate":"0.00026573", "interestRate":"0.00005000", "nextFundingTime":1702828800000, "time":1702816229000 }

Тест реальной работы диска:

img

Версия Python для получения ставки финансирования контракта биржи OKX

Пользователь упомянул, что нужна версия Python, и она взята с биржи OKX. Здесь кстати тоже реализовано:

https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1Данные, возвращаемые интерфейсом:

python
{ "code":"0", "data":[ { "fundingTime":1702828800000, "fundingList":[ { "instId":"BTC-USDT-SWAP", "nextFundingRate":"0.0001102188733642", "minFundingRate":"-0.00375", "fundingRate":"0.0000821861465884", "maxFundingRate":"0.00375" } ...

Конкретный код:

python
import requests import json from time import sleep from datetime import datetime def main(): while True: # https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1 try: response = requests.get("https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1") arr = response.json()["data"][0]["fundingList"] Log(arr) if not isinstance(arr, list): sleep(5) continue arr.sort(key=lambda x: float(x["fundingRate"]), reverse=True) tbl = { "type": "table", "title": "U本位合约资金费率前十", "cols": ["合约", "下期费率", "最小", "当期", "最大"], "rows": [] } for i in range(min(9, len(arr))): obj = arr[i] row = [ obj["instId"], obj["nextFundingRate"], obj["minFundingRate"], obj["fundingRate"], obj["maxFundingRate"] ] tbl["rows"].append(row) LogStatus(_D(), "\n", '`' + json.dumps(tbl) + '`') except Exception as e: Log(f"Error: {str(e)}") sleep(10)

Тест реальной работы диска:

img

END

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

Comment
All comments (3)

    期待小梦老师 尽快出一个@监控账户资产变动的案例

    3 years ago

    好的,这个在计划内。

    3 years ago

    点赞

    3 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)