Desenvolvendo Scrypt Python no Metatrader
Metatrader e Python
Neste artigo veremos um Scrypt Python no Metatrader, a maior plataforma de negociação de ativos do mundo.
O Metatrader disponibiliza em sua IDE a opção de criação de Scrypts tanto na linguagem de programação mql5 quanto na Python.
Para isso basta que você tenha instalado em seu sistema operacional o compilador Python e configure a IDE para utilizá-lo.
Neste artigo iremos mostrar como geramos a imagem acima através de um scrypt Python.
A imagem ilustra o cruzamento de médias de preços da ação ordinária do banco Bradesco e possíveis pontos de negociação do ativo.
Importando as Bibliotecas
Primeiramente importamos as bibliotecas necessárias: Metatrader, Mplfinance, Pandas, NumPy e Datetime.
Para informações adicionais sobre as bibliotecas busque os repositórios(Github) das mesmas.
from datetime import datetime
import MetaTrader5 as mt5
import numpy as np
import pandas as pd
import mplfinance as mpf
Obtendo os Preços da Ação pelo Metatrader
Para obtenção dos candles da ação do Bradesco devemos inicializar a biblioteca Metatrader5.
Após a conexão com sucesso podemos obter os rates da ação no período desejado.
Aproveitamos e indexamos pela data nosso dataframe.
mt5.initialize()
if not mt5.initialize():
print("initialize() failed")
mt5.shutdown()
rates_frame = pd.DataFrame(mt5.copy_rates_from("BBDC3", mt5.TIMEFRAME_D1, datetime(2022,8,7), 100))
rates_frame['time']=pd.to_datetime(rates_frame['time'], unit='s')
rates_frame = rates_frame.set_index('time')
Calculando as Médias e o Desvio Padrão
Agora que já temos todos os dados dos candles do ativo BBDC3, vamos calcular as médias de 20 e 9 períodos. Para a de 9 calculamos também a média exponencial.
No cálculo das médias utilizamos o preço de fechamento do dia.
Precisamos também do desvio padrão da média que será utilizado para calcularmos as bandas superior e inferior da Banda de Bollinger.
rates_frame['MM20'] = rates_frame['close'].rolling(20).mean()
rates_frame['MME9'] = rates_frame['close'].ewm(span=9).mean()
rates_frame['MM9'] = rates_frame['close'].rolling(9).mean()
rates_frame['BB_SUP'] = rates_frame['close'].rolling(20).mean() + 2 * rates_frame['close'].rolling(20).std()
rates_frame['BB_INF'] = rates_frame['close'].rolling(20).mean() - 2 * rates_frame['close'].rolling(20).std()
Plotando no Gráfico as Médias e a BB
Agora que já temos os dados calculados vamos inserir essas informações no gráfico:
mm20 = mpf.make_addplot(rates_frame['MM20'].loc[date_start:date_end])
mm9 = mpf.make_addplot(rates_frame['MM9'].loc[date_start:date_end])
mme9 = mpf.make_addplot(rates_frame['MME9'].loc[date_start:date_end])
bb_inf = mpf.make_addplot(rates_frame['BB_INF'].loc[date_start:date_end])
bb_sup = mpf.make_addplot(rates_frame['BB_SUP'].loc[date_start:date_end])
Função de Cruzamento de Médias
Criamos uma função simples para verificarmos os pontos onde aconteceram cruzamento das médias.
Após identificar os pontos de cruzamento inserimos a informação em um array que identificamos como sinal onde:
- A posição 0 é sinal de compra e;
- A posição 1 é sinal de venda.
def mm_cross(mm1,mm2):
signal = [[],[]]
previous_mm1 = 0
previous_mm2 = 0
for date,value in mm1.iteritems():
if value < mm2[date] and previous_mm1 > previous_mm2:
signal[0].append(True)
signal[1].append(np.nan)
elif value > mm2[date] and previous_mm1 < previous_mm2:
signal[1].append(True)
signal[0].append(np.nan)
else:
signal[0].append(np.nan)
signal[1].append(np.nan)
previous_mm1 = value
previous_mm2 = mm2[date]
return signal
Plotando os resultados
Após obter os sinais através da função que criamos(mm_cross) fizemos uma análise para verificar se houve sinais de compra e venda.
Logo em seguida plotamos os marcadores dos sinais de compra e venda para o gráfico e utilizando a função plot() geramos o gráfico.
exist_signal_buy = False
exist_signal_sell = False
signal = mm_cross(rates_frame['MME9'].loc[date_start:date_end], rates_frame['MM20'].loc[date_start:date_end])
for i in signal[1]:
if(i == True) :
exist_signal_buy = True
break
for i in signal[0]:
if(i == True) :
exist_signal_sell = True
break
if exist_signal_buy and exist_signal_sell:
apd_buy = mpf.make_addplot(signal[1],type='scatter', markersize=200, marker='^', color='green')
apd_sell = mpf.make_addplot(signal[0],type='scatter', markersize=200, marker='v', color='red')
mpf.plot(rates_frame.loc[date_start:date_end],figratio=(18,10),type='candle', addplot=[mme9,mm20,apd_buy, apd_sell,bb_inf,bb_sup], title='BBDC3', ylabel='Preço de Fechamento')
elif exist_signal_buy:
apd_buy = mpf.make_addplot(signal[1],type='scatter', markersize=200, marker='^', color='green')
mpf.plot(rates_frame.loc[date_start:date_end],figratio=(18,10),type='candle', addplot=[mme9,mm20,apd_buy, bb_inf,bb_sup], title='BBDC3', ylabel='Preço de Fechamento')
elif exist_signal_sell:
apd_sell = mpf.make_addplot(signal[0],type='scatter', markersize=200, marker='v', color='red')
mpf.plot(rates_frame.loc[date_start:date_end],figratio=(18,10),type='candle', addplot=[mme9,mm20,apd_sell, bb_inf,bb_sup], title='BBDC3', ylabel='Preço de Fechamento')
mt5.shutdown()
Informações Finais sobre o Scrypt
Vimos em menos de 100 linhas de código uma análise completa de sinais de compra e venda através da estratégia de negociação de cruzamento de médias na ação ordinária do banco Bradesco(BBDC3).
Importante ressaltar que esse código tem como premissa que você está logado na conta da corretora pela plataforma Metatrader5, para acesso direto passe os parâmetros de login e senha pela função initialize().