В процессе загрузки ресурсов... загрузка...

Квалификация FMZ: Анализ примеров дизайна общих потребностей на рынке криптовалют (1)

Автор:Изобретатели количественного измерения - мечты, Создано: 2023-12-17 18:43:46, Обновлено: 2024-11-06 21:18:36

img

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

1, пожалуйста, как написать валюту, которая выросла больше всего за 4 часа, чтобы получить наличные?

При написании количественной стратегии торговли на FMZ необходимо сначала проанализировать потребности.

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

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

Кодный дизайн

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. Бесконечные циклы
      while (true) {
          // ...
      }
      
      Программа постоянно отслеживает цены на сделки в Binance API через бесконечный цикл.
    • 2.2. Доступ к информации о ценах
      var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
      
      Получить информацию о текущей цене пары с помощью API Binance. Если возвращается неарифметика, подождите 5 секунд и попробуйте снова.
    • 2.3 Обновление цены
      for (var i = 0; i < arr.length; i++) {
          // ...
      }
      
      Пройдите через полученные матрицы информации о ценах, обновляя данные в диктСимволахPrice. Для каждой сделки в соответствующую матрицу данных добавляется текущий временной диапазон и цена.
    • 2.4. Обращение с нарушениями
      } catch(e) {
          Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
      }
      
      Захватывает исключения и записывает их, чтобы обеспечить продолжение выполнения процедуры.
    • 2.5. Расчет падения курса
      for (var symbol in dictSymbolsPrice) {
          // ...
      }
      
      Пройдите через dictSymbolsPrice, подсчитайте падение курса на каждую торговую пару и удалите самые ранние данные, если длина данных превышает 4 часа.
    • 2.6. Сортировать и генерировать таблицы
      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. Вывод и задержка журналов
      LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
      Sleep(5000)
      
      Выводит таблицу и текущее время в виде журналов и ждет 5 секунд, чтобы продолжить следующий цикл.

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

Испытания на диске

img

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

2. Узнайте, какие ставки на все виды контрактов в Binance.

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

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

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

В связи с большим количеством контрактов мы входим в десятку стран с наибольшим уровнем экспорта.

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 - это именно та ставка, которую мы хотим получить.

{
    "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Данные, возвращаемые интерфейсом:

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

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

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

Окончание

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


Больше

98-K-диапазон отслеживания _LongМы ожидаем, что учительница в скором времени выпустит пример изменения активов @monitoringaccount.

98-K-диапазон отслеживания _LongПоздравления

Изобретатели количественного измерения - мечтыХорошо, это в планах.