Хабрахабр

Написание торгового робота для bitcoin-биржи

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

Сразу признаюсь, что никаких секретов этим постом не открою.

Идея

Для начала, почему bitcoin?

Регистрация на бирже, генерация ключей, пополнение счета разными способами и все, можно торговать. С bitcoin просто работать. Все взаимодействие происходит поверх http, посредствам rest или чего-то подобного. Даже не нужен договор с брокером. Это первая причина.

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

Если эта цена ниже текущей, значит финансовый инструмент переоценен, если ниже — недооценен. Фундаментальный анализ подразумевает поиск «справедливой цены». Самый простой пример фундаментального анализа — это использование мультипликатора P/E (price/earnings ratio), равного отношению рыночной стоимости акции к годовой прибыли, полученной на акцию. Переоцененный продают, недооцененный — покупают. Полученное число сравниваем со средним по отрасли. Берем стоимость акции и делим ее на доход компании на эту акцию. Да, yahoo еще немного жив. Коэффициент очень популярный, приводится на всех финансовых сайтах типа finance.yahoo.com. Прибыль публикуется раз в квартал, поэтому фундаментальный анализ хорошо работает на больших временных интервалах, месяцах и годах.

Для bitcoin можно использовать спорные соображения о сложности майнинга, динамике роста hashrate и прочее. Этот пример для акций. И именно графики первыми показывают изменения рынка. Честно, в работоспособность этого я не верю.
А вот технический анализ исходит из идеи, что графики содержат всю необходимую информацию для прогноза. А еще при использовании технического анализа, не имеет значения природа товара. А уже за ними появляются новости и меняются отсчеты. Мы же будем на примере bitcoin проверять идеи для торговли на NYSE или NASDAQ. Можно выработать принципы при техническом анализе стоимости картошки и использовать их при торговле золотом. Она же является причиной использования именно технического анализа. Это вторая причина выбора bitcoin.

Можно считать его чем угодно, но это что-то определенно крутое. Третья причина — bitcoin это круто.

Затем, о какой «идее» я говорю?

Могу привести несколько примеров, реалистичных и не очень:

  • Искать новости в twitter по ключевым словам и определять их эмоциональную окраску. В зависимости от этого, принимать решения. Это не тех. анализ, но идея хорошая.
  • Пытаться по внезапно появившимся крупным ордерам отгадать действия инсайдеров и повторять за ними.
  • Определять «качели», движения курса в рамках некоего коридора. ССЫЛКА
  • Если третий ордер на продажу четный — покупать на все 🙂

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

Говорить будем о bitcoin и, так как bitcoin-биржи отличаются свей работой от «взрослых» бирж, я буду стараться использовать общие понятия, характерные для первых и для вторых. Для начала, хотелось бы определить несколько терминов.

Ордер говорит бирже о вашем намерении купить или продать какое-то количество bitcoin по какой-то цене. Ордер (order) — он же биржевая заявка. Штука очень важная и не такая простая, как кажется. При достижении этой цены ордер исполняется, сделка проходит. Рыночные ордера на продажу на wex — это лимитные, но с минимальной ценой. Применительно к bitcoin в общем и к бирже WEX в частности, ордера бывают только лимитные отложенные (limit pending order). Подробнее можно начать читать с wiki. Рыночные на покупку — с максимальной ценой.

На русском. Стакан (depth of market, order book) — совокупность всех лимитных ордеров.

Далее. Bid — цена спроса, наивысшая цена, по которой покупатель согласен покупать.

Далее. Ask — цена предложения, наменьшая цена, по которой продавец согласен продавать.

Bid всегда меньше, чем ask. На некоторых биржах ask и bid могут быть перепутаны, поэтому всегда надо обращать внимание на их величины.

Далее. Спред (spread) — промежуток между самой низкой ценой покупки и самой высокой ценой продажи.

Сбор

У нас есть два варианта:

  1. Использовать исторические данные.
  2. Собрать данные самому.

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

Опять два варианта:

  1. Сырые данные.
  2. Готовые коэффициенты.

Нам, скорей всего, понадобятся три вещи с биржи: цены (покупки, продажи, последней сделки), обороты (когда по какой цене сколько купили или продали) и состояние стакана. Лучше сочетать и то и то. А вот стакан характеризуется сложно. Цены и обороты можно писать сырыми. Или же сразу вычислять и сохранять только нужные коэффициенты. «Сырой» стакан можно хранить массивом, как есть.

Research

Поэтому говорить много я о нем не буду. Это самый интересный и самый творческий этап. Покажу лишь один график.

Шаг — 2 секунды. График за 24 часа. Красной линией здесь изображен курс, по последней цене. Это связано с тем, что биржа кеширует на 2 секунды часть данных. Черной — о продаже. Зеленой — коэффициент, сигнализирующий о покупке.

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

Написание робота

Теперь мы уверены, если если третий ордер четный, то следует покупать. Предположим, что мы нашли прямую зависимость между четностью третьего ордера на продажу и последующим ростом. Сразу попрошу прощения у любителей go и python, но писать мы будем на java.

Он состоит из трех частей: public, позволяет получать общую информацию без аутентификации; trade, предназначенный для операций с ордерами; push — появился недавно, присылает оповещения в реалтайм. У WEX (wex.com или wex.nz) есть API. Этот API целиком покрывается библиотекой wexapi.

Исходники на github.com

Документация на русском

Wexapi есть в maven central, поэтому библиотеку можно подключить как зависимость в gradle:

compile 'com.github.artfultom:wexapi:2.0.0-RELEASE'

или в maven:

<dependency> <groupId>com.github.artfultom</groupId> <artifactId>wexapi</artifactId> <version>2.0.0-RELEASE</version>
</dependency>

Для начала необходимо создать клиент:

WexClient client = new WexClient("https://wex.nz", key, secret);

Конечно же их надо держать в секрете и не коммитить на github. Key и secret используются для trade API, генерируются в личном кабинете биржи.

Информацию о торгах по паре btc-usd за последние 24 часа: Затем с помощью этого клиента можно получать публичные данные.

Map<String, Ticker> tickerMap = client.publicApi().getTicker("btc_usd").execute();
Ticker ticker = tickerMap.get("btc_usd");

Стакан с ограничением в 1000 ордеров:

Map<String, Depth> depthMap = client.publicApi().getDepth("btc_usd").setLimit(1000).execute();
Depth depth = depthMap.get("btc_usd");

В документации заявлено 2 секунды, это почти так. Публичный API кешируется биржей.

Для btc-usd он равняется 0. В trade API есть один неприятный момент — минимальное размер сделки. Учитывая, что операции по этой паре имеют точность 3 знака после запятой, то, если у вас на счету 0. 001 BTC. А вот через сайт можно. 0009 BTC, сделать с ними через API ничего не удасться. Самая частая операция из trade API скорей всего будет:

client.tradeApi().trade( "btc_usd", OrderType.SELL, price.setScale(3, RoundingMode.DOWN), amount.setScale(decimalPlaces, RoundingMode.DOWN)
);

И необходимый тут BigDecimal сильно усложняет простые арифметические операции. Как можно догадаться, это продажа. Но кому сейчас легко?

Также есть пара методов, работающая через сервис пуш-нотификаций:

client.pushApi().subscribeToTrade("btc_usd", trades -> { // видим сделки
});

client.pushApi().subscribeToDepth("btc_usd", depth -> { // видим ордера
});

Важно!

  1. Стоп Лосс и Тейк Профит.
    Стоп лосс (stop loss) — закрытие сделки при достижении определенного уровня потери цены.
    Тейк профит (take profit) — закрытие сделки при достижении определенного уровня прибыли.
    При открытии каждой позиции вы должны быть уверены в том, на какую прибыль рассчитываете и к какому убытку готовы.
  2. Сегодня оно работает, но завтра рынок обязательно изменится.
    Одни алгоритмы хороши при боковом тренде, флэте (флэт (flat) — период, когда цена на длительное время застревает в каком-то ценовом диапазоне), другие только при росте или только при падении. В любом случае, при изменении тренда, прибыльный до этого алгоритм может начать терять деньги.
  3. Bitcoin-биржи отличаются.
    Первое, что бросается в глаза — bitcoin-биржи работают круглосуточно. У ММВБ, NYSE и прочих есть торговая сессия. Поэтому для bitcoin не имеют смысла методы, использующие гэпы (гэп (gap) — разрыв графика, разница между ценой закрытия предыдущей сессии и ценой открытия текущей). Нужно быть внимательным к таким вещам, если читать литературу по техническому анализу, применяя его к bitcoin. И наоборот.

Далее

Schwager», но для начала лучше воспользоваться бесплатными курсами компаний-брокеров. Из литературы по техническому анализу обычно советуют литературу типа «Technical Analysis by Jack D. Удачной торговли! Они позволять сориентироваться в материале, все бросить и пойти заняться чем-то по-настоящему полезным.

Теги
Показать больше

Похожие статьи

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

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

Кнопка «Наверх»
Закрыть