- Регистрация
- 12.06.2018
- Сообщения
- 1 346
- Благодарностей
- 910
- Баллы
- 113
Всем привет. В прошлом по теме WebSocket уже была представлена информация с рабочими решениями. В данной статье моей целью является освежить общее представление о WebSocket, а так же создать более универсальное решение, которое можно было бы применить для как можно более широкого спектра сервисов. Так как одна из актуальных тем это криптовалюта, то пример будет на основе работы с одной из крипто-бирж. Статья адресована от среднего уровня и ниже, т.к. продвинутым пользователям не составит труда запилить WebSocket под свои конкретные нужды, а для новичков это скорее всего тёмный лес, с учётом того, что ZennoPoster из коробки не имеет специальных кубиков для таких задач.
Немного теории.
Протокол WebSocket позволяет обмениваться данными между браузером и сервером в реальном времени используя постоянное соединение. Эти данные представляют собой так называемые "пакеты" и передаются в обоих направлениях без разрыва соединения и каких-либо дополнительных HTTP-запросов.
Если сравнивать WebSocket с обычными HTTP запросами, которые являются однонаправленными, то сразу становится виден очевидный минус HTTP - чтобы узнать об изменении на сервере, необходимо регулярно совершать HTTP запросы и проверять обновления на сервере. При использовании WebSocket сервер может как отвечать на запрос клиента, так и передавать новую информацию.
В связи с этим WebSocket применяется в сервисах, работающих в режиме реального времени - онлайн игры, торговые площадки, биржи. Т.е. где данные меняются очень быстро. Если же нужны статичные данные, или данные, которые обновляются нечасто, то будет достаточно использовать HTTP-запросы.
Чтобы открыть WebSocket-соединение, необходимо использовать специальный протокол ws:// или wss:// Последний использует шифрование, и обладает повышенной надёжностью. Это как https://, но только для WebSocket. Отправляем запрос, сервер с поддержкой WebSocket отвечает - соединение считается установленным. После этого клиент и сервер могут начинать двунаправленный обмен сообщениями.
В нашем случае мы будем использовать крипто-биржу, где данные обновляются очень быстро, а для успешной работы требуется иметь всегда актуальные данные. Как раз в этом случае WebSocket становится незаменимым решением.
ZennoPoster, а так же каждый конкретный шаблон вносят свои коррективы в использование вёб-сокетов - какими-то нюансами можно пренебречь и что-то опустить для упрощения работы. Поэтому на данном этапе общей информации должно быть достаточно.
Практика.
Как правило, у любой крипто-биржи есть документация для разработчиков (если её нет, стоит задуматься имеет ли смысл с ней работать), в которой можно найти информацию как работать c API и WebSocket. Для примера возьмём крипто-биржу ByBit, документацию к которой можно найти тут:
https://bybit-exchange.github.io/docs/spot/v3/#t-introduction
Переходим, ищем раздел по WebSocket и смотрим что нам потребуется:
https://bybit-exchange.github.io/docs/spot/v3/#t-websocket
Для начала нам нужно найти адрес, по которому будет доступен протокол WebSocket.
Во многих случаях после открытия соединения, оно может автоматически закрываться через определённое количество времени, для проверки соединения используются так называемые «ping-pong фреймы», которые так же могут использоваться для поддержания соединения открытым. Смотрим в документацию:
Здесь указано, что для поддержания соединения открытым необходимо каждые 20 секунд посылать специальный heartbeat пакет.
Осталось найти основной запрос для получения данных – смотрим в документации необходимый нам, например этот:
Справа в окне указан пример этого запроса и пример как будет выглядеть ответ. В данном случае нам необходимо указать нужную торговую пару.
Теперь у нас есть все данные для реализации WebSocket соединения и получения данных:
Endpoint: wss://stream.bytick.com/spot/public/v3
Request: {"op":"subscribe","args":["tickers.BTCUSDT"]}
Ping: {"op":"ping"}
В данном эндпоинте я поменял домен с bybit.com на bytick.com, который является зеркалом. По непонятной причине в ZennoPoster домен bybit.com не захотел устанавливать соединение, тогда как вне ZennoPoster он отвечал нормально.
Для удобства составления запросов, представляющих собой JSON и преобразования их в строку, можно использовать любой онлайн-сервис JSON Minifier. Например, этот:
https://codebeautify.org/jsonminifier
Тестировать будем в довольно удобном расширении для браузера, которое называется WebSocket Test Client:
Скачать его можно тут:
https://chrome.google.com/webstore/detail/websocket-test-client/fgponpodhbmadfljofbimhhlengambbn
Прописываем URL жмём «Open» для открытия соединения. После того как соединение открылось, становится активным поле «Request», куда собственно и прописываем наш request. Нажимаем «Send» и видим в нижнем поле как сервер начинает нам слать данные. Периодически отправляем наш Ping запрос для поддержания соединения открытым.
Теперь остаётся только следить за данными, ждать появления необходимых нам значений, принимать решения и получать профит.
Шаблон.
В прилагающемся шаблоне, я постарался по максимуму сделать универсальное решение, которое можно применить не только для данной биржи, а вообще для любого другого сервиса, работающего с WebSocket. Конечно сделать полностью универсальным решение довольно сложно, но думаю большинство потребностей он может закрыть.
Пробежимся по настройкам:
Первые 3 пункта мы уже рассматривали выше.
“Use filter”: выводить в лог не весь ответ сервера, а конкретно по нужному ключу.
Например, у нас идёт следующий ответ от сервера в формате JSON:
{"topic":"bookticker.BTCUSDT","ts":1671558643493,"type":"snapshot","data":{"s":"BTCUSDT","bp":"16798.37","bq":"0.00274","ap":"16800.96","aq":"0.001015","t":1671558643493}}
Мы хотим получать только значения по ключу “bp”. Соответственно прописываем этот ключ в поле “Filter parameter” и в логе будем получать значение только по нему.
“Target value”: Если необходимо дождаться определённого значения для ключа, прописываем здесь нужное значение. Как только это значение достигнуто, работа завершается и дальше можно принимать решения исходя из полученных данных.
Сам шаблон выполнен в минималистичном стиле – запускается первым кубиком, работает асинхронно, т.е. можно делать любые другие действия в процессе получения данных. Чтобы завершить соединение, необходимо запустить второй кубик.
В папке dll находятся библиотеки, которые необходимо скопировать в папку с установленным ZennoPoster - C:\Program Files\ZennoLab\RU\ZennoPoster Pro V7\7.7.1.0\Progs\ExternalAssemblies (путь может отличаться в зависимости от версии установленной программы).
Надеюсь данная информация будет полезной и поможет в реализации собственных идей, а так же получения профита. Всем добра.
Немного теории.
Протокол WebSocket позволяет обмениваться данными между браузером и сервером в реальном времени используя постоянное соединение. Эти данные представляют собой так называемые "пакеты" и передаются в обоих направлениях без разрыва соединения и каких-либо дополнительных HTTP-запросов.
Если сравнивать WebSocket с обычными HTTP запросами, которые являются однонаправленными, то сразу становится виден очевидный минус HTTP - чтобы узнать об изменении на сервере, необходимо регулярно совершать HTTP запросы и проверять обновления на сервере. При использовании WebSocket сервер может как отвечать на запрос клиента, так и передавать новую информацию.
В связи с этим WebSocket применяется в сервисах, работающих в режиме реального времени - онлайн игры, торговые площадки, биржи. Т.е. где данные меняются очень быстро. Если же нужны статичные данные, или данные, которые обновляются нечасто, то будет достаточно использовать HTTP-запросы.
Чтобы открыть WebSocket-соединение, необходимо использовать специальный протокол ws:// или wss:// Последний использует шифрование, и обладает повышенной надёжностью. Это как https://, но только для WebSocket. Отправляем запрос, сервер с поддержкой WebSocket отвечает - соединение считается установленным. После этого клиент и сервер могут начинать двунаправленный обмен сообщениями.
В нашем случае мы будем использовать крипто-биржу, где данные обновляются очень быстро, а для успешной работы требуется иметь всегда актуальные данные. Как раз в этом случае WebSocket становится незаменимым решением.
ZennoPoster, а так же каждый конкретный шаблон вносят свои коррективы в использование вёб-сокетов - какими-то нюансами можно пренебречь и что-то опустить для упрощения работы. Поэтому на данном этапе общей информации должно быть достаточно.
Практика.
Как правило, у любой крипто-биржи есть документация для разработчиков (если её нет, стоит задуматься имеет ли смысл с ней работать), в которой можно найти информацию как работать c API и WebSocket. Для примера возьмём крипто-биржу ByBit, документацию к которой можно найти тут:
https://bybit-exchange.github.io/docs/spot/v3/#t-introduction
Переходим, ищем раздел по WebSocket и смотрим что нам потребуется:
https://bybit-exchange.github.io/docs/spot/v3/#t-websocket
Для начала нам нужно найти адрес, по которому будет доступен протокол WebSocket.
Во многих случаях после открытия соединения, оно может автоматически закрываться через определённое количество времени, для проверки соединения используются так называемые «ping-pong фреймы», которые так же могут использоваться для поддержания соединения открытым. Смотрим в документацию:
Здесь указано, что для поддержания соединения открытым необходимо каждые 20 секунд посылать специальный heartbeat пакет.
Осталось найти основной запрос для получения данных – смотрим в документации необходимый нам, например этот:
Справа в окне указан пример этого запроса и пример как будет выглядеть ответ. В данном случае нам необходимо указать нужную торговую пару.
Теперь у нас есть все данные для реализации WebSocket соединения и получения данных:
Endpoint: wss://stream.bytick.com/spot/public/v3
Request: {"op":"subscribe","args":["tickers.BTCUSDT"]}
Ping: {"op":"ping"}
В данном эндпоинте я поменял домен с bybit.com на bytick.com, который является зеркалом. По непонятной причине в ZennoPoster домен bybit.com не захотел устанавливать соединение, тогда как вне ZennoPoster он отвечал нормально.
Для удобства составления запросов, представляющих собой JSON и преобразования их в строку, можно использовать любой онлайн-сервис JSON Minifier. Например, этот:
https://codebeautify.org/jsonminifier
Тестировать будем в довольно удобном расширении для браузера, которое называется WebSocket Test Client:
Скачать его можно тут:
https://chrome.google.com/webstore/detail/websocket-test-client/fgponpodhbmadfljofbimhhlengambbn
Прописываем URL жмём «Open» для открытия соединения. После того как соединение открылось, становится активным поле «Request», куда собственно и прописываем наш request. Нажимаем «Send» и видим в нижнем поле как сервер начинает нам слать данные. Периодически отправляем наш Ping запрос для поддержания соединения открытым.
Теперь остаётся только следить за данными, ждать появления необходимых нам значений, принимать решения и получать профит.
Шаблон.
В прилагающемся шаблоне, я постарался по максимуму сделать универсальное решение, которое можно применить не только для данной биржи, а вообще для любого другого сервиса, работающего с WebSocket. Конечно сделать полностью универсальным решение довольно сложно, но думаю большинство потребностей он может закрыть.
Пробежимся по настройкам:
Первые 3 пункта мы уже рассматривали выше.
“Use filter”: выводить в лог не весь ответ сервера, а конкретно по нужному ключу.
Например, у нас идёт следующий ответ от сервера в формате JSON:
{"topic":"bookticker.BTCUSDT","ts":1671558643493,"type":"snapshot","data":{"s":"BTCUSDT","bp":"16798.37","bq":"0.00274","ap":"16800.96","aq":"0.001015","t":1671558643493}}
Мы хотим получать только значения по ключу “bp”. Соответственно прописываем этот ключ в поле “Filter parameter” и в логе будем получать значение только по нему.
“Target value”: Если необходимо дождаться определённого значения для ключа, прописываем здесь нужное значение. Как только это значение достигнуто, работа завершается и дальше можно принимать решения исходя из полученных данных.
Сам шаблон выполнен в минималистичном стиле – запускается первым кубиком, работает асинхронно, т.е. можно делать любые другие действия в процессе получения данных. Чтобы завершить соединение, необходимо запустить второй кубик.
В папке dll находятся библиотеки, которые необходимо скопировать в папку с установленным ZennoPoster - C:\Program Files\ZennoLab\RU\ZennoPoster Pro V7\7.7.1.0\Progs\ExternalAssemblies (путь может отличаться в зависимости от версии установленной программы).
Надеюсь данная информация будет полезной и поможет в реализации собственных идей, а так же получения профита. Всем добра.
- Тема статьи
- Другое
Вложения
-
326,2 КБ Просмотры: 451
Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...
Для того чтобы запустить шаблон, откройте нужную программу. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.
Последнее редактирование модератором: