К теме биржи Poloniex я уже несколько раз обращался в других статьях цикла, да и калькулятор валюты на сайте работает, в том числе, и с этой биржей. Пожалуй, пришло время написать бота для торговли и что-то с этой биржи поиметь.
Принцип работы
Общий принцип работы останется таким же, как и у бота для эксмо (ссылки на другие статьи цикла вы можете найти внизу статьи, над комментариями), но добавлен ряд дополнений - например, можно "из коробки" играть на нескольких валютных парах, выставлять отдельные наценки на каждую пару и т.п.
Вот немного более подробная информация:
Бот выискивает медианную цену за указанный период, выставляет ордер на покупку с нужной наценкой, после чего ждет его исполнения или отменяет, если прошло много времени. Если ордер на покупку исполняется, бот продает купленную валюту с наваром. Когда вся купленная валюта продана, всё начинается сначала, и так для каждой нужной валютной пары.
Предварительная настройка
В настройках вы указываете сумму, на которую планируете играть, и бот не выходит за её рамки - например, если собираетесь играть на 0.01 Btc по паре BTC_NXT, то бот будет покупать NXT на 0.01, и ему не важно, сколько еще денег на балансе - все излишки просто копятся.
По законам жанра (и с точки зрения SEO) я должен написать об этом подробную, развернутую статью, с кучей разделов, заголовков и всё такое, но, честно говоря, мне лень. Поэтому выкладываю бота, пару слов о том, что можно и нужно поменять и результаты.
Для настройки работы нужно скачать и установить Python (подробности в этой статье), и установить модуль requests (это тоже описано в той же статье).
После этого, нужно скачать бота (вот ссылка на файл bot.py, скачайте его в любую папку), и поменять настройки под себя.
Эти настройки располагаются в самом верху файла:
<code># ключи API, которые предоставил Poloniex
API_KEY = '' # <------ В эти кавычки вставляем ключ API
# обратите внимание, что добавлена 'b' перед строкой
API_SECRET = b'' <------ Сюда Secret - не убирайте букву b
# Пары, по которым собираемся торговать
PAIRS = {
'BTC_SC' : {
'ORDER_AMOUNT': '0.002', # Сколько валюты 1 использовать в ордере ( в данном случае, 0.002 Btc),
'ORDER_LIFE_TIME': 3, # через сколько минут отменять неисполненный ордер на покупку CURR_1
'PROFIT_MARKUP_DOWN': 0.001, # Какой навар нужен с каждой сделки при покупке (поверх комиссии)? (0.001 = 0.1%). Можно ставить 0
'PROFIT_MARKUP_UP': 0.002, # Какой навар нужен с каждой сделки при продаже (поверх комиссии)? (0.002 = 0.2%)
'MED_PRICE_PERIOD': 15, # За какой период брать среднюю цену (в минутах)
},
'BTC_NXT' : {
'ORDER_AMOUNT': '0.002', # Сколько валюты 1 использовать в ордере ( в данном случае, 0.005 Btc)
'ORDER_LIFE_TIME': 3, # через сколько минут отменять неисполненный ордер на покупку CURR_1
'PROFIT_MARKUP_DOWN': 0.002, # Какой навар нужен с каждой сделки при покупке (поверх комиссии)? (0.001 = 0.1%). Можно ставить 0
'PROFIT_MARKUP_UP': 0.002, # Какой навар нужен с каждой сделки при продаже (поверх комиссии)? (0.002 = 0.2%)
'MED_PRICE_PERIOD': 15, # За какой период брать среднюю цену (в минутах)
},
}</code>
Тут я для эксперимента играл на две пары - BTC_SC и BTC_NXT, но вы можете добавить новые или убрать текущие, если,
например, решите играть на BTC_LSK, то конфиг будет выглядеть так:
PAIRS = {
'BTC_SC' : {
'ORDER_AMOUNT': '0.002', # Сколько валюты 1 использовать в ордере ( в данном случае, 0.002 Btc),
'ORDER_LIFE_TIME': 3, # через сколько минут отменять неисполненный ордер на покупку CURR_1
'PROFIT_MARKUP_DOWN': 0.001, # Какой навар нужен с каждой сделки при покупке (поверх комиссии)? (0.001 = 0.1%). Можно ставить 0
'PROFIT_MARKUP_UP': 0.002, # Какой навар нужен с каждой сделки при продаже (поверх комиссии)? (0.002 = 0.2%)
'MED_PRICE_PERIOD': 15, # За какой период брать среднюю цену (в минутах)
},
'BTC_NXT' : {
'ORDER_AMOUNT': '0.002', # Сколько валюты 1 использовать в ордере ( в данном случае, 0.005 Btc)
'ORDER_LIFE_TIME': 3, # через сколько минут отменять неисполненный ордер на покупку CURR_1
'PROFIT_MARKUP_DOWN': 0.002, # Какой навар нужен с каждой сделки при покупке (поверх комиссии)? (0.001 = 0.1%). Можно ставить 0
'PROFIT_MARKUP_UP': 0.002, # Какой навар нужен с каждой сделки при продаже (поверх комиссии)? (0.002 = 0.2%)
'MED_PRICE_PERIOD': 15, # За какой период брать среднюю цену (в минутах)
},
'BTC_LSK' : {
'ORDER_AMOUNT': '0.01', # Сколько валюты 1 использовать в ордере ( в данном случае, 0.005 Btc)
'ORDER_LIFE_TIME': 30, # через сколько минут отменять неисполненный ордер на покупку CURR_1
'PROFIT_MARKUP_DOWN': 0.002, # Какой навар нужен с каждой сделки при покупке (поверх комиссии)? (0.001 = 0.1%). Можно ставить 0
'PROFIT_MARKUP_UP': 0.005, # Какой навар нужен с каждой сделки при продаже (поверх комиссии)? (0.002 = 0.2%)
'MED_PRICE_PERIOD': 50, # За какой период брать среднюю цену (в минутах)
},
}
Вот так, взял и добавил пару. В верху (ключ словаря BTC_LSK) указал валюту, на которую собираюсь играть.
'ORDER_AMOUNT': '0.01' означает, что на создание ордера я не буду тратить больше чем 0.01 Btc,
'ORDER_LIFE_TIME': 30 означает, что ордера на покупку, которые не выполнились в течении 30 минут будут удалены
'PROFIT_MARKUP_DOWN': 0.002 значит, что при покупке я буду ставить цену на 0.2% ниже вычесленной (это помимо комиссии)
'PROFIT_MARKUP_UP': 0.005 - при продаже купленной валюты планирую получать 0.5% сверху, после вычета комиссии
'MED_PRICE_PERIOD': 50 - цену для покупки/продажи хочу формировать на основе информации о торгов за прошедшие 50 минут по этой паре.
Запуск
Об этом я, кажется, пишу в каждой статье про ботов, ну хотя и ладно.
Мне нравится вариант с запуском через командную строку - запускаете cmd
, в ней пишете python путь_к_файлу_bot.py
. Ну и Enter потом, конечно.
После запуска у вас в папке создастся файл local.db - туда скидываются все результаты, если вдруг надумаете перенести бота в другую папку, не забудьте скопировать этот файл.
Так же в папке появится файл log.txt, в нём вы найдете подробную информацию о торгах бота.
Результаты
Вот тут врать не буду - я сам не понял (с).
Вот таблица с итогами игры примерно за час (тестировал, настраивал, что-то делал, запускал, останавливал).
В общем, я играл на две пары, на каждую выделял 0.002 Btc - итого 0.004 было в игре, получил 0.00003187 - 0.7% процента от вклада за час. Мне это очень понравилось, позже за день он набил еще больше.
Я воодушевился, начал торговлю уже не на две пары, а на 20 пар, на общую сумму 0.04 BTC. Гонял его месяц. Точнее, как гонял.. Бот крутился на сервере, а я занимался своими делами и иногда посматривал баланс. Итог предсказуем - я не озолотился =) Баланс так и прыгал вокруг 0.04 - то опускался до 0.0396, то поднимался до 0.042.
Так что в итоге я его остановил, и сейчас занимаюсь другим проектом. Долго думал, выкладывать ли бота в открытый доступ - он вроде бы сыроват, да и похвастать нечем. С другой стороны, кто-то может его использовать, разобраться в чем причина такого поведения - и, может быть, озолотится =) Может даже и всем остальным расскажет, что нужно поправить, что бы уверенно идти в плюс. Я, может быть, и сам к нему попозже вернусь и что-нибудь добавлю.
В общем, как говорится, используйте на свой страх и риск)
Всем удачи и процветания!
UPD:
В процессе работы бот пишет информацию в локальную базу данных, откуда её можно в удобном виде выгружать в Excel или или делать нужные выборки, если владеете SQL-запросами.
Что бы просматривать данные, установите программу SQLiteStudio, и откройте в ней файл local.db, который автоматически создается при работе бота. Немного полазив там, вы найдете всю информацию по торговле - какие заказы создавались, как исполнялись и т.п. - примеры на скриншоте:
И немного разбредовки:
1. Поле order_type меняется, при создании ордера на покупку там написано buy, если ордер выполняется и создается ордер на продажу, там пишется sell.
2. order_pair - на какую пару создан ордер
3. buy_order_id - сюда записывается id созданного ордера на покупку
4. buy_initial_amount - сколько изначально планировалось закупить
5. buy_initial_price - по какому курсу планировалась закупка
6. buy_created - время создания ордера на покупку
7. buy_finished - если ордер на покупку выполнен, сюда пишется во сколько
8. buy_cancelled - если ордер на покупку отменен, сюда пишется во сколько
9. buy_final_amount - у вас такого не будет, оно у меня исторически осталось
10. sell_order_id - id созданного ордера на продажу
11. sell_amount - кол-во к продаже
12. sell_initial_price - курс продажи
13. sell_final_price - у вас тоже не будет этого поля
14.sell_created - когда и во сколько создан ордер на продажу
15. sell_finished - когда и во сколько ордер на продажу был выполнен
Теперь про экспорт в Excel:
1. Инструменты-Экспорт
2. Ставим галку на "Одну таблицу"
3. Снимаете галки со всего, кроме данных, и выбираете таблицу orders
4. Оставляете формат CSV и указываете, куда его сохранить.
5. Открываете сохраненный файл в Экселе и делаете с ним, что хотите.
Там в настройках (в конфиге) есть параметр
'ORDER_LIFE_TIME': 3,
Это значит, отменять неисполненный ордер через три минуты. Если хотите, например, 15 минут, поставьте
'ORDER_LIFE_TIME': 15,
Я выложил код такого же бота, но закомментировал две строки - они подавляли вывод ошибок и позволяли боту перезапускаться. Вы можете скачать его здесь -
https://bablofil.ru/static/poloniex/bot_db.py, или самостоятельно закомментировать строки 520 и 521 и запустить.
После того как в этой версии бота возникнет ошибка, бот остановится, а ошибка будет более информативной, и можно будет уже разобраться и поправить.
Насчет стратегии Мартингейла, хочу отметить что не очень вижу как ее применить - кол-во ставок то стремиться к бесконечности, разве что их ограничены суммой, но ее может не хватить для ловли "выигрышной комбинации". И второе - матожидание этой стратегии = 0, то ест надо во время спрыгнуть, что-бы не словить это ожидание)
В этом алгоритме подразумевается, что ордера, созданные ботом, никто, кроме бота отменять не может. Поэтому бот полагает, что если заказа, который он создавал, нет в открытых, значит он исполнен. Вот и сейчас он думает, что ордер исполнен, хотя, по факту, был отменен. Тут есть два варианта - либо его действительно кто-то отменил, либо бот отправил команду на его отмену, но произошел сетевой сбой, на бирже ордер отменился, а боту ответ об этом не пришел, и он думает что отмена не удалась, и ордер был-таки распродан..
Решить можно двумя способами - либо остановить бота, удалить файл local.db, привести все на бирже в порядок руками и запустить снова - "с чистого листа". Либо остановить бота, открыть local.db в sqlitestudio (описание в статье), найти в табличке этот ордер, проставить в поле buy_cancelled любую дату (скопированную с другого поля), сохранить (зеленая галочка сверху), и запустить бота - тогда он просто продолжит работу.
Иногда только одна - 2.7+.
Для бота нужна третья ветка.
Если бот запускается через команду python, то выполняется версия 2.7, и там сложно с юникодом, и вообще она работать не будет, запускайте как то так:
python3 ./bot.py
Создало странноватый ордер на покупку. Что в нем странного - цена в 2 раза ниже текущей, хотя я в конфиге указал 0,1%
Скрин http://clip2net.com/s/3N4MEp7
Еще предлагаю доработать бота наличием тестового режима - все тоже самое, но бер реальных покупок/продаж. Так было бы проще обкатывать настройки конфига.
если так, тогда в коде иметь возможность его отключать, пока что сменил
l = open(LOG_FILE, 'a')
на
l = open(LOG_FILE, 'w')
будут только последние записи, но хоть не будет раздуваться...
понаблюдаем
интересны, очень, ваши результаты.
сам думаю запустить этого бота на полоникс.
Вообще подобные боты используются брокерскими компаниями и различными крупными финансовыми институтами для автоматизации торговли и выполнении конкретных задач. Например без шума за неделю закупить битков на круглую сумму. На криптобиржах да и обычных биржах боты выполняют 80% работы и чем больше организация его поддерживает, тем более он сложный и навороченный. В разработках ботов на регулярной основе занимаются группы дорогих программистов, трейдеров и финансистов, и путь на который претендуют эти строчки кодов в перспективе должны быть переработаны в тех сложных больших ботов гигантов, которые ворочают миллионы. Или остановиться на каком то своем скромном уровне. Остановившейся робот всегда будет иметь какие-то недоработки, баги и места для улучшений. Так всегда.
В целом дорогу осилит идущий. Тот кто хочет что-то разработать и торговать прибыльно посвятит этому вопросу все свое свободное время и мозги и обязательно достигнет результатов.
Вполне возможно, хотя здесь нет такой математики, что бы от цикла к циклу использовалась и накапливалась - к флоату в основном приводятся данные, каждый раз полученные с полоникса - это скорее он считает, мы приводим. Тут кстати еще есть момент, что полоникс отрезает хвост после 8го знака после запятой - т.е. если мы посчитали цену в 0.123456789, полоникс воспримет это как 0.12345678. Это опять же не критично при торговле на дорогие пары, но при торговле через USDT, где числа получаются 0.0000000123, обрезка до 0.00000001 может оказаться критичной.
2018-02-04 00:02:32.031250 Неисполненных ордеров в БД нет
2018-02-04 00:02:32.062500 Получаем из настроек все пары, по которым нет неисполненных ордеров
2018-02-04 00:02:32.109375 Найдены пары, по которым нет неисполненных ордеров: ['BTC_ETC', 'BTC_ETH']
2018-02-04 00:02:32.156250 Работаем с парой BTC_ETC
2018-02-04 00:02:32.203125 Получаем результаты последних торгов для определения цены за период с 1517683352.1875 по 1517684552.1875
2018-02-04 00:02:32.828125 Tunnel connection failed: 400 Bad Request
2018-02-04 00:02:32.875000 Получаем все неисполненные ордера по БД
2018-02-04 00:02:32.890625 Неисполненных ордеров в БД нет
2018-02-04 00:02:32.921875 Получаем из настроек все пары, по которым нет неисполненных ордеров
2018-02-04 00:02:32.953125 Найдены пары, по которым нет неисполненных ордеров: ['BTC_ETC', 'BTC_ETH']
2018-02-04 00:02:32.968750 Работаем с парой BTC_ETC
2018-02-04 00:02:33 Получаем результаты последних торгов для определения цены за период с 1517683353.0 по 1517684553.0
2018-02-04 00:02:33.328125 Tunnel connection failed: 400 Bad Request
Такой результат дал с другим прокси
Что-то можно сделать?
Вроде как люди европейские юзают, им помогает
А на предупреждения не обращайте внимания, у него на старте недостаточно данных, если бы каждый писало, то другое дело
Вы не удаляли файл local.db?
Теоретически могло что то произойти, из-за чего бот ордер выставил, а в базу записать не смог, какой-то сетевой сбой или изменился ответ от сервера (Полоникс иногда любит капчу на апи ставить), теперь бот не знает о созданных ордерах.
Если не найдете ничего в логах, попробуйте удалить local.db, продать xrp и запустить бота по новой, посмотрите что будет и что будет в логах писаться