Мониторинг волатильности таких криптовалют, как 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-платформу, и, возможно, этот опыт будет полезен для других проектов, если с криптой вы не работаете.
ссылка на оригинал статьи https://habr.com/ru/articles/839208/
Добавить комментарий