noro
Обучение

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

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

Сделал робота на своей стратегии 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С-ке, так как мне так быстрее и удобнее.
Про rma. В доке tradingview написано что "Это экспоненциально взвешенное скользящее среднее с alpha = length - 1."
Подбором выяснил, что tradingview считает rma c alpha = 1 / length
Ответить
У меня есть еще одно очень крутое добавление к списку. Как сделать так, чтобы скорость работы через 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 секунда. То же самое со всеми другими запросами.
+2 Ответить
Лайк! К как пирамидинг кодируется? Новыми ордерами или игры с плечом?
Ответить
noro root.gidra
@root.gidra, пирамидинг это не совсем плечо. Плечо, это когда например сразу покупаешь на 300% от капитала и не докупаешь. А пирамидинг предполагает постепенную докупку. Где до 300% может доходить, а может и не доходить. В разных сделках по разному. Ну вот стоит пирамидинг 5 например, это значит в первой сделке будет покупка + 1 докупка = 200% загрузка капитала = х2 плечо. А на следующей сделке будет 1 покупка + 4 докупки = 500% загрузка = х5 плечо. То есть пирамидинг это грубо говоря "размазанное" по времени постепенное плечо, а не всё сразу. Пирамидинг обычно безопаснее плеча, так как чаще всего в позицию набирается не максимум разрешенного капитала, а меньше.
Ответить
А где столько денег взять, что бы на 100 роботов хватило?
Ответить
noro Flyingru
@Flyingru, это в думу надо устроиться сначала. Хотя потом роботов не надо будет тоже... Ну пока вопрос без ответа :)
Ответить
Отличный обзор.

Можно тестировать на TestNet, но там иногда сильно скачет цена, а иногда стоит на месте. Поэтому, там можно проверять работоспособность кода бота, а вот проверить эффективность стратегии трудно. К тому же TestNet блокирует веб-интерфейс при работе вместе с API. Так что, посмотреть как бот работает визуально не получится.
Спасибо за идею про свечи 15 минут! Гениально.
Как сделать RMA я так и не разобрался, но спасибо за подсказку с EMA.

Я тестирую Primitive стратегию со своими модификациями на реальных деньгах и пока получается неплохо. Было бы и вовсе отлично, если бы биржа не тупила с ответами, выставление ордера занимает 3 секунды, за это время цена может убежать достаточно далеко. А так же отказы биржи на высоких нагрузках тоже съедают потенциальную прибыль.

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

Ну и не знаю, видели или нет, я писал раньше. Сделал класс для работы с BitMex https://github.com/y0un1verse/bitmex-api-php , который периодически дополняю.
Ответить
noro youniverse
@youniverse, на тестнет можно и нужно тестировать стабильность работы робота, а не доходность/просадку оценивать. Доходность/просадку можно оценит бектестами на TW, а уже потом на реальных деньгах сравнивать. Например, если в тесте на TW и у робота равная стратегия, и они работали 7 дней, то смотрим доходность стратегии и реальную у робота и сравниваем. Если робот сделал на 20% меньше профита за тот же период, значит реальная доходность скорее всего так и будет на 20% меньше чем на тесте.

Кстати. Если робот начал сильно сливать, то можно его выключить и смотреть как бы он работал на бектесте TW. Если на бектесте торговля стала улучшаться опять, значит можно снова включить робота.
Ответить
@noro, да, я о том же, тестнет хорош только для тестирования кода.
В случае с 5-и минутным таймфреймом доходность стратегии на TV и у бота очень сильно отличаются именно из-за того, что TV моментально выполняет ордера по текущей цене, в то время, как бот должен купить ордер на бирже, которая тупит и отваливается из-за нагрузки. Примитивная стратегия с парой доработок оказалась очень эффективной в тесте бота (когда бот не покупает реальные ордера на бирже, а делает виртуальный ордер по текущей цене так же, как это делает TV). Эти тесты меня очень вдохновляют. К тому же, я вижу каких результатов мог бы достичь бот, если бы он мог покупать ордера на бирже без существенных задержек. В режиме реального времени я вижу, как бот принимает правильное решение по покупке, но в результате задержки профит от сделки оказывается близким к нулю, потому что цена успевает отскочить в обратную сторону прежде, чем бот выкупит ордер. У меня есть вера в то, что web socket может решить эту проблему. Но я так и не смог найти решение для web socket на PHP.
Сейчас я получаю ticker через web socket с помощью скрипта на Python раз в 0.1 секунды. Результаты передаются в PHP скрипт, который так же запускается каждые 0.1 секунды. Это позволяет минимизировать время на определение текущей цены, но покупка ордера все еще происходит через тормозной http, в чем и кроется проблема.

Норо, суммируя все вышесказанное, я хочу сказать, что ваша стратегия работает в плюс! :) По-моему, это здорово. Вопрос за технической частью, которая пока не позволяет на практике добиться теории.
P.S. Я сейчас говорю о торговле на 5-и минутном таймфрейме, для которого скорость выполнения ордера является ключевой задачей. Для бОльших траймфреймов эти проблемы могут быть не столь значительными.

> Если робот начал сильно сливать, то можно его выключить и смотреть как бы он работал на бектесте TW. Если на бектесте торговля стала улучшаться опять, значит можно снова включить робота.

Да, это звучит резонно. Я заметил, что примитивная стратегия на 5-и минутках лучше отрабатывает высокую волатильность, в то время, как флэт дает отрицательный профит. Но на то бот и бот, чтобы делать все автоматически. У меня были мысли каким-нибудь образом варьировать параметры бота в зависимости от уровня волатильности рынка.
Пока мысли сосредоточены на скорости покупки ордера. Уже думаю выучить Python, чтобы работать через web socket :)

Спасибо за формулу RMA.
Ответить
noro youniverse
@youniverse, можешь на EMA сделать. Но на SMA не надо - сильно отличаются результаты.

Вот как RMA закодить (не реклама):

https://www.forextimes.ru/foreks-stati/rma-rolling-moving-average-katyashheesya-skolzyashhee-srednee
Ответить
RU Русский
EN English
EN English (UK)
EN English (IN)
DE Deutsch
FR Français
ES Español
IT Italiano
PL Polski
SV Svenska
TR Türkçe
PT Português
ID Bahasa Indonesia
MS Bahasa Melayu
TH ภาษาไทย
VI Tiếng Việt
JA 日本語
KO 한국어
ZH 简体中文
ZH 繁體中文
AR العربية
Домой Скринер акций Скринер Форекс Скринер криптовалют Экономический календарь О проекте Особенности Правила поведения Модераторы Решения для сайтов и брокеров Виджеты Компонент графиков Отзывы и предложения Блог и новости ЧаВо Справка и Wiki Твиттер
Профиль Настройки профиля Счёт и оплата Мои запросы в поддержку Связаться с поддержкой Опубликовано идей Подписчики Подписан Личные сообщения Чат Выйти