Талиб, Питон и индикаторы. Всё просто

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

О чем пойдет речь

В этой статье мы мельком коснемся индикаторов, и, на примере биржи Полоникс, построим такие же, используя язык программирования Python и библиотеку TA-Lib.

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

Вступление. Индикаторы

Торговля была бы намного проще и приятнее, если бы вы знали будущее. Вы бы закупались в нужный момент, и продавали на самом пике.. Знакомая мысль?

Тысячи людей пытались найти закономерности рынка, выстроить математические модели для расчета падения и роста курса, кое-кто потратил на это почти всю жизнь, и многие более-менее приблизились к решению. Более-менее - это значит что они теперь знают о бирже немного больше других. Но, когда вопрос касается денег, даже 0.5% знания могут принести серьезные дивиденды... Если эти знания истинны, конечно.

Существуют такие вещи, как индикаторы. Если говорить упрощенно, то индикатор - это математическая функция, которая принимает на вход историю торгов за определенный период, и возвращает некоторый прогноз. Некоторые индикаторы оценивают объемы торгов, некоторые - цены сделок, в любом случае за каждым проверенным индикатором стоит выверенная математическая модель. А так же для каждого индикатора есть определенные инструкции по трактованию результатов.

Довольно воды - давайте рассмотрим на простых примерах, и подумаем, как мы можем это использовать в автоматизированной торговле.

Вот перед нами окно Полоникса – сейчас выбрана пара BTC-ETH, период 24 часа, свечи по 5 минут. Мы видим соответственно сами свечи (как они строятся, мы уже разбирали), за ними затененные столбики то ли серого, то ли светло-зеленого цвета – объемы торгов по паре (сколько было вбухано денег при том курсе), и кучу разноцветных полос тут и там. Так вот эти полосы как раз отображают посчитанные данные некоторых индикаторов, которые можно использовать при торговле.

EMA, SMA и прочие MA – это скользящие средние (упрощение графика). На любом трейдерском сайте вы найдете тысячу и один способ по их использованию, я процитирую пример из википедии:

Наиболее простой является стратегия, при которой инструмент покупается при условии, что график цены пересекает свою скользящую среднюю снизу вверх, и продаётся, когда график цены пересекает график скользящей средней сверху вниз. И то и другое явление называют пробоем.
Кроме того, полагают, что если линия графика цены находится выше скользящей средней, то рынок считается «бычьим», на котором можно покупать, а если наоборот — «медвежьим», предпочтительным для продажи.

MACD тоже неплохо разобран везде – и на вики, и на нашем сайте есть видео, тоже немного процитирую:

Чаще всего индикатор используют для выявления торговых сигналов при боковом движении цен — периоды стабилизации курса после повышения или понижения (консолидация).
Обычно сигналом «Покупать» считают, когда скользящая с меньшим периодом (на рисунке синяя линия) в нижней зоне пересекает снизу вверх скользящую с бо́льшим периодом (красная линия). Сигналом «Продавать» считают, когда скользящая с меньшим периодом в верхней зоне пересекает сверху вниз скользящую с бо́льшим периодом.
При росте гистограммы (предыдущий столбик гистограммы ниже следующего), независимо от положения гистограммы выше или ниже нуля усиливается сила быков (игроков на повышение), это сигнал для сделок на повышение. При падении гистограммы (предыдущий столбик гистограммы выше следующего), усиливается сила медведей (игроков на понижение), это сигнал для сделок на понижение.

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

Так же маленький хинт – на графике полоникса сверху слева есть шестеренка – вы можете нажать её и поиграться с настройкой индикаторов.


Реклама


Пишем код

Подготовка

Для работы нам потребуется библиотека для научных расчетов numpy, библиотека TA-Lib и модуль requests. Так же понадобится пакет matplotlib, с его помощью мы будем рисовать графики. Ну и установленный Python, конечно. У меня установлен Python 3.5.2 разрядность 32.

  1. В командной строке пишем и выполняем команды
pip install numpy

pip install requests

pip install matplotlib
  1. Скачиваем и устанавливаем набор для TA-Lib (вот прямая ссылка на архив, вот ссылка на страницу, где можно скачать последнюю версию в разделе Windows). После скачивания архива нужно его распаковать на диск C в папку ta-lib. Должно получиться так – C:\ta-lib\, а в этой папке уже папки C, Excel, java и т.п.
  2. В командной строке выполнить pip install ta-lib

Подготовка окончена.

Для начала построим график

Полоникс предоставляет публичный API-метод для построения графика – дает цены открытия, закрытия, минимальной и максимальной цены за период, сгруппированный по указанным периодам. Метод returnChartData, пример можно посмотреть по ссылке. Мы будем использовать эти данные, что бы

  1. Построить график
  2. Сформировать индикаторы

График будем строить по паре BTC-ETH, за прошедшие 24 часа с группировкой по 5 минут. Для этого напишем небольшой скрипт. Если нужны данные по другим парам, меняйте в коде BTC_ETH на что вам угодно.

import numpy
import talib
import requests
import json
import time

from matplotlib.finance import candlestick2_ohlc
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import datetime as datetime

start_time = time.time() - 24*60*60
resource = requests.get("https://poloniex.com/public?command=returnChartData&currencyPair=BTC_ETH&start=%s&end=9999999999&period=300" % start_time)
data = json.loads(resource.text)

quotes = {}
quotes['open']=numpy.asarray([item['open'] for item in data])
quotes['close']=numpy.asarray([item['close'] for item in data])
quotes['high']=numpy.asarray([item['high'] for item in data])
quotes['low']=numpy.asarray([item['low'] for item in data])

xdate=[datetime.datetime.fromtimestamp(item['date']) for item in data]

fig, ax = plt.subplots()

candlestick2_ohlc(ax,quotes['open'],quotes['high'],quotes['low'],quotes['close'],width=0.6)

ax.xaxis.set_major_locator(ticker.MaxNLocator(6))

def chart_date(x,pos):
    try:
        return xdate[int(x)]
    except IndexError:
        return ''

ax.xaxis.set_major_formatter(ticker.FuncFormatter(chart_date))

fig.autofmt_xdate()
fig.tight_layout()

plt.show()

При запуске он будет выдавать предупреждение MatplotlibDeprecationWarning: The finance module has been deprecated in mpl 2.0 and will be removed in mpl 2.2. Please use the module mpl_finance instead., но не обращайте на него внимание, он просто предупреждает, что в будущем код надо писать по другому. Но что бы писать прямо сейчас такой код, как он хочет, надо скачивать отдельные библиотеки, подключать их.. В общем, не берите в голову.

Итак, мы запустили код, и что мы видим? Хм, график! Совпадают данные с полониксом? Ага)

Добавим индикаторов

Но в самом графике смысла нет – его можно и так смотреть на полониксе. Давайте попробуем построить данные для индикатора?

На Полониксе в верхней части используются SMA и EMA – давайте начнем с чего-то одного. Значит так, SMA строится с интервалом в 50 минут? Оок. Немного меняем скрипт:

import numpy
import talib
import requests
import json
import time

from matplotlib.finance import candlestick2_ohlc
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import datetime as datetime

start_time = time.time() - 24*60*60
resource = requests.get("https://poloniex.com/public?command=returnChartData&currencyPair=BTC_ETH&start=%s&end=9999999999&period=300" % start_time)
data = json.loads(resource.text)

quotes = {}
quotes['open']=numpy.asarray([item['open'] for item in data])
quotes['close']=numpy.asarray([item['close'] for item in data])
quotes['high']=numpy.asarray([item['high'] for item in data])
quotes['low']=numpy.asarray([item['low'] for item in data])

xdate=[datetime.datetime.fromtimestamp(item['date']) for item in data]

fig, ax = plt.subplots()

candlestick2_ohlc(ax,quotes['open'],quotes['high'],quotes['low'],quotes['close'],width=0.6)

ax.xaxis.set_major_locator(ticker.MaxNLocator(6))

def chart_date(x,pos):
    try:
        return xdate[int(x)]
    except IndexError:
        return ''

ax.xaxis.set_major_formatter(ticker.FuncFormatter(chart_date))

fig.autofmt_xdate()
fig.tight_layout()

sma = talib.SMA(quotes['close'], timeperiod=50)
print(sma)
ax.plot(sma)

plt.show()

Работает… Так же обратили внимание, что в коде есть строка print(sma)? Я специально в отладочную консоль вывел посчитанные данные:

В «нормальной» жизни вам (наверное) не нужны графики – вам нужны именно эти цифры. Т.е. ваш бот может получать такой массив данных, и понимать – тренд растет, либо тренд падает, цена биржи пересекает тренд снизу вверх или сверху вниз и т.п… Но в этой статье мы рисуем графики для визуализации принципа, поэтому пока-что мы их анализировать не будем.. И print() писать тоже)

Так же график начинается не с начала, а с некоторым интервалом – но тут все просто. Мы берем данные за 24 часа, поэтому в начале работы скрипту нечего считать – мы же ведь за 50 минут строим? Это легко поправить, но я не хочу усложнять код и объяснять, почему и как усложнил, сути это не поменяет.

Теперь надо добавить EMA с периодом в 30 минут. Дополняем код:

import numpy
import talib
import requests
import json
import time

from matplotlib.finance import candlestick2_ohlc
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import datetime as datetime

start_time = time.time() - 24*60*60
resource = requests.get("https://poloniex.com/public?command=returnChartData&currencyPair=BTC_ETH&start=%s&end=9999999999&period=300" % start_time)
data = json.loads(resource.text)

quotes = {}
quotes['open']=numpy.asarray([item['open'] for item in data])
quotes['close']=numpy.asarray([item['close'] for item in data])
quotes['high']=numpy.asarray([item['high'] for item in data])
quotes['low']=numpy.asarray([item['low'] for item in data])

xdate=[datetime.datetime.fromtimestamp(item['date']) for item in data]

fig, ax = plt.subplots()

candlestick2_ohlc(ax,quotes['open'],quotes['high'],quotes['low'],quotes['close'],width=0.6)

ax.xaxis.set_major_locator(ticker.MaxNLocator(6))

def chart_date(x,pos):
    try:
        return xdate[int(x)]
    except IndexError:
        return ''

ax.xaxis.set_major_formatter(ticker.FuncFormatter(chart_date))

fig.autofmt_xdate()
fig.tight_layout()

sma = talib.SMA(quotes['close'], timeperiod=50)
ax.plot(sma)

ema = talib.EMA(quotes['close'], timeperiod=20)
ax.plot(ema)

plt.show()

Мне, в целом, нравится. Но надо больше графиков!

Разделяем графики

Теперь я хочу добавить MACD, но он на этот график не ложится – там совсем другие значения, слишком маленькие. Все просто, сейчас мы будем рисовать сразу ТРИ графика с одной и той-же осью X. На первом графике мы оставим всё как есть, на второй вынесем линию MACD и сигнальную, а на третью – гистограмму MACD. Конечно, можно уместить все в двух графиках, как на Полониксе, но так просто нагляднее.

Меняем код:

import numpy
import talib
import requests
import json
import time

from matplotlib.finance import candlestick2_ohlc
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import datetime as datetime

start_time = time.time() - 24*60*60
resource = requests.get("https://poloniex.com/public?command=returnChartData&currencyPair=BTC_ETH&start=%s&end=9999999999&period=300" % start_time)
data = json.loads(resource.text)

quotes = {}
quotes['open']=numpy.asarray([item['open'] for item in data])
quotes['close']=numpy.asarray([item['close'] for item in data])
quotes['high']=numpy.asarray([item['high'] for item in data])
quotes['low']=numpy.asarray([item['low'] for item in data])

xdate=[datetime.datetime.fromtimestamp(item['date']) for item in data]

fig, ax = plt.subplots(3, sharex=True)

candlestick2_ohlc(ax[0], quotes['open'],quotes['high'],quotes['low'],quotes['close'],width=0.6)

ax[0].xaxis.set_major_locator(ticker.MaxNLocator(6))

def chart_date(x,pos):
    try:
        return xdate[int(x)]
    except IndexError:
        return ''

ax[0].xaxis.set_major_formatter(ticker.FuncFormatter(chart_date))

fig.autofmt_xdate()
fig.tight_layout()

sma = talib.SMA(quotes['close'], timeperiod=50)
ax[0].plot(sma)

ema = talib.EMA(quotes['close'], timeperiod=20)
ax[0].plot(ema)

macd, macdsignal, macdhist = talib.MACD(quotes['close'], fastperiod=12, slowperiod=26, signalperiod=9)
ax[1].plot(macd, color="y")
ax[1].plot(macdsignal)

hist_data = []
for elem in macdhist:
    if not numpy.isnan(elem):
        v = 0 if numpy.isnan(elem) else elem
        hist_data.append(v*100)
ax[2].fill_between([x for x in range(len(macdhist))], 0,macdhist)

plt.show()

Ну что ж, теперь на втором графике рисуются линии MACD, на третьем – гистограмма.. Если хотите гистограмму отправить на второй график, поменяйте ax[2].fill_between на ax[1] .fill_between и т.п.


Реклама


Заключение

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

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

А я желаю вам удачи и процветания, и не стесняйтесь задавать вопросы в комментариях ;)

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

Комментарии: (78)
24.07.2017 08:35
Спасибо за вашу работу. Начинаю вникать в торговлю на бирже благодаря вашим статьям. Очень жду, когда будет готов бот на Питоне. Есть платные боты, которые мало зарабатывают или вообще сливают и платить за них глупо (имхо). Буду очень благодарен за статью "Бот для чайников", где всё по полочкам разложено. В долгу не останемся - если будет хорошо идти торговля, то и поделиться с Вами не жалко Битками или Кефиром :)

Пы.Сы.: можно вставить счета кошельков "Для помощи и благодарности проекту".
24.07.2017 16:40
Спасибо за комментарии и предложения)
Над статьей подумаю
11.08.2017 22:50
У кого не получается установить библиотеку TA-Lib, не отчаивайтесь! Воспользуйтесь установкой из файла .whl. Скачать можно из открытого источника http://www.lfd.uci.edu/%7Egohlke/pythonlibs/
Как устанавливать из whl читайте в интернете.
10.11.2017 23:21
Командой pip install ta-lib установить не удалось никак, ни танцами, ни без.
Скачал по второй ссылке (п.2) https://mrjbq7.github.io/ta-lib/install.html версию TA_Lib-0.4.10-cp36-cp36m-win32.whl.
Как с нее устанавливать, непонятно. Распаковал из нее архиватором 7zip папку 'talib' прямо в папку библиотек питона (у меня C:\Users\CurrentUser\AppData\Local\Programs\Python\Python36-32\Lib), все пошло на ура.
11.11.2017 21:57
Установка из whl - 
pip install TA_Lib-0.4.10-cp36-cp36m-win32.whl

Но и вам спасибо за метод
24.11.2017 23:38
неделю пытался установить ta-lib. танцы с бубном не помогли кроме как по совету владимира распаковать прямо в lib. график получил  но вышли ошибки  
           Warning (from warnings module):
  File "C:\Python363\lib\site-packages\matplotlib\cbook\deprecation.py", line 106
    warnings.warn(message, mplDeprecation, stacklevel=1)
MatplotlibDeprecationWarning: The finance module has been deprecated in mpl 2.0 and will be removed in mpl 2.2. Please use the module mpl_finance instead.
в питоне не силен но подозреваю что то в коде.  питон 3.6.3.  
 по остальным примерам выходят ошибки еще больше  .
25.11.2017 20:42
Это нормально, я в статье писал об этом. Он предупреждает о том, что когда-то в будущем этот модуль устареет.
24.11.2017 23:55
по второму примеру выходит ошибка
  File "C:\Python363\2.py", line 42, in <module>
    sma = talib.SMA(quotes['close'], timeperiod=50)
AttributeError: module 'talib' has no attribute 'SMA' - вроде  как не получает данные по sma? 
спасибо за ваш труд.  на питоне недавно  раньше писал на  mtd4 теперь хочу  бот на EXMO.</module>
25.11.2017 20:51
Нет, это неправильно талиб установлен.
После того, как скачали файл https://mrjbq7.github.io/ta-lib/install.html версию TA_Lib-0.4.10-cp36-cp36m-win32.whl нужно его установить 

pip install TA_Lib-0.4.10-cp36-cp36m-win32.whl

должно всё встать нормально
26.11.2017 21:47
встает нормально из папки C:\ta-lib>pip install TA_Lib-0.4.10-cp36-cp36m-win32.whl
Processing c:\ta-lib\ta_lib-0.4.10-cp36-cp36m-win32.whl
Installing collected packages: TA-Lib
Successfully installed TA-Lib-0.4.10. 

но при запуске 2 го примера выскакивают ошибки  кроме указанной выше 
 File "C:\Python363\2.py", line 42, in <module>
    sma = talib.SMA(quotes['close'], timeperiod=50)
AttributeError: module 'talib' has no attribute 'SMA'
график не выходит.

</module>
27.11.2017 22:19
На странице https://mrjbq7.github.io/ta-lib/install.html есть иконки папочек с двумя архивами https://github.com/mrjbq7/ta-lib/tarball/master файл: mrjbq7-ta-lib-TA_Lib-0.4.10-39-g4339231.tar.gz и https://github.com/mrjbq7/ta-lib/zipball/master файл: mrjbq7-ta-lib-TA_Lib-0.4.10-39-g4339231.zip с одинаковым содержанием. А еще ниже в разделе Windows ссылка: http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-msvc.zip Версии разные. 0.4.0 и 0.4.1. 

"После того, как скачали файл https://mrjbq7.github.io/ta-lib/install.html версию TA_Lib-0.4.10-cp36-cp36m-win32.whl нужно его установить" где среди перечисленных ссылок это: TA_Lib-0.4.10-cp36-cp36m-win32.whl ? На первый взгляд это на название файла похоже с типом файла whl. В архивах таких нет. И куда эти архивы распаковывать в таком случае. Или это команда .whl. Нужно ли до этого всего устанавливать: pip install wheel ? Очень непонятная логика установки этих pip. Откуда этот pip install ta-lib знает где скачивать последнюю версию талиба.
Команда:
c:\ta-lib>pip install TA_Lib-0.4.10-cp36-cp36m-win32.whl
Requirement 'TA_Lib-0.4.10-cp36-cp36m-win32.whl' looks like a filename, but the
file does not exist
Processing .\ta_lib-0.4.10-cp36-cp36m-win32.whl
Exception:
Traceback (most recent call last):
и куча красного...
26.11.2017 22:52
Нашел ошибку у себя. была установлена  Анаконда  и система кидала файлы талиб не туда. удалил анаконду и заново установил   по пути C:\ta-lib>pip install TA_Lib-0.4.10-cp36-cp36m-win32.whl .график с SMA появился .
27.11.2017 00:09
Не могу вывести график с RSI. простая подмена в коде SMA на RSI ничего не дает.
sma =talib.SMA(quotes['close'],timeperiod=50)
27.11.2017 21:55
Уточните пожалуйста пункт установки TA-Lib.
2. Скачиваем и устанавливаем набор для TA-Lib (вот прямая ссылка на архив, вот ссылка на страницу, где можно скачать последнюю версию в разделе Windows). После скачивания архива нужно его распаковать на диск C в папку ta-lib. Должно получиться так  C:\ta-lib\, а в этой папке уже папки C, Excel, java и т.п.
3. В командной строке выполнить pip install ta-lib
При этом он скачивает TA-Lib-0.4.10.tar.gz версия выше, чем по тем ссылкам в п.2. И кучу красного и кучу ошибок.
03.12.2017 12:04
Скачайте со страницы  http://www.lfd.uci.edu/%7Egohlke/pythonlibs/ нужный whl файл (у меня это TA_Lib0.4.10cp36cp36mwin_amd64.whl) 

Откройте cmd

напишите pip install полный_путь_к_скачанному_файлу

После этого запускайте бота
05.12.2017 21:15
Спасибо. Все заработало для Windows. Пробую установить Ta-lib на Ubuntu Server Edition, пока не получается. Выдает ошибку.
03.12.2017 14:24
Здравствуйте!
Устанавливал talib путём скачивания файла со страницы http://www.lfd.uci.edu/%7Egohlke/pythonlibs/ файл TA_Lib0.4.10cp36cp36mwin_amd64.whl , создал папку ta-lib на диске C и закинул файл туда. Через cmd удалось установить файл, но только после его переименования с  TA_Lib0.4.10cp36cp36mwin_amd64.whl на TA_Lib0.4.10cp36cp36mwin32.whl
Далее при запуске программы появляется такая ошибка

Traceback (most recent call last):
  File "C:\Users\user\AppData\Local\Programs\Python\Python36-32\exmo.py", line 7, in <module>
    import talib
  File "C:\Users\user\AppData\Local\Programs\Python\Python36-32\lib\site-packages\talib\__init__.py", line 4, in <module>
    from . import common
ImportError: cannot import name 'common'

не понимаю в чём ошибка, в интернете писали, что это может быть из-за неправильной уставновки</module></module>
03.12.2017 18:40
На сайте: http://www.lfd.uci.edu/%7Egohlke/pythonlibs/ есть версия TA_Lib-0.4.10-cp36-cp36m-win32.whl качайте ее, зачем переименовывать.
03.12.2017 20:51
Благодарю и прощу прощения за свою невнимательность
16.12.2017 13:30
Спасибо! А можете, пожалуйста, рассказать, как брать и сравнивать цену на двух разных биржах в процентах? Чтобы выводилось в таблицу или в виде графика. Заранее спасибо!
21.12.2017 21:55
Андрей К.! Огромное СПА-СИ-БО Вам за Ваши труды!!!
Вы - однозначно - глоток КИСЛОРОДА!!!
(Не.. вру.. КИСЛОРОДНАЯ ПОДУШКА!!!) для всех кто, начинает заниматься криптовалютами, торговлей на биржах, а уж тем более - приходит к выводу, что торговать там руками - надо быть Десятируким Шивой - и начинает, по Вашим урокам, ваять себе бота! =)
Ещё раз - ОГРОМНОЕ ВАМ СПАСИБО!!! Три раза КУ! И дай Вам Бог - Здоровья, Счастья и Радости!

Теперь, если позволите, немного по Питону:
1. Не польз\овались\уетесь ли Вы Анакондой, PyCharm и прочим и можете ли что-нибудь сказать об этом хорошего или плохого!??
2. Какой оснасткой пользуетесь Вы сами?
3. Можно ли в коде указывать полные пути к библиотекам, т.к. из под Анаконды, они нифига не подгружаются! (( Вероятно, по причине несогласования путей..
4. Нет ли у Вас в планах отдельной статьи по созданию "с нуля" _правильной среды разработки_ на Питоне: с удобным редактором, со большинством требующихся библиотек и прочего!??

С ОГРОМНЫМ УВАЖЕНИЕМ к Вашим Трудам!!!
Низкий Вам поклон!
22.12.2017 17:08
Ух ты, спасибо :)
1. PyCharm рулит - для непрофессиональной разработки Community Edition хватает с головой. Анакондой не пользуюсь, т.к. обычно нет нужды в этом. Если разрабатываю проект локально, делаю pip freeze > req.txt, список установленных пакетов собирается в файл, после чего, при развертывании на другой машине, делаю pip install -r ./req.txt - и pip выкачивает и ставит все нужные пакеты нужных версий. Это удобно, т.к. обычно разрабатываю я под Windows, а разворачиваю на линуксовых машинах (если не слишком специфический проект). Под линуксом питон нужной версии запущен в своем виртуальном окружении со своим списком пакетов.. Впрочем, это долгая история. Лично мне кажется, что для разработки достаточно удобной IDE, пакеты приходится ставить крайне редко, и усложнять себе жизнь сторонними менеджерами пакетов не стоит.
2. Для проектов - PyCharm, для простецких скриптов - Idle, а под линуксом - Vim.
3. Лучше научиться пользоваться переменной окружения PYTHONPATH - вы сможете указать интерпретатору, где стоит искать нужные вам библиотеки.
4. Вообще не думал, в питоне почти все нужные библиотеки идут в комплекте, да и доставить нужные не сложно.. Но подумаю
23.12.2017 03:18
Всем - Здравствуйте!
Прошу прощения, уважаемые! Но, может у кого-нибудь будут какие-нибудь идеи!?!
(ну, почему всё не может быть "просто и спокойно"!?! (( =))
Операционка: Windows 10 LTSB x64
Всё снёс и установил заново:
1. Свежескачанный python-3.6.4x64.exe
pip install numpy
pip install requests
pip install matplotlib

2. Скачал ta-lib-0.4.0-msvc.zip, разархивировал в C:\TA-LIB\
pip install ta-lib
выдаёт ошибку:
---
Microsoft Windows [Version 10.0.10240]
(c) Корпорация Майкрософт (Microsoft Corporation), 2015 г. Все права защищены.

C:\Windows\system32>pip install ta-lib
Collecting ta-lib
  Using cached TA-Lib-0.4.10.tar.gz
Installing collected packages: ta-lib
  Running setup.py install for ta-lib ... error
    Complete output from command c:\p\python.exe -u -c "import setuptools, tokenize;__file__='R:\\RamTEMP\\pip-build-nh34ydzo\\ta-lib\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record R:\RamTEMP\pip-m09ctjhp-record\install-record.txt --single-version-externally-managed --compile:
    running install
    running build
    running build_py
    creating build
    creating build\lib.win-amd64-3.6
    creating build\lib.win-amd64-3.6\talib
    copying talib\deprecated.py -> build\lib.win-amd64-3.6\talib
    copying talib\test_abstract.py -> build\lib.win-amd64-3.6\talib
    copying talib\test_data.py -> build\lib.win-amd64-3.6\talib
    copying talib\test_func.py -> build\lib.win-amd64-3.6\talib
    copying talib\test_stream.py -> build\lib.win-amd64-3.6\talib
    copying talib\__init__.py -> build\lib.win-amd64-3.6\talib
    running build_ext
    building 'talib.common' extension
    creating build\temp.win-amd64-3.6
    creating build\temp.win-amd64-3.6\Release
    creating build\temp.win-amd64-3.6\Release\talib
    C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -Ic:\p\lib\site-packages\numpy\core\include -Ic:\ta-lib\c\include -Ic:\p\include -Ic:\p\include "-IC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\8.1\include\shared" "-IC:\Program Files (x86)\Windows Kits\8.1\include\um" "-IC:\Program Files (x86)\Windows Kits\8.1\include\winrt" /Tctalib/common.c /Fobuild\temp.win-amd64-3.6\Release\talib/common.obj
    common.c
    C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\link.exe /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:c:\ta-lib\c\lib /LIBPATH:c:\p\libs /LIBPATH:c:\p\PCbuild\amd64 "/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\LIB\amd64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.10240.0\ucrt\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x64" ta_libc_cdr.lib /EXPORT:PyInit_common build\temp.win-amd64-3.6\Release\talib/common.obj /OUT:build\lib.win-amd64-3.6\talib\common.cp36-win_amd64.pyd /IMPLIB:build\temp.win-amd64-3.6\Release\talib\common.cp36-win_amd64.lib
    common.obj : warning LNK4197: export 'PyInit_common' specified multiple times; using first specification
       Creating library build\temp.win-amd64-3.6\Release\talib\common.cp36-win_amd64.lib and object build\temp.win-amd64-3.6\Release\talib\common.cp36-win_amd64.exp
    common.obj : error LNK2001: unresolved external symbol TA_SetUnstablePeriod
    common.obj : error LNK2001: unresolved external symbol TA_Shutdown
    common.obj : error LNK2001: unresolved external symbol TA_Initialize
    common.obj : error LNK2001: unresolved external symbol TA_GetUnstablePeriod
    common.obj : error LNK2001: unresolved external symbol TA_GetVersionString
    build\lib.win-amd64-3.6\talib\common.cp36-win_amd64.pyd : fatal error LNK1120: 5 unresolved externals
    error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\x86_amd64\\link.exe' failed with exit status 1120

    ----------------------------------------
И КРАСНЫМ:
Command "c:\p\python.exe -u -c "import setuptools, tokenize;__file__='R:\\RamTEMP\\pip-build-nh34ydzo\\ta-lib\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record R:\RamTEMP\pip-m09ctjhp-record\install-record.txt --single-version-externally-managed --compile" failed with error code 1 in R:\RamTEMP\pip-build-nh34ydzo\ta-lib\

c:\ta-lib>
===

Скачанные и запущенные в папке c:\ta-lib>
pip install c:\ta-lib\TA_Lib-0-4-10-cp36-cp36m-win_amd64.whl и\или
pip install c:\ta-lib\TA_Lib-0-4-10-cp36-cp36m-win32.whl

выдают одно и тоже:
TA_Lib-0-4-10-cp36-cp36m-win_amd64.whl is not a supported wheel on this platform.
TA_Lib-0-4-10-cp36-cp36m-win32.whl is not a supported wheel on this platform.

Как думаете: это относится к Windows 10 LTSB x64 или к версии Питона python-3.6.4x64.exe !??
И к чему может относится:
  build\lib.win-amd64-3.6\talib\common.cp36-win_amd64.pyd : fatal error LNK1120: 5 unresolved externals
    error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\x86_amd64\\link.exe' failed with exit status 1120
((( Простите..
01.01.2018 13:54
Вроде бы все правильно делаете, должно работать, попробуйте
python -m pip install --upgrade pip
перед установкой whl файла

еще, хотя в Windows не важен регистр названий файлов и папок, но путь прописан и, похоже скомпилирован где-то в недрах талиба, так что
C:\TA-LIB\ советую, на всякий случай переименовать в C:\ta-lib\, может быть он поэтому не находит библиотеку..
12.01.2018 20:50
Добрый день.

Помогите пожалуйста с установкой ta-lib

Выдается следующая ошибка
Command "c:\users\мария\appdata\local\programs\python\python36-32\python.exe -u
-c "import setuptools, tokenize;__file__='C:\\Users\\81E4~1\\AppData\\Local\\Tem
p\\pip-build-w9oltt_3\\ta-lib\\setup.py';f=getattr(tokenize, 'open', open)(__fil
e__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__,
'exec'))" install --record C:\Users\81E4~1\AppData\Local\Temp\pip-n6v2aiqp-recor
d\install-record.txt --single-version-externally-managed --compile" failed with
error code 1 in C:\Users\81E4~1\AppData\Local\Temp\pip-build-w9oltt_3\ta-lib\

Что это значит? Windows7
Полный путь к каталогу указывала
12.01.2018 21:10
Все получилось!
18.01.2018 07:30
Приветствую, кое как поставил ta-lib. Но все  равно выдает вот такую ошибку:
Traceback (most recent call last):
  File "C:\Program Files\Python36\2.py", line 2, in <module>
    import talib
  File "C:\Program Files\Python36\lib\talib\__init__.py", line 4, in <module>
    from ._ta_lib import (
ModuleNotFoundError: No module named 'talib._ta_lib</module></module>
18.01.2018 07:41
хотя Talib вроде нормaльно встал:
после запуска pip install ta-lib
requirement allreade satisfied
19.01.2018 23:44
Не ставится ТАЛИБ.
Файл WHL поставил, а Талиб всё равно не ставится:
C:\Windows\System32>pip install ta-lib
Collecting ta-lib
  Using cached TA-Lib-0.4.16.tar.gz
Requirement already satisfied: numpy in c:\users\роман\appdata\local\programs\python\python36-32\lib\site-packages (from ta-lib)
Installing collected packages: ta-lib
  Running setup.py install for ta-lib ... error
    Complete output from command c:\users\роман\appdata\local\programs\python\python36-32\python.exe -u -c "import setuptools, tokenize;__file__='C:\\Users\\4CFA~1\\AppData\\Local\\Temp\\pip-build-gwpwooe_\\ta-lib\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record C:\Users\4CFA~1\AppData\Local\Temp\pip-gs8w6_rl-record\install-record.txt --single-version-externally-managed --compile:
    running install
    running build
    running build_py
    creating build
    creating build\lib.win32-3.6
    creating build\lib.win32-3.6\talib
    copying talib\abstract.py -> build\lib.win32-3.6\talib
    copying talib\deprecated.py -> build\lib.win32-3.6\talib
    copying talib\stream.py -> build\lib.win32-3.6\talib
    copying talib\test_abstract.py -> build\lib.win32-3.6\talib
    copying talib\test_data.py -> build\lib.win32-3.6\talib
    copying talib\test_func.py -> build\lib.win32-3.6\talib
    copying talib\test_stream.py -> build\lib.win32-3.6\talib
    copying talib\__init__.py -> build\lib.win32-3.6\talib
    running build_ext
    building 'talib._ta_lib' extension
    error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

    ----------------------------------------
Command "c:\users\роман\appdata\local\programs\python\python36-32\python.exe -u -c "import setuptools, tokenize;__file__='C:\\Users\\4CFA~1\\AppData\\Local\\Temp\\pip-build-gwpwooe_\\ta-lib\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record C:\Users\4CFA~1\AppData\Local\Temp\pip-gs8w6_rl-record\install-record.txt --single-version-externally-managed --compile" failed with error code 1 in C:\Users\4CFA~1\AppData\Local\Temp\pip-build-gwpwooe_\ta-lib\
21.01.2018 14:46
Андрей, доброго дня.

Подскажите в чем ошибка при установке ТАЛИБ, вроде всё как написано у Вас на сайте сделал, но ни туда ни сюда.
Сообщением выше написал, чё система выдает. У меня Винда-10, недавно переустановленная,...максисмум для работы программы проектирования инж. систем стоят.
Вдруг ещё у кого здарвые предложения есть, всем безмерно благодарен буду.
21.01.2018 15:44
Скачайте со страницы  http://www.lfd.uci.edu/%7Egohlke/pythonlibs/ нужный whl файл (у меня это TA_Lib0.4.10cp36cp36mwin_amd64.whl) 

Откройте cmd

напишите pip install полный_путь_к_скачанному_файлу

После этого запускайте бота
29.01.2018 13:06
requests.get("https://site.com/api").json()

Сразу конвертирует все в JSON не нужно импортировать модуль json, все необходимое предоставляет сам requests.
01.02.2018 08:16
Здравствуйте, та же проблема что и у Paul K.
Traceback (most recent call last):
  File "C:\Users\Стригваллдир\Desktop\streegvalldir .py", line 9, in <module>
    import talib
  File "C:\Users\Стригваллдир\AppData\Local\Programs\Python\Python36-32\lib\talib\__init__.py", line 4, in <module>
    from ._ta_lib import (
ModuleNotFoundError: No module named 'talib._ta_lib'</module></module>
01.02.2018 08:36
Всем, у кого не ставится талиб:

Скачайте со страницы  http://www.lfd.uci.edu/%7Egohlke/pythonlibs/ нужный whl файл (у меня это TA_Lib0.4.10cp36cp36mwin_amd64.whl) 
(cp36cp36m - значит питон 3.6.+, win_amd64 - разрядность ОС и Питона, в идеале)

Откройте cmd

напишите pip install полный_путь_к_скачанному_файлу. 

После этого запускайте бота
04.02.2018 22:08
Андрей, я извиняюсь
Но всё таки...чё то не запускается....по Вашей рекомендации бот, пишет следующее:

Traceback (most recent call last):
  File "D:\проект_БИТКОИН\Lessons_Python\bot4_с_логикой\exmo_macd.py", line 7, in <module>
    import talib
ModuleNotFoundError: No module named 'talib'

при запуске в смд: pip install talib

пишет много чего, но в конце - 

 error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

    ----------------------------------------
Command "c:\users\роман\appdata\local\programs\python\python36-32\python.exe -u -c "import setuptools, tokenize;__file__='C:\\Users\\4CFA~1\\AppData\\Local\\Temp\\pip-build-vn05nmad\\ta-lib\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record C:\Users\4CFA~1\AppData\Local\Temp\pip-n5nrncjy-record\install-record.txt --single-version-externally-managed --compile" failed with error code 1 in C:\Users\4CFA~1\AppData\Local\Temp\pip-build-vn05nmad\ta-lib\

</module>
05.02.2018 08:05
А
pip install TA_Lib0.4.10cp36cp36mwin_amd64.whl установился, без ошибок?
05.02.2018 07:35
error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools 
У меня тоже, качаю  Microsoft Visual C++ 14.0
05.02.2018 09:28
Метод тыка рулит!!! )

C:\Users\Prestigio>pip install c:\ta-lib\TA_Lib-0.4.16-cp36-cp36m-win_amd64.whl
TA_Lib-0.4.16-cp36-cp36m-win_amd64.whl is not a supported wheel on this platform.

C:\Users\Prestigio>pip install c:\ta-lib\TA_Lib-0.4.16-cp37-cp37m-win_amd64.whl
TA_Lib-0.4.16-cp37-cp37m-win_amd64.whl is not a supported wheel on this platform.

C:\Users\Prestigio>pip install c:\ta-lib\TA_Lib-0.4.16-cp36-cp36m-win32.whl
Processing c:\ta-lib\ta_lib-0.4.16-cp36-cp36m-win32.whl
Installing collected packages: TA-Lib
Successfully installed TA-Lib-0.4.16
06.02.2018 14:58
Здравствуйте Андрей. Подскажите, пожалуйста, в чём может быть ошибка: скопировал скрипт в IDLE (Python 3.6 32-bit) и сохранил в файл indikators.py. После запуска этого файла из командной строки пишет упомянутую ошибку (не обращаю на неё внимание), разрешаю доступ в сеть. Далее никакой график не появляется, пишет: 
  warnings.warn(message/ mp1Deprecation. stacklevel=1)
Traceback (most recent call last):
  File "C:\Users\Owner\AppData\Local\Programs\Python\Python36-32\indicators.py". line 14. in <module>
     data = json.loads(resource.text)
  File "C:\Users\Owner\AppData\Local\Programs\Python\Python36-32\lib\json\__int__.py". line 354. in loads
     return _default_decoder.decode(s)
  File "C:\Users\Owner\AppData\Local\Programs\Python\Python36-32\lib\json\decoder.py". line 339. in decode
     obj. end = self.raw_decode(s. idx=_w(s. 0).end())
  File "C:\Users\Owner\AppData\Local\Programs\Python\Python36-32\lib\json\decoder.py". line 357. in raw_decode
      raise JSONDecodeError("Expecting value". s. err.valur) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)</module>
06.02.2018 16:09
Скрипт не смог получить данные с биржи - может быть, вылезла капча (если разговор о Полоникс). 
Добавьте перед строкой 
data = json.loads(resource.text)
строку
print(resource.text)
что бы увидеть сообщение.
06.02.2018 17:05
Спасибо за быстрый ответ. Строку вставил - стало ещё больше ругаться:

                <div id="content">
                        <h1>One More Step</h1>
                        <p>Please complete the security check to proceed.</p>

                 
                </div>

Как с этим бороться?
06.02.2018 17:37
это капча, полоникс заблокировал доступ, юзайте прокси..
11.02.2018 05:32
Добрый день! При установке модулей через командную строку система выдает следующее сообщение:
"pip" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.
11.02.2018 09:22
Переустановите питон, поставьте все галки, при установке зайдите в расширенный режим, поставьте все галки там...
12.02.2018 09:05
Спасибо! Все запустилось!
Но в начале работы скрипта Питон выдает следующую ошибку:
Warning (from warnings module):
  File "C:\Users\Dell\Downloads\exmo_macd.py", line 93
    idx = numpy.argwhere(numpy.diff(numpy.sign(macd - macdsignal)) != 0).reshape(-1) + 0
RuntimeWarning: invalid value encountered in sign
Насколько это печально и как можно устранить.
28.02.2018 10:40
Не печально, но данных маловато, попробуйте сменить пару или период
25.02.2018 12:18
А "YoBit" такие данные предоставляет, чтоб график построить?
28.02.2018 10:42
В удобном виде нет, можно попробовать из истории сделок вытащить, https://yobit.net/api/3/trades/ltc_btc?limit=2000, как для Эксмо
27.02.2018 15:07
При попытке установить через pip install ta-lib сыпится ошибка:
https://i.imgur.com/5UgCc2S.png?1
https://i.imgur.com/qYvKm20.png?2
А если напрямую, то пишет что платформа не поддерживается (Win 7 x64, Python 3.6 64 bit)
https://i.imgur.com/Vp2A5e5.png?1

Как решить данную проблему?
27.02.2018 16:16
Вручную удалось установить библиотеку ta-lib, но теперь уже появляется такая ошибка при запуске скрипта.
https://i.imgur.com/nn2DY0V.png?1
28.02.2018 10:43
Скачайте со страницы  http://www.lfd.uci.edu/%7Egohlke/pythonlibs/ нужный whl файл (у меня это TA_Lib0.4.10cp36cp36mwin_amd64.whl) 
(cp36cp36m - значит питон 3.6.+, win_amd64 - разрядность ОС и Питона, в идеале)

Откройте cmd

напишите pip install полный_путь_к_скачанному_файлу. 

После этого запускайте
15.03.2018 17:35
Добрый день Андрей.

Подскажите где есть инфа по web-socket Binance
Не могу допилить для Binance аналог Вашего кода для Полоникса:

import numpy
import talib
import requests
import json
import time

from datetime import datetime

BEAR_PERC = 70
BULL_PERC = 30

PAIR = 'BTC_ETH'

def should_buy(pair):
    
    start_time = time.time() - 15*60*60
    resource = requests.get("https://poloniex.com/public?command=returnChartData&currencyPair=%s&start=%s&end=9999999999.=300" % (pair, start_time))
    data = json.loads(resource.text)

    quotes = {}
    quotes['close']=numpy.asarray([item['close'] for item in data])
    macd, macdsignal, macdhist = talib.MACD(quotes['close'], fastperiod=12, slowperiod=26, signalperiod=9)

    idx = numpy.argwhere(numpy.diff(numpy.sign(macd - macdsignal)) != 0).reshape(-1) + 0

    inters = []

    for offset, elem in enumerate(macd):
        if offset in idx:
            inters.append(elem)
        else:
            inters.append(numpy.nan)

    hist_data = []
    max_v = 0

    for offset, elem in enumerate(macdhist):
        activity_time = False
        curr_v = macd[offset] - macdsignal[offset]
        if abs(curr_v) > abs(max_v):
            max_v = curr_v
        perc = curr_v/max_v
        
        if       (   (macd[offset] > macdsignal[offset] and perc*100 > BULL_PERC) # восходящий тренд
                     or      (
                                 macd[offset] < macdsignal[offset] and perc*100 < (100-BEAR_PERC)
                            )

                ):
            v = 1
            activity_time = True
        else:
            v = 0
            
        if offset in idx and not numpy.isnan(elem):
            # тренд изменился
            max_v = curr_v = 0 # обнуляем пик спреда между линиями
        hist_data.append(v*1000)
 
    return activity_time

while True:
    print("Покупать?", should_buy(PAIR))
    time.sleep(1)
06.04.2018 18:43
На будущее, лучше где нибудь сделать отдельную папку для файлов whl(колес), и туда грузить нужное.
21.03.2018 18:02
Не работает. В чем может быть дело?

Traceback (most recent call last):
  File "C:\Program Files (x86)\Python36-32\3.py", line 2, in <module>
    import talib
  File "C:\Program Files (x86)\Python36-32\lib\talib\__init__.py", line 43, in <module>
    from ._ta_lib import (
ModuleNotFoundError: No module named 'talib._ta_lib'</module></module>
26.03.2018 13:02
Вчера весь день устанавливал ta-lib. К вечеру получилось. Сегодня перешел к следующему уроку и снова проблема. Питон ругается на строчку from matplotlib.finance import candlestick2_ohlc и выдает ошибку ModuleNotFoundError: No module named 'matplotlib.finance'. Я так понимаю, что это какой то подмодуль finance, который входит в модуль matplotlib. Сам модуль matplotlib установил, сначала просто командой pip install matplotlib. Когда снова вышла ошибка, скачал вот отсюда https://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib файл matplotlib-2.2.2-cp36-cp36m-win32.whl и попробовал установить его с указанием папки. Получил ответ Requirement already satisfied, так понимаю, что это означает, что у меня уже установлена нужная версия. Но ошибка по прежнему выходит и скрипт не запускается. Windows 8.1 x64 Питон 3.6.3 x32. Вчера пытался ставить питон х64, но под него нет библиотеки ta-lib x64. Боты вот с этой страницы https://bablofil.ru/forum/7 идут без ошибок, жаль денег не зарабатывают. :)
Как заставить работать matplotlib.finance? Спасибо.
Хочу разобраться с ЕМА.
26.03.2018 13:04
Вру питон 3.6.4
27.03.2018 15:22
C matplotlib.finance разобрался. С версии 2.2.2 библиотека finance отделилась от модуля matplotlib и стала самостоятельным модулем mpl_finance  https://matplotlib.org/api/api_changes.html?highlight=matplotlib%20finance

Скачать модуль mpl_finance можно здесь: https://github.com/matplotlib/mpl_finance 
Установить командой  python Полный путь к файлу\mpl_finance.py install
А в скрипте нужно заменить строчку from matplotlib.finance import candlestick2_ohlc   на   from mpl_finance import candlestick2_ohlc
И о чудо!!! График у меня нарисовался. :)
Андрей баблофил, спасибо. :)
30.03.2018 20:41
matplotlib.finance у меня работает т.е. рисует график в коде для exmo как не странно(см. ниже). Все, что сказано выше Михаил Д. абсолютно правильно и работает.
script RSI:
import numpy
import talib
import requests
import json
import time
from pylab import *

from matplotlib.finance import candlestick2_ohlc
import matplotlib.animation as animation

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
from datetime import datetime

BEAR_PERC = 70
BULL_PERC = 80

PERIOD = 10 # Период в минутах для построения свечей

PAIR = 'ETH_USD'

SHOW_BOT_CHART = False

fig, ax = plt.subplots(3, sharex=True)
fig.comment = plt.figtext(.7,.05, '')

def update_graph(interval):

    resource = requests.get('https://api.exmo.com/v1/trades/?pair=%s&limit=10000' % PAIR)
    #print(resource.text[:100])
    #return
    data = json.loads(resource.text)

    chart_data = {} # сформируем словарь с ценой закрытия по PERIOD минут
    
    for item in reversed(data[PAIR]):
        d = int(float(item['date'])/(PERIOD*60))*(PERIOD*60) # Округляем время сделки до PERIOD минут
        if not d in chart_data:
            chart_data[d] = {'open':0, 'close':0, 'high':0, 'low':0}

        chart_data[d]['close'] = float(item['price'])

        if not chart_data[d]['open']:
            chart_data[d]['open'] = float(item['price'])

        if not chart_data[d]['high'] or chart_data[d]['high'] < float(item['price']):
            chart_data[d]['high'] = float(item['price'])

        if not chart_data[d]['low'] or chart_data[d]['low'] > float(item['price']):
            chart_data[d]['low'] = float(item['price'])
        

    quotes = {}
    quotes['open']=numpy.asarray([chart_data[item]['open'] for item in sorted(chart_data)])
    quotes['close']=numpy.asarray([chart_data[item]['close'] for item in sorted(chart_data)])
    quotes['high']=numpy.asarray([chart_data[item]['high'] for item in sorted(chart_data)])
    quotes['low']=numpy.asarray([chart_data[item]['low'] for item in sorted(chart_data)])

    xdate=[datetime.fromtimestamp(item) for item in sorted(chart_data)]

    ax[0].xaxis.set_major_locator(ticker.MaxNLocator(6))

    def chart_date(x,pos):
        try:
            return xdate[int(x)]
        except IndexError:
            return ''
        
    ax[0].clear()
    ax[0].xaxis.set_major_formatter(ticker.FuncFormatter(chart_date))
    ax[0].grid(True, color='blue')
    candlestick2_ohlc(ax[0], quotes['open'],quotes['high'],quotes['low'],quotes['close'],width=0.6)
    fig.autofmt_xdate()
    fig.tight_layout()

    macd, macdsignal, macdhist = talib.MACD(quotes['close'], fastperiod=12, slowperiod=26, signalperiod=9)
    ax[1].clear()
    ax[1].grid(True, color='blue')
    ax[1].plot(macd, color="y")
    ax[1].plot(macdsignal)

    idx = numpy.argwhere(numpy.diff(numpy.sign(macd - macdsignal)) != 0).reshape(-1) + 0

    inters = []

    for offset, elem in enumerate(macd):
        if offset in idx:
            inters.append(elem)
        else:
            inters.append(numpy.nan)
    ax[1].plot(inters, 'ro')

    max_v = 0
    hist_data = []
     
    for offset, elem in enumerate(macdhist):
        activity_time = False
        curr_v = macd[offset] - macdsignal[offset]
        if abs(curr_v) > abs(max_v):
            max_v = curr_v
        perc = curr_v/max_v
        
        if       (   (macd[offset] > macdsignal[offset] and perc*100 > BULL_PERC) # восходящий тренд
                     or      (
                                 macd[offset] < macdsignal[offset] and perc*100 < (100-BEAR_PERC)
                            )

                ):
            v = 1
            activity_time = True
        else:
            v = 0
            
        if offset in idx and not numpy.isnan(elem):
            # тренд изменился
            max_v = curr_v = 0 # обнуляем пик спреда между линиями

        hist_data.append(v*1000)

    ax[2].fill_between([x for x in range(len(macdhist))], 0, hist_data if SHOW_BOT_CHART else macdhist,  facecolor='gray', interpolate=True)
    plt.gcf().texts.remove(fig.comment)
    fig.comment = plt.figtext(.6,.05, '%s %s%s' % (PAIR, time.ctime(), ' ТОРГУЕМ!!!! ' if activity_time else ''), style='italic', bbox={'facecolor':'red' if activity_time else 'green', 'alpha':0.5, 'pad':10})

ani = animation.FuncAnimation(fig, update_graph, interval=1000)
plt.grid()
plt.show()
___________________________________
win10 x 64
Python 3.6x64
pip list
__
C:\WINDOWS\system32>pip list
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
certifi (2018.1.18)
chardet (3.0.4)
cycler (0.10.0)
et-xmlfile (1.0.1)
idna (2.6)
jdcal (1.3)
kiwisolver (1.0.1)
lxml (3.7.3)
matplotlib (2.1.0)
numpy (1.14.2)
openpyxl (2.5.1)
pandas (0.22.0)
pandas-datareader (0+unknown)
pip (9.0.3)
pyparsing (2.2.0)
python-dateutil (2.7.0)
pytz (2018.3)
requests (2.18.4)
requests-file (1.4.3)
requests-ftp (0.3.1)
setuptools (28.8.0)
six (1.11.0)
TA-Lib (0.4.17)
urllib3 (1.22)
wrapt (1.10.11)
30.03.2018 20:59
Библиотеки Python:
1.	https://stackoverflow.com/questions/49146678/module-matplotlib-has-no-attribute-verbose
pip uninstall matplotlib
pip install matplotlib==2.1.0

2.(опция, если понадобится)	https://github.com/pydata/pandas-datareader
загрузить и в папке куда загрузили в адресной строке ввести cmd(командная строка).
 Путь к python.exe укажите в терминале (cmd) свой.
"C:\Program Files\Python36\python.exe"  setup.py inctall
_________________________________________________________________________________________________________
Ответы:
python setup.py inctall
matplotlib==2.1.0 это таблетка. 
Перед установкой не забудьте удалить существующую библиотеку
pip uninstall matplotlib
30.03.2018 22:29
Кто может помочь на графике сделать временную и ценовую шкалы с переменным шагом. Вот код(BEAR_PERC = 1, BULL_PERC = 1 можно 0-ли при этом графика не меняется и советник тоже. НЕ заморачиваюсь т.к. автор  это прикрепил, наверно из другой оперы).
import numpy
import talib
import requests
import json
import time
from pylab import *

from matplotlib.finance import candlestick2_ohlc
import matplotlib.animation as animation

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
from datetime import datetime

BEAR_PERC = 1
BULL_PERC = 1

PERIOD = 10 # Период в минутах для построения свечей

PAIR = 'ETH_USD'

SHOW_BOT_CHART = False

fig, ax = plt.subplots(3, sharex=True)
fig.comment = plt.figtext(.7,.05, '')

def update_graph(interval):

    resource = requests.get('https://api.exmo.com/v1/trades/?pair=%s&limit=10000' % PAIR)
    #print(resource.text[:100])
    #return
    data = json.loads(resource.text)

    chart_data = {} # сформируем словарь с ценой закрытия по PERIOD минут
    
    for item in reversed(data[PAIR]):
        d = int(float(item['date'])/(PERIOD*60))*(PERIOD*60) # Округляем время сделки до PERIOD минут
        if not d in chart_data:
            chart_data[d] = {'open':0, 'close':0, 'high':0, 'low':0}

        chart_data[d]['close'] = float(item['price'])

        if not chart_data[d]['open']:
            chart_data[d]['open'] = float(item['price'])

        if not chart_data[d]['high'] or chart_data[d]['high'] < float(item['price']):
            chart_data[d]['high'] = float(item['price'])

        if not chart_data[d]['low'] or chart_data[d]['low'] > float(item['price']):
            chart_data[d]['low'] = float(item['price'])
        

    quotes = {}
    quotes['open']=numpy.asarray([chart_data[item]['open'] for item in sorted(chart_data)])
    quotes['close']=numpy.asarray([chart_data[item]['close'] for item in sorted(chart_data)])
    quotes['high']=numpy.asarray([chart_data[item]['high'] for item in sorted(chart_data)])
    quotes['low']=numpy.asarray([chart_data[item]['low'] for item in sorted(chart_data)])

    xdate=[datetime.fromtimestamp(item) for item in sorted(chart_data)]

    ax[0].xaxis.set_major_locator(ticker.MaxNLocator(6))

    def chart_date(x,pos):
        try:
            return xdate[int(x)]
        except IndexError:
            return ''
        
    ax[0].clear()
    ax[0].xaxis.set_major_formatter(ticker.FuncFormatter(chart_date))
    ax[0].grid(True, color='blue')
    candlestick2_ohlc(ax[0], quotes['open'],quotes['high'],quotes['low'],quotes['close'],width=0.6)
    fig.autofmt_xdate()
    fig.tight_layout()

    macd, macdsignal, macdhist = talib.MACD(quotes['close'], fastperiod=12, slowperiod=26, signalperiod=9)
    ax[1].clear()
    ax[1].grid(True, color='blue')
    ax[1].plot(macd, color="y")
    ax[1].plot(macdsignal)

    idx = numpy.argwhere(numpy.diff(numpy.sign(macd - macdsignal)) != 0).reshape(-1) + 0

    inters = []

    for offset, elem in enumerate(macd):
        if offset in idx:
            inters.append(elem)
        else:
            inters.append(numpy.nan)
    ax[1].plot(inters, 'ro')

    max_v = 0
    hist_data = []
     
    for offset, elem in enumerate(macdhist):
        activity_time = False
        curr_v = macd[offset] - macdsignal[offset]
        if abs(curr_v) > abs(max_v):
            max_v = curr_v
        perc = curr_v/max_v
        
        if       (   (macd[offset] > macdsignal[offset] and perc*100 > BULL_PERC) # восходящий тренд
                     or      (
                                 macd[offset] < macdsignal[offset] and perc*100 < (100-BEAR_PERC)
                            )

                ):
            v = 1
            activity_time = True
        else:
            v = 0
            
        if offset in idx and not numpy.isnan(elem):
            # тренд изменился
            max_v = curr_v = 0 # обнуляем пик спреда между линиями

        hist_data.append(v*1000)

    ax[2].fill_between([x for x in range(len(macdhist))], 0, hist_data if SHOW_BOT_CHART else macdhist,  facecolor='gray', interpolate=True)
    plt.gcf().texts.remove(fig.comment)
    fig.comment = plt.figtext(.6,.05, '%s %s%s' % (PAIR, time.ctime(), ' ТОРГУЕМ!!!! ' if activity_time else ''), style='italic', bbox={'facecolor':'red' if activity_time else 'green', 'alpha':0.5, 'pad':10})

ani = animation.FuncAnimation(fig, update_graph, interval=1000)
plt.grid()
plt.show()
06.05.2018 20:31
Добавил на графики "Bollinger bands" и "RSI". Советник по прежнему срабатывает по MACD. Есть идеи доработки кода по всем индикаторам.
======================================================================================================
import numpy
import talib
from talib import MA_Type
import requests
import json
import time
from pylab import *

from matplotlib.finance import candlestick2_ohlc
import matplotlib.animation as animation

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
from datetime import datetime

BEAR_PERC = 75
BULL_PERC = 95

PERIOD = 5 # Период в минутах для построения свечей

PAIR = 'ETH_USD'

SHOW_BOT_CHART = False

fig, ax = plt.subplots(3, sharex=True)
fig.comment = plt.figtext(.7,.05, '')

def update_graph(interval):

    resource = requests.get('https://api.exmo.com/v1/trades/?pair=%s&limit=10000' % PAIR)
    #print(resource.text[:100])
    #return
    data = json.loads(resource.text)

    chart_data = {} # сформируем словарь с ценой закрытия по PERIOD минут
    
    for item in reversed(data[PAIR]):
        d = int(float(item['date'])/(PERIOD*60))*(PERIOD*60) # Округляем время сделки до PERIOD минут
        if not d in chart_data:
            chart_data[d] = {'open':0, 'close':0, 'high':0, 'low':0}

        chart_data[d]['close'] = float(item['price'])

        if not chart_data[d]['open']:
            chart_data[d]['open'] = float(item['price'])

        if not chart_data[d]['high'] or chart_data[d]['high'] < float(item['price']):
            chart_data[d]['high'] = float(item['price'])

        if not chart_data[d]['low'] or chart_data[d]['low'] > float(item['price']):
            chart_data[d]['low'] = float(item['price'])
        

    quotes = {}
    quotes['open']=numpy.asarray([chart_data[item]['open'] for item in sorted(chart_data)])
    quotes['close']=numpy.asarray([chart_data[item]['close'] for item in sorted(chart_data)])
    quotes['high']=numpy.asarray([chart_data[item]['high'] for item in sorted(chart_data)])
    quotes['low']=numpy.asarray([chart_data[item]['low'] for item in sorted(chart_data)])

    xdate=[datetime.fromtimestamp(item) for item in sorted(chart_data)]
    #xdate=[datetime.fromtimestamp(item) for item in data]

    ax[0].xaxis.set_major_locator(ticker.MaxNLocator(6))

    def chart_date(x,pos):
        try:
            return xdate[int(x)]
        except IndexError:
            return ''

    ax[0].clear()
    ax[0].xaxis.set_major_formatter(ticker.FuncFormatter(chart_date))
    ax[0].grid(True, color='blue')
    ax[0].set_title("Сandl+Bollinger bands")
    candlestick2_ohlc(ax[0], quotes['open'],quotes['high'],quotes['low'],quotes['close'],width=0.6)
    upper, middle, lower = talib.BBANDS(quotes['close'], matype=MA_Type.T3)        
    ax[0] = plt.subplot(311)
    plt.plot(upper)
    plt.plot(middle)
    plt.plot(lower)
    fig.autofmt_xdate()
    fig.tight_layout()
    macd, macdsignal, macdhist = talib.MACD(quotes['close'], fastperiod=12, slowperiod=26, signalperiod=9)
    rsi = talib.RSI(quotes['close'], timeperiod=14)   # RSI(14)
    ax[1].clear()
    ax[1].grid(True, color='blue')
    ax[1].plot(macd, color="y")
    ax[1].plot(macdsignal)
    ax[1].set_title("MACD")
    ax[2].clear()
    ax[2].grid(True, color='blue')
    ax[2].plot(rsi, color="y")
    ax[2].set_title("RSI")
    idx = numpy.argwhere(numpy.diff(numpy.sign(macd - macdsignal)) != 0).reshape(-1) + 0

    inters = []

    for offset, elem in enumerate(macd):
        if offset in idx:
            inters.append(elem)
        else:
            inters.append(numpy.nan)
    ax[1].plot(inters, 'ro')

    max_v = 0
    hist_data = []
     
    for offset, elem in enumerate(macdhist):
        activity_time = False
        curr_v = macd[offset] - macdsignal[offset]
        if abs(curr_v) > abs(max_v):
            max_v = curr_v
        perc = curr_v/max_v
        
        if       (   (macd[offset] > macdsignal[offset] and perc*100 > BULL_PERC) # восходящий тренд
                     or      (macd[offset] < macdsignal[offset] and perc*100 < (100-BEAR_PERC)
                            )

                ):
            v = 1
            activity_time = True
        else:
            v = 0
            
        if offset in idx and not numpy.isnan(elem):
            # тренд изменился
            max_v = curr_v = 0 # обнуляем пик спреда между линиями

        hist_data.append(v*1000)

    ax[1].fill_between([x for x in range(len(macdhist))], 0, hist_data if SHOW_BOT_CHART else macdhist,  facecolor='gray', interpolate=True)
    plt.gcf().texts.remove(fig.comment)
    fig.comment = plt.figtext(.6,.05, '%s %s%s' % (PAIR, time.ctime(), ' ТОРГУЕМ!!!! ' if activity_time else ''), style='italic', bbox={'facecolor':'red' if activity_time else 'green', 'alpha':0.5, 'pad':10})

ani = animation.FuncAnimation(fig, update_graph, interval=1000)
plt.grid()
plt.show()
10.04.2018 18:09
ModuleNotFoundError: No module named 'matplotlib.finance'
самый простой вариант - в командной строке набрать pip install matplotlib==2.0.0
18.06.2018 10:18
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1

на ubuntu 16.04 никак ta-lib не поставить. уже весь гугл перерыл, все равно ошибка :)
18.06.2018 14:59
Посмотрите тут, в конце статьи - как раз на 16.04 тестил
https://bablofil.ru/kak-zapustit-bota-na-servere/
18.06.2018 19:31
спасибо большое! ))
16.08.2018 18:29
Андрей добрый вечер. Спасибо за бот)
Еле установил талиб)
запускаю выдает ошибку:
40009: The nonce parameter is less or equal than what was used before "253503482920014"
Что не так?
16.08.2018 18:35
Забыл добавить, это единственное что я изменил в коде:

# Список пар, на которые торгуем
MARKETS = [
'USD_RUB'
]

CAN_SPEND = 3 # Сколько USD готовы вложить в бай
MARKUP = 0.001 # 0.001 = 0.1% - Какой навар со сделки хотим получать
17.08.2018 04:15
Видимо вчера с биржей были какие-то проблемы, все заработало.
19.08.2018 09:03
Отлично)
Вообще в таких случаях можно попробовать пересоздать апи ключи
26.08.2018 14:40
Доброго времени суток. 
подскажите, как переделать код для Binance. покрутила с настройками, все равно ошибки выдает.
заранее спасибо )
27.08.2018 06:26
Добрый день
Возьмите код по этой ссылке https://bablofil.ru/static/macd_bots/mpl_binance.py
17.11.2018 15:30
Здравствуйте.
Выражаю огромную благодарность автору за его труды и желание поделиться результатами . Пришел к выводу, что автор уже создал своего идеального бота и теперь выступает в роли Учителя выложив на сайте разные части кода, кто из учеников сможет собрать части воедино тот и познает истину ;) (соберет правильного бота) ... еще раз спасибо, респект и уважуха ...

А теперь для тех у кого на этапе установки ta-lib (Win 10 x64, python 3.6 - 3.7) возникла ошибка 
building 'talib._ta_lib' extension
    error: Microsoft Visual C++ 14.0 is required....

мне помогло вот это https://www.scivision.co/python-windows-visual-c++-14-required/ правда дополнения к Visual Studio отняли дополнительно более Гб места на диске, не уверен что это единственное решение но мне помогло.
28.11.2018 07:29
Строится график!
Помогло:

pip install mpl_finance

и замена в коде:

from matplotlib.finance import candlestick2_ohlc   на   from mpl_finance import candlestick2_ohlc
05.06.2019 18:53
не могу поставить ta-lib
вылащиет ошибка,
система 64, винда такая же, поставил все кроме последнего..
06.06.2019 15:37
установил. благодраю))))
24.08.2019 23:27
Андрей здравствуйте. Борюсь с одной проблемой и прошу помощи. 
Думаю что с этой проблемой народ будет всё равно сталкиваться и желательно повесить решение этой проблемы в блоге отдельной статьёй после того как устанавливать Python.А речь идёт об ошибке [Fatal error in launcher: Unable to create process using '"c:\program files (x86)\python37-32\python.exe"  "C:\Program Files (x86)\Python37-32\Scripts\pip.exe" install numpy']. Данная ошибка возникает при установке Python х64 в операционной системе Windows 10 x64 и проявляется при попытке установить какой либо модуль с помощью команды pip install... При том что во время установки Python галочка Add PATH была поставлена. Сколько не искал, нормального решения так и не нашел.
29.10.2019 15:00
Здравствуйте! Огромное спасибо за Ваш труд!
Скажите пожалуйста, где взять последний код бота для EXMO не только с MACD, но и полосами Боллинджера и RSI? Или такого еще нет (запутался в количестве вариаций кода здесь).
10.11.2019 09:52
Добрый день!
Exmo не умеет отдавать свечи, поэтому построить для них рабочие индикаторы не получится.
Добавлять их они почему-то не хотят (
Пожалуйста, Авторизуйтесь что бы оставить свой комментарий