Мониторинг волатильности таких криптовалют, как Bitcoin, позволяет быстро реагировать на изменения рынка, управлять рисками и улучшать стратегии. Понимание текущих ценовых колебаний помогает устанавливать правильные уровни стоп-лосс и тейк-профит. В этой статье вы узнаете, как интегрировать ByBit и платформу МТС Exolve для получения автоматических SMS о колебаниях курса Bitcoin.

Мы покажем примеры кода для настройки основных видов колебаний и в конце, в инструкции, соединим наблюдение в режиме реального времени, настроим триггеры и отправку SMS.

Виды колебаний

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

Диапазон изменения цены (Price Range)

Измерение максимальной и минимальной цены за определённый период (час, день). Например, BTC торгуется в диапазоне от 30 000 $ до 32 000 $ за последние сутки.

Сделаем запрос последнего моментального снимка цены, лучшей цены спроса/предложения и объёма торгов за последние 24 часа на api /v5/market/tickers.

Создайте файл priceRangeChecker.js и добавьте в него этот код:

const axios = require('axios'); // Импортирует библиотеку axios для выполнения HTTP-запросов


const baseUrl = 'https://api.bybit.com'; // Базовый URL для API Bybit


// Асинхронная функция для получения диапазона цен для заданного символа
async function getPriceRange(symbol) {
    try {
        // Выполняет GET-запрос к API Bybit для получения данных тикера
        const response = await axios.get(`${baseUrl}/v5/market/tickers`, {
            params: {
                category: 'spot', // Указывает категорию: 'spot', 'linear' или 'inverse'
                symbol: symbol,   // Указывает символ для получения данных (например, BTCUSDT)
            }
        });


        // Проверяет, что результат существует и не пустой
        if (response.data.result && response.data.result.list && response.data.result.list.length > 0) {
            const data = response.data.result.list[0]; // Извлекает данные тикера
            console.log('Ticker data:', data); // Выводит данные тикера в консоль
            console.log(`Диапазон цен для ${symbol}: Мин ${data.lowPrice24h}, Макс ${data.highPrice24h}`); // Выводит диапазон цен за последние 24 часа
            return { min: data.lowPrice24h, max: data.highPrice24h }; // Возвращает диапазон цен
        } else {
            console.error('Для данного символа нет данных.'); // Выводит ошибку, если данных нет
            return null; // Возвращает null, если данных нет
        }
    } catch (error) {
        console.error('Ошибка при получении диапазона цен:', error); // Выводит ошибку, если запрос не удался
    }
}


getPriceRange('BTCUSDT'); // Вызывает функцию для получения диапазона цен для BTCUSDT

Запустите код через терминал:

node priceRangeChecker.js

Результат выполнения кода:

Ticker data: {
  symbol: 'BTCUSDT',
  bid1Price: '64558.89',
  bid1Size: '0.169536',
  ask1Price: '64558.9',
  ask1Size: '0.813043',
  lastPrice: '64558.89',
  prevPrice24h: '64974.89',
  price24hPcnt: '-0.0064',
  highPrice24h: '66129.54',
  lowPrice24h: '63846.77',
  turnover24h: '1098237112.69553235',
  volume24h: '16884.918801',
  usdIndexPrice: '64568.456975'
}
Диапазон цен для BTCUSDT: Мин 63846.77, Макс 66129.54

Что делает код:

  1. Импортирует библиотеку axios для выполнения HTTP-запросов.

  2. Определяет базовый URL для API ByBit.

  3. Определяет асинхронную функцию getPriceRange для получения диапазона цен для заданного символа.

  4. Внутри функции:

  • Выполняет GET-запрос к API ByBit для получения данных тикера.

  • Проверяет, что ответ API содержит необходимые данные.

  • Извлекает и выводит данные тикера, включая диапазон цен за последние 24 часа.

  • Возвращает диапазон цен или null, если данных нет.

  • Обрабатывает ошибки и выводит их в консоль.

И в последнюю очередь вызывает функцию getPriceRange для символа BTCUSDT.

Среднее истинное отклонение (Average True Range, ATR)

Показатель волатильности рынка, учитывающий максимумы и минимумы цен, а также ценовые разрывы. Например, ATR за 14 дней составляет 500 $, что указывает на текущий уровень волатильности.

Запрос исторических линий, известных как свечи, можно сделать по адресу /v5/market/tickers. Графики возвращаются в группах, основанных на запрошенном интервале.

Создайте новый файл atrCalculator.js и добавьте туда этот код:

const axios = require('axios'); // Импортирует библиотеку axios для выполнения HTTP-запросов


const baseUrl = 'https://api.bybit.com'; // Базовый URL для API Bybit
const symbol = 'BTCUSDT'; // Символ для отслеживания


// Асинхронная функция для получения ATR (Average True Range)
async function getATR(symbol, interval = 'D', limit = 14) {
    try {
        // Выполняет GET-запрос к API Bybit для получения данных Kline
        const response = await axios.get(`${baseUrl}/v5/market/kline`, {
            params: {
                category: 'spot', // Указывает категорию: 'spot', 'linear' или 'inverse'
                symbol: symbol,   // Указывает символ для получения данных (например, BTCUSDT)
                interval: interval, // Интервал времени для каждого Kline (например, 'D' для дневного)
                limit: limit + 1 // +1 чтобы включить предыдущее закрытие
            }
        });
        console.log('ответ API:', response.data); // Выводит ответ API в консоль


        // Проверяет, что результат существует и не пустой
        if (response.data.result && response.data.result.list && response.data.result.list.length > 0) {
            const data = response.data.result.list; // Извлекает данные Kline
            console.log('Данные Kline:', data); // Выводит данные Kline в консоль


            let atr = 0; // Инициализирует переменную для ATR
            // Цикл для расчета истинного диапазона (TR) и суммирования для ATR
            for (let i = 1; i < data.length; i++) {
                const high = parseFloat(data[i][3]); // Максимальная цена
                const low = parseFloat(data[i][4]); // Минимальная цена
                const prevClose = parseFloat(data[i - 1][2]); // Цена закрытия предыдущего Kline
                // Рассчитывает истинный диапазон (TR)
                const tr = Math.max(high - low, Math.abs(high - prevClose), Math.abs(low - prevClose));
                atr += tr; // Добавляет TR к общей сумме ATR
            }
            atr /= limit; // Делит общую сумму TR на количество периодов для получения среднего истинного диапазона (ATR)
            console.log(`ATR для ${symbol} за ${limit} периодов: ${atr}`); // Выводит ATR в консоль
            return atr; // Возвращает рассчитанный ATR
        } else {
            console.error('Для данного символа нет данных.'); // Выводит ошибку, если данных нет
            return null; // Возвращает null, если данных нет
        }
    } catch (error) {
        console.error('Ошибка при получении ATR:', error); // Выводит ошибку, если запрос не удался
    }
}


getATR(symbol); // Вызывает функцию для вычисления ATR для BTCUSDT

Результат выполнения кода:

Данные Kline: [
  [
    '1721174400000',
    '65047',
    '66129.54',
    '63846.77',
    '64575.06',
    '14783.664268',
    '962153074.25098363'
  ],
  [
    '1721088000000',
    '64721.37',
    '65399.96',
    '62382.93',
    '65047',
    '20752.661083',
    '1329816905.57084192'
  ],
  [
    '1721001600000',
    '60791.33',
    '64912.45',
    '60649.91',
    '64721.37',
    '20967.809277',
    '1320917551.34519924'
  ],
  [
    '1720915200000',
    '59204.58',
    '61433.24',
    '59193.96',
    '60791.33',
    '12725.297318',
    '764045293.26194184'
  ],
  [
    '1720828800000',
    '57891.49',
    '59858',
    '57750',
    '59204.58',
    '10465.033445',
    '612558728.3136714'
  ],
  [
    '1720742400000',
    '57343.88',
    '58536.45',
    '56538.8',
    '57891.49',
    '14623.710134',
    '840594481.35922771'
  ],
  [
    '1720656000000',
    '57733.33',
    '59559.73',
    '57049.96',
    '57343.88',
    '15993.704904',
    '928676592.96136043'
  ],
  [
    '1720569600000',
    '58048.52',
    '59482',
    '57149.27',
    '57733.33',
    '16643.830341',
    '968048405.30245373'
  ],
  [
    '1720483200000',
    '56711.66',
    '58312',
    '56291.83',
    '58048.52',
    '13123.359683',
    '753640656.19683971'
  ],
  [
    '1720396800000',
    '55864.83',
    '58220',
    '54277.81',
    '56711.66',
    '17367.690054',
    '977413163.04653669'
  ],
  [
    '1720310400000',
    '58239.99',
    '58445.8',
    '55718.61',
    '55864.83',
    '10727.975865',
    '614742797.29615926'
  ],
  [
    '1720224000000',
    '56631.52',
    '58485.47',
    '56018.21',
    '58239.99',
    '9940.385056',
    '567901563.72474508'
  ],
  [
    '1720137600000',
    '57056.28',
    '57555',
    '53345.94',
    '56631.52',
    '23088.571336',
    '1282878717.21570821'
  ],
  [
    '1720051200000',
    '60211.1',
    '60503.22',
    '56752.13',
    '57056.28',
    '25290.405451',
    '1470777653.45158958'
  ],
  [
    '1719964800000',
    '62131.02',
    '62286.36',
    '59387.59',
    '60211.1',
    '19925.700455',
    '1206263679.84045165'
  ]
]
ATR для BTCUSDT за 14 периодов: 3166.1364285714285

Асинхронная функция getATR делает следующее:

  • Принимает параметры symbol, interval (по умолчанию 'D' для дневного интервала) и limit (по умолчанию 14 периодов).

  • Выполняет GET-запрос к API ByBit для получения данных Kline.

  • Проверяет, что ответ API содержит необходимые данные.

  • Извлекает данные Kline и выводит их в консоль.

  • Инициализирует переменную atr для хранения суммы истинных диапазонов (TR).

  • Использует цикл для расчёта TR для каждого периода и суммирует их.

  • Делит общую сумму TR на количество периодов для получения среднего истинного диапазона (ATR).

  • Выводит рассчитанный ATR в консоль и возвращает его.

  • Обрабатывает ошибки и выводит их в консоль.

Стандартное отклонение (Standard Deviation)

Измерение разброса цен вокруг среднего значения за определённый период.

Например, стандартное отклонение цен BTC за последние 30 дней составляет 1500 $.

Для расчёта стандартного отклонения цен за конкретный период с использованием эндпоинта Bybit API GET /v5/market/mark-price-kline нужно сделать запрос к этому эндпоинту, получить данные и использовать их.

Создайте файл standardDeviationCalculator.js с этим кодом:

const axios = require('axios'); // Импортирует библиотеку axios для выполнения HTTP-запросов


const baseUrl = 'https://api.bybit.com'; // Базовый URL для API Bybit
const symbol = 'BTCUSDT'; // Символ для отслеживания


// Асинхронная функция для получения стандартного отклонения (Standard Deviation)
async function getStandardDeviation(symbol, interval = 'D', limit = 30) {
    try {
        // Выполняет GET-запрос к API Bybit для получения данных Mark Price Kline
        const response = await axios.get(`${baseUrl}/v5/market/mark-price-kline`, {
            params: {
                symbol: symbol, // Указывает символ для получения данных (например, BTCUSDT)
                interval: interval, // Интервал времени для каждого Kline (например, 'D' для дневного)
                limit: limit // Количество периодов для расчета стандартного отклонения
            }
        });
        console.log('ответ API:', response.data); // Выводит ответ API в консоль


        // Проверяет, что результат существует и не пустой
        if (response.data.result && response.data.result.list && response.data.result.list.length > 0) {
            const data = response.data.result.list; // Извлекает данные Mark Price Kline
            console.log('Данные Kline:', data); // Выводит данные Kline в консоль


            // Извлекает цены закрытия (close prices) из данных
            const prices = data.map(item => parseFloat(item[2])); // Закрытие цены (close price)
            // Вычисляет среднее значение цен (mean)
            const mean = prices.reduce((acc, price) => acc + price, 0) / prices.length;
            // Вычисляет дисперсию (variance)
            const variance = prices.reduce((acc, price) => acc + Math.pow(price - mean, 2), 0) / prices.length;
            // Вычисляет стандартное отклонение (standard deviation)
            const standardDeviation = Math.sqrt(variance);


            console.log(`Стандартное отклонение для ${symbol} за ${limit} периодов: ${standardDeviation}`); // Выводит стандартное отклонение в консоль
            return standardDeviation; // Возвращает рассчитанное стандартное отклонение
        } else {
            console.error('Для данного символа нет данных.'); // Выводит ошибку, если данных нет
            return null; // Возвращает null, если данных нет
        }
    } catch (error) {
        console.error('Ошибка при получении стандартного отклонения:', error); // Выводит ошибку, если запрос не удался
    }
}


getStandardDeviation(symbol); // Вызывает функцию для вычисления стандартного отклонения для BTCUSDT

Результат выполнения кода:

Данные Kline: [
  [ '1721174400000', '65014.39', '66097.8', '63828.96', '64524.8' ],
  [ '1721088000000', '64713.1', '65346.71', '62369.06', '65014.39' ],
  [ '1721001600000', '60755.8', '64888.6', '60609.6', '64713.1' ],
  [ '1720915200000', '59187.7', '61387.1', '59181.33', '60755.8' ],
  [ '1720828800000', '57861.78', '59848.4', '57718.57', '59187.7' ],
  [ '1720742400000', '57315.22', '58505.5', '56518', '57861.78' ],
  [ '1720656000000', '57713.94', '59470', '57036.1', '57315.22' ],
  [ '1720569600000', '58027.03', '59431.7', '57148.3', '57713.94' ],
  [ '1720483200000', '56696.6', '58271', '56275.94', '58027.03' ],
  [ '1720396800000', '55840', '58197.91', '54265.4', '56696.6' ],
  [ '1720310400000', '58204.1', '58412.16', '55710', '55840' ],
  [ '1720224000000', '56602.8', '58442.3', '56002.38', '58204.1' ],
  [ '1720137600000', '57034', '57518.1', '53504.3', '56602.8' ],
  [ '1720051200000', '60184.9', '60465.18', '56733.81', '57034' ],
  [ '1719964800000', '62092.6', '62250', '59390.9', '60184.9' ],
  [ '1719878400000', '62861.89', '63258.4', '61787.8', '62092.6' ],
  [ '1719792000000', '62749.6', '63842.3', '62488.45', '62861.89' ],
  [ '1719705600000', '60943.32', '63035.1', '60674.17', '62749.6' ],
  [ '1719619200000', '60407.56', '61196.7', '60378.1', '60943.32' ],
  [ '1719532800000', '61659.5', '62207.8', '60029.9', '60407.56' ],
  [ '1719446400000', '60838.5', '62380', '60585.79', '61659.5' ],
  [ '1719360000000', '61764.4', '62454.1', '60672.96', '60838.5' ],
  [ '1719273600000', '60260.35', '62373.3', '60221.36', '61764.4' ],
  [ '1719187200000', '63179.9', '63329.8', '58446.85', '60260.35' ],
  [ '1719100800000', '64228.97', '64484.1', '63145.31', '63179.9' ],
  [ '1719014400000', '64108.3', '64497.79', '63906.7', '64228.97' ],
  [ '1718928000000', '64853.9', '65058.6', '63368', '64108.3' ],
  [ '1718841600000', '64943.76', '66459.51', '64533.6', '64853.9' ],
  [ '1718755200000', '65150.31', '65701.4', '64653.4', '64943.76' ],
  [ '1718668800000', '66459.77', '66552.7', '64042.45', '65150.31' ]
]
Стандартное отклонение для BTCUSDT за 30 периодов: 2751.139147809381

Асинхронная функция getStandardDeviation работает так:

  • Принимает параметры symbol, interval (по умолчанию 'D' для дневного интервала) и limit (по умолчанию 30 периодов).

  • Выполняет GET-запрос к API ByBit для получения данных Mark Price Kline.

  • Выводит ответ API в консоль.

  • Проверяет, что ответ API содержит необходимые данные.

  • Извлекает данные Kline и выводит их в консоль.

  • Извлекает цены закрытия из данных.

  • Вычисляет среднее значение цен (mean).

  • Вычисляет дисперсию (variance).

  • Вычисляет стандартное отклонение (standard deviation).

  • Выводит стандартное отклонение в консоль и возвращает его.

  • Обрабатывает ошибки и выводит их в консоль.

Процентное изменение (Percentage Change)

Измерение процентного изменения цены за определённые временные интервалы (1 час, 24 часа). Например, цена BTC увеличилась на 5% за последние 24 часа.

Для измерения возьмём эндпоинт GET /v5/market/tickers. Мы можем использовать данные о цене открытия и закрытия за последний интервал для расчёта процентного изменения.

Создайте файл percentChange.js и добавьте этот код:

const axios = require('axios'); // Импортирует библиотеку axios для выполнения HTTP-запросов


const baseUrl = 'https://api.bybit.com'; // Базовый URL для API Bybit
const symbol = 'BTCUSDT'; // Символ для отслеживания


// Асинхронная функция для получения процентного изменения цены
async function getPercentageChange(symbol, interval = '24h') {
    try {
        // Выполняет GET-запрос к API Bybit для получения данных тикера
        const response = await axios.get(`${baseUrl}/v5/market/tickers`, {
            params: {
                category: 'spot', // Указывает категорию: 'spot', 'linear' или 'inverse'
                symbol: symbol,   // Указывает символ для получения данных (например, BTCUSDT)
            }
        });
        console.log('Ответ API:', response.data); // Выводит ответ API в консоль


        // Проверяет, что результат существует и не пустой
        if (response.data.result && response.data.result.list && response.data.result.list.length > 0) {
            const data = response.data.result.list[0]; // Извлекает данные тикера
            console.log('Данные Ticker:', data); // Выводит данные тикера в консоль


            const lastPrice = parseFloat(data.lastPrice); // Текущая цена
            const prevPrice = parseFloat(data.prevPrice24h); // Цена 24 часа назад


            // Вычисляет процентное изменение цены
            const percentageChange = ((lastPrice - prevPrice) / prevPrice) * 100;
            console.log(`Процентное изменение для ${symbol} за ${interval}: ${percentageChange.toFixed(2)}%`); // Выводит процентное изменение в консоль
            return percentageChange; // Возвращает рассчитанное процентное изменение
        } else {
            console.error('Для данного символа нет данных.'); // Выводит ошибку, если данных нет
            return null; // Возвращает null, если данных нет
        }
    } catch (error) {
        console.error('Ошибка при получении процентного изменения:', error); // Выводит ошибку, если запрос не удался
    }
}


getPercentageChange(symbol); // Вызывает функцию для вычисления процентного изменения для BTCUSDT

Результат работы кода:

Данные Ticker: {
  symbol: 'BTCUSDT',
  bid1Price: '64618',
  bid1Size: '0.922796',
  ask1Price: '64618.01',
  ask1Size: '0.000002',
  lastPrice: '64618.01',
  prevPrice24h: '64983.79',
  price24hPcnt: '-0.0056',
  highPrice24h: '66129.54',
  lowPrice24h: '63846.77',
  turnover24h: '1097742032.884776',
  volume24h: '16877.388038',
  usdIndexPrice: '64631.408601'
}
Процентное изменение для BTCUSDT за 24h: -0.56%

Асинхронная функция getPercentageChange работает так:

  • Принимает параметры symbol и interval (по умолчанию '24h' для 24-часового интервала).

  • Выполняет GET-запрос к API ByBit для получения данных тикера.

  • Выводит ответ API в консоль.

  • Проверяет, что ответ API содержит необходимые данные.

  • Извлекает данные тикера и выводит их в консоль.

  • Получает текущую цену (lastPrice) и цену 24 часа назад (prevPrice).

  • Вычисляет процентное изменение цены.

  • Выводит процентное изменение в консоль и возвращает его.

  • Обрабатывает ошибки и выводит их в консоль.

Пошаговое руководство интеграции ByBit API и МТС Exolve SMS API на примере диапазона изменения цены

Теперь создадим небольшое приложение, которое будет слушать ByBit и, когда цена пойдёт вверх или вниз, присылать SMS.

Создайте новый файл с названием sendSMS.js в корне проекта и инициализируйте проект:

npm init -y

Установите зависимости:

npm install axios dotenv express

Библиотеку dotenv мы будем использовать для безопасного хранения нашего API-ключа МТС Exolve. Создайте в корне проекта файл .env и добавьте в него полученный в личном кабинете CPaaS-платформы токен:

EXOLVE_API_KEY=ВАШ АПИ КЛЮЧ ЗДЕСЬ

Добавьте следующий код:

require('dotenv').config(); // Загружает переменные среды из файла .env
const express = require('express'); // Импортирует библиотеку express для создания сервера
const axios = require('axios'); // Импортирует библиотеку axios для выполнения HTTP-запросов


const app = express(); // Создает экземпляр express приложения
const port = 3000; // Устанавливает порт для сервера
const baseUrl = 'https://api.bybit.com'; // Базовый URL для API Bybit
const smsUrl = 'https://api.exolve.ru/messaging/v1/SendSMS'; // URL для отправки SMS через Exolve API
const smsApiKey = process.env.EXOLVE_API_KEY; // API ключ для Exolve, загружается из переменных среды


const senderNumber = 'ВАШ НОМЕР ОТПРАВИТЕЛЯ'; // Номер телефона отправителя
const receiverNumber = 'ВАШ НОМЕР ПОЛУЧАТЕЛЯ'; // Номер телефона получателя


let previousPrice = null; // Для хранения предыдущей цены


// Асинхронная функция для получения текущих данных тикера
async function getRealTimeTickers(symbol) {
    try {
        // Выполняет GET-запрос к API Bybit для получения данных тикера
        const response = await axios.get(`${baseUrl}/v5/market/tickers`, {
            params: {
                category: 'spot', // Указывает категорию: 'spot', 'linear' или 'inverse'
                symbol: symbol,   // Указывает символ для получения данных (например, BTCUSDT)
            }
        });
        console.log('Ответ API:', response.data); // Выводит ответ API в консоль


        // Проверяет, что результат существует и не пустой
        if (response.data.result && response.data.result.list && response.data.result.list.length > 0) {
            const data = response.data.result.list[0]; // Извлекает данные тикера
            console.log('Данные Ticker:', data); // Выводит данные тикера в консоль


            return parseFloat(data.lastPrice); // Возвращает текущую цену
        } else {
            console.error('Для данного символа нет данных.'); // Выводит ошибку, если данных нет
            return null; // Возвращает null, если данных нет
        }
    } catch (error) {
        console.error('Ошибка при получении тикеров в реальном времени:', error); // Выводит ошибку, если запрос не удался
    }
}


// Асинхронная функция для отправки SMS
async function sendSMS(number, destination, text) {
    try {
        // Выполняет POST-запрос к Exolve API для отправки SMS
        const response = await axios.post(smsUrl, {
            number: number,
            destination: destination,
            text: text
        }, {
            headers: {
                'Authorization': `Bearer ${smsApiKey}`, // Устанавливает заголовок авторизации
                'Content-Type': 'application/json' // Устанавливает тип содержимого
            }
        });
        console.log('Отправленное SMS:', response.data); // Выводит ответ API на отправку SMS в консоль
    } catch (error) {
        if (error.response) {
            console.error('Данные ответа на ошибку:', error.response.data); // Выводит данные об ошибке, если они есть
        }
        console.error('Ошибка отправки SMS:', error.message); // Выводит сообщение об ошибке
    }
}


// Функция для мониторинга цены
function monitorPrice(symbol, interval) {
    setInterval(async () => {
        const currentPrice = await getRealTimeTickers(symbol); // Получает текущую цену
        if (currentPrice !== null) {
            if (previousPrice !== null) {
                if (currentPrice > previousPrice) {
                    console.log(`Оповещение: Цена ${symbol} выросла! Предыдущая цена: ${previousPrice}, Текущая цена: ${currentPrice}`);
                    await sendSMS(senderNumber, receiverNumber, `Цена ${symbol} выросла с ${previousPrice} до ${currentPrice}`);
                } else if (currentPrice < previousPrice) {
                    console.log(`Оповещение: Цена ${symbol} снизилась! Предыдущая цена: ${previousPrice}, Текущая цена: ${currentPrice}`);
                    await sendSMS(senderNumber, receiverNumber, `Цена ${symbol} снизилась с ${previousPrice} до ${currentPrice}`);
                } else {
                    console.log(`Цена ${symbol} остается неизменной. Текущая цена: ${currentPrice}`);
                }
            } else {
                console.log(`Начальная цена ${symbol} установлена на: ${currentPrice}`);
            }
            previousPrice = currentPrice; // Обновляет предыдущую цену текущей
        }
    }, interval);
}


// Запуск сервера
app.listen(port, () => {
    console.log(`Сервер работает на порту ${port}`);
    monitorPrice('BTCUSDT', 5000); // Периодический запрос каждые 5 секунд
});

Запустите сервер express командой node sendSMS.js, и если всё успешно, то начнут приходить сообщения на указанный вами номер.

Как работает этот код

Асинхронная функция getRealTimeTickers:

  • Выполняет GET-запрос к API ByBit для получения данных тикера.

  • Проверяет, что ответ API содержит необходимые данные.

  • Возвращает текущую цену или выводит ошибку.

Асинхронная функция sendSMS:

  • Выполняет POST-запрос к МТС Exolve SMS API для отправки SMS.

  • Устанавливает заголовки авторизации и тип содержимого.

  • Выводит ответ API на отправку SMS или сообщение об ошибке.

Функция monitorPrice:

  • Запускает периодический запрос к API для получения текущей цены каждые interval миллисекунд.

  • Сравнивает текущую цену с предыдущей и отправляет SMS, если цена изменилась.

  • Обновляет предыдущую цену текущей.

Запуск сервера:

  • Сервер запускается на указанном порту и выводит сообщение в консоль.

  • Запускает мониторинг цены для символа BTCUSDT с интервалом 5 секунд.

Интеграция с другими эндпоинтами

Этот пример показывает, как использовать API ByBit для получения реальных данных о ценах на криптовалюты и для отправки SMS через МТС Exolve. В инструкции выше мы следили за изменениями цен и отправляли уведомления при их подъёме или падении.

Пример легко адаптируется под разные виды колебаний: можно выбрать другой эндпоинт в API ByBit или изменить логику обработки данных перед отправкой SMS.

Показанная в инструкции функция мониторинга позволяет устанавливать критерии для отправки уведомлений, например, по изменениям цен, объёмам торгов или историческому максимуму и минимуму.

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

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


Мы рассмотрели, как настроить мониторинг волатильности Bitcoin с помощью ByBit API и МТС Exolve для получения автоматических SMS-уведомлений о колебаниях курса. Примеры можно адаптировать к любым валютам и монетам криптоплатформы и в целом построить персональную систему наблюдения.

Также вы попробовали отправку SMS через API-платформу, и, возможно, этот опыт будет полезен для других проектов, если с криптой вы не работаете.

Комментарии (1)


  1. ky0
    28.08.2024 10:33

    Зачем в 2024 году нужны SMS, когда есть бесплатные API мессенджеров MMSки, в которых можно и графики заодно приложить? /s