Всем хорош 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()