📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

Создание торгового бота под крипту с нуля | С ЧЕГО НАЧАТЬ?

AutoScalping40:31

Transcription

Ну что ж, друзья, всем привет. Шёл двадцать пятый год. Криптоиндустрия всё растёт, биткоин растёт, пробивает свои максимумы, и количество пользователей в криптовалюте растёт, как и количество трейдеров. А там, где есть трейдеры, там и есть торговые инструменты, скринеры, роботы и куча разных инструментов, которые помогают торговать трейдером.

Конкретно таким и занимается наша команда по разработке торговых алгоритмов. То есть мы пишем скринеры, торговые роботы, секс биржи, Binance, Bit и так далее. Также сейчас вы видите на экране, как торгует один из наших роботов, которого мы с командой недавно разработали. И сегодня в ролике мы посмотрим, что нужно знать, чтобы полностью разработать торгового робота под любую криптобиржу. Можем даже создать небольшой план и по шагам выполнять его.

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

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

О'кей. Допустим, мы изучили основы, мы разобрались с видами трейдинг-стратегий, различных видами торговли и что нам нужно делать дальше. И следующим шагом нам, естественно, нужно знать базовые вещи в каком-нибудь языке программирования. Наша команда бы выбирает один из самых простых и удобных языков программирования для разработки торговых алгоритмов. Это Python. Почему он? Во-первых, для Python создано большое количество готовых библиотек. Этот язык можно использовать в любой сфере программирования, в том числе и для взаимодействия с биржами. Выбирать какой-то другой язык имеет немного смысла. Ну, например, если вы знаете какой-то другой язык и вам лень учить Python, то можно писать на удобном вам языке, но частично это может быть сложнее, а иногда даже сложнее, чем заново выучить Python, потому что тут довольно всё просто.

И что нам нужно узнать в Python? Чёткие темы, которые нам нужны, я укомплектовал в наше обучение. То есть мы там чётко берём по каждой теме и изучаем только то, что конкретно мы будем использовать постоянно. А зная то, что мы будем использовать постоянно, не составит труда изучить что-то необычное, если вам понадобится вдруг. Если так примерно вспомнить, то это циклы, условия if else, типы значений, различные списки, словари и так далее. А, естественно, функции. Асинхронность. Асинхронность - это очень важная тема, которую мы довольно досконально разбираем в обучении. Без неё не обходится ни один проект, потому что, как вы понимаете, и большой проект, там не может всё работать синхронно, то есть по очереди. Там всё должно работать в одно время. И обработка данных, и получение данных, и расчёты всей, и выставление ордеров, и так далее.

Разберём небольшой пример, который довольно лёгкий и который отображает в очень простом виде логику работы бота. У нас есть, например, цена актива какого-нибудь прайс, то есть 100 долларов, например. И у нас есть конкретные условия. Если цена больше 99 долларов, мы открываем лонг. А если вы не знакомы с трейдингом, то открыть лонг, да? То есть это купить какой-то актив, например, futures на какую-нибудь торговую пару. И у нас вызывается функция, которая и будет выставлять этот ордер. Естественно, здесь я пока оставил просто вывод, что мы покупаем что-то.

Ну хорошо, допустим, мы знакомы с базами Python, мы знаем функции, асинхронность, циклы, условия, типы данных и так далее. Что нужно делать дальше? Дальше мы должны познакомиться немного с документациями бирж.

Иногда мы встречали с командой некие сомнения в сторону, можно ли писать торговых ботов для биржи, не банит ли за этой биржей, не блокирует ли. И, конечно же, нет. Это сильное заблуждение, когда человек думает, что биржа заблокирует за то, что мы используем каких-то роботов. Как минимум, сама биржа предлагает также роботов. И документация самих бирж как раз-таки сделана так, чтобы мы и сами хотели писать этих ботов. Она, во-первых, выглядит довольно удобно. Во-вторых, здесь есть всё, что нам нужно для создания этого бота. Бирже это выгодно, так как бот будет торговать 24/7, а не как обычный трейдер, только днём, да, например, и может торговать по всем торговым парам. А биржа с объёмов и зарабатывает комиссию, поэтому это всегда выгодно биржа.

Итак, что здесь нам нужно? Если мы зайдём во вкладку Quick Start, то есть быстрый запуск, и переведём её, то мы можем почитать, что нам нужно и что как работает. То есть создание API ключей. API ключи - это, грубо говоря, такие приватные данные с вашего аккаунта, которые позволяют соединить какой-то внешний проект, грубо говоря, нашего бота с вашим аккаунтом на бирже. То есть, например, чтобы выставлять ордера какие-нибудь или получать данные по вашему аккаунту. Также тут расположены уже готовые библиотеки, например, вот для Java, для Python, которые мы можем использовать. Там уже будет всё готово, то есть все запросы, все подключения. Там нужно будет минимально прилагать усилия, чтобы создать полноценный проект. Но опять же использовать просто готовый SDK, это не значит, что вы легко напишите какого-то робота.

Также здесь удобно всё расположено, но основное нам нужно что понимать, что существуют такие две вещи, как реквесты, то есть запросы и веб-сокеты. Что это такое? В обучении это мы довольно подробно разбираем, но если говорить это в пару слов, то если нам нужна какая-то информация, например, цена на биткоин, то мы должны отправить запрос на биржу. Ну, в данном случае у нас здесь, например, эфир. Мы отправляем запрос на биржу, то есть или квест, и получаем текущую цену по определённой торговой паре. То есть мы отправили вопрос, получили ответ, и вот это важная часть, которая используется в каждом проекте.

Что такое Websocket? Давайте я вам ещё переведу, чтобы всё было понятно. Если вы захотите, вы можете остановить, прочитать, что здесь написано. Если в двух словах, то если запрос - это мы отправляем вопрос и получаем ответ, то websocket нужен для того, чтобы получать какую-то информацию постоянно в реальном времени. И также у каждой биржи существуют свои ограничения. То есть мы не можем сделать там, например, 10.000 запросов за одну секунду. Биржа нас заблокирует просто, ну, конкретно нашего бота на какое-то время небольшое. Но нам всё же нужно получать, например, цены по всем торговым парам, да, например, там биржа 600 торговых пар, и мы хотим по всем получать цену. Сделать это запросами мы не можем, потому что мы превзойдём лимиты биржи и получим на 5 минут блокировку запросов. Но если мы подключаем вебсокеты, то мы можем постоянно получать реальную цену в реальном времени по всем торговым парам и при этом не нарушая никаких лимитов. То есть мы, грубо говоря, получаем по всем 600 парам цену и обрабатываем её, как нам нужно. Грубо говоря, вебсокеты работают так: мы отправляем вопрос и начинаем постоянно получать ответы до тех пор, пока мы не скажем стоп. И, соответственно, наш проект, наш торговый бот будет постоянно иметь доступ к этим данным.

Давайте я вам продемонстрирую, как работает запрос. А что нам нужно понимать? Первое - это метод запроса. Чаще всего он либо GET, либо POST. Также это endpoint запроса, сейчас мы о нём тоже скажем, и базовый URL, то есть ссылка на саму биржу. И готовая ссылка формируется так. Мы берём базовый URL, основа биржи и endpoint. Мы их просто складываем. Endpoint существует, чтобы уточнить, какую информацию мы конкретно запрашиваем. То есть существует же много endpoint'ов, да, там на свечи, на трейды, на стаканы и так далее. И поэтому endpoint уточняет, какая конкретно информация нам нужна. Соединив метод запроса, вот так, базовый URL и endpoint. И также нужно указать параметры, которые мы отправляем для запроса. Для данного запроса у нас нужных параметров обязательных нету. У нас есть необязательный параметр - это торговая пара. Если мы указываем торговую пару, мы получаем информацию конкретно по этой торговой паре, которую мы указали. Если мы не укажем торговую пару, тут даже это всё прописано, мы получим список из всех торговых пар на бирже. Ну, и, грубо говоря, даже одним запросом сможем получить все цены с биржи. Одним запросом.

Давайте продемонстрирую. То есть вот здесь мы прописали запрос. Вот здесь я сделал вызов данной функции и указал торговую пару. Название торговой пары. Запускаем и получаем информацию. Название торговой пары, текущая цена, цена по индексу и другие данные, да? И тот же фандинг, например, здесь есть. Если мы не укажем параметры, как я говорил, то мы получим список из всех торговых пар. Видите, здесь довольно много информации. Мы можем это удобно вывести. Давайте попробуем сделать запрос и вывести ещё раз. Мы получили информацию по каждой торговой паре. Видим здесь название торговой пары, текущую цену, тот же фандинг, время следующего фандинга и так далее. Примерно так работают запросы.

И сейчас также посмотрим, как работают вебсокеты, чтобы получать постоянно какую-то информацию. Также я хотел подметить важный момент, что если вы разбираетесь в документации одной биржи, да, вот, например, документация биржи Binance, здесь всё разбито по вкладочкам удобно, и хотите, например, написать бота для другой биржи, мы берём документацию биржи Bybit. Тут также всё удобно разбросано на вкладочке и всё можно спокойно прочитать и изучить. Вон смотрите, тут разделено там, например, да, фьючерсы для монет, market, data trade, websockets и так далее. Здесь market trade, да, тут ниже websockets, то есть всё аналогично выглядит и запросы формируются аналогично, да? То есть смотрим также метод endpoint, базовый URL там будет выше, но для свечей конкретно нужно больше параметров указывать. Это для каждой биржи одинаково будет.

Итак, смотрим базовый URL для фьючерсов. Берём его и берём, например, вот трейды, вебсокет на трейды. То есть мы подключаемся по вебсокету к определённой торговой паре и будем постоянно получать все новые сделки от всех трейдеров по данной торговой паре. Здесь мы подключили самый простой способ подключения вебсокета. Здесь у нас четыре функции. Первое, то есть когда мы подключаем websocket, у нас срабатывает данная функция при открытии. То есть сами названия говорят сами за себя. При закрытии этого вебсокета происходит код, который находится внутри этой функции. При любой ошибке мы попадаем в эту функцию. И при получении сообщений, при обычной работе вебсокета мы попадаем в данную функцию. То есть получаем все сообщения, обрабатываем их. Здесь мы указываем создание нашего вебсокета. наш базовый URL. И здесь мы используем библиотеку Websocket. Это синхронный websocket и самый простой пример. Ну и, естественно, указываем нашу наш базовый URL и четыре функции, которые мы разобрали выше, и после запускаем сам websocket. Давайте запустим, посмотрим. Вот. И мы получаем теперь все сделки, совершённые трейдерами по данной торговой паре, то есть BTC, USDT. Мы получаем цену, по которой совершаются сделки. Здесь, как вы видите, ключи, то есть это то, что называется в словаре, пишутся одной буквой, да, то есть P, Q, F и так далее. Что значит эти буквы? Мы можем посмотреть конкретно здесь. Тут, кстати, также написана скорость обновления, то есть это 100 миллисекунд, и response example, то есть пример ответа. И здесь прописано, что есть что. То есть P - это цена, Q - это quantity, то есть количество монет, FR ID.

Итак, абсолютно для каждого запроса либо подключение вебсокета. После того, как мы подключили WebSocket, мы разобрались с запросом, что нам нужно делать? Самое сложное и что будет отличаться в каждом вашем проекте - это конкретно торговая логика вашего бота, то есть торговая стратегия и логика открытия ордеров, закрытия и так далее. То есть отработка сделок.

Следующая часть видео довольно информативная, но и сложная для понимания, особенно если вы не сталкивались с программированием или трейдингом. Я старался в ней всё максимально подробно объяснять. Если вы что-то не поняли, задайте вопрос в комментариях, я обязательно отвечу вам. Будьте готовы, что следующая часть видео не особо лёгкая. Сейчас мы с вами в качестве простого примера попробуем написать небольшого торгового бота, который будет обрягаться на довольно простую стратегию торговую конкретно торговли по RSI. То есть будем открывать сделки там, когда RSI, например, ниже 40 или там тридцати, неважно, и закрывать, когда больше 50-60 для тестов. Просто посмотрим. Также покажу примерную структуру, которая должна быть в проекте. Если что-то будет непонятно, не пугайтесь. Также можете записываться на обучение, там подробно всё разбираем. Давайте приступим.

Первое, что у нас должно быть в файле main, основной запускающий файл - это не какой-то функционал по веб-сокетам или запросам. По правилам структуры это должен быть просто запускающий файл, который запускает все процессы в проекте. Поэтому давайте его немного переделаем, а точнее, давайте переименуем наш файл main. Переименуем просто наш main в vs_logic и создадим новый файл main. Здесь сделаем импорты, которые нам понадобятся. То есть, библиотека для работы с асинхронностью. Как я говорил, это очень важно в больших проектах. В любом случае, я это использую в каждом проекте для запуска нескольких процессов потоков. Создали асинхронную функцию. Мы уже знакомы с обычной функцией, то есть если к ней добавить просто async, то получится асинхронная функция. Это если объяснять супербазово. Здесь у нас запуск асинхронной функции. Обязательно, если мы это делаем вне асинхронных функций, нам нужно обязательно вызывать через async run. И здесь мы создаём список для задач, которые мы будем запускать в нашем проекте, и просто через библиотеку создадим эти задачи. Конкретно это будет выглядеть так. вызываем список tasks, добавляем к нему элемент, то есть вызываем просто функцию добавления какого-то элемента в конец списка и через вызываем create_task, то есть задаём поток, который нам нужно запустить. И здесь мы сейчас укажем наш websocket. Websocket у нас асинхронный в данном коде, но в любом случае сделаем функцию асинхронной, чтобы запускать её в одно время с другими потоками. Просто отсюда скопировали код, вставили в нашу синхронную функцию. Теперь здесь запускается websocket. Все сообщения нужно будет фильтровать функцией on_message. И давайте по шагам ещё пройдёмся, скажем, что нам нужно сделать-то в итоге.

Первое у нас должно быть запуск вебсокета, который будет получать свечи для обработки RSI. Следующее, нам нужно подключить запрос на свечи, чтобы при запуске проекта мы сразу получили там, например, 14 свечей для расчёта RSI, то есть, чтобы у нас уже были какие-то данные для расчётов, а не ждать, например, закрытия четырнадцати свечей, чтобы рассчитать RSI. Это было бы очень неэффективно и занимало бы время. Дальше нам нужно подключить будет библиотеку для открытия ордеров на бирже. В целом это всё будет. Ещё один важный момент, но не хочу забегать вперёд, потому что может показаться, возможно, сложно. Из VS logic мы делаем импорт запуск сокета launch_vsocket. В принципе, у нас пока других потоков каких-то не будет. Итак, мы сделали запуск одного потока. Пока у нас один только и будет он, но так и оставим. И важно сделать ожидание выполнения наших задач. То есть этой строкой мы создаём ожидание всех задач, которые мы прописали в наш список tasks. Когда они выполнятся, тогда и закончится проект.

Теперь нам нужно создать запрос на получение свечей. Давайте немного создадим более правильную структуру. У нас будет папка с вебсокетами. Перетащим туда наш файл с вебсокетом. И давайте создадим ещё одну папку для rest запросов. Ну, то есть обычные запросы. И там как раз-таки будет наш запрос на свечи. Мы берём базовый URL, как я объяснял, с запросами. Берём endpoint на свечи и сейчас создадим запрос. Нам нужно сделать также импорт библиотеки requests, чтобы совершать запросы. И создадим его. Вот наш запрос на свечи. И давайте укажем параметры. Категория - это вид рынка, с которого мы запрашиваем свечи. В данном случае это фьючерсы. Торговую пару возьмём. Давайте укажем на примере Solana USDT. Интервал свечей. Пусть это будет, например, пятиминутные свечи. Смотрите, обязательно нужно указывать, как здесь указано по примеру. То есть здесь просто указывается цифрой пять, например. На каждой бирже свои правила. На Bybit, например, просто пятёрка, просто число. И в limit нужно указать количество свечей, которое нам нужно. И давайте сделаем параметры, которые будут передаваться в саму функцию, чтобы мы могли для любой пары получить свечи. Например, мы указали symbol. то, что мы передадим по той паре, мы и получим свечи. Limit также здесь укажем. И аналогично можем указать интервал.

Теперь сделаем вызов данной функции. В limit укажем, давайте одну для тестов, одну свечу получим. Интервал пятиминутка. Давайте вызовем, посмотрим, что вы видите. Так, всё сработало. Вот мы получили списком одну свечу. С форматом, где что есть, мы можем ознакомиться также на документации. Вот нам возвращается лист. Вот он. листы свечей. В нашем случае это одна свеча. Также особенность документации Bybit. Нам нужно развернуть список, чтобы у нас было, то есть последняя свеча самая актуальная, потому что Bybit немножечко возвращает наоборот. Здесь указаны элементы списка, то есть нулевой элемент - это цена, при которой открылась свеча, потом первый элемент - это цена открытия. Второй элемент - это максимум. Третий элемент минимум и так далее. Здесь всё это прописано. И давайте создадим конкретную переменную свечей наших, в которых они будут храниться. Нам важно сначала обратиться в ключ result, то есть самого запроса, а дальше уже обратиться в ключ list, где у нас все свечи. После, как я и сказал, нам важно перевернуть список, чтобы последняя свеча была самой актуальной. И давайте сделаем запрос и выведем. Вот мы получили конкретно список со всеми свечами. В нашем случае это одна свеча. Давайте для понимания сделаем запрос на две свечи. Получили и и то есть у нас список из более маленьких списков. Вот этот список внутри тут элементы. Это одна свеча. Самая актуальная свеча является сейчас последней. То есть вот она. Вот все данные по ней.

Давайте здесь создадим словарь, куда будем сохранять свечи при запуске проекта. И здесь просто укажем укажем торговую пару, для которой мы записываем наши свечи. и равно clients. Всё, теперь мы записали в наш словарь, в торговую пару свечу. Давайте выведем, посмотрим. Вот. То есть мы записали в в торговую пару, которая нам нужна, список со свечами. Теперь мы можем его использовать и обрабатывать.

Создадим ещё одну папку, где будет всякие сортировки, индикаторы и так далее. Итак, я прописал здесь функцию для расчёта RSI. Я использую для этого, библиотеку специально для расчёта индикаторов и Numpy, специальная библиотека для работы со списками, для более удобной работы со списками. И для расчёта с помощью библиотеки TA-Lib нам нужно сделать список в формат Numpy списка. Рассчитываем всё тут буквально в четыре строки и функция возвращает значение RSI. Далее здесь уже понятный для нас код. Запрос на свечи с лимитом в 15 свечей, чтобы были все готовые свечи для расчёта RSI. Дальше интервал пятиминутка. Торговую пару указали и аналогично вызываем функцию для расчёта. С помощью словаря передаём список свечей для расчёта и период RSI указываем 14. Давайте вызовем. Получаем значение RSI. Давайте только сделаем округление, чтобы не было столько цифр после запятой. Нам хватит два значения 265. Теперь это мы можем использовать в нашем коде. Например, сделаем здесь импорт словаря, в котором у нас свечи из папки rest. Словарь у нас называется. И теперь можем использовать данный словарь функцией on_message для получения новых свечей.

Также давайте немножко поменяем саму подписку Websocket, потому что сейчас у нас здесь стоят trades. Нам нужно сделать свечи. Чтобы подписаться на свечи, нам нужно функцию on_open показать, какие параметры мы запрашиваем для вебсокетов. То есть здесь мы укажем торговую пару, тип стрима и интервал. Опять же мы это всё делаем по правилам документации. Здесь у нас раздел Websocket Streams, а public. И здесь конкретно вот по такой инструкции мы подключаем Websocket. указание стрима, интервал, торговая пара. И также тут указан пример, как подключать. Функция on_message будет обрабатывать таким образом сообщение. Получаем сообщение, переводим его в формат JSON, чтобы работать с ним как с обычным словарём. Выводим данную информацию и если там есть ключ data, то мы получаем оттуда свечу. Если свеча уже закрыта, то мы её обрабатываем. Сама URL будет выглядеть вот так. И сама подписка идёт, как я сказал, вот тут. Давайте попробуем запустить и проверим. А только скопируем наш URL и вставим здесь. Выведем и проверим, всё ли работает. Success true. То есть всё подключилось. И дальше идут сообщения по вебсокету. Текущая свеча confirm, которая, то есть, закрыта ли свеча. У нас здесь обычно пишется false. Сейчас в течение минуты закроется свеча и посмотрим, как она закроется. Я здесь в поиске указал confirm true. Как видите, ни одного результата ещё нету. Сейчас, как закроется свеча, мы должны увидеть результат. Вот. Как только прошла минута и у нас свеча закрылась, мы получили closed candle и информацию по всей свече. В таком случае мы должны добавлять данную свечу в наш список к каждой торговой паре. Давайте пока остановим и уберём данный вывод. У нас есть словарь. И давайте туда просто добавлять в нужную нам торговую пару свечу. Только нам нужно указать здесь также symbol, по которому мы получаем эту свечу. Symbol, то есть название торговой пары, мы можем получить из названия стрима topic. Как видите, здесь нету отдельного ключа по названию пары, и нам нужно обрезать вот эту часть сообщения, чтобы получить именно название торговой пары. Поэтому обратимся к ключу topic, то есть data, ключ, topic и сделаем replace части сообщения, которое client и timeframe. Здесь мы укажем как переменную timeframe. Сейчас я покажу. Вот. И нам нужно сейчас создать данную переменную. Обычно это указывается в настройках отдельных. Ну и здесь для примера сделаем вот так. У нас указан timeframe, и мы делаем replace, то есть замену вот этой части сообщения. У нас это client_5. И нужно ещё точку указать, чтобы точка тоже убирала на пустое значение. И у нас получится просто BTCUSDT, то есть наша торговая пара. Делаем print и symbol. Чтобы убедиться, что у нас всё правильно записывается. Передадим в наш словарь ключ торговой пары. И так, как у нас уже внутри список со свечами, то сделаем append и добавим саму торговую свечу. Таймфрейм мы сразу можем указать также и в подписку, то есть вот сюда. Здесь также тогда нужно указать f, чтобы это рассматривалось как переменная. И всё, теперь должно это работать. Давайте сделаем минутные свечи, чтобы быстро я вам продемонстрировал, как это работает. Сейчас мы ждём закрытия свечи. примерно 30 секунд, и у нас добавляется свеча в наш словарь. Итак, свеча закрылась. Мы увидели BTCUSDT, да, то есть название торговой пары. И сейчас мы увидели ошибку, что у нас нету такой торговой пары в словаре. Но это, в принципе, нормально, потому что мы и не создавали по такому ключу ничего. А для таких случаев можно сделать вот так. Если символ не находится в нашем словаре client_dictionary, тогда создать его просто. То есть, если у нас торговая пара не в словаре, то мы создаём пустой список для него, а после уже в этот список и добавляем свечу. В случае целого проекта у нас такой ошибки быть не должно, потому что мы сначала делаем запрос на свечи, туда добавляем все свечи, соответственно, у нас уже будет такая торговая пара. И важно тогда уже в самом файле main, где мы запускаем проект, создать запрос на свечи. То есть, э, делаем импорт rest и client.get_klines. Здесь вызываем данную функцию, указываем название торговой пары. И давайте сразу сделаем, чтобы у нас не нужно было в каждой части проекта прописывать торговую пару, да, там или таймфрейм. Мы для этого специально создаём file settings и здесь прописываем торговую пару, по которой мы хотим работать. Solana USDT. Потом указываем timeframe 5. Указываем длину RSI, с которой мы хотим работать, например, 14. Также можем указать депозит, да, там, например, пусть будут для тестов 30 долларов. Пока нам другие настройки не нужны, поэтому так и оставим. Здесь уже делаем from settings import symbol. Пока нам другого ничего не нужно. Symbol. А, нет, нужно и limit на свечи. Давайте его, смотрите, как сделаем. Поменяем местами с интервалом и укажем по стандарту, что мы запрашиваем 15 и сделаем по стандарту не 15, а сейчас покажу, как мы сделаем settings. Просто делаем такой же лимит. Делаем такую же длину, как RSI, только плюс одна свеча, чтобы у нас была одна запасная свеча и у нас не было никаких ошибок, что там не хватает.

данных для расчёта RSI. Возможно, кто-то из вас сейчас не понимает, что происходит в данном проекте, или это кажется каким-то сложным. Я пытаюсь довольно просто здесь всё объяснять, но да, возможно, если вы не сталкивались ранее с программированием или даже, возможно, с трейдингом, то понять что-то здесь будет трудновато. Но я, как могу, стараюсь объяснять это простым языком или разжёвывать специально для вас.

Напоминаю, что если вы хотите разбираться в этом полноценно сами и в этом вы ничего не понимаете, у нас есть обучение абсолютно с нуля, где мы разбираем и тему трейдинга, и видов торговли, скалинг, intraday, после переходим уже к программированию. Вы сможете полноценно сами реализовывать спокойно такие проекты. То есть это довольно простой проект. Есть буквально один вебсокет и один запрос. Просто нужно в такие мелочи уходить, как там создание словарей, импорты, указание параметров для запросов, веб-сокетов. В этом, наверное, и некоторые сложности.

Итак, после того, как мы создали запрос на свечи, только у нас здесь не должно быть clince равно, потому что у нас функция ничего не возвращает. То есть, видите, здесь нет никакого return, у нас сразу записывается в словарь, в котором мы и обрабатываем все данные. Мы делаем запрос, [музыка] получаем данные, запускаем websocket. И здесь уже мы добавляем добавляем в наш словарь снова новую свечу, которая только что закрылась. Как только мы добавили новую свечу, мы можем рассчитать RSI. Давайте так и сделаем. Просто скопируем из примера, который мы уже тестировали. [музыка] Вызов функции. Также нужно сделать импорт, а from sorting. Import. А теперь это работает. И нужно здесь также указать символ, [музыка] по которому мы делаем расчёт. Период RSI нужно указать. Это тоже нужно сделать import settings. И теперь мы можем просто вводить символ и RSI.

Естественно, мы могли бы сделать, да, например, здесь не просто одну торговую пару, а список из 10 или 100, или даже тысячи торговых пар и по всем ним получать информацию по вебсокету, по запросам. Но там есть свои подводные камни, естественно, это было бы сложнее. Сейчас я бы хотел просто показать простые варианты и простую реализацию бота. Итак, [музыка] давайте теперь запустим и проверим, как оно будет обрабатываться. Здесь давайте уберём таймфрейм и сделаем импорт нужного нам таймфрейма из папки настроек. [музыка] Здесь уберём лишние выводы и вроде как всё готово. Давайте запустим файл main и протестируем. [музыка] Сначала у нас идёт запрос на получение свечей. Только давайте поставим [музыка] таймфрейм минутку, чтобы быстро это протестировать. Сначала мы делаем запрос на свечи. Так, у нас идёт вывод. Ну, здесь вот видите указано, что мы подписываемся на пятиминутные свечи. Это у нас просто готовый принт, который мы можем, э, легко исправить, просто указав здесь таймфрейм. Теперь оно будет писать не 5 минут, а именно то, что мы указали в настройках.

Здесь оказалось не всё так просто. То есть, видите, мы здесь добавляем просто в список свечу, которую мы получаем по вебсокету. Здесь я также забыл поменять BTC USDT на символ, который у нас указан в настройках. Мы добавим, и всё должно нормально подписываться. Здесь также меняем на символ. И важный момент, который не позволяет нам просто легко [музыка] добавить свечу. То есть, как помните, в формате запросов у нас были просто нулевой, первый, второй и третий элементы. Если мы получаем свечи по вебсокету, то у нас есть конкретные ключи: интервал, открытие, закрытие и так далее. Поэтому нам нужно создать список конкретный из словаря, который мы получаем и где закрытие у нас должно быть закрытие свечи, где у нас должно быть четвёртым элементом, как идёт у нас эта функция расчёта RSI. Первым элементом мы укажем время открытия, старт. Так, вторым элементом, точнее первым элементом, если мы делаем отчёт с нуля, то согласно тому, как у нас сейчас расположены свечи при запросе, то у нас первым элементом должно быть open price. У нас open price просто идёт как open. Вторым элементом у нас будет high price, то есть просто high. Третьим элементом у нас идёт low price, то есть просто low. Ну и четвёртым у нас должно идти close где-то здесь он был. Тут вот close, то есть закрытие свечи. И нам нужно его сделать в тип float, так как биржа возвращает нам типе строки. Теперь мы берём данные client listст и добавляем его в наш словарь. И теперь, по идее, всё должно быть нормально. Ну, сейчас мы протестируем, посмотрим. То есть это, в принципе, обычный процесс разработки. Отлично. Мы получили закрытую свечу, получили расай по ней и название торговой пары. Вот этот вывод был здесь. Теперь у нас просто будут добавляться новые свечи в наш словарь каждой торговой паре. И для актуальных данных будут будет считаться RSI.

Теперь мы, наконец-то, можем перейти к открытию ордеров. Если у нас RSI больше, чем, давайте укажем это в настройках. Здесь разделим немного. RSI up low 30, например, и RSI 50. Сейчас ещё, возможно, подрегулируем, чтобы быстро протестировать это. Ну, примерно так. Сделаем здесь импорты. Если у нас RSI больше, чем RSI high, то мы здесь будем продавать. Пока оставим это путм. В другом случае, если у нас RSI меньше, давайте сделаем, смотрите, как больше либо равно, и тут также меньше либо равно RSI, чем RSI Low, то мы будем [музыка] покупать. Давайте закомментируем здесь. То есть продаём, покупаем.

Теперь давайте добавим сюда библиотеку, с помощью которой мы будем делать приватные запросы, например, на размещение ордеров. Мы её используем в каждом проекте для разработки, для заказов. Вот просто добавили саму библиотеку. Делаем импорт клиента из этой библиотеки. И клиент - это то, через что мы взаимодействуем с данной библиотекой. Так мы делаем импорт и так мы создаём клиент. Нам нужно обязательно указать IP ключ IP Secret чтобы взаимодействовать с приватными данными нашего аккаунта. Ну или размещать ордера. Обычно эти данные хранятся в файле Config. Давайте здесь и пропишем IPK IP secret. Это считается приватными данными, но обычно мы вот так их храним в отдельном файле config. Сделаем теперь импорт ключей. Готово. И здесь вот у нас указана асинхронность true. А мы сделаем не асинхронным, чтобы указать клиент не внутри функции, а снаружи. Ну не будем вдаваться в эти подробности, просто сделаем синхронный клиент вне функции. Я поменяю название торговой пары на XRP, чтобы продемонстрировать э открытие ордеров. Для простоты понимания в этом видео я укажу депозит пть конкретно это в монетах, а не в USDT. Обычно мы указываем, то есть в долларах. Но чтобы не проводить лишних расчётов и объяснений, для вашего же простоты понимания, укажем просто как в монетах. Нам нужно также сделать импорт данной переменной settings. Сейчас мы разберём более подробно. Итак, что мы здесь вообще прописали? у нас есть, то есть для размещения ордера нам нужно чётко указать, что где мы размещаем, по какой цене, по количеству. И значит, здесь мы что указали? Торговая пара, вид рынка, где мы это указы, где мы размещаем ордер, направление ордера, тип ордера, то есть это всё то же самое, что вы делаете при размещении руками на бирже. Просто мы это делаем в кодек и order quantity указываем количество монет, которое мы размещаем. Естественно, здесь можно ставить также и стопы, и тейки. То есть всё, что вы можете делать на самой бирже, можно делать и тут. И давайте сделаем вывод симл и самого ордера. Сейчас мы протестируем ещё, всё ли я правильно прописал. Так, остановим наш вебкет, который вот уже там пособирал свечей. Давайте, давайте запустим и сделаем вывод ордера. Пускаем. Я же не указал апи ключи. Сейчас я укажу и протестируем. Снова запускаем. И всё прошло успешно. Давайте посмотрим это на бирже. Вот пара XRP. И у нас открылось ровно на пять монет сделка в шорт. А конкретно то, что мы и указали здесь. Единственный момент, который я поправил, это здесь нужно было просто quantity указать, а не order quantity. Поэтому сейчас поменяем, и всё у нас теперь работает.

Итак, в принципе, мы создали полноценного торгового робота. очень простого, но он полностью работает. Наша логика с ордерами, естественно, самая базовая. RSI больше, чем у нас вот 50 мы продаём. RSI у нас меньше, чем 30 мы покупаем. Также нужно было бы ввести словарь, где мы будем контролировать, когда мы в сделке, когда нет, чтобы несколько раз не заходить. Но в целом, мм, сам проект весь готов. То есть мы можем запустить. Давайте попробуем. Давайте для удобства также добавим принт. Жук в сделку. Вот я добавил, значит, принты. А давайте запустим. [музыка] У нас стоит значение 3050. Сейчас у нас 48. То есть, как дойдёт до 48 у нас значение RSI, то мы сразу зайдём в шорт. У нас таймфрейм минутка для удобства, сделав два экрана. Давайте посмотрим. Пошла очень хорошая зелёная свеча. Сейчас свеча должна закрыться. И по идее должен быть подходящим, да. 61. Мы открываем шорт и всё работает. То есть, естественно, это никто не говорит, что эта стратегия будет точно рабочей, да, вот, потому что свеча может дальше продолжить расти и так далее. Это просто для демонстрации функционала. Остановим бота, закроем позицию.

И что в целом я бы хотел сказать напоследок, что двадцать пятый год, даже уже конец двадцать пятого года, а криптовалюта продолжает, то есть расти, развиваться, естественно, и торговые алгоритмы продолжают развиваться, как в централизованных биржах, так и децентрализованных. Вся эта индустрия растёт, и надобность в таких алгоритмах, естественно, тоже растёт. Если вам интересна тема [музыка] программирования торговых алгоритмов, то это довольно полезное направление. Во-первых, если вы хотите уметь мм автоматизировать свои торговые стратегии, проводить бэк-тесты, то есть смотреть, насколько прибыльна ваша стратегия на истории, как она себя показывала, потом автоматизировать её уже в реальный рынок и в идеале иметь какой-то пассивный доход. Естественно, никто не говорит, что вы точно найдёте прибыльную торговую стратегию. Это не так легко, тем более рынок постоянно меняется и невозможно найти такую стратегию, которая будет постоянно зарабатывать в любой фазе рынка. По моему опыту, прибыльные торговые стратегии работают примерно так. То есть [музыка] фаза рынка одна, бот зарабатывает, рынок меняется, бот не зарабатывает либо теряет. Потом в какой-то момент рынок может быть похожим или возвращается в то же состояние, когда бот зарабатывал, и бот снова зарабатывает. То есть в разные моменты рынка нужно иметь разных ботов и чтобы они друг друга компенсировали, либо иметь какой-то алгоритм на выключение этих ботов или какое-то другое управление. Но в целом, изучая данное направление, вы сможете научиться работать с документациями различных бирж, сервисов. То есть взаимодействие с различными сервисами, оно идёт примерно по такому же алгоритму, как и взаимодействие с документациями Birруша. То есть там всё то же самое: вебсокеты, запросы, методы запроса, энпоинты и так далее. Также вы сможете хорошо изучить Python, естественно, если вы будете уделять этому время. А наше обучение как раз-таки этому всему поможет. Конкретно и трейдингу, и различным торговым стратегиям, и изучению базовых знаний программирования Python и более углубленных знаний. И конкретно в области алгоритмической торговли вы тоже достаточно изучите на нашем обучении. Если вам нужен также проект какой-то, вы можете заказать его. У нас готовые продукты. Вся информация у нас в Telegram-канале. Всем спасибо за просмотр. Обязательно пишите в комментариях. Возможно, ролик был довольно сложноватый для новичков. Но я старался объяснять, как мог. Поэтому пишите ваши отзывы. Что вы думаете в целом про программирование в такой сфере, про алготрейдинг и был ли этот ролик для вас полезен. Всем спасибо. Всем пока.