Как научиться писать ботов для криптобиржи
Перейти к содержимому

Как научиться писать ботов для криптобиржи

  • автор:

Пишем робота для торговли за 15 минут…

Еще

В этой статье я опишу самый простой способ сделать робота для торговли криптовалютой. Кто подтолкнул меня к этой идеи можно узнать из предыдущего поста.

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

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

Например только лонг стратегия на двух МА выглядит вот так:

strategy(«2MA by Denis», commission_value = 0.022, initial_capital = 10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, overlay=true)

mafast = ta.sma(price, fastLength)

maslow = ta.sma(price, slowLength)

if (ta.crossover(mafast, maslow))

strategy.entry(«MA2CrossLE», strategy.long, comment=«MA2CrossLE»)

Для фиксированного размера стопов, добавляем блок стопов.

//БЛОК СТОПОВ и ТЕЙКПРОФИТОВ

// The Fixed Percent Stop Loss Code

// User Options to Change Inputs (%)

stopPer = input.float(3.0, title=’Stop Loss %’) / 100

takePer = input.float(8.0, title=’Take Profit %’) / 100

// Determine where you’ve entered and in what direction

longStop = strategy.position_avg_price * (1 — stopPer)

shortStop = strategy.position_avg_price * (1 + stopPer)

shortTake = strategy.position_avg_price * (1 — takePer)

longTake = strategy.position_avg_price * (1 + takePer)

if strategy.position_size > 0

strategy.exit(id=«MA2CrossLE», stop=longStop, limit=longTake, comment = «Long Stop Loss/Profit»)

if strategy.position_size < 0

strategy.exit(id=«MacdShort», stop=shortStop, limit=shortTake, comment = «Short Stop Loss/Profit»)

//PLOT FIXED SLTP LINE

plot(strategy.position_size > 0? longStop: na, style=plot.style_linebr, color=color.red, linewidth=1, title=«Long Fixed SL»)

plot(strategy.position_size < 0? shortStop: na, style=plot.style_linebr, color=color.red, linewidth=1, title=«Short Fixed SL»)

plot(strategy.position_size > 0? longTake: na, style=plot.style_linebr, color=color.green, linewidth=1, title=«Long Take Profit»)

plot(strategy.position_size < 0? shortTake: na, style=plot.style_linebr, color=color.green, linewidth=1, title=«Short Take Profit»)

// КОНЕЦ — БЛОК СТОПОВ и ТЕЙКПРОФИТОВ

Поздравляю, вы сделали своего первого робота. И он даже прибыльный ��

А в чем подвох вы поймете только после запуска в трейдинг вью.

PS Если вы не поняли, куда пихать код, то попробуйте нажать кнопку “Pine Editor”

ТрейдингВью это отлично, но как заставить его торговать?

С этим все не так просто, но если ваш робот будет торговать криптовалютой, тогда для вас уже есть онлайн сервис. Называется он wundertrading

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

Если коротко, то в TradingView создается Alert для стратегии, в котором Notification приходит в виде Webhook. Или в котором будильник использует интернет крючок, как напоминание…

Для тех, кто совсем ничего не понял, есть видео инструкция, правда она на английском языке, но я надеюсь вы поймете все по картинкам.

Создаём Telegram-бот для трекинга вашего криптопортфеля

Создаём бот в Телеграме для Binance, который показывает баланс в USD(T) и изменения по портфелю в USD(T) за неделю и за все время.

Мне был необходим для личного удобства бот в Телеграм, который умеет выполнять следующие действия:

  1. Показать текущий размер активов в USD(T).
  2. Показать изменения по портфелю в USD(T) за неделю и за все время.

Мне критически важно не использовать никакое приложение вида «все биржи в одном месте» в качестве proxy — да, я не хочу никому предоставлять свои ключи.

Если нужен — давайте напишем.

Что нам потребуется?

В качестве примера в данной статье я буду использовать криптовалютную биржу Binance. Стоит отметить, что никаких ограничений на использование с другими биржами нет — весь каркас тот же самый. Разве что взаимодействие по API будет немного другим (зависит от биржи).

  1. Нам потребуется функционал Telegram (куда же без него).
  2. Нам потребуется Dropbox вместо базы данных (о, да).
  3. Нам потребуется инструмент, где будет крутиться наш бот. Лично я использую Heroku, но можно использовать и AWS.

Создаем бота в Телеграм

Данный этап был описан сотни раз в огромном числе статей, найти которые не составляет проблем. Поэтому здесь будет кратко.

Нам нужно найти в телеграмме контакт @BotFather и выполнить последовательность команд

База из топора

Для начала мы подготовим Dropbox.

Перейдем по ссылке и получим свой API token для Dropbox, нажав на кнопку Create App. Я создам доступ на отдельную папку в Dropbox.

На текущей странице нам необходимо будет сгенерировать OAuth 2.0 для Dropbox:

После создания пройдем на вкладку Permissions и установим права на files.content.write

Теперь по ссылке у нас появилась папка APPS. Зайдем в нее, далее зайдем в поддерикторию с названием нашего бота. Туда нам необходимо поместить файл totalData.txt, содержащий только пустой список.

Взаимодействие с Binance

Нам необходимо создать наш API ключ на бирже Binance.

Данная активность происходит по этой ссылке.

Результатом данного действия для нас будет API Key и Secret Key. В нашем случае будет достаточно прав только на чтение.

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

Для начала попробуем запустить данный код локально. Если все сделано правильно — код будет исполняться каждые 60 секунд и спустя некоторое время файл totalData.txt должен выглядеть как-то так:

Еще немного кода. Как считать diff

Далее я приведу пример кода, с помощью которого мы будем получать сами изменения портфеля, а так же этот же код должен запускаться ботом.Как я уже писал выше — я использую Heroku. К тому же до недавнего времени данный сервис был бесплатным, но времена меняются и уже можно задуматься — стоит ли использовать Heroku или присягнуть AWS. Если вы, как и решите выбрать Heroku — я могу посоветовать данную статью.

Сам бот будет иметь одну ключевую команду — stats.

API ключей от Binance здесь уже не потребуется. Только token полученный при регистрации бота в Telegram и Dropbox token (вы же помните, Dropbox заменяет нам базу данных?). Для подсчета информации по неделе мы просто генерим список по балансам за неделю. При необходимости код несложно изменить и считать diff за любой временной срез.

Вместо заключения

В результате применения команды stats вы должны получить в ответ, например, такое сообщение:

Стоит отметить, что данного бота можно развивать и дальше до еще более прикладных применений.

Например, можно реализовать команду buy или sell. Можно подключить дополнительные аккаунты или сразу несколько бирж и мониторить все свои портфели в одном месте. Удобно? Удобно!

Для подключения дополнительных аккаунтов достаточно добавить еще один вызов в этом месте (и конечно же дополнительные api ключи — там они уже и так в list’е).

Однако данные упражнения мы оставим дорогим читателям для самостоятельной работы. Всё же потребности у всех разные ?

В целом, все исходники уже представлены в статье, но на всякий случай — также они на GitHub.

Простой бот для торговли на криптобирже

Всем привет! Сегодня мы напишем своего первого боевого торгового робота для игры на бирже. Криптобирже. Почему криптобирже?

а) хайповая тема;
б) у них как-то все попроще.

Во-первых, хочу сразу предупредить любителей казино «три топора»: на машину вы завтра не заработаете. Статья больше о том, как начать писать своих роботов, поэтому алгоритм будет примитивный, но рабочий.

Во-вторых, Вы заработаете. Просто немного.

Для самых нетерпеливых, весь код на гитхабе exmo-exchange-trade-bot.

Этап №1: Биржа.

Торговать мы будем на бирже EXMO. Причин несколько. Биржа популярна на просторах СНГ, она русскоязычная и поддерживает ввод рублей, имеет возможность создания пар к рублю.

Среди минусов — неудобный процесс ввода рублей, приличная комиссия, мало торгующихся пар.

Для нас главное, что она имеет готовые решения для работы с их API. Это безусловно облегчит нашу работу.

Разумеется, на бирже нужно зарегистрироваться и внести немного денег. Я для примера внес 5$.

Далее в личном кабинете Вы получите ключи для доступа к API.

Я буду использовать клиент для NodeJS (поэтому потребуется установить nodejs и npm).

На своем компьютере создаем новую папку и файлом, в котором будет наш торговый робот (напр. exmo/index.js), открываем консоль и делаем последние стандартные приготовления.

Переходим в папку с нашим проектом и пишем — npm init, далее на все вопросы нажимаем клавишу enter.

Пока пакеты устанавливаются, создадим еще один файлик, назовем его exmo.js и наполним вот этим содержимым.

Этот фаил содержит адрес API, подключение дополнительных библиотек, которые нам нужны для работы с API и основную функцию для запросов к API.

Всё, мы все подготовили и теперь можем непосредственно приступить к созданию персональной «машины по зарабатыванию денег» 😉

Этап №2: Код

Открываем наш index.js и подключим фаил exmo.js:

Далее идем на бирже в личный кабинет туда, где мы создали наши ключи для доступа к api. Копируем их и сохраняем в переменных:

Теперь создадим две переменные:
currency1 — это ЧТО покупаем;
currency2 — валюта, за которую покупаем.

Я хочу купить биткоины за доллары:

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

Идем по адресу https://api.exmo.com/v1/pair_settings/ ищем свою пару (для меня это BTC_USD) и смотрим первый параметр — min_quantity — 0.001

И ещё немного переменных:

количество минут, через которое неисполненный ордер на покупку будет отменен currency1

биржевая комиссия (0.002 = 0.2%)

период времени (в минутах) для вычисления средней цены (это понадобится для нашего алгоритма)

количество currency2 для покупки currency1 при единоразовой сделки (я закинул 5$ — ими и буду оперировать)

желаемое количество прибыли с каждой сделки (0.001 = 0.1%)

Если расходится время биржи с текущим

Для удобства объединяем нашу пару через _

Для теста можете запросить информацию о себе:

Переходим в консоль и запускаем

Если все сделано верно, то Вы увидите информацию по Вам!

Все работает и можно переходит к самому интересному — функции, которая будет генерировать нам бабки.

Итак, я выше уже говорил что наш алгоритм будет тупым, сейчас Вы поймете на сколько)

Весь фокус состоит в том, чтобы взять историю завершенных сделок за какой-либо период — у нас за это отвечает переменная avgPricePeriod — и посчитать среднюю цену, за которую была продана currency1. За эту среднюю цену мы и выставим свой ордер.

Итак, приступим. Пишем нашу функцию trade()

Сначала получим список наших открытых ордеров:

1) проверяем есть ли у нас открытые ордера по нашей паре с помощью api-метода user_open_orders. Если есть и они на продажу,

то мы просто ждем, когда они исполнятся ( иногда до скончания веков). Если есть ордера на покупку, просто их запоминаем.

2) Проверяем, если у нас есть открытые ордера на покупку.

Перебираем все ордера и получаем историю по ним с помощью метода order_trades, передав туда id ордера.

Здесь может быть 3 варианта:

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

2) при втором варианте нам нужно проверить не слишком ли долго висит наш ордер. Цены меняются быстро и, возможно, средняя цена уже не актуальна. Для этого мы завели переменную orderLifeTime, где указываем, сколько наш ордер должен висеть в минутах.

Если время вышло, то отменяем ордер с помощью метода order_cancel, передав ему id ордера.

3) если время ещё не вышло, то мы просто надеемся, что сможем купить по нашей цене.

Все, с открытыми ордерами мы разобрались, теперь наш робот знает, что делать с ордерами когда их создаст. Половина дела сделано.

Итак, блок если у нас нет ордеров.

Получаем информацию по нашему аккаунту с помощью метода user_info:

Для удобства запишем балансы по нашим парам:

Проверим, есть ли currency1, которую можно продать?

Если да, нам нужно высчитать курс продажи.

Нужно продать всю валюту, которую купили, на сумму которую купили плюс прибыль за вычетом комиссии биржи.

Важный момент! Валюты у нас меньше, чем купили — биржа взяла комиссию.

При создании ордеров, методу order_create нужно передать параметры:

  • pair — это наша актуальная пара для торговли;
  • quantity — количество;
  • price — цена;
  • type — типа создаваемого ордера (buy/sell);

Мы хотим продать — в типе указываем sell.

и отправляем запрос, если все верно, то Вы увидите запись «Создан ордер на продажу»

Здесь все. Если у нас была валюта, мы просто создали ордер на его продажу.

Теперь переходим к самому интересному блоку: случай, если у нас нет currency1(btc) и мы хотим ее купить за нашу currency2 (usd).

Для начала проверим, достаточно ли денег на балансе в валюте currency2.

Если есть, то нам нужно получить среднюю цену, за которую продают currency1(btc) за промежуток времени, который мы указали в avgPricePeriod.

Немного лирики:
У Exmo есть метод ticker со статистикой и объемами торгов по валютным парам. В статистике указана средняя цена за последние 24 часа. Однако разница средней цены и той, по которой идут торги сейчас может очень отличатся.

Из за этого мы можем долго ждать, когда исполниться ордер на продажу.

Мы сделаем свой велосипед.

У Exmo есть метод trades, он возвращает список сделок по валютной паре.

Мы возьмем совершенные сделки за интересующий нас avgPricePeriod и из них посчитаем среднюю цену.

Это не идеальный вариант, но он покажет реальные цены, по которым продают и покупают.

Например, на момент написания статьи средняя цена BTC_USD — 8314, при этом покупка на бирже осуществляется по цене 7970.

Если мы выставим ордер по средней цене, он сразу же исполнится по минимальной цене, значащейся в ордерах на продажу.

Но добавив прибыль и биржевую комиссию мы, вероятнее всего, будем очень долго ждать продажи.

Итак, обратимся к методу trades и запросим у него статистику по нашей паре currentPair:

Переберем все результаты и оставим только те, которые подходят к нашему временному периоду.

И посчитаем среднюю цену.

Средняя цена у нас есть, но нам нужно ее немного подправить — вычесть комиссию биржи stockFee и добавить желаемый профит. Таким образом, получив цену ниже средней цены рынка, мы купим чуть больше валюты, так как биржа впоследствии забирает ее часть;

Получаем конечное количество, которое нам нужно купить.

Проверяем можно ли купить такое количество валюты (не нарушается ли минимальная сумма покупки).

Если наше количество больше, то формируем параметры для метода order_create, только на этот раз уже с типом buy.

Теперь нужно поставить нашу функцию на таймер (диапазон — раз в 5 секунду, например) и можем запускать.

Поздравляю, Вы написали своего первого торгового робота: можете допиливать алгоритм и зарабатывать кучу денег) шучу .

Думаю у вас возник резонный вопрос «Сколько же денег так можно заработать?»

За одну операцию с 5$ я зарабатываю примерно 2-3 цента. Это связано с примитивностью алгоритма, который работает в случае, если цена колеблется в определенном диапазоне (а это почти всегда не так на криптобиржах). За сутки происходит порядка 10-20 операций (при хороших раскладах). Посчитать можете сами;)

Но мы же не ради денег код мастерим)

Ещё раз ссылка на гитхаб с полной версией бота и комментариями.
https://github.com/v-florinskiy/exmo-exchange-trade-bot

Эта моя первая статья — не судите строго)

P.S.: Для тех, кто не работал с node, ваш скрипт естественно будет работать, пока отрыта консоль.

Чтобы ваш робот работал 24/7, вам нужен какой-нибудь vps: там вы ставите nodejs, npm и, например, pm2. С помощью этой утилиты скрипт продолжит работу, даже если консоль закрыта.

Биржевой бот на Python — часть 1

Пишем простого бота для поиска арбитражных ситуаций

Влад Скуришин

В одно время активно пилил букмекерских ботов и недавно заинтересовался очень похожей областью — криптовалютными биржами. В качестве первого проекта, который позволил бы мне разобраться с необъятным миром ордеров, спредов, шортов стал арбитражный бот, работающий внутри одной биржи — Poloniex.

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

Терминология

Попробую описать необходимые для нас термины.

Криптовалютная биржа

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

Ордер

Для заключение сделки продажи или покупки необходимо открыть биржевую заявку — ордер.

Ордер может быть описан следующими параметрами: пара, стоймость, объем, тип операции. Например:

Из данной таблицы видно, что вы можете купить 0.5 ETH за 1 BTC.

Пара читается справа налево при совершении операции. Например:

  • [BTC_ETH, Продажа] — продаю ETH за BTC,
  • [BCH_ETH, Покупка] — покупаю ETH за BCH.

Биржевой стакан

Если вы откроете страницу торгов на бирже Poloniex, то увидите ордера на продажу — SELL ORDERS и ордера на покупку — BUY ORDERS, которые выставляют трейдеры. Данные таблицы называются биржевым стаканом и отображают информацию о том сколько и за какую цену хотят купить / продать валюту.

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

Арбитражная ситуация

Арбитражная ситуация — это ситуация, при которой за счет разницы в оценке актива (в данном случае валюты) трейдер может получить прибыль.

Например на бирже Poloniex есть три пары валют: BTC, BCH, ETH. И представим, что в биржевом стакане были созданы следующие ордера:

Данная таблица демонстрирует арбитражную ситуацию внутри биржы. Если вы выполните ордера, выставленные трейдерами (совершите с ними сделку) :

  • 1 BTC => 10 ETH
  • 10 ETH => 8 BCH
  • 8 BCH => 1.6 BTC

то останетесь в прибыли на 0.6 BTC, так как изначально имели 1 BTC.

На Poloniex доступна документация API. В рамках нашей задачи нас интересует раздел Public API Methods, метод returnOrderBook .

Order Book — является описанным выше биржевым стаканом, который возвращается в JSON формате, а не на web-интерфейс.

Попробуйте перейти по ссылке Poloniex API. В результате вы должны получить ответ для BTC_ETH, похожий на этот:

  • asks — ордера на продажу;
  • bids — ордера на покупку;

Меня параметр currencyPair , можно получать список ордеров для различных валют.

Замечание: существует пара BTC_ETH, но обратной ETH_BTC нет. Поэтому если вы хотите выполнить покупку ETH_BTC, вам необходимо сделать продажу в BTC_ETH.

Задача

В итоге нам необходимо решить следующие задачи:

  • Выполнить парсинг API криптовалютной биржи Poloniex, а именно метода returnOrderBook и реализация алгоритма поиска арбитражных ситуации;
  • Реализовать архитектуру, при которой один поток парсит API и создает отдельные потоки, которые ищут арбитражные ситуации для разных валют;
  • Решить проблему с отсутствием обратной пары. Например: существует пара BTC_ETH, но обратной ETH_BTC нет;
  • Выводить результат поиска в консоль или в Telegram Bot.

В следующей части мы рассмотрим реализацию данного бота на языке программирования Python.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *