Купи-продай-навари - бот для биржи Poloniex

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

Принцип работы

Общий принцип работы останется таким же, как и у бота для эксмо (ссылки на другие статьи цикла вы можете найти внизу статьи, над комментариями), но добавлен ряд дополнений - например, можно "из коробки" играть на нескольких валютных парах, выставлять отдельные наценки на каждую пару и т.п.

Вот немного более подробная информация:

Если у кого-то картинки выглядят убого, нажмите правой кнопкой на картинку и выберите "открыть в новой вкладке". Я знаю о проблеме, но пока-что её не решал.

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



Предварительная настройка

В настройках вы указываете сумму, на которую планируете играть, и бот не выходит за её рамки - например, если собираетесь играть на 0.01 Btc по паре BTC_NXT, то бот будет покупать NXT на 0.01, и ему не важно, сколько еще денег на балансе - все излишки просто копятся.

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

Для настройки работы нужно скачать и установить Python (подробности в этой статье), и установить модуль requests (это тоже описано в той же статье).

После этого, нужно скачать бота (вот ссылка на файл bot.py, скачайте его в любую папку), и поменять настройки под себя. 

UPD: Хм, попробовал сам скачать, браузер выдал предупреждение об опасности при скачивании - в общем-то логично. на всякий случай скажу - файл нормальный, вирусов нет и быть не может, качайте смело. Ну или не качайте, ваше право :)

Эти настройки располагаются в самом верху файла:


# ключи 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, # За какой период брать среднюю цену (в минутах)
    },
}

Тут я для эксперимента играл на две пары - 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. Открываете сохраненный файл в Экселе и делаете с ним, что хотите.



Последнее изменение:


Крипто-кошельки для помощи и благодарности проекту:

Bitcoin адрес проекта: [[address]]

Перевод на сумму [[value]] BTC получен. Спасибо!.
[[error]]

Ethereum адрес проекта: [[address]]



Комментарии
28.06.2017 22:54:16
Уважаемый автор, запустил Вашего бота на полониксе. Но, зараза такая, открывает ордера на пару BTC/ETH и закрывает через три минуты. Прошу Вашего совета и помощи. Может поставить меньше промежуток времени в плане отбора статистики по ценам?
ПроголосоватьПроголосовать
0 0
28.06.2017 22:55:08
И еще вопрос, как сделать чтобы бот таблицу как у Вас в самом низу вел автоматом. Заранее спасибо.
ПроголосоватьПроголосовать
0 0
29.06.2017 15:00:35
Про таблицу расширил статью - можете брать данные в готовом виде и проводить любую аналитику.
ПроголосоватьПроголосовать
0 0
29.06.2017 14:32:20
Добрый день!
Там в настройках (в конфиге) есть параметр
'ORDER_LIFE_TIME': 3,
Это значит, отменять неисполненный ордер через три минуты. Если хотите, например, 15 минут, поставьте 
'ORDER_LIFE_TIME': 15,
ПроголосоватьПроголосовать
0 0
09.07.2017 16:27:41
Добрый день.  Подскажите,  пожалуйста,  запустила  бот. Он  анализирует ордера, но торговать не хочет.  2017-07-09 16:14:31.648889 Работаем с парой BTC_SC
2017-07-09 16:14:31.663890 Получаем результаты последних торгов для определения цены за период с 1499594071.66389 по 1499595271.66389
2017-07-09 16:14:32.129916 Получено 166 записей
2017-07-09 16:14:32.180919 Медианная цена покупки = 0.00000411, с наценкой 0.001 и комиссией биржи 0.0015 курс составит 0.00000412
2017-07-09 16:14:32.200920 Итого собираемся купить 485.40449363 SC по курсу 0.00000412.
                           После вычета комиссии останется 484.67638689 SC, которые продадим по курсу 0.00000413.
                           Итого на баланс упадет 0.00000399 BTC
                           
2017-07-09 16:14:38.713293 Permission denied.
2017-07-09 16:14:38.729294 Получаем все неисполненные ордера по БД
2017-07-09 16:14:38.744294 Неисполненных ордеров в БД нет
2017-07-09 16:14:38.754295 Получаем из настроек все пары, по которым нет неисполненных ордеров
  Деньги на счету есть. И что значит "2017-07-09 16:14:38.713293 Permission denied" ?? Зараннее благодарю.
ПроголосоватьПроголосовать
0 0
09.07.2017 19:12:57
Добрый день. Ничего он не покупает именно из за этой ошибки, но почему она появляется пока не понятно. 
Я выложил код такого же бота, но закомментировал две строки - они подавляли вывод ошибок и позволяли боту перезапускаться. Вы можете скачать его здесь -
 https://bablofil.ru/static/poloniex/bot_db.py, или самостоятельно закомментировать строки 520 и 521 и запустить.
После того как в этой версии бота возникнет ошибка, бот остановится, а ошибка будет более информативной, и можно будет уже разобраться и поправить.
ПроголосоватьПроголосовать
0 0
14.07.2017 21:31:23
Привет, почти неделю ковырял этого бота. В изначальном коде несколько важных ошибок допущено было:
1. 'PROFIT_MARKUP_DOWN': 0.001 Этот параметр нужно писать с минусом, а то он пытается купить еще дороже чем ему предлагают. Правильно так: 'PROFIT_MARKUP_DOWN': -0.001
2. Пары правильно писать так как в текстовом образце, а не в файле по ссылке. через "_". Вот таким способом BTC_SC, а не через BTC/SC. Не знаю почему с BTC парами ошибка не важно, но с парами других валют ошибка критична.
3. Смотрел другие боты, текущий алгоритм совсем не учитывает тренд, по этому на падающем рынке или при коррекции курса, бот не может продать и зависает с валютой до лучших времен. В ганботе например цена закупа и продажи учитывает тренд и ведет себя умней. На коротких сделках торговля будет идти, пока значение тренда можно не учитывать, но только рынок начнет падать и мы попали.
4. Важно в алгоритме предусмотреть регистрацию убытков. Если все таки свершилась коррекция и у бота нет возможности в ближайшие дни продать по желаемому курсу, чтоб не "висеть" нужно продать разок в убыток и торговать по новым реалиям.
5. Секунды почему то сами собой стали малы для полоникса, и появилась ошибка что наше время меньше чем минимальное время сервера. Нашел, что время нужно умножать не на 1000, а на 1000000. Вместо "payload = {'nonce': int(round(time.time()*1000))}" верно "payload = {'nonce': int(round(time.time()*1000000))}"
6. Таймаут поставил на 0.3 так как запускается сразу несколько окон и опасян, что забанят.

Отдельно хочу добавить ,что код выдает непонятные ошибки, в которых трудно разобраться и периодически приходилось брать правильный скачанных исходник и идти опять от него. Например бот ругается на лишнее нажатие кнопки ТАБ или нечаянно оставленную запятую. На знак равно ругался, что индекс ошибка. Не стал выяснять, просто взял и с исходника все переписал аккуратно.
В целом бот рабочий даже в текущей версии, но его лучше запускать на крупные сделки. -7% при закупе, +15% при покупке (так как цена формируется относительно цены закупа, не относительно средней) и время анализа 240 минут само то.

Хорошо было бы добавить анализатор и советчик пар. Чтоб бот мог пробежать по парам и предложить пары с растущим трендом, с высокой волотильностью и нормальной стоимостью. за последние 24 часа.

Еще где нибудь велась бы статистика, сколько заработали со сделки, сколько обернули, итд. а то через полоникс работу нескольких разных роботов вместе смотреть каша получается.

Ну вроде все. комментируйте и вместе мы построим коммунизм!
ПроголосоватьПроголосовать
1 0
20.07.2017 21:16:16
Ого, сколько всего!

Спасибо за анализ и предложения.
1. Тут очевидно ошибка сложения, поэтому поменял в двух исходниках 
curr_rate = buy_price + buy_price*float(STOCK_FEE+PAIRS[pair]['PROFIT_MARKUP_DOWN'])
на
curr_rate = buy_price + buy_price*float(STOCK_FEE-PAIRS[pair]['PROFIT_MARKUP_DOWN'])
(плюс на минус).
Теперь можно снова писать без минуса, так, мне кажется, удобнее
2. Тут не совсем понял - и там и там пары указываются через "_",  т.к. по этому знаку в дальнейшем идет разбиение на базовую и конвертируемую валюту, а так же так требует API - уточните, пожалуйста, где используется "/", я исправлю.
3. А как бы вы посоветовали учитывать тренд? Сейчас в этом боте используется медиана, чего явно недостаточно, но и индикаторов существует 150+ штук. Ого, ганбот стоит 0.1 BTC, лихо!)) https://bitcointalk.org/index.php?topic=1715214.0 
И, насколько я понимаю, он использует EMA1 и EMA2 и Bollinger Band, в принципе реально прикрутить если это работает..
4. Тут есть три варианта, все сомнительные, но тем не менее можно добавить:
4.1 - Stop loss - продавать, если цена упала ниже...  
4.2 - Продавать, если не удалось продать в течении ....
4.3. - Продавать, если не удалось продать в течении .... и цена упала на ...
Это может быть параметром конфига пары, что то вроде
STOP_LOSS = 5 # (%)  от цены выставленного селла
или 
MARKET_SELL_TIMEOUT = 300 # минут от выставления селла
и т.п.
5. Тут у вас часовой пояс может изменился или вроде того.. Умножать на 1000000 это радикальный шаг - на полониксе он может и прокатит, но на других биржах есть максимальный лимит этого значения, иногда 4 млрд. с небольшим, с шагом в миллион вы скоро превысите максимальное значение и придется создавать новую учетку) Повторяюсь, не факт что это касается полоникса, скорее всего нет. Но обычно лучше сначала перевести часы на прежнее значение, прежде чем умножать. 
6. А зачем несколько окон, если можно в одном боте торговать на нужные пары? Но дело ваше, конечно. У полоникса есть глобальное ограничение - 6 запросов в секунду, так что если у вас 6 окон, то надо запрос ограничивать до секунды, три окна - полсекунды и т.п. Тогда гарантированно не забанят. 

Насчет ошибок - Python это такой язык, для которого жизненно важны отступы, даже если они визуально одинаковые - например, знак табуляции и 4 пробела для человека выглядят одинаково, но для интерпретатора это либо знак табуляции, либо 4 знака пробела - разные вещи - и он начинает ругаться. Тут ничего не поделать, надо набить руку.

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

Статистика ведется в файле локальной базы данных, там вся история - что бот покупал/продавал, на какие суммы, по каким курсам, посмотрите в статье - можно оттуда брать SQL запросами, а можно выгружать в Excel и строить любую аналитику, которая вам нужна. Там, правда, может быть небольшое расхождение из-за maker/taker комиссий, но это тоже можно будет поправить.
ПроголосоватьПроголосовать
0 0
22.07.2017 21:29:14
1. Несколько окон запускал для того чтобы одну и ту же пару по разным стратегиям продаж погонять одновременно. А то бы он сказал, что по этой паре уже есть сделка и все.
2. Часовой пояс не менял. не знаю чем ошибка вызвана.
3. Ошибка про PROFIT_MARKUP_DOWN показывает, что никто кроме меня и разработчика в алгоритм не вникал, если я первый кто заметил :) Но устранима легко любым путем.
4. Про "/", не  знаю где видел, но у меня исходник скачан с "/" был, как пошел по не BTC парам столкнулся с проблемой, решил.
5. Насчет совета тренда и прочих индексов. Активно изучаю биржевые стратегии, так как я дилетант в трейдинге, а торговать в прибыль хочется. На меня сильно повлияли несколько роликов на ютюб и видео уроки технического анализа в екселе (почти 5 ГБ). Пока сделал вывод что торговать нужно по индексам Bolinger + RSI + MACD. В ютюбе много роликов про эти 3 индекса. Но в питоне их нет, нужно подгружать дополнительные 2 библиотеки. Numpy и Matplotlib. После комбинируя ими и меняя их свойства в ручную можно составить хорошую стратегию. На ютюбе даже примеры есть как все использовать, но сам не разобрался. В питоне не силен. Записался на курсы программистов, после планирую дописать программу и комбинировать торговлю исходя их индексов. Касательно стоп лосов или продаже при снижении цены думаю лучше убытки контролировать стратегией по Мартингейлу. Не дать упасть ниже 3% или 10%. Зарабатывать кстати тоже лучше используя уровни Мартингейла. Также нужно учитывать быструю и долгую среднюю скользящую для решения покупать или продавать. Без использования индексов, увы, в трейдинге не продвинуться. Одной скользящей вообще не хватит.
6. Анализатор пар наверно не очень нужен.
Мне в техническом анализе в екселе понравился метод проверки стратегии на исторических данных. вводишь свою стратегию, и запускаешь Solver, который подбирает различные настройки твоих индексов и предлагает самую оптимальную конфигурацию, которая бы в прошлом принесла максимальный доход.
ПроголосоватьПроголосовать
0 0
23.07.2017 11:35:37
5. Есть универсальная библиотека ta-lib, и для неё есть интерфейс питона. Там 150+ индикаторов поддерживаются (https://mrjbq7.github.io/ta-lib/funcs.html), легко и просто работать. Matplotlib это скорее для отрисовки графиков, для автоматизации торговли  нужна не сильно, скорее для проверки и визуализации. Скоро статью об этом выложу, с примерами.
ПроголосоватьПроголосовать
0 0
23.07.2017 20:41:36
Статья - https://bablofil.ru/python-indicators/
ПроголосоватьПроголосовать
0 0
24.07.2017 22:41:21
Похоже полоникс капчей закрыл возможность запроса истории сделок?
И через tradeapi пробовал, запрашивает капчу :(
Как можно обойти?

Получаем результаты последних торгов для определения цены за период с 1500901843.7973433 по 1500902443.7973433
2017-07-25 01:20:45.123345 ('Ошибка анализа возвращаемых данных, получена строка', b'html\n<html lang="en">\n<head>\n\t<title>Poloniex - Bitcoin/Cryptocurrency Exchange</title>\n\t<meta charset="utf-8"/>\n\t<style>a,body{color:#323A3C}body,h1{padding:0}.footer,.wrapper{text-align:center}body{margin:0;background-color:#04272A;font-family:HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;font-size:18px}a:hover{color:#A57211}h1{text-transform:uppercase;font-size:36px;margin-top:0;font-weight:400}.fine,.footer{font-size:.7em}#logo{min-width:100px;max-width:230px;margin:35px 10px}#content{border-bottom:3px solid #ffab06;background-color:#e5f0e6;padding:40px 10px}.wrapper{background-color:#fff}.fine{margin:22px 0 0}.footer{color:#fff;margin:40px 0}.footer a,.footer a:hover,.footer a:visited{color:#fff;display:inline-block}@media only screen and (max-width:350px){body{font-size:.9em}h1{font-size:1.6em}.fine{font-size:.75em}}p.cf-msg{margin:4px 0}#recaptcha_widget div div{width:auto!important;height:auto!important}</style>\n</head>\n<body>\n\t<div class="wrapper">\n\t\t<svg id="logo" viewbox="0 0 710 110" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">\n\t\t<g>\n\t\t\t<g>\n\t\t\t\t<lineargradient gradientunits="userSpaceOnUse" id="SVGID_1_" x1="685.9" x2="685.9" y1="109.7" y2="2.8">\n\t\t\t\t\t<stop offset="0" style="stop-color:#2A343A"></stop>\n\t\t\t\t\t<stop offset="0.153" style="stop-color:#3C454B"></stop>\n\t\t\t\t\t<stop offset="0.9144" style="stop-color:#444E54"></stop>\n\t\t\t\t\t<stop offset="1" style="stop-color:#4D565C"></stop>\n\t\t\t\t</lineargradient>\n\t\t\t\t<polygon fill="url(#SVGID_1_)" points="679.5,45.2 708.6,1.4 676.9,1.4 663.2,21.3"></polygon>\n\t\t\t\t<lineargradient gradientunits="userSpaceOnUse" id="SVGID_2_" x1="686.7" x2="686.7" y1="109.4" y2="3">\n\t\t\t\t\t<stop offset="0" style="stop-color:#2A343A"></stop>\n\t\t\t\t\t<stop offset="0.153" style="stop-color:#3C454B"></stop>\n\t\t\t\t\t<stop offset="0.9144" style="stop-color:#444E54"></stop>\n\t\t\t\t\t<stop offset="1" style="stop-color:#4D565C"></stop>\n\t\t\t\t</lineargradient>\n\t\t\t\t<polygon fill="url(#SVGID_2_)" points="679.5,65.3 663.2,87.9 678.6,109.4 710.2,109.4"></polygon>\n\t\t\t</g>\n\t\t</g>\n\t\t<g>\n\t\t\t<g>\n\t\t\t\t<g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<lineargradient gradientunits="userSpaceOnUse" id="SVGID_3_" x1="43.7" x2="43.7" y1="109.4" y2="2.4">\n\t\t\t\t\t\t\t<stop offset="0.0023" style="stop-color:#05535C"></stop>\n\t\t\t\t\t\t\t<stop offset="0.2409" style="stop-color:#0C6267"></stop>\n\t\t\t\t\t\t\t<stop offset="0.7032" style="stop-color:#0D6E74"></stop>\n\t\t\t\t\t\t\t<stop offset="0.793" style="stop-color:#1C747B"></stop>\n\t\t\t\t\t\t\t<stop offset="0.9966" style="stop-color:#2D7F86"></stop>\n\t\t\t\t\t\t</lineargradient>\n\t\t\t\t\t\t<path d="M56.727 1.24c10.544 0 18.3 2.6 23.2 7.94c4.929 5.3 7.4 16.6 7.4 27.2 c0 10.683-2.57 23.492-7.704 28.763c-5.134 5.273-12.768 7.909-22.899 7.909H24.343v36.626H0V1.24H56.727z M24.343 19.7 v35.044h24.543c2.752 0 5.02-0.252 6.81-0.755c1.787-0.506 3.207-1.285 4.263-2.338c1.054-1.054 1.789-2.432 2.201-4.126 c0.411-1.696 0.619-11.94 0.619-14.278c0-2.337-0.184-4.367-0.55-6.085c-0.368-1.72-1.079-3.129-2.131-4.23 c-1.057-1.1-2.511-1.914-4.368-2.441c-1.859-0.527-4.299-0.79-7.324-0.79H24.343z" fill="url(#SVGID_3_)"></path>\n\t\t\t\t\t</g>\n\t\t\t\t</g>\n\t\t\t\t<g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<lineargradient gradientunits="userSpaceOnUse" id="SVGID_4_" x1="142.1" x2="142.1" y1="109.4" y2="2.4">\n\t\t\t\t\t\t\t<stop offset="0.0023" style="stop-color:#05535C"></stop>\n\t\t\t\t\t\t\t<stop offset="0.2409" style="stop-color:#0C6267"></stop>\n\t\t\t\t\t\t\t<stop offset="0.7032" style="stop-color:#0D6E74"></stop>\n\t\t\t\t\t\t\t<stop offset="0.793" style="stop-color:#1C747B"></stop>\n\t\t\t\t\t\t\t<stop offset="0.9966" style="stop-color:#2D7F86"></stop>\n\t\t\t\t\t\t</lineargradient>\n\t\t\t\t\t\t<path d="M95.446 36.998c0-6.602 0.791-12.242 2.372-16.916c1.584-4.677 4.035-8.504 7.36-11.485 c3.322-2.979 7.563-5.157 12.722-6.533C123.056 0.7 129.2 0 136.4 0h11.545c7.243 0 13.4 0.7 18.6 2 c5.16 1.4 9.4 3.5 12.7 6.464c3.301 3 5.7 6.8 7.3 11.483c1.535 4.7 2.3 10.4 2.3 17.021v33.876 c0 6.604-0.78 15.24-2.338 19.916c-1.558 4.677-3.988 8.504-7.288 11.484c-3.302 2.98-7.531 5.158-12.69 6.5 c-5.155 1.377-11.335 2.063-18.532 2.063h-11.545c-7.199 0-13.378-0.686-18.533-2.063c-5.159-1.375-9.4-3.553-12.722-6.533 c-3.326-2.98-5.776-6.807-7.36-11.484c-1.581-4.676-2.372-13.313-2.372-19.916V36.998z M141.355 20.8 c-3.847 0-7.099 0.265-9.753 0.792c-2.655 0.528-4.83 1.537-6.523 3.026c-1.693 1.49-2.919 3.586-3.673 6.3 c-0.756 2.705-1.134 9.234-1.134 13.591v21.935c0 4.4 0.4 10.9 1.1 13.557c0.754 2.7 2 4.8 3.7 6.3 c1.693 1.5 3.9 2.5 6.5 3.062c2.654 0.5 5.9 0.8 9.8 0.79h1.566c3.846 0 7.095-0.263 9.75-0.79 c2.657-0.525 4.832-1.535 6.524-3.024c1.693-1.491 2.919-3.588 3.675-6.294c0.755-2.703 1.132-9.233 1.132-13.59V44.399 c0-4.357-0.377-10.874-1.132-13.555c-0.755-2.682-1.97-4.769-3.641-6.259c-1.67-1.489-3.846-2.485-6.522-2.99 c-2.679-0.504-5.94-0.758-9.786-0.758H141.355z" fill="url(#SVGID_4_)"></path>\n\t\t\t\t\t</g>\n\t\t\t\t</g>\n\t\t\t\t<g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<lineargradient gradientunits="userSpaceOnUse" id="SVGID_5_" x1="232" x2="232" y1="109.4" y2="2.4">\n\t\t\t\t\t\t\t<stop offset="0.0023" style="stop-color:#05535C"></stop>\n\t\t\t\t\t\t\t<stop offset="0.2409" style="stop-color:#0C6267"></stop>\n\t\t\t\t\t\t\t<stop offset="0.7032" style="stop-color:#0D6E74"></stop>\n\t\t\t\t\t\t\t<stop offset="0.793" style="stop-color:#1C747B"></stop>\n\t\t\t\t\t\t\t<stop offset="0.9966" style="stop-color:#2D7F86"></stop>\n\t\t\t\t\t\t</lineargradient>\n\t\t\t\t\t\t<path d="M223.349 88.797h41.626v20.835h-65.972V1.24h24.346V88.797z" fill="url(#SVGID_5_)"></path>\n\t\t\t\t\t</g>\n\t\t\t\t</g>\n\t\t\t\t<g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<lineargradient gradientunits="userSpaceOnUse" id="SVGID_6_" x1="316.9" x2="316.9" y1="109.4" y2="2.4">\n\t\t\t\t\t\t\t<stop offset="0.0023" style="stop-color:#05535C"></stop>\n\t\t\t\t\t\t\t<stop offset="0.2409" style="stop-color:#0C6267"></stop>\n\t\t\t\t\t\t\t<stop offset="0.7032" style="stop-color:#0D6E74"></stop>\n\t\t\t\t\t\t\t<stop offset="0.793" style="stop-color:#1C747B"></stop>\n\t\t\t\t\t\t\t<stop offset="0.9966" style="stop-color:#2D7F86"></stop>\n\t\t\t\t\t\t</lineargradient>\n\t\t\t\t\t\t<path d="M270.209 36.998c0-6.602 0.79-12.242 2.372-16.916c1.583-4.677 4.035-8.504 7.359-11.485 c3.325-2.979 7.564-5.157 12.723-6.533C297.819 0.7 304 0 311.2 0h11.545c7.243 0 13.4 0.7 18.6 2 c5.159 1.4 9.4 3.5 12.7 6.464c3.303 3 5.7 6.8 7.3 11.483c1.536 4.7 2.3 10.4 2.3 17.021v33.876 c0 6.604-0.783 15.24-2.341 19.916c-1.558 4.677-3.987 8.504-7.288 11.484c-3.302 2.98-7.531 5.158-12.69 6.5 c-5.157 1.377-11.334 2.063-18.532 2.063h-11.545c-7.199 0-13.377-0.686-18.534-2.063c-5.159-1.375-9.398-3.553-12.723-6.533 c-3.324-2.98-5.776-6.807-7.359-11.484c-1.582-4.676-2.372-13.313-2.372-19.916V36.998z M316.117 20.8 c-3.847 0-7.098 0.265-9.753 0.792c-2.655 0.528-4.83 1.537-6.524 3.026c-1.694 1.49-2.917 3.586-3.673 6.3 c-0.754 2.705-1.132 9.234-1.132 13.591v21.935c0 4.4 0.4 10.9 1.1 13.557c0.756 2.7 2 4.8 3.7 6.3 c1.694 1.5 3.9 2.5 6.5 3.062c2.655 0.5 5.9 0.8 9.8 0.79h1.565c3.845 0 7.096-0.263 9.751-0.79 c2.655-0.525 4.829-1.535 6.524-3.024c1.692-1.491 2.917-3.588 3.673-6.294c0.756-2.703 1.134-9.233 1.134-13.59V44.399 c0-4.357-0.377-10.874-1.134-13.555c-0.755-2.682-1.969-4.769-3.64-6.259c-1.67-1.489-3.845-2.485-6.523-2.99 c-2.678-0.504-5.94-0.758-9.785-0.758H316.117z" fill="url(#SVGID_6_)"></path>\n\t\t\t\t\t</g>\n\t\t\t\t</g>\n\t\t\t\t<g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<lineargradient gradientunits="userSpaceOnUse" id="SVGID_7_" x1="420.8" x2="420.8" y1="109.4" y2="2.4">\n\t\t\t\t\t\t\t<stop offset="0.0023" style="stop-color:#05535C"></stop>\n\t\t\t\t\t\t\t<stop offset="0.2409" style="stop-color:#0C6267"></stop>\n\t\t\t\t\t\t\t<stop offset="0.7032" style="stop-color:#0D6E74"></stop>\n\t\t\t\t\t\t\t<stop offset="0.793" style="stop-color:#1C747B"></stop>\n\t\t\t\t\t\t\t<stop offset="0.9966" style="stop-color:#2D7F86"></stop>\n\t\t\t\t\t\t</lineargradient>\n\t\t\t\t\t\t<path d="M375.152 1.24h27.99l40.551 74v-74h22.83v108.393h-27.99l-40.548-74.828v74.828h-22.833V1.24z" fill="url(#SVGID_7_)"></path>\n\t\t\t\t\t</g>\n\t\t\t\t</g>\n\t\t\t\t<g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<lineargradient gradientunits="userSpaceOnUse" id="SVGID_8_" x1="493.5" x2="493.5" y1="109.4" y2="2.4">\n\t\t\t\t\t\t\t<stop offset="0.0023" style="stop-color:#05535C"></stop>\n\t\t\t\t\t\t\t<stop offset="0.2409" style="stop-color:#0C6267"></stop>\n\t\t\t\t\t\t\t<stop offset="0.7032" style="stop-color:#0D6E74"></stop>\n\t\t\t\t\t\t\t<stop offset="0.793" style="stop-color:#1C747B"></stop>\n\t\t\t\t\t\t\t<stop offset="0.9966" style="stop-color:#2D7F86"></stop>\n\t\t\t\t\t\t</lineargradient>\n\t\t\t\t\t\t<path d="M481.318 1.24h24.343v108.393h-24.343V1.24z" fill="url(#SVGID_8_)"></path>\n\t\t\t\t\t</g>\n\t\t\t\t</g>\n\t\t\t\t<g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<lineargradient gradientunits="userSpaceOnUse" id="SVGID_9_" x1="557.8" x2="557.8" y1="109.4" y2="2.4">\n\t\t\t\t\t\t\t<stop offset="0.0023" style="stop-color:#05535C"></stop>\n\t\t\t\t\t\t\t<stop offset="0.2409" style="stop-color:#0C6267"></stop>\n\t\t\t\t\t\t\t<stop offset="0.7032" style="stop-color:#0D6E74"></stop>\n\t\t\t\t\t\t\t<stop offset="0.793" style="stop-color:#1C747B"></stop>\n\t\t\t\t\t\t\t<stop offset="0.9966" style="stop-color:#2D7F86"></stop>\n\t\t\t\t\t\t</lineargradient>\n\t\t\t\t\t\t<path d="M520.32 1.24h74.881v20.835h-50.539v22.186h48.888v20.7h-48.888v23.836h50.539v20.835H520.32 V1.24z" fill="url(#SVGID_9_)"></path>\n\t\t\t\t\t</g>\n\t\t\t\t</g>\n\t\t\t\t<g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<lineargradient gradientunits="userSpaceOnUse" id="SVGID_10_" x1="637.1" x2="637.1" y1="109.4" y2="2.4">\n\t\t\t\t\t\t\t<stop offset="0.0023" style="stop-color:#05535C"></stop>\n\t\t\t\t\t\t\t<stop offset="0.2409" style="stop-color:#0C6267"></stop>\n\t\t\t\t\t\t\t<stop offset="0.7032" style="stop-color:#0D6E74"></stop>\n\t\t\t\t\t\t\t<stop offset="0.793" style="stop-color:#1C747B"></stop>\n\t\t\t\t\t\t\t<stop offset="0.9966" style="stop-color:#2D7F86"></stop>\n\t\t\t\t\t\t</lineargradient>\n\t\t\t\t\t\t<path d="M672.339 55.437l-38.96 54.196h-31.572l37.754-54.096L603.524 1.24h31.71L672.339 55.4" fill="url(#SVGID_10_)"></path>\n\t\t\t\t\t</g>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t</g>\n\t\t</svg>\n\t\t<div id="content">\n\t\t\t<h1>One More Step</h1>\n\t\t\t<p>Please complete the security check to proceed.</p>\n\n\t\t\t<form action="/cdn-cgi/l/chk_captcha" class="challenge-form" id="challenge-form" method="get">\n  <script async="" data-ray="38393d1209474ec0" data-sitekey="6LfBixYUAAAAABhdHynFUIMA_sa4s-XsJvnjtgB0" data-type="normal" src="/cdn-cgi/scripts/cf.challenge.js" type="text/javascript"></script>\n  <div class="g-recaptcha"></div>\n  <noscript class="cf-captcha-info" id="cf-captcha-bookmark">\n    <div><div style="width: 302px">\n      <div>\n        <iframe frameborder="0" scrolling="no" src="https://www.google.com/recaptcha/api/fallback?k=6LfBixYUAAAAABhdHynFUIMA_sa4s-XsJvnjtgB0" style="width: 302px; height:422px; border-style: none;"></iframe>\n      </div>\n      <div style="width: 300px; border-style: none; bottom: 12px; left: 25px; margin: 0px; padding: 0px; right: 25px; background: #f9f9f9; border: 1px solid #c1c1c1; border-radius: 3px;">\n        <textarea class="g-recaptcha-response" id="g-recaptcha-response" name="g-recaptcha-response" style="width: 250px; height: 40px; border: 1px solid #c1c1c1; margin: 10px 25px; padding: 0px; resize: none;"></textarea>\n        <input type="submit" value="Submit"/>\n      </div>\n    </div></div>\n  </noscript>\n</form>\n\n\n\t\t</div>\n\t</div>\n\t<div class="footer">© Poloniex, Inc. 2016 - Wilmington, DE, USA | <a href="https://poloniex.freshdesk.com/">Contact Support</a></div>\n</body>\n</html>')
ПроголосоватьПроголосовать
0 0
25.07.2017 09:42:07
Странно.. У меня работает, у кого-то капчу просит.
Впрочем, полоникс работает через CloudFlare, печально известную своими приколами, они могут и целую страну отрубить от сайта по ошибке. Обычно, в течении суток они исправляют..
Не помешает сбросить весь кеш в браузере и попробовать посмотреть в режиме инкогнито
Обойти можно используя прокси или впн. Что касается кода, то нужно заменить

conn = http.client.HTTPSConnection(url_o.netloc)
на
conn = http.client.HTTPSConnection("proxy_host", proxy_port)
conn.set_tunnel(url_o.netloc)
Например 
conn = http.client.HTTPSConnection("40.118.240.200", 8080)
conn.set_tunnel(url_o.netloc)

Список прокси можно взять, например, тут https://hidemy.name/ru/proxy-list/
ПроголосоватьПроголосовать
1 0
25.07.2017 18:18:22
Заработало! спаситель :)
ПроголосоватьПроголосовать
0 0
25.07.2017 19:18:14
здравствуйте, подскажите пожалуйста, запускаю данный бот на пару USDT_DASH, но получаю данный результат при работе:
Python 3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:14:34) [MSC v.1900 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> 
 RESTART: C:\Users\Admin\AppData\Local\Programs\Python\Python36-32\ориг\bot.py 
2017-07-25 19:14:59.397163 Получаем все неисполненные ордера по БД
2017-07-25 19:14:59.425957 Получены неисполненные ордера из БД: ['52151393525']
2017-07-25 19:15:00.088651 Получена информация по ордерам с биржи []
2017-07-25 19:15:00.168904 Ордер 52151393525 выполнен, создаем ордер на продажу
2017-07-25 19:15:00.772909 Order not found, or you are not the person who placed it.
2017-07-25 19:15:00.807021 Получаем все неисполненные ордера по БД
2017-07-25 19:15:00.820055 Получены неисполненные ордера из БД: ['52151393525']
2017-07-25 19:15:01.380751 Получена информация по ордерам с биржи []
2017-07-25 19:15:01.469716 Ордер 52151393525 выполнен, создаем ордер на продажу
2017-07-25 19:15:03.068370 Order not found, or you are not the person who placed it.
2017-07-25 19:15:03.104188 Получаем все неисполненные ордера по БД
2017-07-25 19:15:03.120446 Получены неисполненные ордера из БД: ['52151393525']
2017-07-25 19:15:06.161616 Получена информация по ордерам с биржи []
2017-07-25 19:15:06.194739 Ордер 52151393525 выполнен, создаем ордер на продажу
2017-07-25 19:15:08.528541 Order not found, or you are not the person who placed it.
2017-07-25 19:15:08.582032 Получаем все неисполненные ордера по БД
2017-07-25 19:15:08.605091 Получены неисполненные ордера из БД: ['52151393525']
2017-07-25 19:15:09.172821 Получена информация по ордерам с биржи []
2017-07-25 19:15:09.243862 Ордер 52151393525 выполнен, создаем ордер на продажу
2017-07-25 19:15:10.716712 Order not found, or you are not the person who placed it.

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