noro
Обучение

Ботоводам про BitMEX

BITMEX:XBTUSD   Bitcoin / US Dollar Perpetual Inverse Swap Contract
6891 просмотров
56
Идея может быть полезна только для тех кто разрабатывает робота.

Сделал робота на своей стратегии Fast RSI 1.6, теперь стабильно работает наконец. При этом наступал много, и могу поделиться координатами граблей.

Тестнет

Гораздо лучше делать робота сначала для testnet.bitmex.com. Там всё ровно тоже самое, но это как "демо-счет". Про создании аккаунта даром дают 0.1 фейковых BTC , что достаточно. После того как бот готов и не глючит, достаточно просто поменять в коде адрес testnet.bitmex.com на http://www.bitmex.com - и всё сразу работает. Прием позволяет тестировать не теряя денег на глюках. Для того и сделано по сути.

Спам

Если размер ордера меньше 0.0025 BTC , то сервер помечает аккаунт как "спамер", и не дает создавать ордера. Удалить и создать новые ключи - не поможет. Ярлык "спамер" будет держаться сутки. И на тестнете тоже. Поэтому в коде для теста я указывал размер ордера 100 долларов или более. Ордеры меньше 100 долларов не должны появляться. Спам-фильтр не срабатывает если маленьких ордеров было мало, только когда много. Отсюда ложное впечатление якобы "можно и по баксу". Не можно.

Свечи

Команда GET /trade/bucketed

Ей можно получать свечи разного заданного ТФ. ИМХО лучше взять 5м свечи, так как на ТФ меньше 5м всё равно ничего нормально работать не будет. Нельзя получить свечи 15м, но можно их собрать самому. Тут вроде не сложно даже. Хотим 15м свечки, значит надо выбрать 3 свечи, посмотреть открытие первой и закрытие последней - получается 15м свеча. Можно и 45м так собрать. Максимум 15м-свечи - это максимум из максимумов 3 свечек. Так же с минимумом. Но для стратегии что я кодил минимумы/максимумы не нужны.

RSI

Закодить его сложно. В мануалах в сети описывают формулу расчета либо с EMA , либо со SMA . Тогда как и встроенный индикатор RSI на TradingView и моя версия используют RMA. Она же Rolling Moving Average. Следующая грабля еще забавнее - в мануале TradingView описана формула расчета RMA и она неправильная там! :) По идее можно использовать EMA вместо RMA, так как в итоге значения почти одинаковые, но вот для точности я всё же сделал на RMA.

Котировки

Котировки на Bitmex и Testnet отличаются. Котировки на Bitmex и на TradingView с биржи BitMEX тоже (!) слегка отличаются. Поэтому нельзя проверить правильно ли делается расчет индикатора по сайту TradingView. Зато на самом сайте бирже можно включить индикатор RSI и поменяв ему период на 7 сравнивать результаты - так совпадает у меня. Отличаются котировки очень редко, получается TW иногда "пропускает" некоторые трейды и цена закрытия свечи может быть на пару баксов меньше/больше чем на бирже.

Антикомиссия

Чтобы всегда получать антикомиссию нужно сделал ордеру "пассивный режим", тогда он либо получает антикомиссию, либо вообще не сработает. А так как он может не сработать, значит надо его перевыставлять. Так же лучше использовать команду, которая меняет цену ордеры (двигает его в стакане), а не отменять и создавать новый каждый раз, что было бы медленнее:

PUT /order
Amend the quantity or price of an open order.

Алгоритм

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

1) Должна быть переменная типа ПозицияПлан и переменная ПозицияФакт. То есть какая позиция планируется в долларах (может быть отрицательная, значит шорт), и какая сейчас есть. Один модуль бота отвечает за сигналы и делает расчет позиции, типа какая она должна быть сейчас с учетом сигналов. Этот модуль не реагирует на фактическую позицию. Это важно так как прошлый ордер мог не сработать до сих пор - в этом случае цифры разойдутся, далее какой-нибудь сбой. И второй модуль бота, который приводит ПозицияФакт и ПозицияПлан в соответствие.
Комментарий: Второй модуль запускается если если позицияФакт и позицияПлан не равны. Он работает до тех пор пока они не станут равны. Рассчитывается сколько нужно купить/докупить или продать чтобы они стали равны, создает ордер (если ордера нет), или двигает ордер меняя цену (если ордер уже есть). Так же стоит сделать проверку на количество ордеров, если ордеров почему-то два (изредко так бывает у меня), то нужно отменить оба и создавать новый. Иначе опять сбой будет.

При таком подходе может случаться такая ситуация: из-за задержки по времени ордер может сработать, а бот эту инфу еще не успел получить, поэтому создает уже второй ордер и он тоже срабатывает. Так если планировалось купить на 1000 долларов может купиться на 2000 по ошибке.

И эту проблему тоже решает этот подход с двумя переменными позицияФакт и позицияПлан. Раз уж куплено 2000, а не 1000 как планировалось, то модуль тут же начнет продавать лишнюю 1000. Это не страшно, так как он антикомиссию за это еще получит, поэтому это чаще к прибыли даже приводит чем к убытку.

Перегрузка

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

Лот

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

1) Ими не получится всегда входить с антикомиссией

2) Свою ошибку в коде я быстро найду и исправлю, а их ошибку - нет. Гораздо спокойнее со своим софтом.

3) Любые решения что есть в сети предполагаю использование только для одного аккаунта, а мне вообще то надо для сотни аккаунтов. Так что в любом случае самому всё придется делать.
Комментарий: Аккаунты

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

Создаете 3 аккаунта, на каждом из них запускаете своего робота с разными таймфремами, типа 1ч, 30м и 15м. Если сольется, то сольется один, а не все одновременно. Периодические делаете ребаласнировку между этими тремя аккаунтами (то есть выравниваете капитал до одинакового раз в месяц например). Ну и само собой если один из аккаунтов всё же слился, то значит обязательно нужно снизить у него кредитное плечо.

В идеальной ситуации роботы должны быть разные, разные стратегии, а не одна.

А в алгоритмических хедж-фондах с Уолл-Стрит работают целые сотни роботов. По сути там 5-20 эффективных стратегий, но они берут одну стратегию и запускают её на разных ТФ и чуть с разными настройками. Так у них есть диверсификация по таймфреймам, по параметрам, по активам, по стратегиям, по биржам, и даже по странам (политически риски снижают).

В следствии этой зашкаливающей диверсификации хедж-фонд Virtu имел всего один убыточный день за 6 лет работы! Но это тысячи роботов и тысячи активов в разных странах мира, что конечно одному человеку не под силу. Но можно же команду собирать, когда будут на неё достаточные средства. Для меня этот Virtu некий пример для подражания. Зачем изобретать велосипед, когда можно брать пример с успешных? Раз уж они пришли к выводу что армия роботов это отличное решение, а потом сделали на этом миллиарды, значит скорее всего это правильное решение, и чужой успешный опыт разумно скопировать. Так что я вот тоже хочу хотя бы десятки разных роботов, торгующих разными криптовалютами. С разными таймфреймами, с разными параметрами, на разных биржах, и из разных стран. Типа диверсификации много не бывает :)
Комментарий: 658 строк кода у меня получилось. Для Fast RSI 1.6. Копию полную сделал стратегии с TW + двигает ордеры чтобы антикомиссию ловить. Думаю явно можно было ужать и получить менее 658 строк, но как бы пофиг пусть так будет :) Будучи большим изощренцем и 1с-ником с 10-летним стажем сделал всё на 1С-ке, так как мне так быстрее и удобнее.
Ютуб https://www.youtube.com/channel/UCkup2iZzX4B7avWwwrlRG5w

[реклама] Рейтинг трейдеров криптовалют: https://tradeprofile.net/rating

Комментарии

У меня есть еще одно очень крутое добавление к списку. Как сделать так, чтобы скорость работы через HTTP была практически такой же, как и через WebSocket.

БитМекс не разрешает создавать и отменять ордера через WebSocket. Но пишет, что 'When using HTTP Keep-Alive, request/response round-trip time will be identical to Websocket.', то есть, при использовании HTTP Keep-Alive скорость запроса-ответа будет идентична скорости работы с WebSocket.

HTTP Keep-Alive это 'использование одного TCP-соединения для отправки и получения многократных HTTP-запросов и ответов вместо открытия нового соединения для каждой пары запрос-ответ' (Википедия). Можно сказать, что HTTP Keep-Alive это аналог WebSocket.

Для того, чтобы работать с BitMex через HTTP Keep-Alive нужно обозначить в заголовках (headers) соединения 'Connection: Keep-Alive' и 'Keep-Alive: 90'. И делать любой запрос не реже, чем один раз в 90 секунд. Цифра 90 - это количество секунд без активности со стороны клиента, после которых BitMex прервет Keep-Alive соединение.

Если говорить конкретнее про использование Keep-Alive в PHP, то библиотека curl по умолчанию его поддерживает. А для того, чтобы он работал нужно инициировать соединение только один раз, в начале работы, и больше его не закрывать.
То есть, $ch = curl_init(); вызывается только один раз. После этого все соединения осуществляются через уже созданный $ch. Для того, чтобы сделать новый запрос, можно сбрасывать предыдущие настройки с помощью curl_reset($ch); Даже если 90 секунд стекут и БитМекс прервет соединение, curl его автоматически восстановит в том же $ch.
Посмотреть, как это реализовал я можно тут https://github.com/y0un1verse/bitmex-api-php

Скорость работы с биржей выросла космически. Если раньше на создание ордера уходило порядка 3х секунд, то сейчас это 0.1 секунда. То же самое со всеми другими запросами.
+6 Ответить
Подскажите .
Скачал пример для запросов к API серез ws
Создал аккаунт на testnet . Подлючился . Получаю котировки .

Но когда переключился на реальный счет все сломалось. Сервер отдает 301 ошибку . Ключи естественно подставляю с реального счета .

В чем может быть проблема ?

+2 Ответить
Норо, привет!
Замечания:
- на тестнет можно положить сколько угодно виртуальных битков, если вдруг начального депозита не хватает, или он был слит.
- ликвидность и волатильность на тестнете заметно ниже, чем на основном сервере.
- спам аккаунт сначала просто помечается, а если высокая активность с мелкими ордерами продолжается, то могут ввести ограничения (когда я писал своего бота, несколько раз получал сообщения, что аккаунт помечен как спам, но до ограничений никогда не доходило).
+1 Ответить
noro Reshalex
@Reshalex, спасибо
Ответить
hokuighj Reshalex
@Reshalex, блин раз 10 не смог сконнектиться и словил бан по диапазопу ip.
Ответить
Тоже обратил внимание что формула расчёта RMA в мануалах TW неверная. Я делал для Poloniex и там, кстати, расхождений с котировками на TW не было, значения индикаторов рассчитывались аналогично
+1 Ответить
Про rma. В доке tradingview написано что "Это экспоненциально взвешенное скользящее среднее с alpha = length - 1."
Подбором выяснил, что tradingview считает rma c alpha = 1 / length
Ответить
Лайк! К как пирамидинг кодируется? Новыми ордерами или игры с плечом?
Ответить
noro root.gidra
@root.gidra, пирамидинг это не совсем плечо. Плечо, это когда например сразу покупаешь на 300% от капитала и не докупаешь. А пирамидинг предполагает постепенную докупку. Где до 300% может доходить, а может и не доходить. В разных сделках по разному. Ну вот стоит пирамидинг 5 например, это значит в первой сделке будет покупка + 1 докупка = 200% загрузка капитала = х2 плечо. А на следующей сделке будет 1 покупка + 4 докупки = 500% загрузка = х5 плечо. То есть пирамидинг это грубо говоря "размазанное" по времени постепенное плечо, а не всё сразу. Пирамидинг обычно безопаснее плеча, так как чаще всего в позицию набирается не максимум разрешенного капитала, а меньше.
Ответить
Домой Скринер акций Скринер форекс Скринер криптовалют Экономический календарь О проекте Особенности Цены Приведи друга Правила поведения Справочный центр Решения для сайтов и брокеров Виджеты Графики TradingView для сайтов Легкая версия графиков Блог и новости Твиттер
Профиль Настройка профиля Счёт и оплата Ваши друзья Монеты Мои запросы в поддержку Справочный центр Опубликовано идей Подписчики Подписки Личные сообщения Чат Выйти