Бот для Binance

Андрей К…
Последнее изменение:
263
3
0

Введение

В этой статье представлен простой бот для торговли на бирже Binance.

Бот создает ордер на покупку, основываясь на средней цене из указанного количества предложений на покупку, после чего отслеживает его. Если ордер не выполнен в течении определенного количества времени, ордер отменяется. Если ордер исполнен, выставляется ордер на продажу с указанным профитом. После исполнения ордера на продажу торговля идет по новому кругу.

Поддерживается торговля по нескольким парам, по умолчанию бот работает с комиссией BNB, но поддерживается так же торговля с обычным видом комиссии.

Об особенностях торговли

Цены и объемы

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

Существует шаг цены – например, для пары NEOUSDT цена должна быть кратной 0.00100000. Нельзя выставить ордер по цене, 0.1234 – можно либо 0.123, либо 0.125.

Существует шаг продаваемых/покупаемых монет – например, для пары NEOUSDT шаг объема 0.001 – поэтому не получится продать или купить 123.45678 – можно либо 123.456, либо 123.457.

Ну, и как везде, нельзя создавать ордера меньше указанного объема.

Эти ограничения находятся можно получать через api-метод exchangeInfo (подробности о работе API Binance тут), нужная информация находится в разделе filters по каждой паре. Для цены это tickSize, для объема stepSize в соответствующих структурах данных.

Бот учитывает эти ограничения, но обратите внимание, как меняется цена торгов:

Допустим, вы собираетесь торговать на 11 USDT.

Бот получает цены из стакана – например, 5 цен - [118.753, 118.750, 118.730, 118.712, 118.704]. Берет среднюю -  118,7298. Т.к. минимальный шаг цены 0.001, то берется цена 118,729 (в нижнюю сторону).

После этого бот вычисляет количество валюты, которое можно купить по этой цене – делит 11 USDT на 118,729, получает 0,092648. Т.к. минимальный шаг по монетам 0.001, то выбирается количество 0,092.

В итоге бот покупает 0.092 NEO по курсу 118,729 – и итоговая сумма торгов составит 10,923068. Это меньше, чем указано в настройках, но бот вынужден подстраиваться под требования биржи.

При продаже бот будет продавать так, чтобы получить 10,923068 + нужный процент профита.

Комиссии

У бинанса своя система взимания комиссии. Точнее, их две. По умолчанию, используется такой вид комиссии – неважно, по какой паре вы торгуете, комиссия списывается с вашего счета в валюте BNB. BNB – это собственная валюта Binance, подробнее я расскажу о ней отдельно, но суть такая:

Вы, например, торгуете NEO-USDT. Совершаете покупку по курсу X, рассчитывая купить Y монет NEO и потратить Z USDT. Вы выставляете ордер, он исполняется, и вы получаете Y монет NEO, потратив Z USDT. Вы, как бы, ничего не потеряли на этих торгах – но с вас списалось S монет BNB.

В общем-то, это хорошо – потому что Binance даёт скидку. Оплачивая комиссию через BNB, вы платите на 50% меньше. Теоретически, если комиссия 0.1%, то оплачивая комиссию таким образом, вы платите 0.05% с каждой сделки. Бот рассчитан в первую очередь на такую комиссию, и рекомендуется использовать именно её. Если вдруг вы хотите торговать с обычным видом комиссии, то зайдите в свой профиль и переключите флажок:

После этого в боте нужно будет поменять переменную

USE_BNB_FEES = True

На

USE_BNB_FEES = False  

Правда, я не вижу, зачем бы вам это делать. В любом случае, если вы раньше не торговали на Binance, то первым делом нужно прикупить немного BNB. Прикупить, и пусть лежат. Если вы, тем более, будете торговать с базовой парой BNB, вам это будет на руку.

Как лучше пользоваться ботом

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

Такой вывод вы можете сделать, либо используя индикаторы, либо новости – например, если валюту добавили на биржу, скорее всего она первое время будет расти. Если IBM решил вложиться в Etherium, скорее всего эфир будет расти. Если MACD и RSI показывают сигналы к покупке, скорее всего будет расти, и т.п.

Выбрав пару для торгов, вы останавливаете бота (если запущен), и добавляете пару в конфиг, вот так:

"""
    Пропишите пары, на которые будет идти торговля.
    base - это базовая пара (BTC, ETH,  BNB, USDT) - то, что на бинансе пишется в табличке сверху
    quote - это квотируемая валюта. Например, для торгов по паре NEO/USDT базовая валюта USDT, NEO - квотируемая
"""
pairs = [
     {
        'base': 'USDT',
        'quote': 'BTC',
        'offers_amount': 5, # Сколько предложений из стакана берем для расчета средней цены
                            # Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
        'spend_sum': 11,  # Сколько тратить base каждый раз при покупке quote
        'profit_markup': 0.005, # Какой навар нужен с каждой сделки? (0.001 = 0.1%)

    },{
        'base': 'USDT',
        'quote': 'NEO',
        'offers_amount': 5, # Сколько предложений из стакана берем для расчета средней цены
                            # Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
        'spend_sum': 11,  # Сколько тратить base каждый раз при покупке quote
        'profit_markup': 0.005, # Какой навар нужен с каждой сделки? (0.001 = 0.1%)

    }
]

Пар можно добавлять любое количество, угрозу бана это не спровоцирует, просто отдельные пары будут реже проверяться, но ответы сервера тут шустрые, так что это особо не скажется на производительности.

Если же вы думаете, что ситуация становится опасной, и пора бы прекратить торги, то дождитесь, когда бот выставит ордер на продажу, остановите бота, и удалите пару из конфигурации. Бот продолжит отслеживать ордер на продажу, но новых покупок создавать не будет.

Если вы отменили ордера или что-то еще сделали на бирже, но бот «запомнил» и теперь проверяет несуществующие ордера, у вас есть два варианта:

  1. Удалите файл binance.db из папки с ботом. Это вынудит бота начать всё с чистого листа, и он начнет работать с нуля по всем парам из конфигурации. Открытые ордера на бирже пропадут из его надзора, и вам нужно будет разрешить их судьбу самостоятельно.
  2. Если вы не хотите терять открытые ордера по другим парам, то откройте файл binance.db с помощью программы SQLiteStudio, Вы запустите программу, добавите базу данных через обзор, там откроете таблицу orders и удалите оттуда только нужный ордер. Кстати говоря, т.к. бот записывает все свои покупки и продажи, с помощью этой программы вы можете выгружать историю торгов бота в Excel и анализировать.

Реклама


Установка и запуск

  1. Зарегистрироваться на Binance (если еще не сделали, вот инструкция)
  2. Пополнить баланс
  3. Убедиться, что на балансе есть BNB (если нет, докупить чуток)
  4. Получить API-ключи (инструкция). Потребуется включить двухфакторную авторизацию, я советую использовать SMS, но можно и Google Authenticator.
  5. Установить Python версии 3.6 и выше. Прямую ссылка на скачивание я не указываю, т.к. к моменту прочтения статьи все может измениться, вам нужно зайти на официальный сайт по ссылке https://www.python.org/downloads/, скачать и установить Python 3.6 и выше (кнопка слева). При установке поставьте все галочки. В идеале, выберите расширенный режим установки (advanced) и поставьте все галки там – нужны будут права администратора.
  6. Скачать архив с ботом.
  7. Распаковать в любую директорию на компьютере
  8. Запустить файл setup.bat – установятся нужные модули (для надежности, запустите и так, и от имени администратора)
  9. Открыть файл binance_bot.py в текстовом редакторе и прописать API-ключи и настройки (об этом ниже)
  10. Запустить файл run.bat – запустится бот и начнет зарабатывать деньги.

Остановить бота можно закрыв окно крестиком.


Реклама


Настройка

Настроек не так много, в API_KEY и API_SECRET нужно прописать ключи, которые вы получили на бирже.

В пары нужно прописать соответственно пары, на которые планируете торговать, максимальную сумму, которую планируете тратить, и желаемый процент прибыли. С этим есть некоторый момент, т.к. вы платите комисиию BNB. Я советую ставить 0.003 (0.3%) и выше, но если у вас есть возможность дешево получать BNB, то можно и меньше.

BUY_LIFE_TIME_SEC – через сколько отменять ордер на покупку (если он не исполнен), в секундах.

STOCK_FEE – комиссия биржи, если вдруг решите торговать без BNB.

USE_BNB_FEES = True – если торгуете с BNB, False – в противном случае.


Реклама


ВСЁ!

Я гонял этого бота несколько дней, меня не забанили, я немного увеличил количество USDT – так что я со спокойной душой передаю вам бота и его исходный код. Вы можете модифицировать его под свои нужды, или обратиться за доработкой.

Я желаю вам хороших заработков, если в процессе эксплуатации будут выявлены какие-то проблемы, или возникнут вопросы, смело пишите в комментарии или лично мне, контакты есть в профиле.

Это статья из цикла "Популярно о бирже"

Текущая статья
Комментарии: (263)
14.02.2018 23:57
архив с ботом не доступен... сервер отвечает 404...
15.02.2018 04:41
у меня так же сервер не отвечает
15.02.2018 06:44
Спасибо, обновил ссылку
15.02.2018 14:14
Добрый день Андрей!
Внимательно слежу за ваши ботами. Визуально выделил три стадии эволюции:
1. Простой бот
2. С индикатором
3. С индикатором и плавающей ценой продажи.
Пробовал все три вида + небольшие доработки. У всех трёх ботов есть общий недостаток - возможность зависания на верхах. Связано это с тем, что прибыль фиксируется на продажи с учётом двух комиссий за покупку и продажу. Для этого нужен хороший тренд вверх.
Есть идея - сделать бота с индикатором и закладывать комиссию и в покупку и продажу + прибыль. При определении цены покупки/продажи отталкиваться от предыдущей цены сделки + комиссию + прибыль. Соответственно тренд на повышение/уменьшение нужен будет меньше. Интересует ваше мнение на этот счёт. Не собираетесь ли вы реализовать нечто подобное?
P.s. спасибо вам за выложенных ботов.
28.11.2018 20:11
Доброго времени суток!!! Прикрутите пожалуйста к боту для Binance мартин. Суть - если сработал стоп лосс, то следующий лот  увеличивается на заранее заданный процент. Если сработал тейк профит лот, то лот переходит в первоначальный объем. МОЖНО ЛИ ТАК СДЕЛАТЬ?
15.02.2018 15:46
Добрый день.
Самый первый бот для Эксмо торгует именно по такой логике - он снижает цену при покупке, делая покупки реже, но зато не так сильно завышает цену продажи, т.к. она уменьшается на размер комиссии.
Кому-то это нравится, кому-то нет. Кто-то хочет покупать по цене продажи, кто-то готов торговать до упора, а последний лот продавать в минус. Лично мне нравится, но я стараюсь держать код максимально простым, что бы каждый мог разобраться, а иногда даже достичь желаемого, поправив всего пару строчек.
15.02.2018 16:24
В первом боте опять же закладывается логика продажи включая две комиссии и навар. Что опять приводит к рискам застрять на верхах (купили чуть дешевле при активном падении). А я говорю о возможности брать последнию сделку с нее брать цену. Новая цена следующей сделки = цена последней сделки + процент комиссии за одну операцию + навар. С учётом индикаторов такой бы бот работал более сбалансировано. Как думаете?
17.02.2018 00:38
допустим валюта 'base': 'BTC'   = программа не работает со значением менее 1, например 0.00337656... т.е. торговать имея сумму менее 548 000 р. по текущему курсу, не возможно...
17.02.2018 10:20
Такое могло быть на некоторых парах, сейчас изменил алгоритм и обновил архив с ботом, скачайте по новой.
Проверил, торгуя по паре BTCXVG на макс. сумму 0.0015BTC. Создался ордер на покупку по курсу 0.00000764 на 196 XVG на сумму 0.00149744, потом прошла продажа 196 XVG по курсу 0.00000768 на сумму 0.00150528
17.02.2018 19:52
при запуске run выдает такой текст, питон установлен

"python" не является внутренней или внешней
командой, исполняемой программой или пакетным ф
Для продолжения нажмите любую клавишу . . .
18.02.2018 06:39
Переустановите питон, и поставьте вообще все галочки, даже зайдите в расширенную установку и там поставьте тоже, все заработает.
Если вкратце, питон должен быть добавлен в переменную окружения PATH, вы можете прописать его туда сами без переустановки. Так же вы можете открыть run.bat в блокноте, и поменять python на полный путь к файлу python.exe - C:\Users... Но проще переустановить и все сделается само
20.02.2018 22:07
всё надеялся, что будут комменты об успехах, так и не дождался... у меня не работает, пишет :[DEBUG] https://api.binance.com:443 "GET /api/v3/account?timestamp=1519162472623&signature=6fb44960a5f9358e546271db2f9e5a5fc4e728b6a9a3edeb55de6a1ae461b530 HTTP/1.1" 400 None  [WARNI] 'balances'   ... выставлено ===> 'base': 'BTC', 'quote': 'LTC', 'spend_sum': 0.01... баланс присутствует, в чём может быть дело???
21.02.2018 06:21
Во времени.
Биржа очень чувствительна ко времени, поэтому если у вас не настроена автоматическая синхронизация, то торговать вы не сможете.
Так же может влиять часовой пояс..
Откройте ссылку https://api.binance.com/api/v1/exchangeInfo, там в самом верху есть "serverTime":1519193631348 - текущее время сервера. В вашем коде выше есть timestamp - /api/v3/account?timestamp=1519162472623 - текущее время компа.
Надо, что бы они не расходились более чем на 5000, причем на стороне компа время должно быть меньше чем серверное.
Добиться этого можно либо изменяя часовой пояс, либо в файле binance_api поменять строку
payload.update({'timestamp': int(time.time() * 1000)})
на
payload.update({'timestamp': int((time.time()-1*60*60) * 1000)})
где -1 - это кол-во часов разницы, нужно поменять на -2, +2 и т.п. по ситуации.
Я подумаю, как сделать так, что бы это все проходило автоматически.
22.02.2018 23:40
мучился пару дней, но так и не смог загнать в необходимое значение... ни подвод часов, ни смена часового пояса не дало результата... изменения носили скачкообразый результат много больше необходимого... миниму 20000 разницы, меньше никак... больно уж сложно получается настроить!!!
25.02.2018 07:34
Скачайте архив с нуля, я добавил пару интересных вещей для работы со временем
25.02.2018 12:28
всё то же самое, а архив точно обновлён???
25.02.2018 12:31
возможно страница не успела обновится... попробую позже.
21.02.2018 07:13
Добрый день.Не могу запустить бот.Вроде все проделлал.Однако при запуске run выдает ошибку.
21.02.2018 07:35
Добрый день.
Какую ошибку?
Вы пробовали запускать setup от имени администратора?
21.02.2018 17:22
Не могу запустить бота.при нажатии на последний пункт.(Запустить файл run.bat  запустится бот и начнет зарабатывать деньги.)
Не является приложением exАндре можете ли Вы сделать бота для Binanca  в формате EXE. Типа вроде как EVOLUTION BOT для Exmo.(http://good-technology.ru/) Наподобие аналога.
25.02.2018 07:31
Добрый день.
Переустановите питон и установите все галки при установке.
Если делать exe то людям будет сложнее настраивать бота под себя, смотреть код и т.п.
22.02.2018 16:55
у меня тоже к сожалению выдает ошибку связанную со временем
22.02.2018 19:25
пытался время подогнать, теперь новая ошибка : starting new HTTPS connection <1>: api.binance.com
22.02.2018 19:27
2018-02-23 04:27:33,460 [DEBUG] Получаем все неисполненные ордера по БД
2018-02-23 04:27:33,467 [DEBUG] Неисполненных ордеров в БД нет
2018-02-23 04:27:33,475 [DEBUG] Получаем из настроек все пары, по которым нет неисполненных ордеров
2018-02-23 04:27:33,488 [DEBUG] Найдены пары, по которым нет неисполненных ордеров: ['NEOUSDT', 'NEOBTC']
2018-02-23 04:27:33,504 [DEBUG] Работаем с парой NEOUSDT
2018-02-23 04:27:33,515 [DEBUG] Starting new HTTPS connection (1): api.binance.com
2018-02-23 04:27:34,598 [DEBUG] https://api.binance.com:443 "GET /api/v3/account?timestamp=1519327653513&signature=b67618ef7a9c86bf4111d064b8218a39e3b8402ae1156b624999769af3e64c80 HTTP/1.1" 400 None
2018-02-23 04:27:34,652 [WARNI] 'balances'
2018-02-23 04:27:34,669 [DEBUG] Получаем все неисполненные ордера по БД
2018-02-23 04:27:34,689 [DEBUG] Неисполненных ордеров в БД нет
2018-02-23 04:27:34,706 [DEBUG] Получаем из настроек все пары, по которым нет неисполненных ордеров
2018-02-23 04:27:34,745 [DEBUG] Найдены пары, по которым нет неисполненных ордеров: ['NEOUSDT', 'NEOBTC']
2018-02-23 04:27:34,768 [DEBUG] Работаем с парой NEOUSDT
2018-02-23 04:27:34,786 [DEBUG] Starting new HTTPS connection (1): api.binance.com
25.02.2018 07:32
Скачайте архив по новой, там многое изменено
24.02.2018 17:20
Неплохо было бы ловить пампы)
04.03.2018 00:02
Ошибочно щитывает баланс - типа нехватает минимальной суммы 10 USDT. Биткойны тоже недощитывает.
05.03.2018 20:33
Это не ошибочно, это от биржи идет - приходится покупать меньше и тратить меньше, что бы соблюдать шаги цены и объема. В общем, если бот не продал/купил, то и руками не выйдет по тем же ценам на те же суммы
04.03.2018 08:12
Добрый день. Подскажите пожалуйста, как решить проблему зависания на верхах, если тренд пошел вниз? Может добавить параметр который будет указывать вершину выше которой ставки не делать или параметр отслеживающий откат и продающий с небольшим минусом? Подскажите плиз, т.к. приходится все время следить, чтобы не зависнуть на верхах.
26.04.2018 08:50
Добрый день!
Один из способов решения - https://bablofil.ru/weighted-average/
04.03.2018 08:14
Еще один вопрос, подскажите где еще можно взять боты для binance, т.к. я чайник в программировании приходиться искать готовые боты...
26.04.2018 08:48
Добрый день!
Бот выложен тут https://bablofil.ru/bot-dlya-binance/
04.03.2018 19:55
API_KEY=''VojrXv5CNuLджтэждрькждээавлbjuS4Yr,'
SyntaxError: invalid syntax                                         *

Доброго времени суток, не могу запустить, прописал апи ключи, запускаю: вот эту ошибку выдает
04.03.2018 19:57
с указанием на последнюю букву в ключе
05.03.2018 20:31
Добрый день, у вас кавычки разные
06.03.2018 04:51
Блок схему не приложите, трудновато разобраться в коде без схемы.
06.03.2018 06:49
2018-03-06 12:09:23,867 [DEBUG] https://api.binance.com:443 "GET /api/v3/account?timestamp=1520312926000&signature=e40ba12078d44768200a01551ae0cbec2a29b54ff821627bc01ff140fb9e11bf HTTP/1.1" 200 None
При том шапка лога выглядит вот так:
2018-03-06 13:47:46,050 [DEBUG] 
    Текущее время: 2018-03-06 13:47:44 1520318864
    Время сервера: 2018-03-06 13:47:09 1520318829
    Разница: 35.00000000 ТЕКУЩЕЕ ВРЕМЯ ВЫШЕ
    Бот будет работать, как будто сейчас: 2018-03-06 13:47:09 1520318829
То есть проблема не во времени.
26.04.2018 08:47
Не видел комментария, сорри. Блок-схема примерно как для бота полоникса, вот https://bablofil.ru/media/uploads/2017/06/06/pol.png
06.03.2018 08:32
По поводу ошибки тупанул, код 200 HTTP говорит о том что все ОК. =)
07.03.2018 09:13
Добрый день! Вопрос такой: можно ли настроить этого бота так, чтобы он просто открывал ордера? Т.е. по моему требованию. Нужно ручное управление счётом инвестора через API биржи для торговли внутри дня.
19.03.2018 15:28
Добрый день!
Можно, но проще под свою задачу несколько строчек написать
Смотрите примеры тут https://bablofil.ru/binance-api/ (как создавать ордера, как получать курсы и т.п.)
12.03.2018 14:59
Добрый день,
я дилетант и как обычно пробовал делать, как мне казалось, по Вашей инструкции здесь.
После установки Python, установил бот, но почему-то после корректировки binance_bot.ru и запуска setup.bat под IDLE (Python) никаких настроек не появляется и соответственно после запуска run.bat тоже ничего не происходит, кроме появле в IDLE слдеующего сообщения -
Python 3.6.4 (v3.6.4:d48ecebad5, Dec 18 2017, 21:07:28) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "copyright", "credits" or "license()" for more information.
>>> WARNING: The version of Tcl/Tk (8.5.9) in use may be unstable.
Visit http://www.python.org/download/mac/tcltk/ for current information.

Возможно-ли диагностировать проблему или необходимо устанавливать более рабоспособную (предыдущую) версию PYTHON?
Спасибо, если не устали отвечать на вопросы дилетантов.
Юрий
19.03.2018 15:30
Что то вы не так делаете.. Сложно сказать. И файл binance_bot.ru должен быть binance_bot.py, может дело в этом?
18.03.2018 11:36
Добрый день Андрей.

2018-03-18 14:30:49,624 [DEBUG] Starting new HTTPS connection (1): api.binance.com
2018-03-18 14:30:50,436 [DEBUG] https://api.binance.com:443 "GET /api/v3/account?timestamp=1521372649000&signature=7b32395eeb159920cd56a6d25aaa8a237368c3fd3d601b4044c3b09b13dec570 HTTP/1.1" 200 None
2018-03-18 14:30:50,436 [DEBUG] Баланс ['BTC:0.00000021', 'USDT:0.00693251']
2018-03-18 14:30:50,436 [DEBUG] Starting new HTTPS connection (1): api.binance.com
2018-03-18 14:30:51,245 [DEBUG] https://api.binance.com:443 "GET /api/v1/depth?symbol=BTCUSDT&limit=10 HTTP/1.1" 200 None

Одна ошибка недостаточно средств. А на что ещё ругается?
Спасибо.
19.03.2018 15:31
Добрый день.
Я не вижу ошибок, обычные отладочные сообщения, кажется, все в порядке
24.03.2018 15:31
2018-03-24 18:26:42,515 [DEBUG]
    Текущее время: 2018-03-24 18:26:41 1521905201
    Время сервера: 2018-03-24 18:26:40 1521905200
    Разница: 1.00000000 ТЕКУЩЕЕ ВРЕМЯ ВЫШЕ
    Бот будет работать, как будто сейчас: 2018-03-24 18:26:40 1521905200

2018-03-24 18:26:42,515 [DEBUG] Получаем все неисполненные ордера по БД
2018-03-24 18:26:42,515 [DEBUG] Получены неисполненные ордера из БД: ['6629766',
 '20925449']
2018-03-24 18:26:42,515 [DEBUG] Starting new HTTPS connection (1): api.binance.c
om
2018-03-24 18:26:43,484 [DEBUG] https://api.binance.com:443 "GET /api/v3/order?s
ignature=d0d5af1430718244aa5847cdf1c3730f4df845a9322949d9fed7ec787fdbfaf6&symbol
=WAVESBTC&timestamp=1521905200000&orderId=6629766 HTTP/1.1" 400 None
2018-03-24 18:26:43,500 [ERROR] {"code":-1022,"msg":"Signature for this request
is not valid."}
Traceback (most recent call last):
  File "./binance_bot.py", line 151, in <module>
    stock_order_data = bot.orderInfo(symbol=orders_info[order]['order_pair'], or
derId=order)
  File "C:\Python34\binance\binance_api.py", line 47, in wrapper
    return self.call_api(**kwargs)
  File "C:\Python34\binance\binance_api.py", line 75, in call_api
    raise Exception(response.text)
Exception: {"code":-1022,"msg":"Signature for this request is not valid."}

Подскажите, в чём проблема? Точнее их несколько. причем иногда бот запускается без ошибок и создает ордера. А иногда вот так. Баланса хватает, и открытых ордеров нет.</module>
27.03.2018 17:26
Загадочная история.. Может быть, несколько ботов одновременно торгуют, и отправляют одни и те же запросы время от времени?
30.03.2018 17:26
Нет. Бот однозначно один. При включении несколько минут (1-5) работает нормально, а потом начинается этот цикл. Также бывает, что после отмены или создания ордера такое начинается.
Скажите, как уменьшить частоту запросов бота к бирже? Может срабатывает защита самой биржи?
31.03.2018 14:04
Вы можете открыть файл binance_api.py, и перед строкой
response = requests.request(method=self.met.....
Добавить 
time.sleep(1.5) # Ждать полторы секунды
Не забудьте слева сделать такое же кол-во отступов
Защита биржи по другому проявлялась бы.
Тут недавно binance добавляли балансировку нагрузки, возможно вас перебрасывает с сервера на сервер. Я вносил некоторые изменения в код, попробуйте скачать по новой, мало ли
25.03.2018 14:58
Можно задать вопрос? При создании нового ордера из списка работаем сразу с pair_name и pair_obj
  for pair_name, pair_obj in all_pairs.items()
Совсем не понимаю для чего они оба, объясните пожалуйста.
27.03.2018 17:31
Первое - это просто строка, которая по сути является ключом словаря.
Второе - это непосредственно сам словарь.
Допустим, мы создадим словарь словарей такого вида
 o = {'q':{'qq':11}, 'w':{'ww':12}}
и запустим такой код:
for pair_name, pair_obj in o.items():
    print(pair_name, pair_obj)

На выходе получим
q {'qq': 11}
w {'ww': 12}
Такие вот разные вещи
28.03.2018 18:04
Доброго дня, Андрей в программировании полный НОЛЬ. Но стал немного читать ваш код... Возможно стал чуть чуть понимать работу программы...
Случилась беда с ботом, он стал материться в слух во весть экран вот таким вот циклом *:))) я не могу ничего понять что ему нужно?

KeyError: 'ADAETH'
2018-03-28 20:40:15,309 [DEBUG] Получаем все неисполненные ордера по БД
2018-03-28 20:40:15,309 [DEBUG] Получены неисполненные ордера из БД: ['14053312']
2018-03-28 20:40:15,309 [DEBUG] Starting new HTTPS connection (1): api.binance.com
2018-03-28 20:40:15,709 [DEBUG] https://api.binance.com:443 "GET /api/v3/order?symbol=ADAETH&orderId=14053312&timestamp=1522258815000&signature=7e2be5faf86087feadeb1bdc709314838a3ec20b58bbc4978f93f51dced6d12b HTTP/1.1" 200 None
2018-03-28 20:40:15,709 [DEBUG] Получаем из настроек все пары, по которым нет неисполненных ордеров
2018-03-28 20:40:15,709 [ERROR] 'ADAETH'
Traceback (most recent call last):
  File "./binance_bot.py", line 350, in <module>
    del all_pairs[row[0]]
KeyError: 'ADAETH'
2018-03-28 20:40:15,709 [DEBUG] Получаем все неисполненные ордера по БД
2018-03-28 20:40:15,725 [DEBUG] Получены неисполненные ордера из БД: ['14053312']
2018-03-28 20:40:15,725 [DEBUG] Starting new HTTPS connection (1): api.binance.com
2018-03-28 20:40:16,115 [DEBUG] https://api.binance.com:443 "GET /api/v3/order?symbol=ADAETH&orderId=14053312&timestamp=1522258815000&signature=7e2be5faf86087feadeb1bdc709314838a3ec20b58bbc4978f93f51dced6d12b HTTP/1.1" 200 None
2018-03-28 20:40:16,115 [DEBUG] Получаем из настроек все пары, по которым нет неисполненных ордеров
2018-03-28 20:40:16,115 [ERROR] 'ADAETH'
Traceback (most recent call last):
  File "./binance_bot.py", line 350, in <module>
    del all_pairs[row[0]]
KeyError: 'ADAETH'
2018-03-28 20:40:16,115 [DEBUG] Получаем все неисполненные ордера по БД
2018-03-28 20:40:16,115 [DEBUG] Получены неисполненные ордера из БД: ['14053312']
2018-03-28 20:40:16,115 [DEBUG] Starting new HTTPS connection (1): api.binance.com
2018-03-28 20:40:17,045 [DEBUG] https://api.binance.com:443 "GET /api/v3/order?symbol=ADAETH&orderId=14053312&timestamp=1522258816000&signature=cd6982ba4cd20691977a6e7652fef0a682a16e4183e2c585ae6a3d12613e56a6 HTTP/1.1" 200 None
2018-03-28 20:40:17,045 [DEBUG] Получаем из настроек все пары, по которым нет неисполненных ордеров
2018-03-28 20:40:17,045 [ERROR] 'ADAETH'
Traceback (most recent call last):
  File "./binance_bot.py", line 350, in <module>
    del all_pairs[row[0]]

Бот стал ругаться я стал проверять... В личном кабинете на БИНАНС нет неисполненых ордеров 'ADAETH' и не было в истории торгов.

Пары в файле стоят вот такие:

pairs = [
{
        'base': 'BTC',
        'quote': 'ONT',
        'offers_amount': 5, # Сколько предложений из стакана берем для расчета средней цены
                            # Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
        'spend_sum': 0.001,  # Сколько тратить base каждый раз при покупке quote
        'profit_markup': 0.01, # Какой навар нужен с каждой сделки? (0.001 = 0.1%)

    }, {
        'base': 'ETH',
        'quote': 'ONT',
        'offers_amount': 5, # Сколько предложений из стакана берем для расчета средней цены
                            # Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
        'spend_sum': 0.001,  # Сколько тратить base каждый раз при покупке quote
        'profit_markup': 0.01, # Какой навар нужен с каждой сделки? (0.001 = 0.1%)
		
    }, {
        'base': 'BNB',
        'quote': 'ONT',
        'offers_amount': 5, # Сколько предложений из стакана берем для расчета средней цены
                            # Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
        'spend_sum': 0.1,  # Сколько тратить base каждый раз при покупке quote
        'profit_markup': 0.01, # Какой навар нужен с каждой сделки? (0.001 = 0.1%)
		
	}, {
        'base': 'USDT',
        'quote': 'BTC',
        'offers_amount': 5, # Сколько предложений из стакана берем для расчета средней цены
                            # Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
        'spend_sum': 10,  # Сколько тратить base каждый раз при покупке quote
        'profit_markup': 0.01, # Какой навар нужен с каждой сделки? (0.001 = 0.1%)
		}

    ]

Блок 348-351 строк вот такой вот:

# Получаем из базы все ордера, по которым есть торги, и исключаем их из списка, по которому будем создавать новые ордера
        for row in cursor.execute(orders_q):
            del all_pairs[row[0]]

И вот сижу я и мозг ломаю, то ли лыжи не едут, то ли асфальт слишком шершавый... =*:)))
Помогите начинающему лузеру пожалуйста...
P.S. https://www.youtube.com/watch?v=rt4ebMu6_aM </module></module></module>
29.03.2018 07:05
Значит было. У вас в базе данных есть запись. Как вариант удалите файл binance.db из папки с ботом, тогда он с чистого листа начнет
29.03.2018 12:52
спасибо, вчера дорулил - так и сделал и всё взлетело... теперь пробую настраивать....
25.04.2018 19:51
интересно, какие настройки под какие временные значения?
26.04.2018 10:20
Вы о чем?
29.04.2018 15:12
У вас в настройках есть такое( Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000) например берём значение 10 и на каком временном графике можно любоваться на свечи, мысленно подталкивая их в верх) или не имеет значения? просто так сказать визуализация работы в картине)
11.05.2018 17:43
Аа, ну это вопрос стратегии.. На 5 сделках курс может падать а на 1000 расти и наоборот, наверное стоит прикинуть сколько сделок в среднем совершается за нужный период на нужной паре
01.05.2018 19:50
Здравствуйте!
Вопрос от новичка: запускаю бот под Ubuntu, работает, ордеров не создает, и постоянно такое сообщение об ошибке:

2018-05-01 19:42:59,298 [DEBUG] "GET /api/v3/account?signature=2eed0ecccd40a0e6c51b57bb5211557cf812c459bd8e0d2fe88f367a3bd67a17&timestamp=1525203778000 HTTP/1.1" 400 None
2018-05-01 19:42:59,301 [ERROR] {"code":-1022,"msg":"Signature for this request is not valid."}


Пробовал сделать как советовали выше:
"Вы можете открыть файл binance_api.py, и перед строкой
response = requests.request(method=self.met.....
Добавить 
time.sleep(1.5) # Ждать полторы секунды
Не забудьте слева сделать такое же кол-во отступов"

-- Не помогает.
Заранее благодарю за помощь.
12.05.2018 15:34
Почему то именно на убунте такая история, я, к сожалению, пока не знаю в чем дело, причем иногда работает а иногда нет, бывает, что первый запрос отработал а второй уже нет.
07.05.2018 22:19
Здравствуйте Андрей! К сожалению у меня тоже не работает. Если можете помогите пожалуйста разобраться.
Текущее время: 2018-05-08 01:09:51 1525730991
    Время сервера: 2018-05-08 01:10:08 1525731008
    Разница: 17.00000000 
    Бот будет работать, как будто сейчас: 2018-05-08 01:10:08 1525731008

2018-05-08 01:10:08,267 [DEBUG] Получаем все неисполненные ордера по БД
2018-05-08 01:10:08,267 [DEBUG] Неисполненных ордеров в БД нет
2018-05-08 01:10:08,267 [DEBUG] Получаем из настроек все пары, по которым нет неисполненных ордеров
2018-05-08 01:10:08,267 [DEBUG] Найдены пары, по которым нет неисполненных ордеров: ['BTCUSDT']
2018-05-08 01:10:08,267 [DEBUG] Работаем с парой BTCUSDT
2018-05-08 01:10:09,773 [INFO ] Starting new HTTPS connection (1): api.binance.com
2018-05-08 01:10:15,336 [DEBUG] "GET /api/v3/account?timestamp=1525734608268&signature=6c840f1f8eb8272bea146f55b1af986c338f06fb6f5319c9010919e03b9a3937 HTTP/1.1" 400 None
2018-05-08 01:10:15,338 [ERROR] {"code":-1021,"msg":"Timestamp for this request was 1000ms ahead of the server's time."}

Перечитал выше и тоже менял по Вашему совету:

Вы можете открыть файл binance_api.py, и перед строкой
response = requests.request(method=self.met.....
Добавить 
time.sleep(1.5) # Ждать полторы секунды
Не забудьте слева сделать такое же кол-во отступов"

Добиться этого можно либо изменяя часовой пояс, либо в файле binance_api поменять строку
payload.update({'timestamp': int(time.time() * 1000)})
на
payload.update({'timestamp': int((time.time()-1*60*60) * 1000)})
где -1 - это кол-во часов разницы, нужно поменять на -2, +2 и т.п. по ситуации.

Ничего не получается. Заранее спасибо.
09.05.2018 12:27
Проблема с зависанием на верхах прямо критическая. Есть ли варианты со стоплоссом.
Пример: после покупки бот создает не лимит-ордер, а стоп-лосс ордер (например 5,10,15,%), но в памяти сохраняет желаемую цену продажи (например 3,5,10%) и когда цена доходит до отметки продажи -+ 0.5-1%, меняет стоплос на лимит ордер. вот как то так. либо просто меняет стоплос на цену продажи. потому что на верхах можно не хило залететь если не сидеть у монитора, даже если цена растет.
09.05.2018 12:35
P.S да и еще желательно сделать промежуток по времени между покупками хотя бы минуту или 30сек иначе получается, купил по 100 продал +3% = 103, тут же покупает по стакану процент прибыли \ 2 тоесть по 101.5 и ждет следующие 101.5+3% и получается в случае если это последняя макс цена или резкий обвал то минус может быть очень большой в особо волатильных парах.
09.05.2018 21:31
я наверное целый лист еще написал текста чтобы помочь и интернет вылетел. 2 раз не буду. суть в том что надо чтобы бот выставлял стоплос на продажу а цену продажи держал в голове и выставлял ее за 1-2 тика до края стакана. и сравнивал (или задать как параметр ) начало работы с первым ордером, чтобы работать в 2-4% флэте на высоко-волотильных парах.
12.05.2018 15:41
А еще можно выставлять стоп-лосс на -2%, например, но при каждом движении цены вверх скажем на 0.2% отменять и ставить stop_loss скажем на -0.3% от текущей, получится трейлинг-стоп)
10.05.2018 01:10
здравствуйте. Скажите пожалуйста как поправить код, чтобы бот покупал по текущей цене на торгах или текущая цена+0,02%.
Такая проблема что бот всё время ставит цену чуть меньше чем торги и не может ничего купить - только в убыток.
Время вроде проверял.
спасибо
12.05.2018 15:46
Самое простое, это сделать покупку по рынку...
Найдите в коде
new_order = bot.createOrder(
                            symbol=pair_name,
                            recvWindow=5000,
                            side='BUY',
                            type='LIMIT',
                            timeInForce='GTC',  # Good Till Cancel
                            quantity="{quantity:0.{precision}f}".format(
                                quantity=my_amount, precision=CURR_LIMITS['baseAssetPrecision']
                            ),
                            price="{price:0.{precision}f}".format(
                                price=my_need_price, precision=CURR_LIMITS['baseAssetPrecision']
                            ),
                            newOrderRespType='FULL'
                        )

и замените на

new_order = bot.createOrder(
                            symbol=pair_name,
                            recvWindow=5000,
                            side='BUY',
                            type='MARKET',
                            quantity="{quantity:0.{precision}f}".format(
                                quantity=my_amount, precision=CURR_LIMITS['baseAssetPrecision']
                            )
                        )
05.06.2019 22:44
После замены создаёт ордер на продажу по той же цене что и был куплен.
16.06.2019 15:19
Да, тут придется потом узнавать цену, по которой прошла сделка (или средневзвешенную, если сделок несколько), и записывать в базу вместо my_need_price
12.05.2018 22:15
добрый день!
Скажите, а как запустить файлы bat если компьютер на macOS?
13.05.2018 04:54
Вам нужно будет в терминале перейти к папке с ботом, потом выполнить
python3.5 ./binance_bot.py

Вместо python3.5 у вас может быть какой-то другой питон, замените

Также установите модуль requests
pip3 install requests
или
pip install requests
13.05.2018 20:07
Спасибо за ответ.
а после запустить через python Run python Shell ?
14.05.2018 06:56
бегает много красных строк, но часто повторяется вот такие. что то не так...

Traceback (most recent call last):
  File "/Users/mityavol/Desktop/binance/binance_bot.py", line 364, in <module>
    raise Exception("Не удалось найти настройки выбранной пары " + pair_name)
Exception: Не удалось найти настройки выбранной пары USDTLTC

пардон за делитантизм </module>
13.05.2018 21:08
вроде уже разобрался...
а на виртуальную машину реально его поставить?
15.05.2018 10:10
Это значит что он не может получить информацию с https://api.binance.com/api/v1/exchangeInfo
Проверьте связь, посмотрите что писало в логе (в папке logs)
15.05.2018 07:41
Да, вполне, для него никакой разницы нет где запускаться
15.05.2018 13:33
я кажется перепутал местами base и quote )) поменял местами и все заработало.
15.05.2018 09:44
1) полдня и примерно 250 тыс бегущих строк хватает, чтобы «программа неожиданно завершила свою работу» :) На digitalocean такое тоже происходит, не знаете? 

2) По вашему опыту сколько времени требуется чтобы бот показал результат? А то уже третий день идет, а пока наторговал немного в минус. может у меня что то не так с параметрами в парах?

'base': 'BTC',
        'quote': 'IOTA',
        'offers_amount': 10, # Сколько предложений из стакана берем для расчета средней цены
                            # Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
        'spend_sum': 0.005,  # Сколько тратить base каждый раз при покупке quote
        'profit_markup': 0.005, # Какой навар нужен с каждой сделки? (0.001 = 0.1%)

    },{
        'base': 'BTC',
        'quote': 'XLM',
        'offers_amount': 10, # Сколько предложений из стакана берем для расчета средней цены
                            # Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
        'spend_sum': 0.003,  # Сколько тратить base каждый раз при покупке quote
        'profit_markup': 0.005, # Какой навар нужен с каждой сделки? (0.001 = 0.1%)

    },{
        'base': 'BTC',
        'quote': 'LTC',
        'offers_amount': 20, # Сколько предложений из стакана берем для расчета средней цены
                            # Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
        'spend_sum': 0.002,  # Сколько тратить base каждый раз при покупке quote
        'profit_markup': 0.005, # Какой навар нужен с каждой сделки? (0.001 = 0.1%)

    },{
        'base': 'BTC',
        'quote': 'TRIG',
        'offers_amount': 20, # Сколько предложений из стакана берем для расчета средней цены
                            # Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
        'spend_sum': 0.002,  # Сколько тратить base каждый раз при покупке quote
        'profit_markup': 0.005, # Какой навар нужен с каждой сделки? (0.001 = 0.1%)

    },{
        'base': 'BTC',
        'quote': 'SNT',
        'offers_amount': 10, # Сколько предложений из стакана берем для расчета средней цены
                            # Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
        'spend_sum': 0.002,  # Сколько тратить base каждый раз при покупке quote
        'profit_markup': 0.005, # Какой навар нужен с каждой сделки? (0.001 = 0.1%)

    },{
        'base': 'BTC',
        'quote': 'OMG',
        'offers_amount': 20, # Сколько предложений из стакана берем для расчета средней цены
                            # Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
        'spend_sum': 0.002,  # Сколько тратить base каждый раз при покупке quote
        'profit_markup': 0.005, # Какой навар нужен с каждой сделки? (0.001 = 0.1%)

    }
15.05.2018 11:28
Такое ощущение, что у вас что-то кончается, может быть место на жестком, а может быть оперативка, но такого я не замечал. А в код изменения не вносили?
В минус бот торговать в принципе не должен, он выставляет на продажу исходя из цены и кол-ва купленного и навара, даже если текущий курс ниже, он должен выставить по рассчитанному. Вам нужно ориентироваться именно на кол-во монет, а не на примерную стоимость всего портфеля, которую считает binance на странице балансов. А общая результативность зависит от подбора пар, параметров и т.п. С параметрами вроде бы все хорошо.
15.05.2018 13:36
в коде ничего кроме пар ничего не изменял точно.

может навар с количеством base не сосчитается? комиссию ведь бот учитывает, чтобы профит получился?
15.05.2018 19:09
Печально что нельзя удалять комментарии - столько чуши написал,нормально не прочитав, что вы пишете.

Есть какие то кричные изменения в настройках пар, что с параметрами было «все плохо»? Эдакий метод от противного
13.05.2018 12:05
Добрьій день. при запуске бота вот такое происходит:

2018-05-13 14:42:12,600 [DEBUG] Получаем все неисполненные ордера по БД
2018-05-13 14:42:12,600 [ERROR] string indices must be integers
Traceback (most recent call last):
  File "./binance_bot.py", line 143, in <module>
    all_pairs = {pair['quote'].upper() + pair['base'].upper():pair for pair in pairs}
  File "./binance_bot.py", line 143, in <dictcomp>
    all_pairs = {pair['quote'].upper() + pair['base'].upper():pair for pair in pairs}
TypeError: string indices must be integers

Такое повторяется бесконечное множество раз (пока бот запущен).  Запускаю на паре BNB/ETH, на бирже висит ордер на продажу BNB, которьій бьіл вьіставлен руками. Спасибо.</dictcomp></module>
13.05.2018 12:17
Вопрос снят, набокопорил в настройках пар закомментировав кусочек кода.
14.05.2018 14:16
здравствуйте) уважаемый а можете сделать чтобы строчки не бежали а то пытаешься разобраться и не успеваешь прочитать аж глаза начинают болеть)
15.05.2018 10:08
Он пишет не только на экран, но еще и в лог, в папку logs с ботом.
Так что в любой момент можно открыть текстовый файл и обстоятельно всё просмотреть)
14.05.2018 17:25
ещё такой момент) не может выставить ордер на продажу даже на той паре которая перед этим всё срабатывало((( или что то я не то делаю или не понимаю)
15.05.2018 10:08
Посмотрите файл лога, там должно быть всё написано
21.05.2018 11:46
заполнил в файлике ключи оба , без пробелов, но получаю  {"code":-2014,"msg":"API-key format invalid."}  ключи верные, другой бот по ним работает(отключен).
21.05.2018 21:39
2018-05-22 00:37:31,731 [DEBUG] Работаем с парой ETHXLM
2018-05-22 00:37:31,732 [ERROR] Не удалось найти настройки выбранной пары ETHXLM
Traceback (most recent call last):
  File "./binance_bot.py", line 406, in <module>
    raise Exception("Не удалось найти настройки выбранной пары " + pair_name)
Exception: Не удалось найти настройки выбранной пары ETHXLM


Что бы это могло значить, не подскажете? За 5 минут до этого работало с этой парой, на сколько я помню ничего не менял.
И есть ли ограничения на одновременную работу пары например ETH\XLM и XLM\ETH?</module>
22.05.2018 07:59
Вопрос снят, продажа автоматически происходит на соответсвующую пару, незачем ставить обратную сделку, протупил немного :)
22.05.2018 08:09
а можно добавить докуп на спаде и усреднение цены?
23.05.2018 06:06
Можно
Но я стараюсь выкладывать не слишком перегруженных ботов, что бы любой мог разобраться и прикрутить что ему угодно
22.05.2018 15:02
постоянно стал ловить ошибку 
Traceback (most recent call last):
  File "./binance_bot.py", line 12, in <module>
    from binance_api import Binance
  File "C:\cwb\binance-trader\hz\binance_api.py", line 5, in <module>
    import requests
ModuleNotFoundError: No module named 'requests'</module></module>
23.05.2018 06:05
Нужно в командной строке выполнить 
pip install requests
22.05.2018 16:29
Привет! есть ли возможность юзать несколько этих ботов на одном аккаунте, что бы ордера не пересекались одни и те же? Спасибо!
23.05.2018 06:08
Да, бот запоминает свои ордера в локальной БД
Если запускать двух ботов (каждого в своей папке) то можно играть на одну и ту же пару, один бот другому мешать не будет
28.05.2018 20:35
Добрый день!
Получилось ли как-то локализовать проблему с этим:
Signature for this request is not valid
01.06.2018 07:57
Кстати говоря, да, я обновил код тут и в статье про апи https://bablofil.ru/binance-api/
29.05.2018 16:52
Добрый день!
Как можно сделать, чтобы бот торговал определенное количество раз. Т.е. не торговал по кругу, а, например, только N-количество раз?
01.06.2018 08:30
По каждой паре?
Можно например, добавить в параметры после 

'profit_markup': 0.005, # Какой навар нужен с каждой сделки? (0.001 = 0.1%)

параметр 

'max_sell_orders': 20 # Сколько ордеров допускается создавать

Потом, после 
log.debug("Ордер {order} на продажу исполнен".format(
                        order=order
                    ))
                    # Обновляем информацию в БД
                    cursor.execute(
                        """
                          UPDATE orders
                          SET
                            sell_finished = datetime()
                          WHERE
                            sell_order_id = :sell_order_id

                        """, {
                            'sell_order_id': order
                        }
                    )
                    conn.commit()

добавить вычитание исполненного ордера из максимального кол-ва:

                    for i, d in enumerate(pairs):
                        if d['quote'].upper() + d['base'] == orders_info[order]['order_pair']:
                           pairs[i]['max_sell_orders'] = pairs[i]['max_sell_orders'] - 1

После чего добавить перед строкой 
# Если остались пары, по которым нет текущих торгов вот такую строку

all_pairs = {pair['quote'].upper() + pair['base'].upper():pair for pair in pairs if pair['max_sell_orders'] > 0}

На этом всё
Вот так будет выглядеть: https://pastebin.com/v0D9V3nP
04.06.2018 18:42
С учетом добавки со стоплоссом, добавляем сюда:


# Если это ордер на продажу, и он исполнен
                if order_status == 'FILLED' and orders_info[order]['order_type'] == 'sell':
                    log.debug("Ордер {order} на продажу исполнен".format(
                        order=order
                    ))
                    # Обновляем информацию в БД
                    cursor.execute(
                        """
                          UPDATE orders
                          SET
                            sell_finished = datetime()
                          WHERE
                            sell_order_id = :sell_order_id

                        """, {
                            'sell_order_id': order
                        }
                    )
                    conn.commit()

                # ---------------------------------------------------------------------------------------------
                for i, d in enumerate(pairs):
                    if d['quote'].upper() + d['base'] == orders_info[order]['order_pair']:
                        pairs[i]['max_sell_orders'] = pairs[i]['max_sell_orders'] - 1
                # ---------------------------------------------------------------------------------------------

                if order_status == 'NEW' and orders_info[order]['order_type'] == 'sell':
                  curr_rate = float(bot.tickerPrice(symbol=orders_info[order]['order_pair'])['price'])
                  
                  if (1 - curr_rate/orders_info[order]['buy_price'])*100 >= all_pairs[orders_info[order]['order_pair']]['stop_loss']:
                     log.debug("{pair} Цена упала до стоплосс (покупали по {b:0.8f}, сейчас {s:0.8f}), пора продавать".format(
                        pair=orders_info[order]['order_pair'],
                        b=orders_info[order]['buy_price'],
                        s=curr_rate
                     ))
                     # Отменяем ордер на бирже
                     cancel = bot.cancelOrder(
                       symbol=orders_info[order]['order_pair'],
                          orderId=order
                      )
                     # Если удалось отменить ордер, скидываем информацию в БД
                     if 'orderId' in cancel:

******************************************************************************************************************
или ниже обработки стоплосса:

                 if not new_order.get('code'):
                     log.info("Создан ордер на продажу по рынку " + str(new_order))
                     cursor.execute(
                        """
                          DELETE FROM orders
                          WHERE
                            sell_order_id = :sell_order_id
                        """, {
                            'sell_order_id': order
                        }
                     )
                     conn.commit()
**********************************************************************************
-->>>> сюда
**********************************************************************************
        else:
            log.debug("Неисполненных ордеров в БД нет")

        log.debug('Получаем из настроек все пары, по которым нет неисполненных ордеров')

        orders_q = """
            SELECT
              distinct(order_pair) pair
            FROM
              orders
            WHERE
06.11.2018 03:07
Тестанул код что под ссылкой. Бот начинает создавать большое количество ордеров по одной и той же паре. Не пойму в чем косяк...
01.06.2018 08:59
Все-таки вопрос со стоплосом остается открытым. Это прямо охилесова пята, если стоплосс появится то бот имеет смысл ...в остальных случаях он просто загонит в минус. поторговал недельку малыми суммами. бот просто загнал меня на пик свечи. пока это не бот а быстрый калькулятор (не в обиду) . ну или я просто не умею его готовить.
01.06.2018 13:20
Да не вопрос, залил новый код, теперь в конфиге есть параметр stop_loss и некоторая логика (sell отменяется и продается по рынку если цена упала на указанный % от изначальной цены buy)
Скачайте код бота по новой
09.06.2018 07:17
2018-06-09 09:42:58,989 [DEBUG] 
    Текущее время: 2018-06-09 09:42:57 1528526577
    Время сервера: 2018-06-09 09:42:58 1528526578
    Разница: 1.00000000 
    Бот будет работать, как будто сейчас: 2018-06-09 09:42:58 1528526578

2018-06-09 09:42:59,098 [DEBUG] Получаем все неисполненные ордера по БД
2018-06-09 09:42:59,098 [DEBUG] Неисполненных ордеров в БД нет
2018-06-09 09:42:59,098 [DEBUG] Получаем из настроек все пары, по которым нет неисполненных ордеров
2018-06-09 09:42:59,098 [DEBUG] Найдены пары, по которым нет неисполненных ордеров: ['BNBUSDT', '']
2018-06-09 09:42:59,114 [DEBUG] Работаем с парой BNBUSDT
2018-06-09 09:42:59,114 [DEBUG] Starting new HTTPS connection (1): api.binance.com
2018-06-09 09:43:00,458 [DEBUG] https://api.binance.com:443 "GET /api/v3/account?timestamp=1528526579000&signature=6d25310011746a732afffb64f2da7ead0681e27fbf9cf8c3351632a68a6e7a15 HTTP/1.1" 200 None
2018-06-09 09:43:00,474 [DEBUG] Баланс ['BNB:0.45498155', 'USDT:12.81706040']
2018-06-09 09:43:00,474 [DEBUG] Starting new HTTPS connection (1): api.binance.com
2018-06-09 09:43:01,802 [DEBUG] https://api.binance.com:443 "GET /api/v1/depth?symbol=BNBUSDT&limit=15 HTTP/1.1" 400 None
2018-06-09 09:43:01,802 [ERROR] 'bids'
Traceback (most recent call last):
  File "./binance_bot.py", line 441, in <module>
    prices = [float(bid[0]) for bid in offers['bids']]
KeyError: 'bids'
2018-06-09 09:43:01,896 [DEBUG] Получаем все неисполненные ордера по БД
2018-06-09 09:43:01,896 [DEBUG] Неисполненных ордеров в БД нет
2018-06-09 09:43:01,911 [DEBUG] Получаем из настроек все пары, по которым нет неисполненных ордеров
2018-06-09 09:43:01,911 [DEBUG] Найдены пары, по которым нет неисполненных ордеров: ['BNBUSDT', '']
2018-06-09 09:43:01,911 [DEBUG] Работаем с парой BNBUSDT
2018-06-09 09:43:01,911 [DEBUG] Starting new HTTPS connection (1): api.binance.com
2018-06-09 09:43:03,913 [DEBUG] https://api.binance.com:443 "GET /api/v3/account?timestamp=1528526581000&signature=8f889024ba52f7b1eff0e68dc79d1ba5fe0d60ee65680c768aa559a27ea90860 HTTP/1.1" 200 None
2018-06-09 09:43:03,913 [DEBUG] Баланс ['BNB:0.45498155', 'USDT:12.81706040']
2018-06-09 09:43:03,913 [DEBUG] Starting new HTTPS connection (1): api.binance.com</module>
09.06.2018 07:18
Что делать? Переустановка не помогает.
12.06.2018 03:03
Стоп лосс это спорный вопрос как можно изменить код чтобы вместо стопа выставлялось несколько ордеров на покупку по методу лесенка
10.06.2018 11:01
У вас стоит лимит 15, а допустимые значения - 5, 10, 20 и тп
https://api.binance.com/api/v1/depth?symbol=BNBUSDT&limit=15
13.06.2018 07:06
Добавил в коде флаг, использовать ли стоп-лосс, по умолчанию нет
Насчет лесенки тоже спорный момент, т.к. много средств простаивает без движения. Для этого много кода нужно переделывать, например нужны настройки - сколько ордеров на покупку, с каким шагом. Нужно при создании ордера на покупку сразу создавать несколько ордеров. При исполнении ордера на покупку и выставления на продажу нужно выставлять еще более дешевый ордер на покупку. При исполнении ордера на продажу нужно отменять все ордера на покупку. При срабатывании ордера на покупку если он второй и дальше по хорошему нужно отменять существующие ордера на продажу и выставлять всё уже купленное по средневзвешенной, что бы ордер на продажу опускался вслед за рынком и т.п.
Но код открытый, вы можете с ним делать что угодно, в том числе и вышеописанное )

Вы можете начать с чего-то простого, например, вот пример изменения, где создаются 5 ордеров на покупку с ниспадающей ценой, каждый раз когда срабатывает бай, создается селл

https://pastebin.com/Rzk5Da0z
13.06.2018 23:50
Спасибо будем разбираться
04.06.2018 09:49
Уважаемые. Подскажите пожалуйста стратегию нового бота со стоп лосами)
04.06.2018 10:39
И ещё, было бы прекрасно, что бы можно можно было выставлять ставку, когда боту начать и перестать торговлю) ти по глянул на индикатор, ага тут лучше купить а там лучше продать и закончить до лучшего входа
14.06.2018 10:04
День добрый.
Нашел статью 
https://golos.io/ru--kriptovalyuty/@primus/avtomatizirovannaya-torgovlya-altkoinami-na-birzhakh-kriptovalyut-chast-3-primer-prostogo-torgovogo-algoritma
в которой описывается аналогичный метод торговли. В ней приведен способ анализа торгуемых пар для повышения эффективности торговли. Набросал код, позволяющий сортировать пары по этому параметру. Создается файл PairParams, в нем на листе Sorted упорядочены по убыванию пары по столбцу RANK. Берем самые верхние пары для работы.
Вот код, не судите строго, это мои первые шаги в Питоне:
import xlwt # Import `xlwt`         pip install xlwt
book = xlwt.Workbook()  # create xls file
book = xlwt.Workbook(encoding="utf-8")# Initialize a workbook
sheet1 = book.add_sheet("Full_List")  # Add a sheet to the workbook  
sheet2 = book.add_sheet("Sorted")  # Add a sheet to the workbook

from binance_api import Binance 
bot = Binance(
    API_KEY='e...bs',
    API_SECRET='n...G'
    )
SYM='BNBBTC'
INFO = 'ddd'
# INFO = bot.exchangeInfo()                 # Настройки и лимиты биржи - /api/v1/exchangeInfo
# INFO - bot.depth(symbol=SYM,limit=5)      # Открытые ордера (книгa ордеров), limit - кол-во возвращаемых записей от 5 до 1000 
# INFO = bot.trades(symbol=SYM,limit=1)     # Последние (чужие) сделки - /api/v1/trades
# INFO = bot.klines(symbol=SYM, interval='5m', limit=1) # Данные по свечам, limit – кол-во свечей (максимум 500, по умолчанию 500)
# INFO = bot.aggTrades(symbol=SYM, limit=1) # Сжатая история сделок - /api/v1/aggTrades     
# INFO = bot.tickerPrice(symbol=SYM)        # Последняя цена по паре (или парам) 
# INFO = bot.tickerBookTicker(symbol=SYM)   # Лучшие цены покупки/продажи - /api/v3/ticker/bookTicker
INFO = bot.ticker24hr()         # Статистика за 24 часа -  /api/v1/ticker/24hr   Если symbol не указан, возвращаются данные по всем парам

Dict=dict()
for i in range(len(INFO)): # разбиваем список словарей на словари
    Dict[i]=INFO[i]        # создаем новый массив словарей
    INFO[i].update({'SPRED':00})    # добавляем новые
    INFO[i].update({'SPRED/BID':00})# значения к 
    INFO[i].update({'RANK':00})     # нашему словарю

row=0 # столбцы
col=0 # строки
for key in Dict[0]: # перебираем все ключи самого первого словаря (любого) 
    sheet1.write(col,row, key)   # для формирования из них строки с названием столбцов
    row+=1

for col in Dict: # в каждую строку будем записывать содержимое словаря из массива словарей Dict
    row=0 # обнуляем столбец
    for key in Dict[col]: # перебор значений всех ключей в выбранном словаре 
        sheet1.write(col+1,row, Dict[col][key])# построчная запись в xls файл всех значений словаря
        row+=1

for key in INFO:  # расчет оценочных параметров для каждой пары
    key['SPRED'] =   (float(key['askPrice'])-float(key['bidPrice']))
    key['SPRED/BID']=(float(key['askPrice'])-float(key['bidPrice'])) / float(key['bidPrice'])
    key['RANK'] =    (float(key['askPrice'])-float(key['bidPrice'])) / float(key['bidPrice']) * float(key['volume'])
   
Sorted_List=sorted(INFO, key= lambda d: d['RANK'], reverse=True)   # сортировка списка словарей по убыванию 'RANK'
NewRows=['symbol', 'priceChangePercent', 'highPrice', 'lowPrice', 'weightedAvgPrice', 'bidPrice', 'askPrice', 'volume', 'SPRED','SPRED/BID', 'RANK']  # перечень нужных столбцов 

for i in range(len(NewRows)):
    key=NewRows[i] # название столбца
    row=i # столбцы
    col=0 # строки
    sheet2.write(col,row, key) # пишем название столбца
    for j in Sorted_List:
        col+=1
        sheet2.write(col,row, j[key]) # заполняем все строки столбца

book.save("PairsParams.xls")# Save the workbook
14.06.2018 11:57
Уважаемый Sergey H... а можно по подробнее и ещё бы готовый файл а то я в этом деле не силён) и ещё бы видео если файл очень сложен в настройке и запуске)
14.06.2018 13:55
весь текст программы я привел, осталось вставить свои АПИ ключи, вставить в файл.ру и все будет работать.
14.06.2018 17:25
не большое уточнение) вы пишете о боте который с этого сайта в который можно вставить ваше дополнение? Ваш фаил нужно вставить или полностью заменить на ваш фаил. нашёл только эти фаилы (binance_api,   binance_bot,   run,  setup,  logs) просто пробовал всяко разно и вставлял и заменял и бубен хотел покупать) может всё скинете на яндекс диск что бы можно было скопировать?
15.06.2018 05:03
ок, вот ссылка на файлhttps://yadi.sk/d/Tbi0qTqQ3XuWwU
кидаем его рядом с binance_api,  запускаем, получаем в той же папке экселевский файл. На вкладке Sorted будет список всех пар, упорядоченный по параметру, описанному в статье 
https://golos.io/ru--kriptovalyuty/@primus/avtomatizirovannaya-torgovlya-altkoinami-na-birzhakh-kriptovalyut-chast-3-primer-prostogo-torgovogo-algoritma
15.06.2018 10:17
так и не могу запустить((( моргнёт и закроется и не какого экселя((( вот если бы вы полностью папку с работающим у вас ботом со всеми файлами заархивировали и на яндекс диск)
16.06.2018 06:25
Отличная программа! Один вопрос. В программировании я новичок. Что надо добавить в код, чтобы увидеть строки информации номера ордера и торгуемой пары вместе? Напр. : было - Ордер 1141572 всё ещё не исполнен, а хотелось Ордер 1141572 XLMUSD всё ещё не исполнен ???
18.06.2018 07:49
Добрый день.
В данном случае, нужно заменить

log.info("""
                            Ордер {order} выполнен, получено {exec_qty:0.8f}.
                            Создаем ордер на продажу
                        """.format(
                            order=order, exec_qty=float(stock_order_data['executedQty'])
                        ))
на 
log.info("""
                            Ордер {order} {pair} выполнен, получено {exec_qty:0.8f}.
                            Создаем ордер на продажу
                        """.format(
                            order=order, exec_qty=float(stock_order_data['executedQty']), pair=orders_info[order]['order_pair']
                        ))
Ну и в других местах по аналогии
19.06.2018 14:58
Всем здравия! Андрей К.. вы могли бы скинут папку с файлами и дополнениями от Sergey H.. а то просто бот у меня работает без проблем а с дополнениями не запускается( или что то я не так делаю(((
10.07.2018 03:17
Добрый день! Запустил бота. Все работало нормально. 
Но!  потом увидел сообщение от сервера  {"code":-2010,"msg":"Account has insufficient balance for requested action."}
Торгую BTC/USDT. Для начала решил 300USDT использовать для покупки-продажи BTC. Ордер на покупку отработал отлично, но ордер на продажу дает выше указанную ошибку. В чем проблема? 
Спасибо!
11.07.2018 12:38
Добрый день!
У вас на балансе меньше монет, чем вы купили.
Либо вы используете комиссию НЕ bnb - но в боте этого не указали, при покупке списалась комиссия с купленных монет, а бот думает, что комиссия списалась в BNB.
Либо какой-то другой бот или человек потратил монеты.
Посмотрите историю торгов на самой бирже, сравните сколько было куплено и сколько числится на балансе, может быть увидите сколько не хватает и куда они делись.
Если решите начать всё с нуля, удалите файл binance.db из папки с ботом, тогда он забудет о созданных ордерах и начнет опять с покупки
21.07.2018 13:33
Добрый день, Андрей!
Вы не разбирались с работой ордеров типа STOP_LOSS_LIMIT?
В моем понимании такой ордер на примере SELL должен работать так: продает по цене orderPrice с прибылью, если же цена пошла в противоположном направлении, то продает по цене stopPrice с убытком. Соответственно, в момент выставления ордера цена orderPrice должна быть выше текущей, а stopPrice - ниже.
Однако, на практике у меня такой ордер игнорирует снижение цены до stopPrice - ничего не происходит.
Приходится роботом с какой-то периодичностью проверять такие ордера и, в случае снижения цены ниже stopPrice, продавать по цене MARKET.
Есть ли более "прямое" решение этой проблемы?
24.07.2018 09:26
Добрый день.
Там другая логика у бинанса, грубо говоря при падении цены до определенного уровня родится ордер по указанной цене.
Кроме как ботом я вариантов не знаю)
21.07.2018 16:56
Доброго времени суток! 
подскажите, пожалуйста, как исправить ошибку

2018-07-22 00:09:55,748 [DEBUG] Получаем все неисполненные ордера по БД
2018-07-22 00:09:55,750 [DEBUG] Неисполненных ордеров в БД нет
2018-07-22 00:09:55,751 [DEBUG] Получаем из настроек все пары, по которым нет неисполненных ордеров
2018-07-22 00:09:55,753 [DEBUG] Найдены пары, по которым нет неисполненных ордеров: ['BTCUSDT']
2018-07-22 00:09:55,754 [DEBUG] Работаем с парой BTCUSDT
2018-07-22 00:09:55,779 [DEBUG] Starting new HTTPS connection (1): api.binance.com:443
2018-07-22 00:09:57,045 [DEBUG] https://api.binance.com:443 "GET /api/v3/account?timestamp=1532189390000&signature=a0060d6db83d47ba4511cfc49f803934a4a6e3e1c76ca72f838aa45dae2440ab HTTP/1.1" 400 None
2018-07-22 00:09:57,053 [ERROR] 'balances'
Traceback (most recent call last):
  File "./binance_bot.py", line 425, in <module>
    balance['asset']: float(balance['free']) for balance in bot.account()['balances']
KeyError: 'balances'

баланс есть, комиссия в BNB. 
заранее спасибо!
</module>
24.07.2018 09:33
Добрый день.
Запустил только что бота, проверил, такой ошибки нет, попробуйте создать новые API ключи и запустить с ними, может что-то с правами
22.07.2018 16:41
Здравствуйте Андрей!
недавно Бинанс провел изменения в API и Ваш пример бота перестал работать, подскажите пожалуйста что подкорректировать в коде. Может быть даже выпустить статейку было бы идеально. Спасибо
24.07.2018 09:34
Здравствуйте
И этот бот и другие у меня продолжают работать, какая у вас вылетает ошибка?
Кстати, не так давно Binance удалил все API ключи, может быть ваши перестали быть валидными?
26.07.2018 10:26
Здравствуйте уважаемый Андрей!
У меня тоже не работает вход по API. Выдается такая ошибка:
C:\Users\Sapa\AppData\Local\Programs\Python\Python37-32\python.exe E:/Binance/binance/binance_bot1.py
Traceback (most recent call last):
  File "E:/Binance/binance/binance_bot1.py", line 11, in <module>
    from binance_api import Binance
  File "E:\Binance\binance\binance_api.py", line 5, in <module>
    import requests
ModuleNotFoundError: No module named 'requests'

Process finished with exit code 1
Ключи обновил, все безрезультатно. Подскажите мне валенку, плиз, в чем причина.</module></module>
27.07.2018 07:19
Разобрался, сам накосячил. Установил Python37 не для АМД, вот и не работало. Прошу прощения за свой нубизм. Андрей, спасибо за бота!
27.07.2018 12:33
Отлично)
29.07.2018 14:49
Уважаемый Андрей! А нельзя ли сделать так, чтобы бот покупал по цене ниже, чем высчитанная средняя в данный момент на вводимый вручную параметр? Например, создавать ордер на покупку на 1% меньшей цены в момент создания ордера. Мне кажется, что такой параметр очень бы пригодился и бот намного меньше зависал бы на верхах.
01.08.2018 10:16
Можно, в данном случае стоит заменить
avg_price = sum(prices) / len(prices)
на
perc = 0.01
avg_price = prices[0] * (1- perc)

ну и по хорошему сменить название переменной, вынести perc на самый верх и т.п.
0.01 это 1%

02.08.2018 08:48
Спасибо! Теперь понял, где можно поиграть значениями.
29.07.2018 14:03
Какой ,в среднем, выходит профит за месяц(в %). Скажите пж
10.08.2018 03:17
День добрый. Иногда после нескольких часов работы выскакивает следующая ошибка.
code":-1021,"msg":"Timestamp for this request is outside of the recvWindow.
Я так понимаю, что дело в нарушении интернет соединения. Можно ли скорректировать апи таким образом, чтобы выполнение программы при этой ошибке не прерывалось. А то приходится перезапускать терминал по несколько раз в день.
11.08.2018 06:47
Добрый день.
У вас именно бот останавливается, или просто в цикле об ошибке сообщает?
Бот не должен прерываться вообще никогда, т.к. все возможные ошибки он должен игнорировать и идти на следующий круг.
В вашем случае наверное постепенно расходится время. Грубо говоря ваша машина каждую секунду отстает на 5мс и через несколько часов разрыв времени становится критичным для Binance. Бот продолжает работать, но биржа не принимает запросы.
Можете на каждой итерации добавлять синхронизацию, это лишний запрос к апи, но зато, наверное, проблема уйдет.
Для этого измените вот этот кусок кода

while True:
    try:
        # Устанавливаем соединение с локальной базой данных

На вот такой (например)

while True:
    try:
        # Синхронизация времени
        time.sleep(0.045)
        bot.set_shift_seconds(int(bot.time()['serverTime'])//1000 - int(time.time()))
        # Устанавливаем соединение с локальной базой данных
11.08.2018 13:53
Здравствуйте. 
Огромное спасибо за поддержку. 
Я написал собственного бота https://yadi.sk/d/96ecaqX13a8gcP с использованием вашего API. Суть та же: в замкнутом цикле покупаются несколько криптоактивов по цене Bid и тут же продаются по Ask. Разница лишь в том, что раз в десять минут анализируются все BTС пары биржи в поисках самых оптимальных. Сперва список ранжируется по параметру (Ask-Bid)/Bid. Берутся только пары с отношением выше 0.01, т.е. чтобы при покупке по Bid и продаже по Ask прибыль со сделки составляла более 1%.  Из полученного списка берется половина с максимальным количеством сделок за прошлые сутки, так сказать самые ликвидные. Из оставшихся опять берется половина с максимальным количеством сделок за последние пять минут, т.е. по которым ведется активная торговля прямо сейчас. В результате остается штук пять. К ним прибавляются пары, по которым остались старые ордера на покупку с прошлых сессий (с целью удаления) и все, что есть на депозите (кроме BTC и BNB) для продажи с прибылью. Полученный список сохраняется в экселевксий файл со всеми необходимыми параметрами. Для контроля жизнедеятельности шлются сообщения в телеграмм.  По выбранным пяти парам постоянно ставятся ордера на покупку по бидам, если они срабатывают  ставятся ордера на продажу по аскам. Если после покупки цена отскочила вниз, актив продается в безупыток по минимальной цене с учетом комиссии.  Каждые пять минут бот проверяет выставленные ордера, и если Bid поменялся, ордер переставляется.
Так вот, каждые десять минут в функции FULL_LIST_SCAN() выполняется код
local_time = int(time.time())
    server_time = int(ExchangeInfo['serverTime'])//1000
    shift_seconds = server_time-local_time
    bot.set_shift_seconds(shift_seconds)
Разность времени выводится на экран и составляет каждый раз не более 2 секунд. Тем не менее время от времени бот останавливается с ошибкой «сode-1021.». При запуске бота из под VisualStudio, выполнение программы останавливается с выводом окна комментария об ошибке, если напрямую на Питоне, то окно терминала закрывается. Время работы до появления ошибки всегда разное: от пяти минут до нескольких часов. Пробовал запускать на виртуальном сервере Амазон, та же ситуация. Вычитал на гитхабе, что можно расширить временное окно, в параметре функции АПИ вставить {'recvWindow': 10000000}, но никак не соображу, как это к апи можно прикрутить.
Ссылка на бот: https://yadi.sk/d/96ecaqX13a8gcP
16.08.2018 11:13
Добрый.
Выкидывает ошибку:
Traceback (most recent call last):
  File "C:\Users\Администратор.000\Desktop\binance\bnb_scan.py", line 44, in <module>
    key['SPRED/BID']=(float(key['askPrice'])-float(key['bidPrice'])) / float(key['bidPrice'])
ZeroDivisionError: float division by zero
</module>
23.08.2018 08:05
Здравствуйте, Сергей.
Решил тестануть Вашего бота. Но столкнулся с проблемой, после запуска бота вылетает ошибка "<urlopen 10060]="" [winerror="" error="" безуспешной,="" была="" было="" время="" другого="" за="" из-за="" или="" компьютера="" не="" неверного="" нужный="" от="" отклик,="" отклика="" подключенного="" получен="" попытка="" разорвано="" соединение="" т.к.="" требуемое="" уже="" установить="" установленное="">". Подскажите, в чем может быть проблема и как пофиксить?
Спасибо.</urlopen>
06.09.2018 14:44
Сергей, а у меня чего то не заработал Ваш вариант. Выдает ошибку:

06.09.2018 19:49:36 Start program. Time difference = 0 sec
{"code":-1022,"msg":"Signature for this request is not valid."}
Traceback (most recent call last):
  File "./Binance.py", line 29, in <module>
    PAIRS,SYM_LIST = BEST_PAIRS(BnB_LIST) # get best part of all pairs by parameters: Rank=Spred/Bid, Trades per 24H quantity, Trades per 5M quantity
  File "d:\_BinanceTradingBot_\MoreAccurately\BnB_Search.py", line 155, in BEST_PAIRS
    if Ord['symbol'] not in SYM_LIST:
TypeError: string indices must be integers</module>
17.06.2021 08:23
Добрый день, Сергей!
Очень интересная у вас идея.
Хотел посмотреть ваш бот, но по указанной ссылке, к сожалению, информация не доступна.
Скиньте, пожалуйста, новую ссылку?
17.06.2021 08:25
Добрый день, Сергей!
Очень интересная у вас идея.
Хотел посмотреть ваш бот, но по указанной ссылке, к сожалению, информация не доступна.
Скиньте, пожалуйста, новую ссылку?
07.09.2018 06:51
У меня данная ошибка возникает в модуле TELEGRAM(), причем только на домашнем компе, при запуске с VPS все норм. Можно закомментировать данный модуль, бот просто не будет слать сообщения в телеграмм.
07.09.2018 13:05
Закоментил все что относится к отправке в телеграмм и ...

07.09.2018 18:09:35 Start program. Time difference = -1 sec
Traceback (most recent call last):
  File "./Binance.py", line 29, in <module>
    PAIRS,SYM_LIST = BEST_PAIRS(BnB_LIST) # get best part of all pairs by parameters: Rank=Spred/Bid, Trades per 24H quantity, Trades per 5M quantity
  File "d:\_BinanceTradingBot_\MoreAccurately\BnB_Search.py", line 155, in BEST_PAIRS
    LimOrders=bot.openOrders()
  File "d:\_BinanceTradingBot_\MoreAccurately\binance_api.py", line 47, in wrapper
    return self.call_api(**kwargs)
  File "d:\_BinanceTradingBot_\MoreAccurately\binance_api.py", line 76, in call_api
    raise Exception(response.text)
Exception: {"code":-1022,"msg":"Signature for this request is not valid."}
Для продолжения нажмите любую клавишу . . .</module>
19.09.2018 09:49
Вообще ничего не понимаю. Установил сделал так как было написано. Ничего не получается. Как быть помогите кто-нибудь, уже глаза болят. Хотя не скажу что полный ноль в компьютерах. Помогите пожалуйста, что я ни так делаю. Лучше если в ВК напишите vk.com/id12110920 буду очень признателен.
24.09.2018 04:04
здравствуйте.очень хороший при правильной настройке, но можно ли добавить еще одно условие в него если уже есть ордер на продажу по валюте то ее не нужно покупать пока ордера не продадутся?
25.09.2018 17:02
Приветствую!
Не понял из описания :( Бот работает в режиме усреднения, или просто купил по одной цене и выставляет по цене = цена покупки + провит + комиссия.
04.10.2018 18:51
Доброго времени суток. 
При запуске сетапа получаю следующее: You are using pip version 10.0.1, however version 18.0 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.
Прописываю python -m pip install --upgrade pip (и ей подобные команды) - все время выдает ошибку синтаксиса. Как быть?)
Спасибо
04.10.2018 18:55
Собсна, вот ответ: https://bootstrap.pypa.io/get-pip.py
Качаем, запускаем в Питоне (предложит при скачивании) --- профит
04.10.2018 18:56
Не помогло)
22.10.2018 20:30
добрый день. у binance уменьшился дискаунт - 25% вместо 50%. нужно ли что то менять в боте?
22.10.2018 20:43
забыл добавить вопрос - CANCELED в логах 
2018-10-22 23:46:07,388 [DEBUG] Состояние ордера 26566004 - CANCELED
2018-10-22 23:46:07,405 [DEBUG] Starting new HTTPS connection (1): api.binance.com:443
2018-10-22 23:46:07,994 [DEBUG] https://api.binance.com:443 "GET /api/v3/order?symbol=LTCBTC&orderId=69667279&timestamp=1540241166000&signature=8a18b202f5b7e930509da0053b4d4cbf487598603a4eabb54341b4f9f601c725 HTTP/1.1" 200 None
 до бесконечности - что означает? 

спасибо за ответы
23.10.2018 17:11
Добрый день,
Да, нужно поставить

STOCK_FEE = 0.00075

Я обновил архив с ботом
23.10.2018 17:14
Такая ситуация в боте не обрабатывается, когда бот создал ордер, а человек отменил его.
Можете, конечно, доработать бота, что бы он помечал в БД такие ордера отмененными, но проще будет либо удалить базу целиком, либо удалить ордер руками из базы, тогда бот про него забудет.
23.10.2018 19:21
спасибо большое
07.11.2018 08:04
Андрей, приветствую! Какой профит посоветуете поставить, если не использовать BNB?
10.11.2018 17:32
Добрый день,
Нужно в STOCK_FEE установить актуальную комиссию, она будет закладываться и в покупку, и в продажу, немного изменятся цены, а профит по прежнему будет указываться отдельно, как и с BNB.
07.11.2018 09:07
что то получаю отэто теперь 
2018-11-07 12:13:10,256 [DEBUG] Starting new HTTPS connection (1): api.binance.com
2018-11-07 12:13:10,737 [DEBUG] https://api.binance.com:443 "GET /api/v3/account?timestamp=1541581989000&signature=d4d105b724f501845c333c3321505745f4e23e69e42012b6e2cc49d8dbd820d0 HTTP/1.1" 401 None
{"code":-2015,"msg":"Invalid API-key, IP, or permissions for action."}
2018-11-07 12:13:10,757 [ERROR] 'balances'
Traceback (most recent call last):
  File "./binance_bot.py", line 434, in <module>
    balance['asset']: float(balance['free']) for balance in bot.account()['balances']
KeyError: 'balances'</module>
10.11.2018 17:35
Попробуйте запустить с сервера, ну и еще API ключи проверить, Binance иногда втихую их удаляет, если видит угрозы безопасности
13.11.2018 17:13
Доброго времени суток Всем.
Можно ли сделать так, чтобы после срабатывания stop loss прекращалась подача новых ордеров, а именно останавливалась торговля?
14.11.2018 07:34
По указанной паре, я так понимаю, по другим бот должен продолжать работать?
Как вы узнаете, что бот перестал работать по паре, это наверное не очень удобно отслеживать если пар много...

Заведите, пожалуйста, тему тут https://forum.bablofil.ru/forum/9-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0-%D0%B8%D0%B4%D0%B5%D0%B8-%D0%B1%D0%BE%D1%82%D0%BE%D0%B2/
я выложу отдельную версию кода с такой доработкой, тут это делать неудобно и включать в существующего бота пока что тоже, наверное не стоит
18.11.2018 10:09
Здравствуйте! А есть ли версия для Binance на подобие той что для Exmo, торговля с анализом линий MACD? поделитесь у кого есть код . Данную версию запустил, работает но сделки зависают на верхах. Как вариант, можно пользоваться если предварительно проанализировать по индикаторам и иметь подтверждение что монета будет расти, через определенное время , когда цена дойдет до теоретического максимума бота остановить и искать другую пару для входа, но это почти то же самое что торговать вручную....
18.11.2018 18:29
Вот что мне пишет, по запуску.. Что не так с кодом? Стоит Питон 7б последний
File "./binance_bot.py", line 35
BUY_LIFE_TIME_SEC = 180 # Сколько (в секундах) держать ордер на продажу открытым
SyntaxError: invalid syntax
28.11.2018 20:43
Доброго времени суток!!! Прикрутите пожалуйста к боту для Binance мартин. Суть - если сработал стоп лосс, то следующий лот  увеличивается на заранее заданный процент. Если сработал тейк профит лот, то лот переходит в первоначальный объем. МОЖНО ЛИ ТАК СДЕЛАТЬ?
29.11.2018 19:36
Андрей К..., здравствуйте. Спасибо за ваш проект.
Попробовал запускать ваш слегка измененный бот под Android (используя интерпритатор Pydroid 3).  Бот заработал, но периодически (иногда через сутки, иногда через несколько часов) происходит остановка работы с выдачей сообщений:

. . .
   limits = bot.exchangeInfo()
File "/storage/emulated/0/qpython/bbinance_api.py", line 52, in wrapper
   return self.call_api(**kwargs)
File "/storage/emulated/0/qpython/bbinance_api.py", line 82, in call_api
   response = requests.request(method=self.methods[command]['method'], url=api_url, data="" if self.metho
ds[command]['method'] == 'GET' else payload_str, headers=headers)
File "/data/user/0/ru.iiec.pydroid3/files/arm-linux-androideabi/lib/python3.6/site-packages/requests/api
.py", line 58, in request
   return session.request(method=method, url=url,  **kwargs)
File "/data/user/0/ru.iiec.pydroid3/files/arm-linux-androideabi/lib/python3.6/site-packages/requests/ses
sions.py", line 512, in request
   resp = self.send(prep, **send_kwargs)
File "/data/user/0/ru.iiec.pydroid3/files/arm-linux-androideabi/lib/python3.6/site-packages/requests/ses
sions.py", line 622, in send
   r = adapter.send(request, **kwargs)
File "/data/user/0/ru.iiec.pydroid3/files/arm-linux-androideabi/lib/python3.6/site-packages/requests/ada
pters.py", line 513, in send
   raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='api.binance.com', port=443): Max retries ex
ceeded with url: /api/v1/exchangeInfo (Caused by NewConnectionError('<urllib3.connection.verifiedhttpsconn 0xf53eea10="" at="" ection="" object="">: Failed to establish a new connection: [Errno 7] No address associated  with h
ostname',))

[Program finished]


В чем может быть причина и можно ли это исправить?
</urllib3.connection.verifiedhttpsconn>
29.11.2018 19:51
P/S:  что-то последние строчки перепутались.
 Они выглядят так:
"requests.exceptions.ConnectionError: HTTPSConnectionPool(host='api.binance.com', port=443): Max retries exceeded with url: /api/v1/exchangeInfo (Caused by NewConnectionError('<urllib3.connection.verifiedhtppsconnection 0xf53eea10="" at="" object="">: Failed to establish a new connection: [Errno 7] No address associated  with hostname',))

[Program finished]"</urllib3.connection.verifiedhtppsconnection>
29.11.2018 19:57
P/S_2:
опять последние строчки выглядят не так, как в оригинале. Видимо часть символов воспринимается как команды форматирования и при отправке комментария несколько искажают порядок слов.
30.11.2018 09:17
Да, лучше такие вещи обсуждать на форуме, там ничего не съедается
По ошибке - скрипту не удается найти сайт из-за временных сетевых сбоев, это вполне нормальная ситуация, на которую сложно повлиять (особенно, если речь идет о мобильном устройстве).
Вам нужно такие ошибки отлавливать, игнорировать и идти на следующий круг, через конструкцию try/except, что-то вроде
try:
    # логика программы
    r = requests.get...
    # логика программы
except requests.exceptions.RequestException as e:  
    print(e)
03.12.2018 13:56
Доброго времени суток. Вроде все сделал по инструкции, настроил, запустил, не хочет торговать пишет
 2018-12-03 16:48:42,677 [DEBUG] https://api.binance.com:443 "GET /api/v1/depth?symbol=PAXBNB&limit=10 HTTP/1.1" 200 None
2018-12-03 16:48:42,683 [DEBUG] Не удается вычислить среднюю цену: []
04.12.2018 16:23
Добрый день - только что проверил, на binance PAX торгуется к USDT, к BNB пары нет
06.12.2018 12:53
Здравствуйте! Бот несколько дней работал в штатном режиме, однако пару дней назад перестал торговать, выдавая ошибку [ERROR] 'stepSize'. 
Вот кусок лога: 
2018-12-06 15:46:21,847 [DEBUG] Получаем все неисполненные ордера по БД
2018-12-06 15:46:21,849 [DEBUG] Неисполненных ордеров в БД нет
2018-12-06 15:46:21,850 [DEBUG] Получаем из настроек все пары, по которым нет неисполненных ордеров
2018-12-06 15:46:21,851 [DEBUG] Найдены пары, по которым нет неисполненных ордеров: ['XRPBNB']
2018-12-06 15:46:21,852 [DEBUG] Работаем с парой XRPBNB
2018-12-06 15:46:21,857 [DEBUG] Starting new HTTPS connection (1): api.binance.com:443
2018-12-06 15:46:22,661 [DEBUG] https://api.binance.com:443 "GET /api/v3/account?timestamp=1544100263000&signature=04245e8abcb84fda1049585006e7db3e2ca13b1d84e1571cc1a50ec1a7663137 HTTP/1.1" 200 None
2018-12-06 15:46:22,668 [DEBUG] Баланс ['BNB:1.99813172', 'XRP:0.00000000']
2018-12-06 15:46:22,673 [DEBUG] Starting new HTTPS connection (1): api.binance.com:443
2018-12-06 15:46:23,932 [DEBUG] https://api.binance.com:443 "GET /api/v1/depth?symbol=XRPBNB&limit=10 HTTP/1.1" 200 None
2018-12-06 15:46:23,938 [ERROR] 'stepSize'
Traceback (most recent call last):
  File "./binance_bot.py", line 445, in <module>
    my_amount = adjust_to_step(pair_obj['spend_sum']/ my_need_price, CURR_LIMITS['filters'][1]['stepSize'])
KeyError: 'stepSize'

И так по кругу. Подскажите, как можно решить проблему?</module>
08.12.2018 12:40
Здравствуйте, на днях binance внесли изменения в некоторые методы api, просто скачайте бота по новой, он уже обновлен
11.12.2018 09:18
Спасибо!!!
25.12.2018 09:11
Здравствуйте,аналогичная проблема что и выше,пробовал переустановить,не работает,Что делать?
25.12.2018 19:20
Посмотрел, вроде бы изменений больше не было.
Вы скачали новый архив с ботом?
25.12.2018 19:42
Да,архив вышел 5 декабря,вроде и настроил все правильно,проблема та же.
25.12.2018 20:01
А,извините за мою глупость,неправильно API вставлял
26.12.2018 18:54
Снова здравствуйте,подскажите неопытному


om:443
2018-12-26 23:56:24,982 [DEBUG] https://api.binance.com:443 "POST /api/v3/order
HTTP/1.1" 400 None
{"code":-2010,"msg":"Account has insufficient balance for requested action."}
2018-12-26 23:56:24,986 [WARNI] Не удалось создать ордер на продажу {'code': -20
10, 'msg': 'Account has insufficient balance for requested action.'}
2018-12-26 23:56:24,986 [DEBUG] Получаем из настроек все пары, по которым нет не
исполненных ордеров
2018-12-26 23:56:24,987 [DEBUG] По всем парам есть неисполненные ордера
2018-12-26 23:56:24,988 [DEBUG] Получаем все неисполненные ордера по БД
2018-12-26 23:56:24,989 [DEBUG] Получены неисполненные ордера из БД: [('66904434
', 'BNBUSDT')]
2018-12-26 23:56:24,991 [DEBUG] Starting new HTTPS connection (1): api.binance.c
om:443
2018-12-26 23:56:25,613 [DEBUG] https://api.binance.com:443 "GET /api/v3/order?s
ymbol=BNBUSDT&orderId=66904434&timestamp=1545850588000&signature=fc7788155656f63
dc3b39c64bd38dd1d0977807aeb030cbfa35d4df31ad637ad HTTP/1.1" 200 None
2018-12-26 23:56:25,616 [DEBUG] Состояние ордера 66904434 - FILLED
27.12.2018 16:29
Недостаточно денег на балансе
27.12.2018 13:28
Всем привет, такие вопросы. после закрытия бота и редактирования данных, он отказывается работать, каждый раз приходиться заново устанавливать, извлекать, и запускать его с нуля, это можно как то исправить?
И второй вопрос, при добавлении несколько валютных пар, выставляет ордера только на первую валютную пару. Как исправить?
27.12.2018 16:36
Бот откажется работать, если настройки как то с ошибками синтаксиса делать. В питоне важны пробелы и табуляции, кое-где запятые.
Вы можете скачать и установить среду разработки pyCharm, например, и редактировать настройки в ней, там ошибки либо будут исправлены, либо подчеркнуты
28.12.2018 07:00
Сделала как Вы сказали ошибок нет.
Проблема именно в том что он первый раз отредактированного бота запускает, может запустить после редактирования еще 2-3 раза, а потом при запуске бот перестает работать. Могу даже настройки не менять, просто закрыть бота, открыть и все он не работает.
Может его стоит редактировать не закрывая?
29.12.2018 09:41
Привет! Спасибо за бота! Всё неплохо работает, но периодически зависает на строчке 

2018-12-29 12:27:49,637 [DEBUG] Starting new HTTPS connection (1): api.binance.com:443


После перезапуска всё работает. пока не остановится снова.
Подозреваю, что проблема в нестабильном инет соединении (4G Yota за городом), или в синхронизации времени с сервером биржи. (Бот корректирует время по серверу).
Виснет, то пару раз в сутки, то пару раз в час. Я взялся за чтение учебника Марка Лутца, но понимаю, что до редактирования кода мне ещё далеко....:) 
А очень хочется, что бы программа делала авторестарт при потере соединения. Майнеры справляются с этим на ура, например.
30.12.2018 18:43
Кстати да, при нестабильной сети может возникнуть ситуация, когда программа получит заголовок ответа сервера, ждет начала отдачи тела, но это событие не наступает.. Причем это связано не с кодом, а с сетевыми драйверами, что ли.
Я одно время подозревал винду, но то же самое повторилось на линуксе. Потом я перенес код с питона на яву, но это повторилось снова и там и там. Но, скажем с C++ или golang я таких проблем не наблюдал, в силу наверное того, что они ближе к ядру системы..
В данном случае я могу посоветовать запускать бота на сервере - https://bablofil.ru/kak-zapustit-bota-na-servere/
Первые два месяца по моей ссылке будут бесплатно, и бот будет работать намного стабильнее и быстрее.
30.12.2018 00:10
Можно было бы реализовать следующий алгоритм : - программа отслеживает создание  записей в файле \binance_bot\logs binance > если обновление записей в файле не происходит в течении n секунд > перезапуск бота. Топорно, наверно, но зато должно помогать при любых простоях и зависаниях бота.
04.01.2019 02:43
Бот работает после запуска минут 20, и перестает выставлять ордера. При этой в командой строке изменения есть. Как решаить проблему?
17.02.2019 19:04
Добрый день. Не пойму что не так. Скачал последнюю версию. Пишет ошибку:

2019-02-17 22:03:07,390 [ERROR] 'stepSize'
Traceback (most recent call last):
  File "./binance_bot.py", line 455, in <module>
    my_amount = adjust_to_step(pair_obj['spend_sum']/ my_need_price, CURR_LIMITS['filters'][1]['stepSize'])</module>
18.02.2019 12:17
Специально только что скачал, не вижу этого старого кода
https://forum.bablofil.ru/files/file/1-%D0%B1%D0%BE%D1%82-%D0%B4%D0%BB%D1%8F-binance/
У вас может быть при загрузке какая то старая версия лежит и не дает перезаписаться?
18.02.2019 10:44
"Пар можно добавлять любое количество..." Подскажите, есть ли возможность комментировать ненужные в данный момент пары, что бы избежать полного прописывания или удаления их из кода? Если это возможно, то где ставить знак комментирования "#"? Спасибо!
18.02.2019 12:24
Комментарии в теле массива не очень желательны, вы можете например два раза указать 
pairs = ...
второе перезапишет первое, и в нем будут актуальные пары

А лучше всего добавить признак в каждую пару, например
{
        'base': 'BTC',
        'quote': 'EOS',
        'offers_amount': 5, # Сколько предложений из стакана берем для расчета средней цены
                            # Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
        'spend_sum': 0.0015,  # Сколько тратить base каждый раз при покупке quote
        'profit_markup': 0.005, # Какой навар нужен с каждой сделки? (0.001 = 0.1%)
        'use_stop_loss': False, # Нужно ли продавать с убытком при падении цены
        'stop_loss': 1, # 1% - На сколько должна упасть цена, что бы продавать с убытком
        'active': False, # <------------------------------------------------------------------
    },

А потом, например тут
log.debug("Работаем с парой {pair}".format(pair=pair_name))
добавить строки
if not pair_obj['active']:
    log.debug("Пара {pair} не активна, пропускаем".format(pair=pair_name))
    continue
18.02.2019 15:14
Спасибо за флаг активности пары, получилось.
01.03.2019 17:45
Здравствуйте, запустил бота с вашими настройками работает, но с моими почему то не хочет.
Это ваши настройки:
{
        'base': 'BTC',
        'quote': 'EOS',
        'offers_amount': 5, # Сколько предложений из стакана берем для расчета средней цены
                            # Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
        'spend_sum': 0.0015,  # Сколько тратить base каждый раз при покупке quote
        'profit_markup': 0.005, # Какой навар нужен с каждой сделки? (0.001 = 0.1%)
        'use_stop_loss': False, # Нужно ли продавать с убытком при падении цены
        'stop_loss': 1, # 1% - На сколько должна упасть цена, что бы продавать с убытком
    }

А это мои настройки:
{
        'base': 'USDT',
        'quote': 'BNB',
        'offers_amount': 11,  # Сколько предложений из стакана берем для расчета средней цены
        # Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
        'spend_sum': 5,  # Сколько тратить base каждый раз при покупке quote
        'profit_markup': 0.005,  # Какой навар нужен с каждой сделки? (0.001 = 0.1%)
        'use_stop_loss': False,  # Нужно ли продавать с убытком при падении цены
        'stop_loss': 1,  # 1% - На сколько должна упасть цена, что бы продавать с убытком
    }
Выдает вот такую ошибку:
KeyError: 'bids'
2019-03-01 21:40:04,797 [DEBUG] Получаем все неисполненные ордера по БД
2019-03-01 21:40:04,798 [DEBUG] Неисполненных ордеров в БД нет
2019-03-01 21:40:04,798 [DEBUG] Получаем из настроек все пары, по которым нет неисполненных ордеров
{"code":-1100,"msg":"Illegal characters found in parameter 'limit'; legal range is '5, 10, 20, 50, 100, 500, 1000'."}
2019-03-01 21:40:04,799 [DEBUG] Найдены пары, по которым нет неисполненных ордеров: ['BNBUSDT']
2019-03-01 21:40:04,799 [DEBUG] Работаем с парой BNBUSDT
2019-03-01 21:40:04,802 [DEBUG] Starting new HTTPS connection (1): api.binance.com:443
2019-03-01 21:40:05,269 [DEBUG] https://api.binance.com:443 "GET /api/v3/account?timestamp=1551462014000&signature=fdb4bd683f05c1e4a6039d534d9aabca00713c4d2f94f227bfe861649dbbc9de HTTP/1.1" 200 None
2019-03-01 21:40:05,273 [DEBUG] Баланс ['BNB:0.70902584', 'USDT:48.63097378']
2019-03-01 21:40:05,276 [DEBUG] Starting new HTTPS connection (1): api.binance.com:443
2019-03-01 21:40:05,725 [DEBUG] https://api.binance.com:443 "GET /api/v1/depth?symbol=BNBUSDT&limit=11 HTTP/1.1" 400 None
{"code":-1100,"msg":"Illegal characters found in parameter 'limit'; legal range is '5, 10, 20, 50, 100, 500, 1000'."}
2019-03-01 21:40:05,728 [ERROR] 'bids'
Traceback (most recent call last):
  File "C:/Users/1/Desktop/binance bot/binance_bot/binance_bot.py", line 437, in <module>
    prices = [float(bid[0]) for bid in offers['bids']]
Подскажите пожалуйста, в чем проблема?</module>
02.03.2019 09:17
Добрый день!
В 'offers_amount' допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
А у вас стоит 11
Binance не принимает такого значения и ругается
19.03.2019 11:55
Добрый день!
Помогите разобраться, плиз.
Бота запустил неделю назад, думал, что со временем перейдет к продаже,
в итоге на Бинансе стоят в ордерах EOS и XLM, AMB просто доступна.
2019-03-19 13:49:28,331 [DEBUG]
    Текущее время: 2019-03-19 13:49:27 1552996167
    Время сервера: 2019-03-19 13:49:31 1552996171
    Разница: 4.00000000
    Бот будет работать, как будто сейчас: 2019-03-19 13:49:31 1552996171

2019-03-19 13:49:28,335 [DEBUG] Получаем все неисполненные ордера по БД
2019-03-19 13:49:28,336 [DEBUG] Получены неисполненные ордера из БД: [('14921438
', 'AMBBNB'), ('72834116', 'EOSETH'), ('53656614', 'XLMETH')]
2019-03-19 13:49:28,342 [DEBUG] Starting new HTTPS connection (1): api.binance.c
om:443
2019-03-19 13:49:28,937 [DEBUG] https://api.binance.com:443 "GET /api/v3/order?s
ymbol=AMBBNB&orderId=14921438&timestamp=1552996171000&signature=df72b4cf7437e781
901e3c06db6ed576cf179ac720376bbe7d6f5a57afffcbaa HTTP/1.1" 200 None
2019-03-19 13:49:28,944 [DEBUG] Состояние ордера 14921438 - CANCELED
2019-03-19 13:49:28,949 [DEBUG] Starting new HTTPS connection (1): api.binance.c
om:443
2019-03-19 13:49:29,586 [DEBUG] https://api.binance.com:443 "GET /api/v3/order?s
ymbol=EOSETH&orderId=72834116&timestamp=1552996171000&signature=24a79a8c59bea8e4
1d4db9b1a9c665b7e5774e5df15bb92e73d73222da77c64a HTTP/1.1" 200 None
2019-03-19 13:49:29,592 [DEBUG] Состояние ордера 72834116 - NEW
2019-03-19 13:49:29,593 [DEBUG] Ордер 72834116 всё еще не выполнен
2019-03-19 13:49:29,598 [DEBUG] Starting new HTTPS connection (1): api.binance.c
om:443
2019-03-19 13:49:30,296 [DEBUG] https://api.binance.com:443 "GET /api/v3/order?s
ymbol=XLMETH&orderId=53656614&timestamp=1552996172000&signature=a5a71cad86d5b066
7f3476b1b9a1de771c90bae0efd51cc396cbadb8319d8528 HTTP/1.1" 200 None
2019-03-19 13:49:30,303 [DEBUG] Состояние ордера 53656614 - NEW
2019-03-19 13:49:30,304 [DEBUG] Ордер 53656614 всё еще не выполнен
2019-03-19 13:49:30,305 [DEBUG] Получаем из настроек все пары, по которым нет не
исполненных ордеров
2019-03-19 13:49:30,307 [DEBUG] По всем парам есть неисполненные ордера
2019-03-19 13:49:30,310 [DEBUG] Получаем все неисполненные ордера по БД
2019-03-19 13:49:30,311 [DEBUG] Получены неисполненные ордера из БД: [('14921438
', 'AMBBNB'), ('72834116', 'EOSETH'), ('53656614', 'XLMETH')]
2019-03-19 13:49:30,317 [DEBUG] Starting new HTTPS connection (1): api.binance.c
om:443
2019-03-19 13:49:30,935 [DEBUG] https://api.binance.com:443 "GET /api/v3/order?s
ymbol=AMBBNB&orderId=14921438&timestamp=1552996173000&signature=ad8ed3519ba378dd
773955c07b4d1943ae5bc198f394b8026a58b696c8fd44aa HTTP/1.1" 200 None
2019-03-19 13:49:30,942 [DEBUG] Состояние ордера 14921438 - CANCELED
2019-03-19 13:49:30,948 [DEBUG] Starting new HTTPS connection (1): api.binance.c
om:443
19.03.2019 12:11
Насколько я понимаю ситуацию, бот создал ордера, вы их отменили руками на бирже, бот не понял.
Удалите файл *.db в папке с ботом, он с начала всё начнет по всем парам
19.03.2019 17:49
А те объемы криптовалют. которые он уже купил. он будет учитывать, или их необходимо обменять их на начальные, чтоб цикл совершался правильно?
20.03.2019 11:25
Будет торговать на сумму, которая указана в настройках.
Соответственно если нужно поменять, нужно остановить бота (после продажи всех ордеров) и поменять настройки
20.03.2019 18:13
подскажите пожалуйста начинающему. как теперь отменить ордера, в которых уже зависла валюта, потому что бот теперь ругается, что не хватает среств, пытаясь запустить покупку по новой?
22.03.2019 09:15
Остановить бота
Зайти на биржу, навести порядок в средствах (отменить, продать и т.п.)
В папке с ботом удалить файл binance.db
Прописать нужные настройки
Запустить бота
31.03.2019 11:33
Андрей, подскажите пожалуйста, запустил бота, вроде все хорошо, покупает дешевле продает дороже, но при этом баланс уменьшается! Куда посмотреть чтобы разобраться?)
02.04.2019 12:40
Смотря какими парами торгуете
Например, ETH_BNB - вы можете увеличивать баланс как ETH, так и BNB, но если кто-то из них падает к BTC, то расчетный баланс BTC уменьшается, т.к. хотя монет становится больше, купить BTC на них вы можете всё меньше.
Аналогично, если у вас есть 100 рублей, но доллар растет, то ваш баланс в пересчете на доллары уменьшается, хотя 100 рублей как лежали так и лежат в кармане.
В общем, если курс BTC растет, а у вас вложено в другие монеты, то _расчетный_ баланс в BTC уменьшается (то, что на странице funds отображается).
08.06.2019 17:03
Подскажите пожалуйста! Как сделать чтобы бот не вычислял по стакану, а покупал сразу по маркету???
16.06.2019 15:19
Посмотрите выше, я отвечал в комментариях. поищите "по рынку" (ctrl+F)
18.06.2019 15:37
Андрей! Подскажите еще такой момент пожалуйста. Я в этого бота поставил покупку по рыку https://forum.bablofil.ru/topic/301-stop-loss-%D0%B8-%D0%B1%D0%B8%D0%BD%D0%B0%D0%BD%D1%81/?tab=comments#comment-839 . А есть ли возможность прикрутить к лоссу функцию следования за текущей ценой? Иными словами,  после покупки фиксировал максимальную цену и уже от нее ставил 1%?
18.06.2019 15:49
Я пробовал так
# Получаем текущие курсы с биржи
                        curr_rate = float(bot.tickerPrice(symbol=orders_info[order]['order_pair'])['price'])
                        curr_rate_mx = float(0.0)
                        if curr_rate_mx <= curr_rate:
                        	curr_rate_mx = curr_rate

if (1 - curr_rate_mx/orders_info[order]['buy_price'])*100 >= all_pairs[orders_info [order]['order_pair']]['stop_loss']:
                        log.debug("{pair} Цена упала до стоплосс (покупали по {b:0.8f}, сейчас {s:0.8f}), пора продавать".format(
                           pair=orders_info[order]['order_pair'],
                           b=orders_info[order]['buy_price'],
                           s=curr_rate
бот с такими изменениями некорректно работает
03.07.2019 12:30
Здравствуйте. Очевидно после изменений на бинансе изменили и API. Бот перестал получать балансы и конечно же не работает... 
2019-07-03 15:28:14,312 [DEBUG] Получаем все неисполненные ордера по БД
2019-07-03 15:28:14,314 [DEBUG] Неисполненных ордеров в БД нет
2019-07-03 15:28:14,314 [DEBUG] Получаем из настроек все пары, по которым нет неисполненных ордеров
2019-07-03 15:28:14,318 [DEBUG] Найдены пары, по которым нет неисполненных ордеров: ['BNBBTC', 'USDTBTC']
2019-07-03 15:28:14,321 [DEBUG] Работаем с парой BNBBTC
2019-07-03 15:28:14,324 [DEBUG] Starting new HTTPS connection (1): api.binance.com:443
2019-07-03 15:28:14,783 [DEBUG] https://api.binance.com:443 "GET /api/v3/account?timestamp=1562156897000&signature=2ce51ecdb49700610c5b7bcc217a575f2a5f42e2fed8ad60c36ceebae19fb762 HTTP/1.1" 400 None
2019-07-03 15:28:14,789 [ERROR] 'balances'
Traceback (most recent call last):
  File "./binance_bot.py", line 434, in <module>
    balance['asset']: float(balance['free']) for balance in bot.account()['balances']
KeyError: 'balances'

подправите или проект заброшен?</module>
05.07.2019 16:50
Да нет, скорее тут проблема либо в неправильных АПИ ключах, либо на балансе нет денег, либо время не синхронизировано.
Вам стоит проверить и настроить что-то у себя, такое уже бывало
31.07.2019 14:55
Добрый день! 
настройки:
pairs = [
   {
        'base': 'BTC',
        'quote': 'USDT',
        'offers_amount': 10, # Сколько предложений из стакана берем для расчета средней цены
                            # Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
        'spend_sum': 0.0050,  # Сколько тратить base каждый раз при покупке quote
        'profit_markup': 0.005, # Какой навар нужен с каждой сделки? (0.001 = 0.1%)
        'use_stop_loss': False, # Нужно ли продавать с убытком при падении цены
        'stop_loss': 1, # 1% - На сколько должна упасть цена, что бы продавать с убытком
    }
]
пробовал ставить на 2х компьютерах одно и тоже выдает:
2019-07-31 17:18:12,127 [DEBUG] 
    Текущее время: 2019-07-31 17:18:11 1564582691
    Время сервера: 2019-07-31 17:18:09 1564582689
    Разница: 2.00000000 ТЕКУЩЕЕ ВРЕМЯ ВЫШЕ
    Бот будет работать, как будто сейчас: 2019-07-31 17:18:09 1564582689

2019-07-31 17:18:12,143 [DEBUG] Получаем все неисполненные ордера по БД
2019-07-31 17:18:12,144 [DEBUG] Неисполненных ордеров в БД нет
2019-07-31 17:18:12,145 [DEBUG] Получаем из настроек все пары, по которым нет неисполненных ордеров
2019-07-31 17:18:12,146 [DEBUG] Найдены пары, по которым нет неисполненных ордеров: ['USDTBTC']
2019-07-31 17:18:12,147 [DEBUG] Работаем с парой USDTBTC
2019-07-31 17:18:12,148 [ERROR] Не удалось найти настройки выбранной пары USDTBTC
Traceback (most recent call last):
  File "./binance_bot.py", line 420, in <module>
    raise Exception("Не удалось найти настройки выбранной пары " + pair_nam
</module>
03.08.2019 12:59
Добрый день
Пары USDT_BTC на бирже нет
https://www.binance.com/en/trade/USDT_BTC
А BTCUSDT есть
https://www.binance.com/en/trade/BTC_USDT
05.08.2019 11:42
Добрый день!
вот такая теперь проблема:
# python ./binance_bot.py
Traceback (most recent call last):
  File "./binance_bot.py", line 14, in <module>
    from binance_api import Binance
  File "/root/eag/binance_api.py", line 10, in <module>
    from urllib.parse import urlparse, urlencode
ImportError: No module named parse

пробовали ставить:
# pip install parse
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
Requirement already satisfied: parse in /usr/lib/python2.7/site-packages (1.12.0)
не помогло. (((</module></module>
05.08.2019 17:32
У вас старая версия питона, python2.7
Ставьте и используйте самую последнюю с сайта, 3.7.4 уже, другое поколение
05.08.2019 22:47
Да спасибо. Разобрались поставили нового питона. Там теперь на 3.7.4 проблемы с кодировкой. ругается на нее.. вроде как указываем юникод. но на каждый символ в комментах (русские буквы) пишет в формате типа: "\u0439" и ворнинг... На латинские буквы на ругается. Как заставить в правильных русских буквы писать и не ворчать? (а так вроде сам бот заработал)
10.08.2019 06:24
Попробуйте открывать в Idle или в другой среде разработки, скачайте проект заново, вообще не должно быть проблем с кодировкой. На маке могут быть, но там проще открывать в idle, можно кодировку в самом файле указать в самом верху
# -*- coding: utf-8 -*-
07.08.2019 14:19
Всем привет! Крутой робот, спасибо Андрей. Теперь беда
2019-08-07 17:14:12,333 [DEBUG] https://api.binance.com:443 "GET /api/v3/account?timestamp=1565187251000&signature=b09769f5e3cad9cc8ae33f683d8b6fa0764684351445960a1dda2dd64afbe16b HTTP/1.1" 400 None 
{"code":-1022,"msg":"Signature for this request is not valid."} 
2019-08-07 17:14:12,333 [ERROR] 'balances' 
Traceback (most recent call last): 
File "./binance_bot.py", line 424, in <module> 
balance['asset']: float(balance['free']) for balance in bot.account()['balances'] 
KeyError: 'balances'
Подскажите, что делать? 
</module>
10.08.2019 06:25
Проверьте API ключи, пересоздайте при необходимости
09.08.2019 21:07
что-то не могу понять почему не идем в плюс...
pairs = [
   {
        'base': 'USDT',
        'quote': 'BTC',
        'offers_amount': 10, # Сколько предложений из стакана берем для расчета средней цены
                            # Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
        'spend_sum': 20.000,  # Сколько тратить base каждый раз при покупке quote
        'profit_markup': 0.004, # Какой навар нужен с каждой сделки? (0.001 = 0.1%)
        'use_stop_loss': True, # Нужно ли продавать с убытком при падении цены
        'stop_loss': 0.1, # 1% - На сколько должна упасть цена, что бы продавать с убытком
    }
]
за ночь было 160 операций в результате ушел в -0.05USDT (ну т.е. ничего не заработалось - а комиссии заплатил 0.1 BNB т.е. суммарно в минус) - что может не так с паретрами не может же быть что на 200 операций то на то и вышло?
10.08.2019 11:40
У вас же стоплосс включен
Соответствено грубо говоря 60% времени за ночь график проседал и 40% поднимался
Меньшая часть сделок сыграла в плюс, бОльшая в минус
Бот продавал при каждом падении на 0.1% из за стоплосса, и продавал с прибылью при росте на 0.4, какое событие наступило раньше то и сработало
Тут не знаю, как бы вы руками торговали? Можно отключить стоп-лосс, можно увеличить его, можно увеличить навар и т.п.
14.08.2019 15:42
Binance will perform a scheduled system upgrade starting at 2019/08/15 02:00 AM (UTC). The upgrade will take approximately 6-8 hours.

Major improvements in this upgrade include:

    Matching Engine, API, and WebSocket performance optimizations.

    New order type: OCO (Order Cancels Order), available via the API.

    5,000 and 10,000 order book levels available from Rest API (GET api/v1/depth).

The full API changelog for this update can be found https://github.com/binance-exchange/binance-official-api-docs/blob/master/CHANGELOG.md
25.09.2019 20:38
Здравствуйте, не могу понять почему в коде если стоит USE_BNB_FEES = True, то мы не учитываем комиссию в момент момент расчета цены продажи, хотя должы учитывать ее с дисконтом в 25% (получается мы действительно выигрываем заданный 'profit_markup', но теряем BNB соразмерно комиссии, то есть в реальном выражении 'profit_markup' получается меньше указанного). 
А если USE_BNB_FEES = False, то в коде берется комссия 0,075%, хотя это комиссия с дисконтом, а должна быть без дисконта (0,1%).

Также интересно как работает дисконт за реферальную ссылку, она вроде около 10% дает скидки.

Заранее спасибо.
25.10.2019 18:42
Здравствуйте, Андрей. Подскажите пожалуйста, как сделать, чтобы бот торговал только ETH/USDT?
10.11.2019 09:43
Добрый день.
Убрать другие пары из настроек, какие пары пропишите, на таких и будет торговать.
31.10.2019 15:30
Здравствуйте! Огромное спасибо за бота. Не могли бы Вы более подробно объяснить алгоритм по которому бот учитывает комиссию биржи? Размер комиссии отдельно прибавляется к желаемой наценке? Или входит в наценку? Заранее благодарю.
Запустил сегодня бота на пару XRP_BNB, бот закупился по цене 0,01464 и выставил ордер на продажу по цене 0,01486. Разница между покупкой и продажей 1,5%, а в настройках бота у меня выставлено 0,5%. Поэтому возник такой вопрос.
10.11.2019 09:46
Добрый день,
Комиссии входят в расчет цен, итоговый профит за вычетом комиссий должен соответствовать тому, который вы указали в настройках (0.5%)
Так же есть округления из-за требований binance, например если бот посчитал, что нужно потратить 0.012312 монеты, а для пары шаг должен быть 0.01, то бот потратит 0.01 или 0.02, по ситуации, это тоже влияет на цены
07.11.2019 17:28
как заставить бот брать цену покупки из первого зеленого стакана. Очень удобно на таких монетах как трон, где шаг цены 1 сатоха. 
Вроде писали в ветке обработки API ключей, но куда нужно это вставить???
 from binance_api import Binance
bot = Binance(
    API_KEY='D7...Ejj',
    API_SECRET='gwQ...u3A'
)
print('ticker/price', bot.tickerPrice(
    symbol='BNBBTC'
))
10.11.2019 09:51
Добрый день,
Замените
avg_price = sum(prices) / len(prices)
На
avg_price = prices[0]
12.11.2019 15:10
Спаасибо!!!!!!!!!!!!
12.11.2019 21:09
Что означает эта ошибка?
Traceback (most recent call last):
  File "./binance_bot.py", line 159, in <module>
    order_status = stock_order_data['status']
KeyError: 'status'</module>
17.11.2019 10:48
Бот не может получить ответ с биржи, может быть ключи API не валидные или время рассинхронизировано на компе.
А больше в логе ничего нет?
15.11.2019 04:12
Добрый день.

Все сделал по инструкции и когда пытаюсь запустить run.bat то получаю ошибку - the application was unable to start correctly 0xc000007b
Как это решить?
17.11.2019 10:52
У вас может быть на файлы .bat настроено что-то не то.
Откройте run.bat в блокноте
Запустите командную строку win+r -> cmd
В командной строке наберите команду 
cd ПУТЬ_К_ВАШЕЙ_ПАПКЕ_С_БОТОМ
Из блокнота копируйте команды построчно в cmd и нажимайте Enter
Посмотрите, что из этого выйдет (Скорее всего заработает, ну или узнаем, где именно ругается)
18.11.2019 05:13
Оказывается проблема до этого - это пункт где нужно установить необходимые модули запустив файл setup.bat и мне там пишут ошибку - 'pip' is not recognized as an internal or external command
18.11.2019 14:06
Переустановите Питон, поставьте все галочки, нажмите кнопку дополнительно там где то в установке, там тоже все галочки поставьте
А еще уберите на всякий случай пробелы из пути к боту, положите его например в папку C:/bot или D:/bot
19.11.2019 09:51
При запуске run.bat такая ошибка - ImportError: DLL load failed while importing _sqlite3: The specified module could not be found
20.11.2019 02:52
А при запуске setup.bat ошибка та же осталась, хоть и переустановил питон как вы сказали со всеми галочками и теперь он лежит С:/binance_bot
19.11.2019 09:53
Это уже после переустановки питона со всеми галочками
25.11.2019 07:53
Какая то у вас загадочная история, у вас обычный Windows и обычный питон, скачанный с оф сайта версии 3.8?
Вы не используете анаконду и не пользуетесь "оптимизированными" версиями Windows, из которых часть вырезана?
У вас есть возможность попробовать установить питон и запустить код на работе или у друга? Для этого не нужны права администратора
17.01.2020 06:57
Подскажите как можно сделать чтоб бот делал один раз покупку, после того как ордер исполнился, не делал снова покупку, и для дальнейшей работы требовался перезапуск бота либо ввод пользователя с клавиатуры. Немного знаком с питоном. Заранее спс.
20.01.2020 10:05
Ну как вариант найдите в коде в двух местах

avg_rate = calc_sell_avg_rate(order_trades, log)
    if avg_rate > 0:
        update_sell_rate(cursor, conn, new_order['orderId'], avg_rate)
    else:
        log.debug("Не удается вычислить цену покупки, пропуск")
        continue

И после них добавьте 
all_pairs[orders_info[order]['order_pair']]['active'] =False
Тогда он будет пропускать эту пару после продажи
30.01.2020 11:09
С этим вроде разобрался. Подскажите еще один момент, как вывести значение по какому курсу был продан последний лот? Мне нужно создать одну переменную в которой будет храниться цена на продажу последнего лота, в первом боте есть переменная need_price, там все понятно, а вот в новом не знаю как сделать, потому что там лот выставляется по рынку.
30.01.2020 11:12
Там есть строка: curr_rate = float(prices['bidPrice']) из нее можно узнать текущий курс, а мне необходимо добавить еще одну переменную в которой будет хранится по какому курсу был продан последний лот.
31.01.2020 15:40
Самый правильный вариант - получить историю торгов по ордеру, просуммировать полученное кол-во и потраченное кол-во и посчитать средневзвешенную цену.В новом боте это есть, ищите в логах или в файле misc.py
'Средневзвешенная цена {ar:0.8f}'.format(ar=avg_rate))
отдельно для покупки и продажи
02.02.2020 12:25
Подскажите что за ошибка вылазит:
2020-02-02 15:19:38,721 :ERROR: local variable 'pair_name' referenced before assignment
Traceback (most recent call last):
  File "./binance_bot.py", line 115, in main_flow
    order_trades = get_order_trades(order_id=new_order['orderId'], pair=pair_name, bot=bot)
UnboundLocalError: local variable 'pair_name' referenced before assignment

Я так понимаю связанно что-то с видимостью переменных.
02.02.2020 12:39
И что делает строка:
order_trades = get_order_trades(order_id=new_order['orderId'], pair=pair_name, bot=bot)

Может её вообще можно убрать?
03.02.2020 14:53
Как вывести результат выполнения ордера не в процентах, а например в USDT. У нас есть cummulativeQuoteQty, сколько затрачено base на покупку quote. Как быть с продажей ? 
                       # Изначально было куплено quote
                            got_qty = float(stock_order_data['executedQty'])

                            # Сколько затрачено base на покупку quote
                            buy_spend = float(stock_order_data['cummulativeQuoteQty'])

                           # Результат выполнения ордера для вывода в лог
                                order_res = 'Убыток' if all_pairs[orders_info[order]['order_pair']]['stop_loss_fixed'] <= orders_info[order]['buy_price'] else 'Доход'
                                log.info("Сработал STOP_LOSS по паре {pair}. {order_res} от продажи составит {r:0.4f}%".format(
                                    pair = orders_info[order]['order_pair'],                                    
                                    order_res = order_res,
                                    r = price_change
                                ))
04.02.2020 14:20
Хотелось бы на выходе получить примерно такое: 
# Результат выполнения ордера для вывода в лог
                        spend = sell_spend - buy_spend
                        order_res = 'Убыток' if all_pairs[orders_info[order]['order_pair']]['stop_loss_fixed'] <= orders_info[order]['buy_price'] else 'Доход'
                        log.info("Сработал STOP_LOSS по паре {pair}. {order_res} от продажи составит {spend} {base} или {r:0.4f}%".format(
                            pair = orders_info[order]['order_pair'],                                    
                            order_res = order_res,
                            spend = spend,
                            base = all_pairs[orders_info[order]['order_pair']]['base'],
                            r = price_change
                        ))
28.06.2020 13:18
Если ордер был не по рынку (а в этом боте не по рынку), то там есть еще и price.
Берем price, берем кол-во монет, перемножаем, вычитаем комиссию, получаем итоговую сумму вырученных денег.
Сравниваем с затраченными на покупку, и вот точное кол-во в USDT или какой-то еще валюте.
06.03.2020 12:05
Друзья, возможно, кому-то будет интересно - я сделал тоже бесплатного бота для Binance https://tradingpanel.pro
Много автоматизаций, полный список тут https://docs.tradingpanel.pro/v/ru/ 
Пользуйтесь на здоровье!
01.05.2020 10:20
Здравствуйте! спасибо за отличный бот , подскажите пж. бот работает на марже? на обычном торговли работает а на марже нет. может я не правильно запускаю. Заранее спасибо!
28.06.2020 13:21
Нет, на этом боте маржи нет, для этого нужно существенно изменять код
04.05.2020 19:18
Добрый день. Как дополнение к этому боту рекомендую использовать Крипто Ассистента https://cryptoassistantbot.com/
06.05.2020 22:44
Здравствуйте.
Подскажите, пожалуйста, реально ли физически реализовать в боте следующий алгоритм? Возможно кто-то делал что-то подобное, буду очень признателен, если есть возможность поделиться.

- бот следит за инд. RSI, при достижении значения, к примеру, <=30, бот ждет пересечения на индикаторах MACD и STOCHRSI, как только оба индикатора "заворачивают" (пересекаются линии), происходит контрольная проверка уровня RSI, и если по прежнему на уровне <=30 - происходит открытие сделки


28.06.2020 13:23
Добрый день,
Для этого есть другая версия бота, с индикаторами https://bablofil.com/bot-dlya-binance-s-indikatorami/
Там можно легко реализовать подобную стратегию
14.09.2020 15:58
Приветствую!
Есть ли готовый бот с такой стратегией (если не ошибаюсь, называется сеткой)?
Покупаем когда курс 100 и сразу создаем несколько ордеров (для примера 3 штуки) на продажу с шагом 1$, т.е. 101,102,103
И тут же ордера на покупку с таким же шагом, 99,98,97.
Если срабатывает ордер на продажу с ценой 101, то создаем ордер на покупку 101-1$, т.е. 100, и тут же создается ордер на продажу по курсу 104.
Или что-то подобное.
19.03.2021 20:26
Здравствуйте, благодарю за проделанную работу. Хотелось бы понять, с какими параметрами нужно вызывать метод account(), чтобы узнать баланс определённой монеты.
Что-то не могу сообразить, чтобы красиво было.
Иначе такой код получается:

balance = bot.account()
balance = balance['balances'][4]
balance_BNB = balance.get('free')
print(balance_BNB)
19.03.2021 22:39
def get_balance(currency):
    balance = bot.account()
    for i in balance['balances']:
        for key in i.keys():
            if i[key] == currency:
                return(i['free'])


print(get_balance('OM'))


Функция для получения баланса валюта 'OM'
17.04.2021 07:54
Добрый день.  Что не так в настройках ?

KeyError: 'balances'
2021-04-17 10:53:42,109 [DEBUG] Получаем все неисполненные ордера по БД
2021-04-17 10:53:42,110 [DEBUG] Неисполненных ордеров в БД нет
2021-04-17 10:53:42,111 [DEBUG] Получаем из настроек все пары, по которым нет неисполненных ордеров
2021-04-17 10:53:42,111 [DEBUG] Найдены пары, по которым нет неисполненных ордеров: ['BTCUSDT', 'USDTETH']
2021-04-17 10:53:42,112 [DEBUG] Работаем с парой BTCUSDT
2021-04-17 10:53:42,114 [DEBUG] Starting new HTTPS connection (1): api.binance.com:443
2021-04-17 10:53:42,504 [DEBUG] https://api.binance.com:443 "GET /api/v3/account?timestamp=1618646019000&signature=8a54815b72fe74ef8fecdc6f0ed50f8f9f3ae3d579e35b654c4a1d9d6136dc4d HTTP/1.1" 401 70
{"code":-2015,"msg":"Invalid API-key, IP, or permissions for action."}
2021-04-17 10:53:42,507 [ERROR] 'balances'
Traceback (most recent call last):
  File "./binance_bot.py", line 434, in <module>
    balance['asset']: float(balance['free']) for balance in bot.account()['balances']
KeyError: 'balances'
2021-04-17 10:53:42,508 [DEBUG] Получаем все неисполненные ордера по БД
2021-04-17 10:53:42,509 [DEBUG] Неисполненных ордеров в БД нет
2021-04-17 10:53:42,510 [DEBUG] Получаем из настроек все пары, по которым нет неисполненных ордеров
2021-04-17 10:53:42,511 [DEBUG] Найдены пары, по которым нет неисполненных ордеров: ['BTCUSDT', 'USDTETH']
2021-04-17 10:53:42,511 [DEBUG] Работаем с парой BTCUSDT
2021-04-17 10:53:42,513 [DEBUG] Starting new HTTPS connection (1): api.binance.com:443


сами настройки 

"""
    Подробная информация о боте на сайте bablofil.ru/bot-dlya-binance
"""
import sqlite3
import logging
import time
import os

from datetime import datetime

from binance_api import Binance
bot = Binance(
    API_KEY='53a1bd71c763ae8049381391b4c2edf53dca930cab8dfd460a5ec931411dedcd',
    API_SECRET='36d3540ab7fdcb6d0d91d25d69fbafc3ef1b42469ebd973f7a90b6f3cfee672a'
)

"""
    Пропишите пары, на которые будет идти торговля.
    base - это базовая пара (BTC, ETH,  BNB, USDT) - то, что на бинансе пишется в табличке сверху
    quote - это квотируемая валюта. Например, для торгов по паре NEO/USDT (base) базовая валюта USDT, NEO (quote) - квотируемая
"""


pairs = [
   {
        'base': 'USDT',
        'quote': 'BTC',
        'offers_amount': 5, # Сколько предложений из стакана берем для расчета средней цены
                            # Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
        'spend_sum': 0.01,  # Сколько тратить base каждый раз при покупке quote
        'profit_markup': 0.005, # Какой навар нужен с каждой сделки? (0.001 = 0.1%)
        'use_stop_loss': False, # Нужно ли продавать с убытком при падении цены
        'stop_loss': 1, # 1% - На сколько должна упасть цена, что бы продавать с убытком
    }, {
        'base': 'ETH',
        'quote': 'USDT',
        'offers_amount': 5, # Сколько предложений из стакана берем для расчета средней цены
                            # Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
        'spend_sum': 11,  # Сколько тратить base каждый раз при покупке quote
        'profit_markup': 0.005, # Какой навар нужен с каждой сделки? (0.001 = 0.1%)
        'use_stop_loss': False, # Нужно ли продавать с убытком при падении цены
        'stop_loss': 2, # 2%  - На сколько должна упасть цена, что бы продавать с убытком

    }
]



BUY_LIFE_TIME_SEC = 180 # Сколько (в секундах) держать ордер на продажу открытым

STOCK_FEE = 0.00075  # Комиссия, которую берет биржа (0.001 = 0.1%)

# Если вы решите не платить комиссию в BNB, то установите в False. Обычно делать этого не надо
USE_BNB_FEES = False

# Получаем ограничения торгов по всем парам с биржи
local_time = int(time.time())
limits = bot.exchangeInfo()
server_time = int(limits['serverTime'])//1000

# Ф-ция, которая приводит любое число к числу, кратному шагу, указанному биржей
# Если передать параметр increase=True то округление произойдет к следующему шагу
def adjust_to_step(value, step, increase=False):
   return ((int(value * 100000000) - int(value * 100000000) % int(
        float(step) * 100000000)) / 100000000)+(float(step) if increase else 0)

# Подключаем логирование
logging.basicConfig(
    format="%(asctime)s [%(levelname)-5.5s] %(message)s",
    level=logging.DEBUG,
    handlers=[
        logging.FileHandler("{path}/logs/{fname}.log".format(path=os.path.dirname(os.path.abspath(__file__)), fname="binance")),
        logging.StreamHandler()
    ])

log = logging.getLogger('')

# Бесконечный цикл программы

shift_seconds = server_time-local_time
bot.set_shift_seconds(shift_seconds)

log.debug("""
    Текущее время: {local_time_d} {local_time_u}
    Время сервера: {server_time_d} {server_time_u}
    Разница: {diff:0.8f} {warn}
    Бот будет работать, как будто сейчас: {fake_time_d} {fake_time_u}
""".format(
    local_time_d = datetime.fromtimestamp(local_time), local_time_u=local_time,
    server_time_d=datetime.fromtimestamp(server_time), server_time_u=server_time,
    diff=abs(local_time-server_time),
    warn="ТЕКУЩЕЕ ВРЕМЯ ВЫШЕ" if local_time > server_time else '',
    fake_time_d=datetime.fromtimestamp(local_time+shift_seconds), fake_time_u=local_time+shift_seconds
))

while True:
    try:
        # Устанавливаем соединение с локальной базой данных
        conn = sqlite3.connect('binance.db')
        cursor = conn.cursor()

        # Если не существует таблиц, их нужно создать (первый запуск)
        orders_q = """
          create table if not exists
            orders (
              order_type TEXT,
              order_pair TEXT,

              buy_order_id NUMERIC,
              buy_amount REAL,
              buy_price REAL,
              buy_created DATETIME,
              buy_finished DATETIME NULL,
              buy_cancelled DATETIME NULL,

              sell_order_id NUMERIC NULL,
              sell_amount REAL NULL,
              sell_price REAL NULL,
              sell_created DATETIME NULL,
              sell_finished DATETIME NULL,
              force_sell INT DEFAULT 0
            );
        """
        cursor.execute(orders_q)

        log.debug("Получаем все неисполненные ордера по БД")

        orders_q = """
            SELECT
              CASE WHEN order_type='buy' THEN buy_order_id ELSE sell_order_id END order_id
              , order_type
              , order_pair
              , sell_amount
              , sell_price
              ,  strftime('%s',buy_created)
              , buy_amount
              , buy_price
            FROM
              orders
            WHERE
              buy_cancelled IS NULL AND CASE WHEN order_type='buy' THEN buy_finished IS NULL ELSE sell_finished IS NULL END
        """
        orders_info = {}


        for row in cursor.execute(orders_q):
            orders_info[str(row[0])] = {'order_type': row[1], 'order_pair': row[2], 'sell_amount': row[3], 'sell_price': row[4],
                                         'buy_created': row[5], 'buy_amount': row[6], 'buy_price': row[7] }
        # формируем словарь из указанных пар, для удобного доступа
        all_pairs = {pair['quote'].upper() + pair['base'].upper():pair for pair in pairs}

        if orders_info:
            log.debug("Получены неисполненные ордера из БД: {orders}".format(orders=[(order, orders_info[order]['order_pair']) for order in orders_info]))

            # Проверяем каждый неисполненный по базе ордер
            for order in orders_info:
                # Получаем по ордеру последнюю информацию по бирже
                stock_order_data = bot.orderInfo(symbol=orders_info[order]['order_pair'], orderId=order)

                order_status = stock_order_data['status']
                log.debug("Состояние ордера {order} - {status}".format(order=order, status=order_status))
                if order_status == 'NEW':
                    log.debug('Ордер {order} всё еще не выполнен'.format(order=order))

                # Если ордер на покупку
                if orders_info[order]['order_type'] == 'buy':
                    # Если ордер уже исполнен
                    if order_status == 'FILLED':
                        log.info("""
                            Ордер {order} выполнен, получено {exec_qty:0.8f}.
                            Создаем ордер на продажу
                        """.format(
                            order=order, exec_qty=float(stock_order_data['executedQty'])
                        ))

                        # смотрим, какие ограничения есть для создания ордера на продажу
                        for elem in limits['symbols']:
                            if elem['symbol'] == orders_info[order]['order_pair']:
                                CURR_LIMITS = elem
                                break
                        else:
                            raise Exception("Не удалось найти настройки выбранной пары " + pair_name)

                        # Рассчитываем данные для ордера на продажу

                        # Имеющееся кол-во на продажу
                        has_amount = orders_info[order]['buy_amount']*((1-STOCK_FEE) if not USE_BNB_FEES else 1)
                        # Приводим количество на продажу к числу, кратному по ограничению
                        sell_amount = adjust_to_step(has_amount, CURR_LIMITS['filters'][2]['stepSize'])
                        # Рассчитываем минимальную сумму, которую нужно получить, что бы остаться в плюсе
                        need_to_earn = orders_info[order]['buy_amount']*orders_info[order]['buy_price']*(1+all_pairs[stock_order_data['symbol']]['profit_markup'])
                        # Рассчитываем минимальную цену для продажи
                        min_price = (need_to_earn/sell_amount)/((1-STOCK_FEE) if not USE_BNB_FEES else 1)
                        # Приводим к нужному виду, если цена после срезки лишних символов меньше нужной, увеличиваем на шаг
                        cut_price = max(
                            adjust_to_step(min_price, CURR_LIMITS['filters'][0]['tickSize'], increase=True),
                            adjust_to_step(min_price, CURR_LIMITS['filters'][0]['tickSize'])
                        )
                        # Получаем текущие курсы с биржи
                        curr_rate = float(bot.tickerPrice(symbol=orders_info[order]['order_pair'])['price'])
                        # Если текущая цена выше нужной, продаем по текущей
                        need_price = max(cut_price, curr_rate)

                        log.info("""
                            Изначально было куплено {buy_initial:0.8f}, за вычетом комиссии {has_amount:0.8f},
                            Получится продать только {sell_amount:0.8f}
                            Нужно получить как минимум {need_to_earn:0.8f} {curr}
                            Мин. цена (с комиссией) составит {min_price}, после приведения {cut_price:0.8f}
                            Текущая цена рынка {curr_rate:0.8f}
                            Итоговая цена продажи: {need_price:0.8f}
                        """.format(
                            buy_initial=orders_info[order]['buy_amount'], has_amount=has_amount,sell_amount=sell_amount,
                            need_to_earn=need_to_earn, curr=all_pairs[orders_info[order]['order_pair']]['base'],
                            min_price=min_price, cut_price=cut_price, need_price=need_price,
                            curr_rate=curr_rate
                        ))

                        # Если итоговая сумма продажи меньше минимума, ругаемся и не продаем
                        if (need_price*has_amount) <float(curr_limits['filters'][3]['minnotional']): """="" """,="" """.format(="" #="" 'buy_order_id':="" 'orderid'="" 'sell_amount':="" 'sell_initial_price':="" 'sell_order_id':="" 'рассчитан="" )="" ))="" ),="" ,="" -="" .format(="" :="" amount="sell_amount," buy_finished="datetime()," buy_order_id=":buy_order_id" cancel="" conn.commit()="" cursor.execute(="" elif="" else:="" exception("""="" good="" if="" in="" log.debug(="" log.debug("прошло="" log.info("создан="" log.warning("не="" min_am="float(CURR_LIMITS['filters'][3]['minNotional'])" need_price="" new_order="bot.createOrder(" new_order:="" new_order['orderid'],="" neworderresptype="FULL" order,="" order_created="" order_status="NEW" order_type="sell" orders="" precision="CURR_LIMITS['baseAssetPrecision']" price="need_price," quantity="sell_amount," raise="" rate="need_price)" recvwindow="5000," sell_amount=":sell_amount," sell_amount,="" sell_created="datetime()," sell_order_id=":sell_order_id," sell_price=":sell_initial_price" set="" side="SELL" symbol="orders_info[order]['order_pair']," till="" time_passed="" timeinforce="GTC" trade_am="(need_price*has_amount)," type="LIMIT" update="" where="" {="" {amount:0.8f},="" {min_am:0.8f}.="" {new_order}".format(new_order="new_order))" {passed:0.2f}".format(passed="time_passed))" {rate:0.8f}'.format(="" {trade_am:0.8f}="" }="" базу="" без="" больше="" были="" в="" возможность="" времени="" времени,="" выводим="" данные="" данных="" держать="" допустимого="" если="" еще="" записываем="" исполнен,="" исполнения="" итоговый="" кол-во="" команду="" курс:="" меньше="" на="" не="" нет,="" ордер="" ордера="" отмены="" отправляем="" ошибки="" ошибок,="" параметрами="" паре="" по="" после="" при="" проверяем="" продажу="" продажу:="" прошло="" размер="" разрешено="" рассчитанными="" с="" сделки="" создался="" создание="" создании,="" создания="" создать="" сообщение="" удалось="" частичного="" чем=""> BUY_LIFE_TIME_SEC:
                            log.info("""Ордер {order} пора отменять, прошло {passed:0.1f} сек.""".format(
                                order=order, passed=time_passed
                            ))
                            # Отменяем ордер на бирже
                            cancel = bot.cancelOrder(
                                symbol=orders_info[order]['order_pair'],
                                orderId=order
                            )
                            # Если удалось отменить ордер, скидываем информацию в БД
                            if 'orderId' in cancel:
                                
                                log.info("Ордер {order} был успешно отменен".format(order=order))
                                cursor.execute(
                                    """
                                      UPDATE orders
                                      SET
                                        buy_cancelled = datetime()
                                      WHERE
                                        buy_order_id = :buy_order_id
                                    """, {
                                        'buy_order_id': order
                                    }
                                 )
                                
                                conn.commit()
                            else:
                                log.warning("Не удалось отменить ордер: {cancel}".format(cancel=cancel))
                    elif order_status == 'PARTIALLY_FILLED':
                        log.debug("Ордер {order} частично исполнен, ждем завершения".format(order=order))

                # Если это ордер на продажу, и он исполнен
                if order_status == 'FILLED' and orders_info[order]['order_type'] == 'sell':
                    log.debug("Ордер {order} на продажу исполнен".format(
                        order=order
                    ))
                    # Обновляем информацию в БД
                    cursor.execute(
                        """
                          UPDATE orders
                          SET
                            sell_finished = datetime()
                          WHERE
                            sell_order_id = :sell_order_id

                        """, {
                            'sell_order_id': order
                        }
                    )
                    conn.commit()
                if all_pairs[orders_info[order]['order_pair']]['use_stop_loss']:
                   
                   if order_status == 'NEW' and orders_info[order]['order_type'] == 'sell':
                     curr_rate = float(bot.tickerPrice(symbol=orders_info[order]['order_pair'])['price'])
                     
                     if (1 - curr_rate/orders_info[order]['buy_price'])*100 >= all_pairs[orders_info[order]['order_pair']]['stop_loss']:
                        log.debug("{pair} Цена упала до стоплосс (покупали по {b:0.8f}, сейчас {s:0.8f}), пора продавать".format(
                           pair=orders_info[order]['order_pair'],
                           b=orders_info[order]['buy_price'],
                           s=curr_rate
                        ))
                        # Отменяем ордер на бирже
                        cancel = bot.cancelOrder(
                          symbol=orders_info[order]['order_pair'],
                             orderId=order
                         )
                        # Если удалось отменить ордер, скидываем информацию в БД
                        if 'orderId' in cancel:
                           log.info("Ордер {order} был успешно отменен, продаем по рынку".format(order=order))
                           new_order = bot.createOrder(
                                  symbol=orders_info[order]['order_pair'],
                                  recvWindow=15000,
                                  side='SELL',
                                  type='MARKET',
                                  quantity=orders_info[order]['sell_amount'],
                            )
                           if not new_order.get('code'):
                              log.info("Создан ордер на продажу по рынку " + str(new_order))
                              cursor.execute(
                                 """
                                   DELETE FROM orders
                                   WHERE
                                     sell_order_id = :sell_order_id
                                 """, {
                                     'sell_order_id': order
                                 }
                              )
                              conn.commit()
                        else:
                           log.warning("Не удалось отменить ордер: {cancel}".format(cancel=cancel))
                     else:
                         log.debug("{pair} (покупали по {b:0.8f}, сейчас {s:0.8f}), расхождение {sl:0.4f}%, panic_sell = {ps:0.4f}% ({ps_rate:0.8f}), продажа с профитом: {tp:0.8f}".format(
                           pair=orders_info[order]['order_pair'],
                           b=orders_info[order]['buy_price'],
                           s=curr_rate,
                           sl=(1 - curr_rate/orders_info[order]['buy_price'])*100,
                           ps=all_pairs[orders_info[order]['order_pair']]['stop_loss'],
                           ps_rate=orders_info[order]['buy_price']/100 * (100-all_pairs[orders_info[order]['order_pair']]['stop_loss']),
                           tp=orders_info[order]['sell_price']
                        ))
                   
                   elif order_status == 'CANCELED' and orders_info[order]['order_type'] == 'sell':
                     # На случай, если после отмены произошел разрыв связи
                     new_order = bot.createOrder(
                                  symbol=orders_info[order]['order_pair'],
                                  recvWindow=15000,
                                  side='SELL',
                                  type='MARKET',
                                  quantity=orders_info[order]['sell_amount'],
                            )
                     if not new_order.get('code'):
                        log.info("Создан ордер на продажу по рынку " + str(new_order))
                        cursor.execute(
                           """
                             DELETE FROM orders
                             WHERE
                               sell_order_id = :sell_order_id
                           """, {
                               'sell_order_id': order
                           }
                        )
                        conn.commit()
        else:
            log.debug("Неисполненных ордеров в БД нет")

        log.debug('Получаем из настроек все пары, по которым нет неисполненных ордеров')

        orders_q = """
            SELECT
              distinct(order_pair) pair
            FROM
              orders
            WHERE
              buy_cancelled IS NULL AND CASE WHEN order_type='buy' THEN buy_finished IS NULL ELSE sell_finished IS NULL END
        """
        # Получаем из базы все ордера, по которым есть торги, и исключаем их из списка, по которому будем создавать новые ордера
        for row in cursor.execute(orders_q):
            del all_pairs[row[0]]

        # Если остались пары, по которым нет текущих торгов
        if all_pairs:
            log.debug('Найдены пары, по которым нет неисполненных ордеров: {pairs}'.format(pairs=list(all_pairs.keys())))
            for pair_name, pair_obj in all_pairs.items():
                log.debug("Работаем с парой {pair}".format(pair=pair_name))

                # Получаем лимиты пары с биржи
                for elem in limits['symbols']:
                    if elem['symbol'] == pair_name:
                        CURR_LIMITS = elem
                        break
                else:
                    raise Exception("Не удалось найти настройки выбранной пары " + pair_name)

                # Получаем балансы с биржи по указанным валютам
                balances = {
                    balance['asset']: float(balance['free']) for balance in bot.account()['balances']
                    if balance['asset'] in [pair_obj['base'], pair_obj['quote']]
                }
                log.debug("Баланс {balance}".format(balance=["{k}:{bal:0.8f}".format(k=k, bal=balances[k]) for k in balances]))
                # Если баланс позволяет торговать - выше лимитов биржи и выше указанной суммы в настройках
                if balances[pair_obj['base']] >= pair_obj['spend_sum']:
                    # Получаем информацию по предложениям из стакана, в кол-ве указанном в настройках
                    offers = bot.depth(
                        symbol=pair_name,
                        limit=pair_obj['offers_amount']
                    )

                    # Берем цены покупок (для цен продаж замените bids на asks)
                    prices = [float(bid[0]) for bid in offers['bids']]

                    try:
                        # Рассчитываем среднюю цену из полученных цен
                        avg_price = sum(prices) / len(prices)
                        # Среднюю цену приводим к требованиям биржи о кратности
                        my_need_price = adjust_to_step(avg_price, CURR_LIMITS['filters'][0]['tickSize'])
                        # Рассчитываем кол-во, которое можно купить, и тоже приводим его к кратному значению
                        my_amount = adjust_to_step(pair_obj['spend_sum']/ my_need_price, CURR_LIMITS['filters'][2]['stepSize'])
                        # Если в итоге получается объем торгов меньше минимально разрешенного, то ругаемся и не создаем ордер
                        if my_amount < float(CURR_LIMITS['filters'][2]['stepSize']) or my_amount < float(CURR_LIMITS['filters'][2]['minQty']):
                            log.warning("""
                                Минимальная сумма лота: {min_lot:0.8f}
                                Минимальный шаг лота: {min_lot_step:0.8f}
                                На свои деньги мы могли бы купить {wanted_amount:0.8f}
                                После приведения к минимальному шагу мы можем купить {my_amount:0.8f}
                                Покупка невозможна, выход. Увеличьте размер ставки
                            """.format(
                                wanted_amount=pair_obj['spend_sum']/ my_need_price,
                                my_amount=my_amount,
                                min_lot=float(CURR_LIMITS['filters'][2]['minQty']),
                                min_lot_step=float(CURR_LIMITS['filters'][2]['stepSize'])
                            ))
                            continue

                        # Итоговый размер лота
                        trade_am = my_need_price*my_amount
                        log.debug("""
                                Средняя цена {av_price:0.8f}, 
                                после приведения {need_price:0.8f}, 
                                объем после приведения {my_amount:0.8f},
                                итоговый размер сделки {trade_am:0.8f}
                                """.format(
                            av_price=avg_price, need_price=my_need_price, my_amount=my_amount, trade_am=trade_am
                        ))
                        # Если итоговый размер лота меньше минимального разрешенного, то ругаемся и не создаем ордер
                        if trade_am < float(CURR_LIMITS['filters'][3]['minNotional']):
                            raise Exception("""
                                Итоговый размер сделки {trade_am:0.8f} меньше допустимого по паре {min_am:0.8f}. 
                                Увеличьте сумму торгов (в {incr} раз(а))""".format(
                                trade_am=trade_am, min_am=float(CURR_LIMITS['filters'][3]['minNotional']),
                                incr=float(CURR_LIMITS['filters'][3]['minNotional'])/trade_am
                            ))
                        log.debug(
                            'Рассчитан ордер на покупку: кол-во {amount:0.8f}, курс: {rate:0.8f}'.format(amount=my_amount, rate=my_need_price)
                        )
                        # Отправляем команду на бирже о создании ордера на покупку с рассчитанными параметрами
                        new_order = bot.createOrder(
                            symbol=pair_name,
                            recvWindow=5000,
                            side='BUY',
                            type='LIMIT',
                            timeInForce='GTC',  # Good Till Cancel
                            quantity="{quantity:0.{precision}f}".format(
                                quantity=my_amount, precision=CURR_LIMITS['baseAssetPrecision']
                            ),
                            price="{price:0.{precision}f}".format(
                                price=my_need_price, precision=CURR_LIMITS['baseAssetPrecision']
                            ),
                            newOrderRespType='FULL'
                        )
                        # Если удалось создать ордер на покупку, записываем информацию в БД
                        if 'orderId' in new_order:
                            log.info("Создан ордер на покупку {new_order}".format(new_order=new_order))
                            cursor.execute(
                                """
                                  INSERT INTO orders(
                                      order_type,
                                      order_pair,
                                      buy_order_id,
                                      buy_amount,
                                      buy_price,
                                      buy_created

                                  ) Values (
                                    'buy',
                                    :order_pair,
                                    :order_id,
                                    :buy_order_amount,
                                    :buy_initial_price,
                                    datetime()
                                  )
                                """, {
                                    'order_pair': pair_name,
                                    'order_id': new_order['orderId'],
                                    'buy_order_amount': my_amount,
                                    'buy_initial_price': my_need_price
                                }
                            )
                            conn.commit()
                        else:
                            log.warning("Не удалось создать ордер на покупку! {new_order}".format(new_order=str(new_order)))

                    except ZeroDivisionError:
                        log.debug('Не удается вычислить среднюю цену: {prices}'.format(prices=str(prices)))
                else:
                    log.warning('Для создания ордера на покупку нужно минимум {min_qty:0.8f} {curr}, выход'.format(
                        min_qty=pair_obj['spend_sum'], curr=pair_obj['base']
                    ))

        else:
            log.debug('По всем парам есть неисполненные ордера')

    except Exception as e:
        log.exception(e)
    finally:
        conn.close()

(на дату 17 04 2021)</float(curr_limits['filters'][3]['minnotional']):></module>
23.04.2021 12:19
Добрый день! Все работало нормально, день-два, потом заметил такое:
2021-04-23 17:54:49,516 [DEBUG] Получаем все неисполненные ордера по БД
2021-04-23 17:54:49,517 [DEBUG] Получены неисполненные ордера из БД: [('37231296
64', 'ETHUSDT')]
2021-04-23 17:54:49,518 [DEBUG] Starting new HTTPS connection (1): api.binance.c
om:443
2021-04-23 17:54:50,059 [DEBUG] https://api.binance.com:443 "GET /api/v3/order?s
ymbol=ETHUSDT&orderId=3723129664&timestamp=1619178891000&signature=6ac675205cb83
ab4fca6bebcf41f220b0bd7326e46236dc7489df87a4bc6ffa1 HTTP/1.1" 400 44
{"code":-2013,"msg":"Order does not exist."}
2021-04-23 17:54:50,061 [ERROR] 'status'
Traceback (most recent call last):
  File "D:\binance_bot_ETH-usdt\binance_bot.py", line 151, in <module>
    order_status = stock_order_data['status']
KeyError: 'status'

И Бот вроде работает, но как-то не так.</module>
30.08.2021 13:39
здравствуйте! а вы можете написать простого бота который будет набирать и раздавать позицию? логика проста,в определённой зоне выставляемой в ручную,все выставляемые в ручную зоны были автоматически выставленные ордера! например выбираю валюту,тезер,евро или рубль,там на каждый бакс ордер например 0,001 биткоин в зоне от 30к до 60к! так же в обратную сторону ! цена флетит и либо раздаёт либо наливает позицию! торговать с помощью робота такое себе удовольствие,сам не научишься и робот принесёт в лучшем случае копеечную прибыль,а когда нужно во флете набрать позицию то вечно мешают роботы которые перед тобой выставляют ордера,ведь ставишь крупный ордер и это усложняет процесс даже не считая того что если стараться то придётся сидеть сутками у компа и подставлять ордера в ручную!
Пожалуйста, Авторизуйтесь что бы оставить свой комментарий