Мониторинг волатильности таких криптовалют, как 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
Что делает код:
-
Импортирует библиотеку axios для выполнения HTTP-запросов.
-
Определяет базовый URL для API ByBit.
-
Определяет асинхронную функцию getPriceRange для получения диапазона цен для заданного символа.
-
Внутри функции:
-
Выполняет 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-платформу, и, возможно, этот опыт будет полезен для других проектов, если с криптой вы не работаете.
Автор: michabramov