Индикаторы на Python

21 января 2022, 07:55
Sergey Deev
11
968

Всем хорош Python: производительностью, гибкостью обработки данных, интеграцией с MT5 и пр.

Много чего позволяет MetaTrader5 API - получить котировки, информацию о счете, инструментах, вести торговые операции и пр. Жаль, что не умеет получать данные индикаторов.

Но ведь индикаторы не сложно посчитать формулы доступны..

Данной публикацией автор начинает разработку собственной библиотеки для расчета стандартных (возможно и некоторых пользовательских) индикаторов.

Итак, все просто: создаем файл indicators.py, в нем - класс ta с набором функций, рассчитывающих данные индикаторов. Файл будет прицеплен к статье. В тексте приводится лишь скрипт с примером работы (который так же будет прицеплен к статье). Комментарии - по тексту.

#импорт библиотек
import MetaTrader5 as mt5
from datetime import datetime
import pandas as pd
import matplotlib.pyplot as plt
from indicators import ta # собственная библиотека с индикаторами

# подключаемся к МТ5
mt5.initialize("C:\\Program Files\\InstaTrader 5\\terminal64.exe")
# формируем интервал запроса
tm = datetime.now()
tx = datetime(tm.year-1,tm.month,tm.day)
# получаем котировки
rates = pd.DataFrame(mt5.copy_rates_range("EURUSD", mt5.TIMEFRAME_D1, tx, tm))

# формируем нормальное время
rates['time'] = [datetime.fromtimestamp(x) for x in rates['time']]

ema_fast=12
ema_slow=26
sma_signal=9
channel=20

# получаем данные индикаторов MACD и PRICE_CHANNEL
rates['macd'],rates['signal'] = ta.macd(rates['close'],ema_fast,ema_slow,sma_signal)
rates['upper'],rates['lower'],rates['middle'] = ta.price_channel(rates['high'],rates['low'],channel)
 
# на график выводим данные с отбрасыванием начальных значений

# формируем подложку
plt.figure(figsize=(12, 8))
# рисуем верхнее окно, выводим график с ценами и канал
plt.subplot(2, 1, 1)
plt.title("PRICE_CHANNEL")
plt.plot(rates.time[ema_slow+sma_signal:], rates.close[ema_slow+sma_signal:], label="сlose")
plt.plot(rates.time[ema_slow+sma_signal:], rates.upper[ema_slow+sma_signal:],":",label="upper")
plt.plot(rates.time[ema_slow+sma_signal:], rates.lower[ema_slow+sma_signal:],":",label="lower")
plt.plot(rates.time[ema_slow+sma_signal:], rates.middle[ema_slow+sma_signal:],":",label="median")
plt.legend()
plt.grid(True)
# рисуем нижнее окно, выводим график MACD
plt.subplot(2, 1, 2)
plt.title("MACD")
plt.bar(rates.time[ema_slow+sma_signal:], rates.macd[ema_slow+sma_signal:], label="main", color="gray", width=3)
plt.plot(rates.time[ema_slow+sma_signal:], rates.signal[ema_slow+sma_signal:],":",label="signal", color="red")
plt.legend()
plt.grid(True)
# выводим картинку
plt.show()

И это, собственно, все. Получаем результат с отображением графика цены с индикатором price_channel и MACD в подвале. Файл indicators.py необходимо положить в каталог основного скрипта.

В версии 1.0 (15.01.2022) реализованы индикаторы SMA, EMA, MACD, Upper, Lower и Price_Channel. Дальше будет больше..


В версии 1.0 (23.01.2022) реализованы индикаторы LWMA, SMMA, TEMA, DEMA, AMA, FRAMA. Ниже скрипт с примером вызова и скриншот результатов (строки импорта и загрузки данных не приводятся - аналогичны первому примеру).

# получаем данные индикаторов
rates['sma'] = ta.sma(rates['close'],period)
rates['ema'] = ta.ema(rates['close'],period)
rates['lwma'] = ta.lwma(rates['close'],period)
rates['smma'] = ta.smma(rates['close'],period)
rates['dema'] = ta.dema(rates['close'],period)
rates['tema'] = ta.tema(rates['close'],period)
rates['ama'] = ta.ama(rates['close'],period,2,30)
rates['frama'] = ta.frama(rates['close'],rates['high'],rates['low'],period)

# выводим на график данные
# формируем подложку
plt.figure(figsize=(12, 8))
# рисуем верхнее окно, выводим график с ценами и графиками
plt.subplot(1, 1, 1)
plt.title("MOVING AVERAGES")
plt.plot(rates.time, rates.close, label="сlose")
plt.plot(rates.time, rates.sma,"-",label="sma")
plt.plot(rates.time, rates.ema,"-",label="ema")
plt.plot(rates.time, rates.lwma,"-",label="lwma")
plt.plot(rates.time, rates.smma,"-",label="smma")
plt.plot(rates.time, rates.dema,"-",label="dema")
plt.plot(rates.time, rates.tema,"-",label="tema")
plt.plot(rates.time, rates.ama,"-",label="ama",color="black")
plt.plot(rates.time, rates.frama,"-",label="frama",color="brown")
plt.legend()
plt.grid(True)
# выводим картинку
plt.show()



Файлы: