Программа-оповещатель о резком изменении курса фьючерса на природный газ на Московской Бирже

Для трейдеров, которые постоянно следят за курсом того или иного актива, например, в нашем случае это фьючерс на природный газ NGH3 крайне полезно иметь приложение, которое бы автоматически отслеживало резкие изменения курса (понижение или возрастание) и информировало бы трейдера в телеграмм, чтобы он мог принять решение об обоснованном открытии сделки.

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

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

Идея программы

В данном примере я создал заготовку простой программы на языке Python, которая подключается к API Московской Биржи и сравнивает 2 стоимости актива фьючерс на природный газ NGH3:

  • Стоимость фьючерса на газ 20 минут назад от текущего времени
  • Текущую стоимость фьючерса на природный газ

Смысл программы в том, что нужно проанализировать 2 разные стоимости на фьючерс природного газа – историческую (на момент 20 минут назад) и текущую, и сделать вывод о том, как и на сколько процентов она изменилась за это время.

Варианта изменения стоимости за 20 минут может быть 2:

  • Уменьшение стоимости актива
  • Увеличение стоимости актива

В случае изменения стоимости актива программа должна отправить мне в телеграмм сообщение с указанием количества процентов, на которое она изменилась и указать уменьшилась она или увеличилась.

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

Таким образом, если изменение стоимости фьючерса на газ будет незначительное (менее 1%), то программа будет “молчать”. Но если робот заметит, что неожиданно стоимость изменилась относительно стоимости 20 минут назад более чем на 1% – надо срочно отправить сообщение в телеграмм хозяину и взять паузу в проверке на 60 секунд, чтобы лишний раз его не отвлекать.

Давайте посмотрим на итоговый рабочий код такой программы.

Код программы

import time
import requests
Укажите токен вашего бота, полученный от BotFather
bot_token = 'ВАШ_ТОКЕН'
Укажите ваш chat_id. Вы можете получить его, написав боту @userinfobot в Telegram
chat_id = 'ВАШ_ID'
Определяем период в минутах, за который мы хотим получить исторические данные
period_minutes = 20
Отправляем запрос на получение информации о цене фьючерса NGH3 за последние period_minutes минут
response = requests.get(f'https://iss.moex.com/iss/history/engines/futures/markets/forts/securities/NGH3.json?from={period_minutes}MIN')
Получаем исторические данные из ответа в формате JSON
history_data = response.json()['history']['data']
Извлекаем значение цены 20 минут назад из исторических данных
old_price = float(history_data[-1][4])
while True:
timepause=5
# Отправляем запрос на получение информации о цене фьючерса NGH3 с Московской биржи
response = requests.get('https://iss.moex.com/iss/engines/futures/markets/forts/securities/NGH3.json')
# Получаем стоимость из ответа в формате JSON
last_price = response.json()['marketdata']['data'][0][6]
print(f'Цена NGH3 20 минут назад: {old_price}')
print(f'Последняя цена NGH3: {last_price}')
price_diff = (last_price - old_price) / old_price * 100
# Если изменение стоимости больше 1%, выводим сообщение о росте или падении цены
if abs(price_diff) >= 1:
if price_diff > 0:
message = f'Стоимость фьючерса NGH3 увеличилась на {price_diff:.1f} %: {last_price:.3f}'
# Отправляем запрос к API Telegram, используя метод sendMessage
url = f'https://api.telegram.org/bot{bot_token}/sendMessage'
params = {'chat_id': chat_id, 'text': message}
response = requests.post(url, data=params)
timepause=60
else: message = f'Стоимость фьючерса NGH3 уменьшилась на {abs(price_diff):.1f} %: {last_price:.3f}'
# Отправляем запрос к API Telegram, используя метод sendMessage
url = f'https://api.telegram.org/bot{bot_token}/sendMessage'
params = {'chat_id': chat_id, 'text': message}
response = requests.post(url, data=params)
timepause=60
time.sleep(timepause)

Детально описание работы программы

Данная программа создана для отслеживания изменений стоимости фьючерса NGH3 на Московской бирже и отправки уведомлений в Telegram в случае, если изменение цены составляет более 1%.

Сначала в программе задаются следующие параметры:

  • bot_token – токен бота в Telegram, который будет использоваться для отправки уведомлений.
  • chat_id – ID чата в Telegram, в который будут отправляться уведомления.
  • period_minutes – период времени в минутах, за который будет запрашиваться историческая информация о цене фьючерса.

Затем происходит отправка GET-запроса к API Московской биржи для получения исторической информации о цене фьючерса за последние period_minutes минут. Ответ на запрос получается в формате JSON и сохраняется в переменную history_data.

Далее в бесконечном цикле происходит отправка GET-запроса к API Московской биржи для получения текущей цены фьючерса. Ответ на запрос также получается в формате JSON и сохраняется в переменную last_price.

Затем происходит вывод информации о цене фьючерса 20 минут назад (old_price) и текущей цене (last_price).

Далее вычисляется процентное изменение цены (price_diff) по формуле: (last_price - old_price) / old_price * 100.

Если процентное изменение цены превышает 1%, программа формирует сообщение о росте или падении цены и отправляет его в чат в Telegram, используя метод sendMessage API Telegram. После отправки уведомления происходит остановка выполнения программы на 60 секунд (timepause=60), чтобы не отправлять слишком много уведомлений в короткий промежуток времени.

Если процентное изменение цены не превышает 1%, программа ждет 5 секунд (timepause=5) перед повторным выполнением цикла. Если цена не изменяется, программа будет продолжать выполняться в бесконечном цикле.

Понравилась статья? Поделиться с друзьями: