Время от времени мне пишут, что хотели бы использовать моего бота для бинанса с таким-то индикатором или в такой-то связке индикаторов для реализации своей стратегии. Раз уж мы закончили цикл статей про индикаторы, давайте применим их в реальной жизни?
Отличия в новой версии:
- Стало больше файлов. Ваши настройки нужно прописывать в файле config.py
- Бот совершает абсолютно все сделки по рынку.
- Вначале, если индикаторы позволяют (об этом ниже), бот создает ордер на покупку по рынку. После создания бот получает с биржи историю сделок и считает средневзвешенную цену (как и то, что вы видите на Binance) в истории торгов.
- После того, как ордер на покупку исполнен, бот проверяет текущий курс (в стакане на покупку), и, если рост превысил заданное в конфиге, то продает по рынку. После продажи опять же получает историю сделок и считает курс для истории.
- Если включен флаг stop-loss, то бот продает по рынку, когда цена падает на указанный процент.
- Бот работает в два потока, один из которых собственно бот, другой синхронизирует время с биржей. Это нужно для тех случаев, когда время постепенно расходится в процессе работы бота.
- Убрано всё, что связано с комиссией. Во-первых, бот покупает по рынку и ему плевать на комиссии, во вторых сейчас помимо BNB|НеBNB комиссий появились разные ставки maker/taker для разных уровней участников, и еще возможна ситуация, когда часть комиссии снята в BNB, потом монеты кончились и часть снялась в остальной валюте. Для простого бота обработку всех этих событий считаю излишней, просто держите BNB на балансе и не снимайте галочку.
Теперь собственно про индикаторы (и вообще алгоритм работы).
Рассказываю с самого начала.
- Нужно скачать архив с ботом. Распаковать его в любую папку по вашему выбору
- Вам нужен установленный python версии 3.6 и выше, скачайте его с официального сайта и установите все галочки.
- Запустите setup.bat в папке с ботом.
- Откройте файл config.py в папке с ботом и укажите настройки.
- Нужно будет прописать API-ключи (откуда их взять расписано тут)
- Указать пары, по которым собираетесь торговать
- Суммы для торгов
- Признак active пары позволяет пропускать пару, если не хотите её использовать (по ней не будут создаваться новые ордера на покупку)
- KLINES_LIMITS – сколько свечей бот должен получать при построении индикаторов
- TIMEFRAME – по каким свечам собираетесь работать с индикаторами (в примере – с часовыми)
- В принципе бот готов к работе, но нужно еще настроить вашу торговую стратегию. Я думал убрать её в отдельный файл, но решил, что вас это еще больше запутает. Вот суть:
Индикаторы
В файле binance_bot.py есть вот такой вот фрагмент кода:
log.debug("Проверяем индикаторы")
# Получаем свечи и берем цены закрытия, high, low
klines = bot.klines(
symbol=pair_name.upper(),
interval=TIMEFRAME,
limit=KLINES_LIMITS
)
closes = [float(x[4]) for x in klines]
high = [float(x[2]) for x in klines]
low = [float(x[3]) for x in klines]
# Скользящая средняя
sma_5 = ta.SMA(closes, 5)
sma_100 = ta.SMA(closes, 100)
ema_5 = ta.EMA(closes, 5)
ema_100 = ta.EMA(closes, 100)
enter_points = 0
if ema_5[-1] > ema_100[-1] and sma_5[-1] > sma_100[-1]:
# Быстрая EMA выше медленной и быстрая SMA выше медленной, считаем, что можно входить
enter_points += 1
macd, macdsignal, macdhist = ta.MACD(closes, 12, 26, 9)
if macd[-1] > macdsignal[-1] and macdhist[-1] > 0:
# Линия макд выше сигнальной и на гистограмме они выше нуля
enter_points += 1.3
rsi_9 = ta.RSI(closes, 9)
rsi_14 = ta.RSI(closes, 14)
rsi_21 = ta.RSI(closes, 21)
if rsi_9[-1] < 70 and rsi_14[-1] < 70 and rsi_21[-1] < 70:
# RSI не показывает перекупленности
enter_points += 2
fast, slow = ta.STOCH(high, low, closes, 5, 3, 3)
if fast[-1] > slow[-1]:
# Быстрая линия стохастика выше медленной, вход
enter_points += 1.5
fast, slow = ta.STOCHRSI(closes, 14, 3, 3)
if fast[-1] > slow[-1]:
# Быстрая линия STOCHRSI выше медленной, вход
enter_points += 1.8
upper, middle, lower = ta.BBANDS(closes, ma_period=20)
if high[-1] > upper[-1]:
# Свеча пробила верхнюю полосу Боллинджера
enter_points += 3
log.debug("Свеча набрала {b} баллов".format(b=enter_points))
if enter_points < POINTS_TO_ENTER:
log.debug("Минимальный проходной балл {b}. Пропуск пары".format(b=POINTS_TO_ENTER))
continue
Я его набросал для примера, просто что бы дать вам понимание что и как настраивается. Эта торговая стратегия не является какой-то там оптимальной или известной. Вы можете добавлять или убавлять куски кода так, как вам будет удобнее. Пробегусь по логике:
Работа с индикаторами происходит только перед созданием ордера на покупку, фактически это принятие решения, стоит ли входить в торги.
Сначала мы получаем с биржи свечи по текущей паре:
klines = bot.klines(
symbol=pair_name.upper(),
interval=TIMEFRAME,
limit=KLINES_LIMITS
)
Формируем массивы с ценами закрытия (а также high и low)
closes = [float(x[4]) for x in klines]
high = [float(x[2]) for x in klines]
low = [float(x[3]) for x in klines]
Строим для начала скользящие средние SMA и EMA (это и все что дальше касается индикаторов можно смело менять и удалять).
# Скользящая средняя
sma_5 = ta.SMA(closes, 5)
sma_100 = ta.SMA(closes, 100)
ema_5 = ta.EMA(closes, 5)
ema_100 = ta.EMA(closes, 100)
Проверяем, если последнее значение SMA с периодом 5 выше последнего значения SMA с периодом 100, и если тоже самое справедливо для EMA, то присваиваем одно очко в копилку. Значения могут быть любыми.
if ema_5[-1] > ema_100[-1] and sma_5[-1] > sma_100[-1]:
# Быстрая EMA выше медленной и быстрая SMA выше медленной, считаем, что можно входить
enter_points += 1
Если # Линия макд выше сигнальной и на гистограмме они выше нуля, то присваиваем еще 1.3 и т.п. Там вы найдете RSI, STOCH, STOCHRSI, и Боллинджера, по тем же приницпам.
macd, macdsignal, macdhist = ta.MACD(closes, 12, 26, 9)
if macd[-1] > macdsignal[-1] and macdhist[-1] > 0:
# Линия макд выше сигнальной и на гистограмме они выше нуля
enter_points += 1.3
В итоге, после того как все индикаторы построены и наши веса посчитаны, можно принимать решение. В данном случае у меня в конфиге стоит проходной балл 7 (параметр POINTS_TO_ENTER), а суммарно можно набрать 10.6, если все индикаторы сработают.
В большинстве случаев какие-то индикаторы будут срабатывать а какие то нет, я проставил 3 очка Боллинджеру, если есть пробитие то это почти на половину увеличивает шансы пары войти на рынок. Если сработают только скользящие, то пара получит одно очко.
Ваша задача подобрать индикаторы, веса и проходной балл так, что бы реализовалась ваша торговая стратегия. Например, если вы используете только MA200 и RSI, и хотите войти на рынок, когда они сработают вдвоем, удалите всё лишнее, дайте каждому из них по 1 и сделайте проходной бал 2. Если достаточно сработки хотя бы одного из них, сделайте проходной балл 1.
Все доступные индикаторы вы можете найти в файле bablofil_ta.
Надеюсь, этот бот поможет вам отлаживать/настраивать/проверять свои или чужие торговые стратегии, а также принесет прибыль при грамотной настройке.
Вы всегда можете остановить бота, поменять настройки (например прибыльности или стоп-лосса) и бот подхватит для всех пар, даже для тех, по которым есть ордера. Если хотите начать все заново, удалите файл binance.db из папки с ботом, это его база данных, он создаст новую при запуске.
В общем удачи и профита вам и вашим роботам.
Задавайте вопросы в комментариях, пишите на форуме.
111) и самое главное бот не стабильный, пропускает стоп-лосси лимиты на продажу, даже если его допилить чтоб он после продажи не покупал снова, бот будет пропускать то что должен делать.
Протестировал бота - вход происходит в торги удачно: по маркету было куплено три монеты когда условия сложились до 7 входных баллов, однако когда курс купленных монет превысил на утро более 1 процент - продажа не осуществилась ни по одной из них. Пришлось все скидывать вручную.
Можно ли настроить чтобы на продажу выставлялся ордер?
Или столкнулись с какой то ошибкой в логах?
Бот работает (покупает, продает, пишет в логфайл) минут 20 потом останавливается. После перезапуска все опять работает минут 20 -25. В чем проблема может быть?
Там еще может отображаться ошибка в консоли, которая не попадает в лог, посмотрите, пишется ли там что то
Купите немного BNB, закиньте на баланс, тогда количество полученного будет совпадать, а уменьшаться будут монеты BNB
Так вроде все ок
Вообще обратной пары не существует, он по какой купил по той и продает, меняется тип операции
Сначала он проверил, не пора ли продавать с профитом, запросил курсы, получил эту строку
2019-10-02 15:39:58,779 [DEBUG] Цена изменилась на -1.02450039%, процент для продажи 0.50000000
После этого выяснил, что с профитом продавать рано, и переключился на ветку продажи по стоплоссу.
Там заново запросил курсы, и, полагаю, ситуация уже была другой. Тут, к сожалению, лог не пишется (хотя стоило бы), но если бы курс был по прежнему на 1%, то он продал бы и написал в лог
При пробитии верхней границы полосы Боллинджера мы ожидаем спада цены, мы действительно там должны входить в рынок с покупкой?
Возможно нужно внести измененный индикатор, нам необходимо побитие именно нижней полосы Боллинджера?
Проверьте апи ключи, а так же синхронизируйте время на компьютере с мировым
Закупите bnb для комиссий
Тут происходит деление на ноль, но это не из-за того, что он данные не получил, а из-за того, видимо, что текущий high по паре совпал с текущим low, если посмотрите график по паре, то так оно и есть
https://snipboard.io/1uQ52d.jpg
С такими ровными графиками теханализ работать не может.
Вообще на будущее нужно будет такое предусмотреть в коде, добавить внятное описание ошибки, и пропуск таких пар, но в целом оно так сейчас и работает. Просто подождите, пока начнется какое-то движение по паре, и снова всё заработает
Чтоб было примерно так:
2020-01-09 13:00:16,345 [DEBUG] Свеча набрала 2 баллов = macd(1) + BB(1).
или так:
2020-01-09 13:00:16,345 [DEBUG] Свеча набрала 2 баллов = 1 балл (macd) + 1 балл (BB).
Чтоб видно было какой индикатор сработал и сколько баллов добавил. Потом легче сравнивать с графиком на бирже и понятно будет, срабатывает как было задумано или нет.
Вы можете запускать несколько экземпляров бота, каждого в своей папке, и менять им параметры, хотите, ставьте одинаковые пары с разными параметрами, лимит обращений вы вряд ли превысите, проблемы если и начнутся, то где то после 20 одновременных ботов
Нужно получать историю сделок, группировать их время создания по нужными интервалам, соответственно low и high свечи будут наименьшей и наивысшей ценами сделок, open - цена первой сделки, close- цена последней, объем - суммарный объем сделок в периоде. Хотите, делайте 3-х секундные свечи, хотите - 11 секундные и т.п.
EUR/USD
Цена данной валютной пары показывает, какое количество долларов США (USD) можно приобрести за 1 единую европейскую валюту (EUR). Открывая ордер «buy» трейдер приобретает EUR, расплачиваясь при этом USD. При фиксировании прибыли совершается обратная операция — покупка USD за EUR. В данной паре EUR является базовой валютой. Это утверждение верно по отношению ко всем мировым валютам.
т.е. EUR является базовой валютой - первая валюта базовая, вторая котируемая, а у вас все наоборот:)
В файле конфига profit_markup и stop_loss какое значение будет верным? 1 = 1% или 0,01 = 1% ?
Интересно узнать ваше мнение,Спасибо!
Не подскажете, зачем запрашиваются данные по 200 свечам если в индикаторах используется максимум 100 (в SMA, EMA) в других ещё меньше? Или я не правильно понял?
У нас первые 100 значений будут пустыми, при агрегации в 100
подскажите как это реализовать в коде ?