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

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

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

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

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

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

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

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


Реклама


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

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

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

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

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

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

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


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

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

Комментарии: (58)
28.06.2017 22:54
Уважаемый автор, запустил Вашего бота на полониксе. Но, зараза такая, открывает ордера на пару BTC/ETH и закрывает через три минуты. Прошу Вашего совета и помощи. Может поставить меньше промежуток времени в плане отбора статистики по ценам?
28.06.2017 22:55
И еще вопрос, как сделать чтобы бот таблицу как у Вас в самом низу вел автоматом. Заранее спасибо.
29.06.2017 14:32
Добрый день!
Там в настройках (в конфиге) есть параметр
'ORDER_LIFE_TIME': 3,
Это значит, отменять неисполненный ордер через три минуты. Если хотите, например, 15 минут, поставьте
'ORDER_LIFE_TIME': 15,
29.06.2017 15:00
Про таблицу расширил статью - можете брать данные в готовом виде и проводить любую аналитику.
09.07.2017 16:27
Добрый день.  Подскажите,  пожалуйста,  запустила  бот. Он  анализирует ордера, но торговать не хочет.  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" ?? Зараннее благодарю.
09.07.2017 19:12
Добрый день. Ничего он не покупает именно из за этой ошибки, но почему она появляется пока не понятно.
Я выложил код такого же бота, но закомментировал две строки - они подавляли вывод ошибок и позволяли боту перезапускаться. Вы можете скачать его здесь -
https://bablofil.ru/static/poloniex/bot_db.py, или самостоятельно закомментировать строки 520 и 521 и запустить.
После того как в этой версии бота возникнет ошибка, бот остановится, а ошибка будет более информативной, и можно будет уже разобраться и поправить.
14.07.2017 21:31
Привет, почти неделю ковырял этого бота. В изначальном коде несколько важных ошибок допущено было:
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 часа.

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

Ну вроде все. комментируйте и вместе мы построим коммунизм!
20.07.2017 21: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 комиссий, но это тоже можно будет поправить.
22.07.2017 21:29
1. Несколько окон запускал для того чтобы одну и ту же пару по разным стратегиям продаж погонять одновременно. А то бы он сказал, что по этой паре уже есть сделка и все.
2. Часовой пояс не менял. не знаю чем ошибка вызвана.
3. Ошибка про PROFIT_MARKUP_DOWN показывает, что никто кроме меня и разработчика в алгоритм не вникал, если я первый кто заметил :) Но устранима легко любым путем.
4. Про "/", не  знаю где видел, но у меня исходник скачан с "/" был, как пошел по не BTC парам столкнулся с проблемой, решил.
5. Насчет совета тренда и прочих индексов. Активно изучаю биржевые стратегии, так как я дилетант в трейдинге, а торговать в прибыль хочется. На меня сильно повлияли несколько роликов на ютюб и видео уроки технического анализа в екселе (почти 5 ГБ). Пока сделал вывод что торговать нужно по индексам Bolinger + RSI + MACD. В ютюбе много роликов про эти 3 индекса. Но в питоне их нет, нужно подгружать дополнительные 2 библиотеки. Numpy и Matplotlib. После комбинируя ими и меняя их свойства в ручную можно составить хорошую стратегию. На ютюбе даже примеры есть как все использовать, но сам не разобрался. В питоне не силен. Записался на курсы программистов, после планирую дописать программу и комбинировать торговлю исходя их индексов. Касательно стоп лосов или продаже при снижении цены думаю лучше убытки контролировать стратегией по Мартингейлу. Не дать упасть ниже 3% или 10%. Зарабатывать кстати тоже лучше используя уровни Мартингейла. Также нужно учитывать быструю и долгую среднюю скользящую для решения покупать или продавать. Без использования индексов, увы, в трейдинге не продвинуться. Одной скользящей вообще не хватит.
6. Анализатор пар наверно не очень нужен.
Мне в техническом анализе в екселе понравился метод проверки стратегии на исторических данных. вводишь свою стратегию, и запускаешь Solver, который подбирает различные настройки твоих индексов и предлагает самую оптимальную конфигурацию, которая бы в прошлом принесла максимальный доход.
23.07.2017 11:35
5. Есть универсальная библиотека ta-lib, и для неё есть интерфейс питона. Там 150+ индикаторов поддерживаются (https://mrjbq7.github.io/ta-lib/funcs.html), легко и просто работать. Matplotlib это скорее для отрисовки графиков, для автоматизации торговли нужна не сильно, скорее для проверки и визуализации. Скоро статью об этом выложу, с примерами.
30.08.2017 07:37
Влад, добавил кусок пода и параметр для отмены не сработавших ордеров на продажу через какой-то период. К сож в логе он потом фигурирует как выполненный, но это не столь важно.
В параметры пары добавляем строки, например, было так:
'ORDER_AMOUNT': '0.002', # Сколько валюты 1 использовать в ордере ( в данном случае, 0.002 Btc),
'ORDER_LIFE_TIME': 45, # через сколько минут отменять не исполненный ордер на покупку CURR_1

стало так:
'ORDER_AMOUNT': '0.002', # Сколько валюты 1 использовать в ордере ( в данном случае, 0.002 Btc),
'ORDER_DIE_TIME': 1400, # через сколько минут отменять не исполненный ордер на продажу CURR_1, даже с убытком
'ORDER_LIFE_TIME': 15, # через сколько минут отменять не исполненный ордер на покупку CURR_1

И в код, добавить между
if stock_order['orderNumber'] == order:
                        finished = False

и  
break
эти строки:
                        order_created = int(orders_info[order]['buy_created'])
                        time_passed = time.time() - order_created
                        log('Ордер %s всё еще не выполнен' % order)
                        if time_passed > PAIRS[orders_info[order]['order_pair']]['ORDER_DIE_TIME'] * 60:
                            log("Ордер по продажу не выполнен за %s секунд, отменяем" % time_passed)
                            cancel = call_api(command="cancelOrder", orderNumber=order)
                            if 'success' in cancel and cancel['success'] == 1:
                                log("Ордер %s был успешно отменен из за простоя" % order)
                                cursor.execute(
                                    """
                                       UPDATE orders
                                       SET
                                         sell_finished = datetime()
                                       WHERE
                                         sell_order_id = :sell_order_id
                                    """, {
                                        'buy_order_id': order
                                    }
                                )
                                conn.commit()
                            else:
                                log('Какие-то проблемы при отмене не исполненного ордера на продажу', cancel)

То ест получим кусок:
            for order in orders_info:
                finished = True
                for stock_order in stock_orders[orders_info[order]['order_pair']]:
                    if stock_order['orderNumber'] == order:
                        finished = False
                        order_created = int(orders_info[order]['buy_created'])
                        time_passed = time.time() - order_created
                        log('Ордер %s всё еще не выполнен' % order)
                        if time_passed > PAIRS[orders_info[order]['order_pair']]['ORDER_DIE_TIME'] * 60:
                            log("Ордер по продажу не выполнен за %s секунд, отменяем" % time_passed)
                            cancel = call_api(command="cancelOrder", orderNumber=order)
                            if 'success' in cancel and cancel['success'] == 1:
                                log("Ордер %s был успешно отменен из за простоя" % order)
                                cursor.execute(
                                    """
                                       UPDATE orders
                                       SET
                                         sell_finished = datetime()
                                       WHERE
                                         sell_order_id = :sell_order_id
                                    """, {
                                        'buy_order_id': order
                                    }
                                )
                                conn.commit()
                            else:
                                log('Какие-то проблемы при отмене не исполненного ордера на продажу', cancel)                        
                        break
30.08.2017 07:41
Как курсы по питону, приносят свою пользу? (прошел месяц)

Насчет стратегии Мартингейла, хочу отметить что не очень вижу как ее применить - кол-во ставок то стремиться к бесконечности, разве что их ограничены суммой, но ее может не хватить для ловли "выигрышной комбинации". И второе - матожидание этой стратегии = 0, то ест надо во время спрыгнуть, что-бы не словить это ожидание)
19.09.2017 19:27
Влад, не заморачивайся притуливанием библиотек к питону, написал код для вычисления индекса MACD:
def macd(S, L):
    global bid
    EMA_S = 0
    EMA_L = 0
    MACD_LINE = 0
    Signal_Line_Result = 0
    Signal_Line = [[0] for i in range(9)]
    for k in range(len(bid)):
        kn = k
        if k < S:
            EMA_S = EMA_S + (bid[k] - EMA_S) / (k + 1)
            EMA_L = EMA_L + (bid[k] - EMA_L) / (k + 1)			
        elif k >= S:
            EMA_S = ((2 / (1 + S)) * bid[k]) + (((1 - (2 / (1 + S))) * EMA_S))
            if k < L:			
                EMA_L = EMA_L + (bid[k] - EMA_L) / (k + 1)             
            elif k >= L:
                EMA_L = ((2 / (1 + L)) * bid[k]) + (((1 - (2 / (1 + L))) * EMA_L))
                MACD_LINE = EMA_S - EMA_L
                if k < (L + 9):
                    Signal_Line[k - L] = MACD_LINE
                else:
                    n = 0
                    Signal_Line_Result = 0
                    while n < 9:
                        Signal_Line_Result = Signal_Line_Result + Signal_Line[n]		
                        n = n + 1
                    Signal_Line_Result = Signal_Line_Result / 9
                    n = 0
                    while n < 8:					
                        Signal_Line[n] = Signal_Line[n+1]
                        n = n + 1					
                    Signal_Line[8] = MACD_LINE
    if Signal_Line_Result < 0:
        trand_MACD = 1
    else:
        trand_MACD = -1
    return trand_MACD

S и L - индексы короткой и длинной скользящей.
в массиве bid значения (например последних продаж)
функция возвращает или -1 что значит падение, или +1 что значит рост
23.07.2017 20:41
Статья - https://bablofil.ru/python-indicators/
31.08.2017 14:35
Блин, отменить отменил, а как новую создать по актуальной цене - х.з! (((
24.07.2017 22:41
Похоже полоникс капчей закрыл возможность запроса истории сделок?
И через 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>')
25.07.2017 09:42
Странно.. У меня работает, у кого-то капчу просит.
Впрочем, полоникс работает через 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/
26.11.2017 20:28
Здравствуйте. При запросе истории торгов биржа просит ввести каптчу.
2017-11-26 22:41:39.902971 Получаем результаты последних торгов для определения цены за период с 1511691699.9019713 по 1511692899.9019713
2017-11-26 22:41:40.346997 ('Ошибка анализа возвращаемых данных, получена строка', b'html.... и HTML разметка тела страницы ввода каптчи

Пытался обойти указав прокси в коде бота, но выдает ошибку:
2017-11-26 22:40:10.058832 Получаем результаты последних торгов для определения цены за период с 1511691610.0578327 по 1511692810.0578327
2017-11-26 22:40:10.642866 Remote end closed connection without response

Когда-то давно биржа не просила каждый раз вводить каптчу, а с кого-то момента начала. Всегда с любого устройства при обновлении страницы в браузере просит каптчу ввести. Это удручает всегда, а тут еще и бот не работает из-за этого.
Интересно, что на Poloniex раздел Trade History / Market Trades пуст.
В API Documentation Poloniex есть такие инструкции:
Examples
PHP wrapper by compcentral: http://pastebin.com/iuezwGRZ
Python wrapper by oipminer: http://pastebin.com/fbkheaRb
Node.js example of how to connect to the push API (requires autobahn): http://pastebin.com/dMX7mZE0

Push API
The best way to get public data updates on markets is via the push API, which pushes live ticker, order book, trade, and Trollbox updates over WebSockets using the WAMP protocol. In order to use the push API, connect to wss://api.poloniex.com and subscribe to the desired feed.

Может используя их можно обойти эту проблему с каптчей. Как прикрутить Push API и WAMP protocol этот? Или использовать Python wrapper от oipminer.
25.07.2017 18:18
Заработало! спаситель :)
25.07.2017 19:18
здравствуйте, подскажите пожалуйста, запускаю данный бот на пару 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, но увы та же история.
26.07.2017 10:06
Тут смотрите как - у Полоникса нет 100% способа узнать, был ли ордер отменен.. Приходится искать обходные пути.
В этом алгоритме подразумевается, что ордера, созданные ботом, никто, кроме бота отменять не может. Поэтому бот полагает, что если заказа, который он создавал, нет в открытых, значит он исполнен. Вот и сейчас он думает, что ордер исполнен, хотя, по факту, был отменен. Тут есть два варианта - либо его действительно кто-то отменил, либо бот отправил команду на его отмену, но произошел сетевой сбой, на бирже ордер отменился, а боту ответ об этом не пришел, и он думает что отмена не удалась, и ордер был-таки распродан..
Решить можно двумя способами - либо остановить бота, удалить файл local.db, привести все на бирже в порядок руками и запустить снова - "с чистого листа". Либо остановить бота, открыть local.db в sqlitestudio (описание в статье), найти в табличке этот ордер, проставить в поле buy_cancelled любую дату (скопированную с другого поля), сохранить (зеленая галочка сверху), и запустить бота - тогда он просто продолжит работу.
26.07.2017 11:31
спасибо за ответ, попробую.
04.08.2017 12:13
"2017-08-04 02:10:24.849176 2017-08-04 02:10:24.919577 'charmap' codec can't encode characters in position 0-7: character maps to <undefined>"
Запускаю на VDS что означает?</undefined>
01.09.2017 23:34
На хостингах обычно сразу две ветки питона - 2.7 и 3.3
Иногда только одна - 2.7+.
Для бота нужна третья ветка.
Если бот запускается через команду python, то выполняется версия 2.7, и там сложно с юникодом, и вообще она работать не будет, запускайте как то так:
python3 ./bot.py
11.08.2017 13:29
Добрый день.
Ошибку "Permission denied" удалось победить после настройки API на Poloniex. Нужно разрешить доступ к API со всех IP-адресов.
Единственный вопрос, как осадить бота с логами? На одной паре за сутки он нагенерил 15Mb лога. Ошибок при этом нету.

2017-08-11 13:25:44.296053 Ордер 327547958314 всё еще не выполнен
2017-08-11 13:25:44.303062 Получаем из настроек все пары, по которым нет неисполненных ордеров
2017-08-11 13:25:44.328093 По всем парам есть неисполненные ордера
2017-08-11 13:25:44.335101 Получаем все неисполненные ордера по БД
2017-08-11 13:25:44.343115 Получены неисполненные ордера из БД: ['327547958314']

И так по кругу каждую секунду пишет пока ордер не купят.
Заранее благодарен.
01.09.2017 23:36
Да, логи тут общительные)
Как вариант, заменить код

def log(*args):
    l = open(LOG_FILE, 'a')
    print(datetime.now(), *args)
    print(datetime.now(), *args, file=l)
    l.close()

На

def log(*args):
    print(datetime.now(), *args)

тогда будет писать в консоль, но не в файлы
20.08.2017 15:59
Андрей, спасибо за труды, за программку! Запустил бота, интересно. Настроил на 1 пару эфир-биткоин.
Создало странноватый ордер на покупку. Что в нем странного - цена в 2 раза ниже текущей, хотя я в конфиге указал 0,1%
Скрин http://clip2net.com/s/3N4MEp7

Еще предлагаю доработать бота наличием тестового режима - все тоже самое, но бер реальных покупок/продаж. Так было бы проще обкатывать настройки конфига.
22.08.2017 12:48
разобрался, я класик эфир в не класик перепутал))
23.08.2017 20:31
Странный баг - зависание программы через нескольких часов работы. Последние строки лога:
2017-08-23 11:51:27.627491 Получена информация по ордерам с биржи [('BTC_STR', [{'orderNumber': '34772877404', 'type': 'sell', 'rate': '0.00000590', 'startingAmount': '172.61836811', 'amount': '172.61836811', 'total': '0.00101844', 'date': '2017-08-23 07:42:39', 'margin': 0}])]
2017-08-23 11:51:27.658692 Ордер 34772877404 всё еще не выполнен
2017-08-23 11:51:27.674324 Получаем из настроек все пары, по которым нет неисполненных ордеров
2017-08-23 11:51:27.689944 По всем парам есть неисполненные ордера
2017-08-23 11:51:27.705566 Получаем все неисполненные ордера по БД
2017-08-23 11:51:27.705566 Получены неисполненные ордера из БД: ['34772877404']

Есть идеи, где ошибка?
25.08.2017 10:14
а могло виснуть из-за лога в 400Мб?
если так, тогда в коде иметь возможность его отключать, пока что сменил
l = open(LOG_FILE, 'a')
на
l = open(LOG_FILE, 'w')
будут только последние записи, но хоть не будет раздуваться...
понаблюдаем
18.09.2017 16:56
Добрый день!
Андрей, а почему вычисляем медианную цену? Можно же просто использовать цену last
19.09.2017 19:33
тоже интересно. почему медиана?
переделывал на среднее за указанный промежуток времени - ничего вроде не изменилось в результате.
последнее значение я бы не брал, помониторь значения сделок - там разброс такой (видимо от других ботов, или х.з от чего), что легко выставить стоимость ниже видимой last которая в стакане на сайте.
26.10.2017 18:55
А так как то исторически получилось. Компромисс, может быть. Я менял медиану на мин, макс, и т.п. удобно когда можно на лету менять функцию. В некоторых случаях медиана лучше средней - не дает перекоса, т.е. отсекаются данные резких пиков и провалов, которые всегда влияют на среднюю. Last и макс я бы тоже не советовал брать, что бы не попасть в ловушку - есть стратегия по выставлению именно таких цен, рассчитанная на отлов ботов.
25.11.2017 23:10
Здравствуйте, Андрей. Подскажите, пожалуйста, что нужно изменить в коде, чтобы бот не отслеживал ордера на SELL. а выставлял следом на BUY ? Так сказать, получится сетка ордеров на SELL. Спасибо за бота. На EXMO вы мне помогли.Очень доволен. Еще раз спасибо.
26.10.2017 16:56
кто-нибудь смог добиться каких-то положительных результатов на этом боте?
интересны, очень, ваши результаты.
сам думаю запустить этого бота на полоникс.
26.10.2017 19:54
Всем привет, давно не писал сюда, да и заглядывал не часто. Изначально взял то что выложил автор за основу, и каждый день занимался его изучением и доработкой. Алгоритм торговли по индикаторам приносил примерно 40% прибыли в месяц. За основу стратегии взял трендовую линию и индекс РСИ. Если Тренд восходящий и рси <30 покупаем, Если рси >70 продаем. При падающем тренде сначала продаем, потом покупаем. Выставил стоп лосы и тейк профиты. Проработал у меня 2 недели. После я его остановил и занялся разработкой более выгодного и более сложного алгоритма, который почти реализован. Для его составления я привлекаю группу разрозненных программистов, раздаю им тех задания и контролирую выполнения текущих. Никакая группа не знает всего тех задания, да и я сам его до конца не знаю, но пока движемся.
Вообще подобные боты используются брокерскими компаниями и различными крупными финансовыми институтами для автоматизации торговли и выполнении конкретных задач. Например без шума за неделю закупить битков на круглую сумму. На криптобиржах да и обычных биржах боты выполняют 80% работы и чем больше организация его поддерживает, тем более он сложный и навороченный. В разработках ботов на регулярной основе занимаются группы дорогих программистов, трейдеров и финансистов, и путь на который претендуют эти строчки кодов в перспективе должны быть переработаны в тех сложных больших ботов гигантов, которые ворочают миллионы. Или остановиться на каком то своем скромном уровне. Остановившейся робот всегда будет иметь какие-то недоработки, баги и места для улучшений. Так всегда.
В целом дорогу осилит идущий. Тот кто хочет что-то разработать и торговать прибыльно посвятит этому вопросу все свое свободное время и мозги и обязательно достигнет результатов.
01.04.2018 20:50
Как-то надменно и не в тему про использование и улучшение того "...... что выложил автор". Слабо выложить код ".......стратегии взял трендовую линию и индекс РСИ"???
05.11.2017 17:37
Покупайте и продавайте биткоины рядом с вами Моментально. Безопасно. Анонимно. Торговать #bitcoin в 15177 городах и 248 странах. https://localbitcoins.net/country/US?ch=f5vs
26.11.2017 12:59
Здравствуйте, Андрей. Подскажите, пожалуйста, что нужно изменить в коде, чтобы бот не отслеживал ордера на SELL. а выставлял следом на BUY ? Так сказать, получится сетка ордеров на SELL. Спасибо за бота. На EXMO вы мне помогли.Очень доволен. Еще раз спасибо.
27.11.2017 14:10
Не могу понять что не так? Бот с вашими настройками уже двое суток не открыл ни одну сделку? В логе посмотрел, цена покупки стоит 0,0095 а на бирже в это время 0,0093, что не так в Ваших настройках?
05.12.2017 13:33
Здравствуйте, Андрей. Подскажите, пожалуйста, что нужно изменить в коде, чтобы бот не отслеживал ордера на SELL. а выставлял следом на BUY ? Так сказать, получится сетка ордеров на SELL. Спасибо .
25.12.2017 07:47
Добрый день, подскажите? как прикрутить к боту аналитику от бота который для bittrex.
09.01.2018 08:10
Привет Андрей. Такой вопрос, возможно есть смысл поменять в коде float на decimal?, как мне представляется при использовании float - (складывать, вычитать, делить и умножать) — ошибка будет нарастать и рано или поздно превысит критический уровень
09.01.2018 09:27
Добрый день.
Вполне возможно, хотя здесь нет такой математики, что бы от цикла к циклу использовалась и накапливалась - к флоату в основном приводятся данные, каждый раз полученные с полоникса - это скорее он считает, мы приводим. Тут кстати еще есть момент, что полоникс отрезает хвост после 8го знака после запятой - т.е. если мы посчитали цену в 0.123456789, полоникс воспримет это как 0.12345678. Это опять же не критично при торговле на дорогие пары, но при торговле через USDT, где числа получаются 0.0000000123, обрезка до 0.00000001 может оказаться критичной.
03.02.2018 21:50
2018-02-03 23:45:52.500000 Получаем все неисполненные ордера по БД
2018-02-03 23:45:52.546875 Неисполненных ордеров в БД нет
2018-02-03 23:45:52.578125 Получаем из настроек все пары, по которым нет неисполненных ордеров
2018-02-03 23:45:52.593750 Найдены пары, по которым нет неисполненных ордеров: ['BTC_ETC']
2018-02-03 23:45:52.625000 Работаем с парой BTC_ETC
2018-02-03 23:45:52.656250 Получаем результаты последних торгов для определения цены за период с 1517682352.65625 по 1517683552.65625
2018-02-03 23:45:53.625000 ('Ошибка анализа возвращаемых данных, получена строка', 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" pre="" капчу?="" кода="" на="" не="" помогла="" понимаю,="" прокси="" просит="" смена="" так="">
									</stop></lineargradient></g></g></g></g></svg></div></body></html>
03.02.2018 21:50
так понимаю, тоже просит капчу.. в коде менял на вход через прокси не помогло
03.02.2018 22:02
2018-02-04 00:02:31.968750 Получаем все неисполненные ордера по БД
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


Такой результат дал с другим прокси

Что-то можно сделать?
05.02.2018 07:53
Прокси не подходит, пробуйте другие.
Вроде как люди европейские юзают, им помогает
11.02.2018 17:01
Подскажите пожалуйста, то нужно поменять в коде, чтобы быт пытался купить по цене last?
11.02.2018 17:01
*бот)
11.02.2018 17:20
Самое простое обходное решение заменить 
buy_price = median(buy_prices)
на
buy_price = median(buy_prices[0])

тогда бот будет брать последнюю цену покупки
Так же можно заменить 
trades = call_api(api_url='https://poloniex.com/public?command=returnTradeHistory&currencyPair=%s&start=%s&end=%s' % (pair, start_time, end_time))
                log("Получено %s записей" % len(trades))

                buy_prices  = []

                for trade in trades:
                    if trade['type'] == 'buy':
                        buy_prices.append(float(trade['rate']))



                if not buy_prices:
                    log('Не удалось получить цены продаж за период (не было сделок на покупку), пропускаем пару')
                else:
                    buy_price = median(buy_prices)
На
trades = call_api(api_url='https://poloniex.com/public?command=returnTradeHistory&currencyPair=%s&start=%s&end=%s' % (pair, start_time, end_time))
                log("Получено %s записей" % len(trades))

                if not buy_prices:
                    log('Не удалось получить цены продаж за период (не было сделок на покупку), пропускаем пару')
                else:
                    buy_price = float(buy_prices[0]['rate'])

Что бы брать любую последнюю цену. В любом случае, к выбранной цене добавятся модификаторы комиссии, и она немного изменится
12.02.2018 03:19
Добрый день, Андрей!
Попробовал оба варианта. В первом появляется ошибка "'float' object is not iterable", а во втором "Please specify a currency pair."
15.02.2018 09:20
Надо будет движок сайта подправить, в общем вот тут
returnTradeHistory&currencyPair=%s&start=%s&end=%s
не должно быть точек с запятыми, они лишние, их нужно убрать (
13.01.2019 17:01
Более продвинутую версию этого бота можно бесплатно получить тут https://forum.bablofil.ru/files/file/5-poloniex_macd/
А статья, описывающая изменения, здесь https://bablofil.ru/macd-python-stock-bot/
20.09.2019 07:22
Что то пошло не так :)
Бот не минуты не ждёт крутит по кругу сообщения одни и те-же (меняется только время сервера и nonce).
еще момент при запуске выдает такое :

Warning (from warnings module):
  File "E:\min\BAS\python_bots\polo\poloniex_macd.py", line 63
    idx = numpy.argwhere(numpy.diff(numpy.sign(macd - macdsignal)) != 0).reshape(-1) + 0
RuntimeWarning: invalid value encountered in sign

показывает 1 раз и работает дальше в цикле
24.09.2019 09:00
А зачем ему ждать, ему же нужно проверять состояние ордеров и всего такого, минута это иногда много
А на предупреждения не обращайте внимания, у него на старте недостаточно данных, если бы каждый писало, то другое дело
15.01.2020 16:26
Почему бот продаёт не все монеты? Может я логику не понимаю. Бот выставляет ордер на покупку монеты. Когда ордер исполнится (не рассматриваем отмену ордера по таймауту) бот ВСЕ купленные монеты должен выставлять на продажу. А у меня за 2 суток на паре XRP_BTC на балансе валяется 7 XRP. тупо на балансе, а не в ордере. Сам ничего не покупал. Специально для теста слил всё по это монете.
16.01.2020 06:43
Странно, а в логах что пишет?
Вы не удаляли файл local.db?
Теоретически могло что то произойти, из-за чего бот ордер выставил, а в базу записать не смог, какой-то сетевой сбой или изменился ответ от сервера (Полоникс иногда любит капчу на апи ставить), теперь бот не знает о созданных ордерах.
Если не найдете ничего в логах, попробуйте удалить local.db, продать xrp и запустить бота по новой, посмотрите что будет и что будет в логах писаться
17.01.2020 15:43
Не настолько хорошо знаю питон чтобы искать в логах странности. Да и логи по этому боту обширные)) удалю базу, всё продам и начну с нуля. Буду посмотреть.
Пожалуйста, Авторизуйтесь что бы оставить свой комментарий