Автоматизированная торговля альткоинами на биржах криптовалют. Часть 3: пример простого торгового алгоритма.
Прежде всего - спасибо всем, кто дождался выхода этой публикации и поддерживал меня, проявляя интерес к теме. Это мотивирует! Думаю, настало время перейти от теоретических рассуждений (начало и продолжение) об основах автоматизированной торговли на биржах криптовалют к практическому примеру готового алгоритма такого бота.
Необходимый дисклаймер: я не призываю вас начинать торговать. Я предполагаю, что читающие эти строки люди обладают достаточной компетенцией и знаниями, чтобы самостоятельно принимать решения об эффективности биржевой торговли в целом и автоматическом трейдинге в частности.
Эта серия постов несёт цель систематизации моих знаний для меня лично и дать вам пищу для самостоятельных размышлений, если тема вас заинтересует.
Логика торгового бота
Блок-схема алгоритма работы бота приведена на рисунке. Это был мой первый бот, разрабатывая который я хотел чтобы:
- Бот не был бы слишком сложным для реализации и не требовал много времени на отладку. Поэтому я отказался от использования индикаторов и технического анализа. Во-первых, написание самих индикаторов (или адаптация готовых кодов) требует дополнительных затрат времени и усложняет код. Во-вторых, поиск оптимальных точек входа и выхода из рынка требует времени. Совсем не обязательно что прямо сейчас на рынке сложились благоприятные условия. Мне же нужен был бот, который приходит на биржу и сразу начинает торговлю.
- В структуре бота были бы все необходимые элементы, которые могут пригодиться для построения в будущем более сложных торговых систем. Мне нужен был механизм выставления и закрытия ордеров на биржах, а также функции сбора рыночных данных, чтобы бот мог принимать решение о входе в рынок или выходе из него.
- Желательно, чтобы торговая стратегия, несмотря на свою простоту, приносила прибыль в долгосрочной перспективе.
В итоге я выбрал следующую торговую стратегию для реализации: бот приходит на рынок и анализирует данные только по текущему состоянию. Для работы ему необходимы лишь данные о лучшей цене на покупку (Bid), на продажу (Ask) и о суточном объёме торгов каждой криптовалюты. Торговля идёт альткоинами по отношению к биткоину.
Все рынки на бирже ранжируются по убыванию параметра:
Таким образом, бот находит рынки криптовалют с наибольшей процентной доходностью в текущем моменте и с наибольшей ликвидностью, чтобы эту доходность реализовать. При этом ему не важно - какова динамика цены, как вела себя стоимость монеты в прошлом и какая цена у неё будет в будущем. Бот торгует здесь и сейчас и для начала торговли ему достаточно знания рынка здесь и сейчас, без необходимости прогнозирования цены криптовалюты в будущем. В итоге бот начинает торговлю сразу же как только приходит на биржу.
Полная блок-схема алгоритма приведена на рисунке:
Настроечные параметры алгоритма
В качестве параметров алгоритма в зависимости от ваших предпочтений и конкретной бирже, на которой запускается бот, используются следующие настройки:
- Максимальное количество одновременно торгуемых пар
$trade_pairs
. Теоретически бот может торговать всеми активами, что есть на бирже, но для этого вам потребуется значительный начальный баланс (распределяемый равномерно между всеми торгуемыми активами). Торговля всеми парами - не очень оптимальная стратегия, если учесть, что даже на крупных биржах большинство торговых пар - это низколиквидные активы. Поэтому я ограничиваю количество одновременно торгуемых пар. - Минимальная цена криптовалюты для торговли. Для криптовалют с низкой ценой разница даже в 1 сатоши между Bid 0.0000001 и Ask 0.00000002 даёт уже маржу в 100%, но торговля такими активами имеет значительный риск. Ведь если цена на актив настолько низкая, то это означает, что данная криптовалюта сама по себе не несёт никакой ценности и представляет интерес лишь для спекулянтов. Я предпочитаю не связываться с такими активами, устанавливая минимальную планку цены в 100 сатоши.
- Минимальный размер одного лота в BTC. Выставлять ордера на 10,000 сатоши нет смысла - прибыль будет минимальна. Поэтому имеет смысл ввести ограничение на минимальный размер одного лота.
- Минимальный размер одного ордера на бирже - каждая биржа, в свою очередь, имеет ограничение на минимальный размер ордера. Например, на Биттрексе это 50,000 сатоши. Меньшие ордера будут отклонены биржей.
- Минимальная прибыль (в процентах) которую должен обеспечить бот по каждой торговой паре. При торговле нужно учитывать, что у биржи есть комиссия, обычно это 0.2%, за каждую операцию. Поэтому на круг "купил-продал" уже теряется 0.4% на комиссию биржи и вам необходимо это учитывать, чтобы бот работал с положительным результатом. Поэтому устанавливать прибыль меньше 1% не очень разумно. Максимальный размер прибыли - на ваше усмотрение. Чем меньше он будет - тем чаще бот будет торговать, но с меньшей прибылью на одну сделку. В общем, параметр этот следует подбирать каждому индивидуально. Я обычно устанавливаю в районе 2-5%.
- Время, в течение которого бот держит убыточные активы. Бот не может всегда торговать в профит. Часто возникают ситуации, когда после покупки актива его цена идёт только вниз и вы не получаете прибыль. Так как работа бота основана на постоянном обороте средств, нужен механизм фиксации убытков по отдельным парам. Я обычно жду время
$loss_time
, после которого бот фиксирует убыток, продавая актив по текущей рыночной цене, какая бы они ни была. Параметр этот эмпирический - я обычно устанавливаю срок в две недели.
Пояснения по работе боте
Надеюсь, что блок-схема алгоритма бота понятна сама по себе, но я всё же дам некоторые пояснения по его работе. Если какие-то моменты останутся непонятными - не стесняйтесь спрашивать в комментариях. На блок-схеме переходы в алгоритме по условию "нет" выделены красным цветом, по условию "да" - черные стрелочки.
Прежде всего, бот не работает постоянно, а запускается по расписанию (cron
в линуксе), выполняет свою работу и отключается от биржи. В зависимости от биржи я запускаю бота обычно раз в 5-20 минут.
Первым делом бот проверяет - есть ли у него открытые ранее ордера и если такие есть - закрывает все текущие ордера. Таким образом, он постоянно адаптируется к текущему состоянию рынка.
Следующим шагом на бирже запрашиваются данные о ценах Ask и Bid всех торгуемых криптовалют и объёмах суточных торгов по ним. При этом для себя бот для каждой криптовалюты выставляет цену покупки чуть лучше лучшей цены на бирже (Bid=Bid+0.00000001
). Тоже самое и с ценой продажи (Ask=Ask-0.00000001
). Все криптовалюты ранжируются по критерию Rank (сам формулу выше) потенциальной прибыли за счёт разницы Ask-Bid и с учётом объёма торгов.
Получив общие данные о рынке, бот получает данные о своём собственно балансе: сколько у него есть BTC на счету и сколько других криптовалют.
После этого начинается цикл выставления ордеров на продажу криптовалют с баланса бота. Первым делом, если стоимость в пересчёте на BTC превышает настроечный параметр минимального размера одного лота - монета удаляется из списка потенциальных кандидатов на покупку. Это необходимо, чтобы бот не накапливал средства в одной криптовалюте, которую не может продать. Т.е. покупку по криптовалюте он совершает один раз и если она уже есть у него на балансе - он пытается только продать её с прибылью.
Затем бот для каждой криптовалюты анализирует - получит ли он заложенную прибыль, если выставит ордер по цене Ask. Бот всегда работает как маркетмейкер, т.е. не продаёт по существующей на рынке цене Bid, а выставляет лимитные ордера Ask, но эти лимитные ордера всегда с лучшей ценой на рынке.
Также проводится анализ времени с последней покупки актива и если это время больше настроечного параметра $loss_time
- также выставляется ордер на продажу.
По завершению цикла выставления ордеров на продажу бот переходит к выставлению ордеров на покупку. Если у него есть свободные биткоины на балансе, он берёт ранжированный список $trade_pairs
и выставляет Bid ордера с лучшей ценой на рынке.
Результаты торговли и возможные улучшения
Рассматриваемый алгоритм, очевидно, не является оптимальным с точки зрения торговой стратегии и полученной прибыли в пересчёте на объём совершаемых сделок. Существуют и более выгодные стратегии, например арбитраж во всех его видах или ребалансировка отобранного вручную портфеля избранных криптовалют. Я обязательно расскажу об этих стратегиях в следующих публикациях, но сейчас хочу заметить, что несмотря на свою простоту, рассматриваемый алгоритм показал лично для меня положительный результат в виде долгосрочного роста торгового баланса. Причём не только на растущем, но и на падающем рынке.
Кроме того, в простоте алгоритма есть один большой плюс для новичков: вы не запутаетесь. Робот имеет все необходимые компоненты для создания ваших собственных ботов по вашим собственным торговым стратегиям. Он умеет выставлять и закрывать ордера и получать информацию о текущих котировках криптовалют, объёмах торгов и заполненности биржевых стаканов. Из этих кубиков вы легко сможете самостоятельно строить более сложные торговые стратегии. Но если вы не гуру программирования - начинать лучше с чего-то простого.
Так как боту не нужно много информации для начала торговли - он начинает торговать сразу в момент запуска. И в последующем делает достаточно много операций, так что его отладка не займёт слишком много времени. Активность бота в логах биржи выглядит примерно так (скриншот из моего торгового аккаунта на Livecoin прямо сейчас):
Подробнее о я языках программирования, существующих библиотеках, форматах API вызовов для реализации этого алгоритма - в следующей статье на эту тему (выйдет заметно быстрее, чем эта :).
Если у вас есть свои торговые стратегии (и вы готовы ими поделиться) или если есть вопросы, дополнения и предложения по улучшения описанной торговой стратегии - буду рад ваши комментариям!