Scrypt Python no Metatrader

Desenvolvendo Scrypt Python no Metatrader

grafico bradesco com scrypt python metatrader
Gráfico de Velas da Ação do Banco Bradesco

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().

Por favor, siga e compartilhe:
Esta entrada foi publicada em Programação. ligação permanente.
0 0 votos
Article Rating
Inscrever
Notifique para
guest

0 Comentários
Antigos
Novos Mais Votados
Inline Feedbacks
Ver todos os comentários