English Русский 中文 Español Deutsch 日本語
preview
Desenvolvimento do Kit de Ferramentas de Análise de Price Action (Parte 20): Fluxo Externo (IV) — Correlation Pathfinder

Desenvolvimento do Kit de Ferramentas de Análise de Price Action (Parte 20): Fluxo Externo (IV) — Correlation Pathfinder

MetaTrader 5Exemplos |
26 0
Christian Benjamin
Christian Benjamin

Conteúdo


Introdução

O trading de Forex exige uma compreensão clara de diversos fatores. Um dos principais fatores é a correlação entre pares de moedas. A correlação entre pares de moedas define como dois pares se movimentam em relação um ao outro. Ela mostra se eles se movimentam na mesma direção, em direções opostas ou de forma aleatória ao longo do tempo. Como as moedas são sempre negociadas em pares, cada par está relacionado a outros, criando uma rede de interdependências.

Conhecer essas relações pode aprimorar sua estratégia de trading e reduzir o risco. Por exemplo, comprar EUR/USD e GBP/USD durante um período de alta correlação positiva duplica sua exposição às mesmas forças de mercado e aumenta o risco. Por outro lado, esse conhecimento permite que os traders construam portfólios diversificados e implementem estratégias de hedge de forma eficaz.

Este artigo explica como adicionar a análise de correlação entre pares de moedas ao seu kit de ferramentas de trading. Ele oferece insights práticos e estratégias aplicáveis para aprimorar o desempenho no trading. Os dois diagramas abaixo ilustram a estrutura de mercado de EUR/USD e GBP/USD nas mesmas datas. Ambos os pares estavam em alta em 2 de abril e passaram para uma tendência de baixa em 3 de abril, demonstrando uma correlação positiva. Os traders podem utilizar um par para confirmar reversões no outro. Por exemplo, se o par EUR/USD estiver sobrecomprado e o GBP/USD estiver sob pressão vendedora, isso fornece um sinal claro de uma possível reversão no EUR/USD. A ferramenta Correlation Pathfinder é essencial porque mostra claramente a inter-relação entre os pares de moedas, ajudando os traders a obter uma visão mais precisa do mercado.

GBP/USD

GPBUSD

Fig 1. GBP/USD


EUR/USD

EURUSD

Fig 2. EUR/USD



Visão Geral do Sistema

As correlações entre moedas são expressas por meio de um coeficiente que varia de -1 a +1. Um valor próximo de +1 indica que os pares de moedas tendem a se movimentar juntos, enquanto um valor próximo de -1 indica que eles se movimentam em direções opostas. Um coeficiente próximo de zero indica pouca ou nenhuma relação.

Essa compreensão é fundamental para um gerenciamento de risco eficaz. Por exemplo, comprar EUR/USD e GBP/USD durante períodos de forte correlação positiva aumenta a exposição geral ao mercado, efetivamente duplicando o risco. Por outro lado, conhecer o grau de correlação que permite que os traders diversifiquem os portfólios e apliquem estratégias de hedge para se proteger contra movimentos inesperados do mercado, como mencionei anteriormente.

O sistema consiste em dois componentes interconectados. Primeiro, um Expert Advisor MQL5 recupera continuamente dados históricos de preços de EUR/USD e GBP/USD. Ele formata esses dados em uma estrutura JSON e os envia para um servidor Python. O segundo componente é um mecanismo de análise baseado em Python. Ele utiliza Pandas para calcular tanto as correlações gerais quanto as correlações móveis e utiliza Matplotlib para gerar um gráfico de correlação móvel com dimensão fixa. Além disso, o servidor produz comentários analíticos que explicam se os pares de moedas se movimentam juntos ou divergem e descreve as implicações para as estratégias de trading.

Entenda melhor visualizando o fluxograma a seguir, que apresenta o fluxo de dados e o processo de análise do sistema.

Fluxograma

Fig 3. Diagrama de Fluxo

Este diagrama fornece uma visão geral clara e visual do fluxo de trabalho do sistema, acompanhando o processo desde a recuperação dos dados no MetaTrader 5 até a geração da análise e dos comentários no servidor Python. Os elementos marcados de A a H representam cada etapa do processo, ilustrando como os dados são coletados, organizados em JSON, transmitidos ao servidor, analisados com Pandas, visualizados com Matplotlib e, por fim, acompanhados de comentários explicativos antes do retorno dos resultados da análise.


Detalhes técnicos

O Expert Advisor MQL5

Recuperação de Dados

O Expert Advisor recupera dados históricos de preços utilizando a função integrada do MetaTrader 5, CopyRates(). Essa função obtém um array de registros de preços (estruturados como MqlRates) que contém informações como horário e preços de abertura, máxima, mínima e fechamento para um determinado símbolo e timeframe. Neste EA, o usuário pode configurar o timeframe (por exemplo, intervalos de 15 minutos por meio de PERIOD_M15) e o número de barras (pontos de dados) a serem exportadas utilizando o parâmetro BarsToExport. Ao permitir que esses valores sejam configuráveis, o EA pode ser adaptado a diversas estratégias de trading. Seja para uma visão de curto prazo, seja para uma análise mais ampla das tendências históricas.

MqlRates rates1[];
if(CopyRates(Symbol1, TimeFrame, 0, BarsToExport, rates1) <= 0)
{
   Print("Failed to copy rates for ", Symbol1);
   return "";
}
ArraySetAsSeries(rates1, true);

Depois que os dados são recuperados para cada par de moedas (como EUR/USD e GBP/USD), o EA garante que o array de dados seja configurado como uma série. Essa etapa é fundamental porque organiza o array de modo que a barra mais recente fique no índice 0, o que está alinhado à forma como muitas outras funções no ambiente MQL5 esperam que os dados sejam formatados. Essa preparação dos dados históricos garante que o número correto de barras seja recuperado e mantém a ordem cronológica adequada, o que é essencial para a análise subsequente.

Construção do Payload JSON

Após a coleta dos dados de preços, o EA constrói um payload JSON que organiza os dados de forma estruturada para transmissão. A função BuildJSONPayload() começa criando um objeto JSON que inclui os nomes dos dois pares de moedas. Em seguida, para cada par de moedas, a função constrói um array de objetos de dados. Cada objeto no array representa uma barra de dados históricos e inclui duas informações principais: o horário (formatado de maneira consistente utilizando TimeToString() com os parâmetros TIME_DATE e TIME_SECONDS) e o preço de fechamento (formatado com cinco casas decimais utilizando DoubleToString()).

string json = "{";
json += "\"symbol1\":\"" + Symbol1 + "\",";
json += "\"symbol2\":\"" + Symbol2 + "\",";
json += "\"data1\":[";
for(int i = 0; i < ArraySize(rates1); i++)
{
   string timeStr = TimeToString(rates1[i].time, TIME_DATE | TIME_SECONDS);
   json += "{\"time\":\"" + timeStr + "\",\"close\":" + DoubleToString(rates1[i].close, 5) + "}";
   if(i < ArraySize(rates1) - 1)
      json += ",";
}
json += "],";
// The same pattern repeats for Symbol2's data array.
json += "}";
return json;

Essa abordagem modular garante que o payload inclua todos os detalhes necessários para a análise no servidor Python. A estrutura JSON facilita a manutenção da consistência e garante que o servidor possa interpretar os dados sem ambiguidades. Por exemplo, ao identificar os arrays como data1 e data2, o script do servidor sabe exatamente qual conjunto de dados corresponde a cada par de moedas. Essa separação clara é fundamental para combinar os dados posteriormente durante o cálculo da correlação. A função percorre cada array de dados históricos, concatenando cada registro com a formatação JSON adequada e, em seguida, conclui a construção fechando o objeto JSON.

Integração com WebRequest

Depois que o payload JSON é construído, o EA envia os dados utilizando a função WebRequest() do MetaTrader, uma ferramenta essencial para realizar requisições HTTP diretamente a partir da plataforma de trading. Esse componente gerencia a comunicação entre o Expert Advisor MQL5 e o servidor Python que realiza as análises adicionais. Antes de enviar os dados, o EA converte a string JSON em um array dinâmico uchar utilizando a função StringToCharArray(), pois WebRequest() aceita o corpo da requisição nesse formato. Essa conversão é necessária para garantir que o payload seja transmitido corretamente pela rede.

string requestHeaders = "Content-Type: application/json\r\n";
uchar result[];
string responseHeaders;
int webRequestResult = WebRequest("POST", pythonUrl, requestHeaders, timeout, requestData, result, responseHeaders);
if(webRequestResult == -1)
{
   Print("Error in WebRequest. Error code = ", GetLastError());
   return;
}

string response = CharArrayToString(result);
Print("Server response: ", response);

Em seguida, o EA configura os cabeçalhos HTTP, especificando que os dados estão no formato JSON por meio do cabeçalho "Content-Type: application/json\r\n". Parâmetros de entrada configuráveis, como pythonUrl (o endpoint do servidor) e timeout (o tempo que o EA aguarda por uma resposta), permitem que o usuário ajuste os parâmetros de rede de acordo com seu ambiente. A função WebRequest() é utilizada com esses cabeçalhos e configurações de timeout para enviar uma requisição HTTP POST ao servidor Python. Se a requisição falhar, o EA exibe um código de erro, o que auxilia na solução de problemas de conectividade. Caso contrário, ele converte a resposta resultante em um array uchar novamente para uma string e, em seguida, exibe a resposta do servidor — espera-se que essa resposta contenha informações úteis, como um valor de correlação calculado e quaisquer comentários gerados pelo mecanismo de análise Python.

O Servidor de Análise Python

Ambiente do Servidor

O sistema é desenvolvido sobre um servidor baseado em Flask que recebe requisições POST. Quando iniciado, o servidor é inicializado utilizando as configurações padrão do Flask e define o nível de logging como DEBUG. Essa configuração garante que todas as requisições recebidas e as etapas de processamento sejam registradas detalhadamente. O servidor foi projetado para receber dados JSON, processá-los, realizar a análise e retornar os resultados no formato JSON. Ao utilizar Flask, o servidor permanece leve e eficiente, sendo capaz de processar requisições web em um ambiente headless (sem interface gráfica), ideal para aplicações de trading automatizado.

import matplotlib
matplotlib.use("Agg")  # Use non-interactive backend to avoid GUI overhead
import matplotlib.pyplot as plt
from flask import Flask, request, jsonify
import logging

app = Flask(__name__)
logging.basicConfig(level=logging.DEBUG)

if __name__ == "__main__":
    app.run(host="127.0.0.1", port=5000)

Análise e Processamento de Dados

Assim que o servidor recebe uma requisição POST,ele começa tentando interpretar o payload JSON recebido. Se o parser padrão falhar, o código decodifica os dados brutos da requisição, remove quaisquer caracteres excedentes após a última chave de fechamento e, em seguida, carrega o JSON. Os dados analisados são então convertidos em dois DataFrames separados do Pandas, um para cada par de moedas. O campo “time” do payload é analisado e convertido em objetos datetime para facilitar a combinação precisa dos dados e a análise de séries temporais. Após combinar os dois DataFrames pela coluna “Time” compartilhada, o servidor calcula duas métricas principais de correlação. Primeiro, ele calcula a correlação geral entre os preços de fechamento dos dois símbolos. Em seguida, calcula uma correlação móvel utilizando uma janela de 50 barras. Essa correlação móvel fornece insights sobre como a correlação entre os pares muda ao longo do tempo, o que é fundamental para compreender a dinâmica do mercado e identificar períodos em que essa relação se fortalece ou enfraquece.

import pandas as pd
import json

@app.route('/analyze', methods=['POST'])
def analyze():
    # Parse JSON payload
    data = request.get_json(silent=True)
    if not data:
        raw_data = request.data.decode('utf-8').strip()
        app.logger.debug("Raw request data: %s", raw_data)
        try:
            end_index = raw_data.rfind("}")
            trimmed_data = raw_data[:end_index+1] if end_index != -1 else raw_data
            data = json.loads(trimmed_data)
        except Exception as e:
            app.logger.error("Failed to parse JSON: %s", str(e))
            return jsonify({"error": "Invalid JSON received"}), 400

    # Convert incoming JSON arrays to DataFrames
    data1 = pd.DataFrame(data["data1"])
    data2 = pd.DataFrame(data["data2"])
    
    # Convert time strings to datetime objects
    data1['Time'] = pd.to_datetime(data1['time'])
    data2['Time'] = pd.to_datetime(data2['time'])
    
    # Merge DataFrames on 'Time'
    merged = pd.merge(data1, data2, on="Time", 
                      suffixes=('_' + data["symbol1"], '_' + data["symbol2"]))
    
    # Calculate overall correlation between the close prices
    correlation = merged[f'close_{data["symbol1"]}'].corr(merged[f'close_{data["symbol2"]}'])
    
    # Calculate rolling correlation with a 50-bar window
    merged['RollingCorrelation'] = merged[f'close_{data["symbol1"]}'].rolling(window=50).corr(merged[f'close_{data["symbol2"]}'])
    
    # [Graph generation and commentary code follows here, see next sections]

Geração e Armazenamento do Gráfico

Para a representação visual, o servidor utiliza Matplotlib com o backend “Agg”. Esse backend elimina a necessidade de uma interface gráfica do usuário, garantindo que o gráfico seja gerado em um ambiente headless sem provocar qualquer sobrecarga relacionada à GUI. O gráfico é produzido com um tamanho de figura fixo, definido em 7,5 polegadas de largura a 100 DPI. Essa configuração garante que a imagem de saída tenha uma largura fixa de 750 pixels, proporcionando consistência entre os relatórios e facilitando a interpretação visual dos dados. Depois de gerado, o gráfico que exibe a correlação móvel é salvo como um arquivo PNG no mesmo diretório do script Python. O armazenamento local da imagem permite sua fácil recuperação e posterior compartilhamento sem incluir a imagem em si na resposta JSON do servidor.

import matplotlib.pyplot as plt

# Generate a rolling correlation plot
plt.figure(figsize=(7.5, 6), dpi=100)  # 7.5 inches * 100 dpi = 750 pixels width
plt.plot(merged['Time'], merged['RollingCorrelation'], label="Rolling Correlation (50 bars)")
plt.xlabel("Time")
plt.ylabel("Correlation")
plt.title(f"{data['symbol1']} and {data['symbol2']} Rolling Correlation")
plt.legend()
plt.grid(True)
plt.tight_layout()

# Save the graph as a PNG file in the same folder
plot_filename = "rolling_correlation.png"
plt.savefig(plot_filename)
plt.close()

Comentários Interpretativos

Além dos números e gráficos brutos, o servidor aprimora a análise gerando comentários explicativos. Esses comentários são produzidos por uma função dedicada que examina tanto os valores da correlação geral quanto os valores da correlação recente (móvel). Por exemplo, se a correlação geral for muito alta (próxima de +1), o comentário explica que os dois pares de moedas geralmente se movimentam em conjunto, o que pode indicar uma eficácia limitada da diversificação ao negociar múltiplos pares. Por outro lado, se a correlação for baixa ou se tornar negativa, o comentário destaca o potencial de divergência entre os pares e as oportunidades para realizar hedge ou ajustar a exposição.

def generate_commentary(corr, rolling_series):
    """Generate a commentary based on overall and recent correlation values."""
    commentary = ""
    if corr >= 0.8:
        commentary += ("The currency pairs have a very strong positive correlation, meaning "
                       "they typically move together. This may support the use of hedging strategies.\n")
    elif corr >= 0.5:
        commentary += ("The pairs display a moderately strong positive correlation with some deviations, "
                       "indicating they often move in the same direction.\n")
    elif corr >= 0.0:
        commentary += ("The overall correlation is weakly positive, suggesting occasional movement together "
                       "but limited consistency, which may offer diversification opportunities.\n")
    elif corr >= -0.5:
        commentary += ("The pairs exhibit a weak to moderate negative correlation; they tend to move in opposite "
                       "directions, which can be useful for diversification.\n")
    else:
        commentary += ("The pairs have a strong negative correlation, implying they generally move in opposite "
                       "directions, a factor exploitable in hedging strategies.\n")
    
    if not rolling_series.empty:
        recent_trend = rolling_series.iloc[-1]
        commentary += f"Recently, the rolling correlation is at {recent_trend:.2f}. "
        if recent_trend > 0.8:
            commentary += ("This high correlation suggests near mirror-like movement. "
                           "Relative strength approaches may need reconsideration for diversification.")
        elif recent_trend < 0.3:
            commentary += ("A significant drop in correlation indicates potential decoupling. "
                           "This may signal opportunities in pair divergence trades.")
        else:
            commentary += ("The correlation remains moderate, meaning the pairs show some synchronization but also "
                           "retain independent movement.")
    return commentary

O comentário também oferece insights sobre as tendências recentes da correlação, fornecendo aos traders orientações práticas sobre o que esses sinais estatísticos podem significar para o gerenciamento de risco e para a estratégia. Ao combinar análise quantitativa com insights qualitativos, o sistema ajuda os traders a compreender melhor o comportamento do mercado e a tomar decisões mais fundamentadas.


Resultados

Antes de analisarmos os resultados, é necessário explicar como iniciar o servidor Python. Primeiro, baixe e instale o Python a partir de python.org e configure um ambiente virtual executando python -m venv venv e ativando-o. Em seguida, instale os pacotes necessários executando pip install Flask pandas matplotlib. Crie um script Python (por exemplo, server.py) contendo o código do seu servidor Flask e os endpoints necessários. Por fim, navegue até o diretório do script e execute o servidor com python server.py. Consulte um dos meus artigos anteriores sobre fluxo externo para obter mais detalhes.

Abaixo está uma apresentação dos resultados dos testes realizados nos pares EUR/USD e GBP/USD. Para obter os melhores resultados, certifique-se de testar o sistema nos mesmos pares especificados em seu EA. Inicialmente, os logs do prompt de comando indicam que o sistema foi inicializado com sucesso e exibem claramente os dados transmitidos do MetaTrader 5 pelo EA MQL5 para o servidor Python — isso inclui os valores de abertura, fechamento e horário referentes ao período de 2 a 9 de abril. A entrada de log, "POST /analyze HTTP/1.1" 200, confirma uma conexão bem-sucedida e que o servidor Python executou o processamento necessário conforme o esperado.

DEBUG:plotter:Raw request data: {"symbol1":"EURUSD","symbol2":"GBPUSD","data1":[{"time":"2025.04.09 07:00:00"
,"close":1.10766},{"time":"2025.04.09 06:45:00","close":1.10735},{"time":"2025.04.09 06:30:00","close":1.10602}
,{"time":"2025.04.09 06:15:00","close":1.10538},{"time":"2025.04.09 06:00:00","close":1.10486},
{"time":"2025.04.09 05:45:00","close":1.10615},{"time":"2025.04.09 05:30:00","close":1.10454},
{"time":"2025.04.09 05:15:00","close":1.10402},{"time":"2025.04.09 05:00:00","close":1.10447},
{"time":"2025.04.09 04:45:00","close":1.10685},{"time":"2025.04.09 04:30:00","close":1.10582},
{"time":"2025.04.09 04:15:00","close":1.10617},{"time":"2025.04.09 04:00:00","close":1.10384},
{"time":"2025.04.09 03:45:00","close":1.10196},{"time":"2025.04.09 03:30:00","close":1.10184},
{"time":"2025.04.09 03:15:00","close":1.10339},{"time":"2025.04.09 03:00:00","close":1.10219},
{"time":"2025.04.09 02:45:00","close":1.10197},{"time":"2025.04.09 02:30:00","close":1.10130},
{"time":"2025.04.09 02:15:00","close":1.10233},{"time":"2025.04.09 02:00:00","close":1.10233},
{"time":"2025.04.09 01:45:00","close":1.10200},{"time":"2025.04.09 01:30:00","close":1.10289},
{"time":"2025.04.09 01:15:00","close":1.10382},{"time":"2025.04.09 01:00:00","close":1.10186},
{"time":"2025.04.09 00:45:00","close":1.10148},{"time":"2025.04.09 00:30:00","close":1.09985},
{"time":"2025.04.09 00:15:00","close":1.09894},{"time":"2025.04.09 00:00:00","close":1.09747},
{"time":"2025.04.08 23:45:00","close":1.09776},{"time":"2025.04.08 23:30:00","close":1.09789},
{"time":"2025.04.08 23:15:00","close":1.09793},{"time":"2025.04.08 23:00:00","close":1.09740},
{"time":"2025.04.08 22:45:00","close":1.09681},{"time":"2025.04.08 22:30:00","close":1.09718},
{"time":"2025.04.08 22:15:00","close":1.09669},{"time":"2025.04.08 22:00:00","close":1.09673},
{"time":"2025.04.08 21:45:00","close":1.09586},{"time":"2025.04.08 21:30:00","close":1.09565},
{"time":"2025.04.08 21:15:00","close":1.09507},{"time":"2025.04.08 21:00:00","close":1.09493},
{"time":"2025.04.08 20:45:00","close":1.09529},{"time":"2025.04.08 20:30:00","close":1.09442},
{"time":"2025.04.08 20:15:00","close":1.09417},{"time":"2025.04.08 20:00:00","close":1.09533},
{"time":"2025.04.08 19:45:00","close":1.09541},{"time":"2025.04.08 19:30:00","close":1.09587},
{"time":"2025.04.08 19:15:00","close":1.09684},{"time":"2025.04.08 19:00:00","close":1.09724},
{"time":"2025.04.08 18:45:00","close":1.09521},{"time":"2025.04.08 18:30:00","close":1.09551},
{"time":"2025.04.08 18:15:00","close":1.09561},{"time":"2025.04.08 18:00:00","close":1.09474},
{"time":"2025.04.08 17:45:00","close":1.09337},{"time":"2025.04.08 17:30:00","close":1.09334},
{"time":"2025.04.08 17:15:00","close":1.09421},{"time":"2025.04.08 17:00:00","close":1.09429},
{"time":"2025.04.08 16:45:00","close":1.09296},{"time":"2025.04.08 16:30:00","close":1.09210},
{"time":"2025.04.08 16:15:00","close":1.09123},{"time":"2025.04.08 16:00:00","close":1.09073},
{"time":"2025.04.08 15:45:00","close":1.09116},{"time":"2025.04.08 15:30:00","close":1.09083},
{"time":"2025.04.08 15:15:00","close":1.09119},{"time":"2025.04.08 15:00:00","close":1.08986},
{"time":"2025.04.08 14:45:00","close":1.09102},{"time":"2025.04.08 14:30:00","close":1.08954},
{"time":"2025.04.08 14:15:00","close":1.09051},{"time":"2025.04.08 14:00:00","close":1.09213},
{"time":"2025.04.08 13:45:00","close":1.09357},{"time":"2025.04.08 13:30:00","close":1.09300},
{"time":"2025.04.08 13:15:00","close":1.09548},{"time":"2025.04.08 13:00:00","close":1.09452},
{"time":"2025.04.08 12:45:00","close":1.09485},{"time":"2025.04.08 12:30:00","close":1.09585},
{"time":"2025.04.08 12:15:00","close":1.09477},{"time":"2025.04.08 12:00:00","close":1.09512},
{"time":"2025.04.08 11:45:00","close":1.09342},{"time":"2025.04.08 11:30:00","close":1.09311},
{"time":"2025.04.07 09:45:00","close":1.09627},{"time":"2025.04.07 09:30:00","close":1.09545},
{"time":"2025.04.07 09:15:00","close":1.09597},{"time":"2025.04.07 09:00:00","close":1.09729},
{"time":"2025.04.07 08:45:00","close":1.09918},{"time":"2025.04.07 08:30:00","close":1.09866},
{"time":"2025.04.07 08:15:00","close":1.09705},{"time":"2025.04.07 08:00:00","close":1.10051},
{"time":"2025.04.07 07:45:00","close":1.10006},{"time":"2025.04.07 07:30:00","close":1.10232},
{"time":"2025.04.07 07:15:00","close":1.10273},{"time":"2025.04.07 07:00:00","close":1.10397},
{"time":"2025.04.07 06:45:00","close":1.10029},{"time":"2025.04.07 06:30:00","close":1.10083},
{"time":"2025.04.07 06:15:00","close":1.10012},{"time":"2025.04.07 06:00:00","close":1.10084},
{"time":"2025.04.07 05:45:00","close":1.10183},{"time":"2025.04.07 05:30:00","close":1.09905},
{"time":"2025.04.07 05:15:00","close":1.09941},{"time":"2025.04.07 05:00:00","close":1.09826},
{"time":"2025.04.07 04:45:00","close":1.09848},{"time":"2025.04.07 04:30:00","close":1.09830},
{"time":"2025.04.07 04:15:00","close":1.09739},{"time":"2025.04.07 04:00:00","close":1.09608},
{"time":"2025.04.07 03:45:00","close":1.09503},{"time":"2025.04.07 03:30:00","close":1.09456},
{"time":"2025.04.07 03:15:00","close":1.09373},{"time":"2025.04.07 03:00:00","close":1.09343},
{"time":"2025.04.07 02:45:00","close":1.09353},{"time":"2025.04.07 02:30:00","close":1.09248},
{"time":"2025.04.07 02:15:00","close":1.09360},{"time":"2025.04.07 02:00:00","close":1.09550},
{"time":"2025.04.07 01:45:00","close":1.09673},{"time":"2025.04.07 01:30:00","close":1.09740},
{"time":"2025.04.07 01:15:00","close":1.09688},{"time":"2025.04.07 01:00:00","close":1.09649},
{"time":"2025.04.07 00:45:00","close":1.09667},{"time":"2025.04.07 00:30:00","close":1.09526},
{"time":"2025.04.07 00:15:00","close":1.09555},{"time":"2025.04.07 00:00:00","close":1.09517},
{"time":"2025.04.06 23:45:00","close":1.09825},{"time":"2025.04.06 23:30:00","close":1.09981},
{"time":"2025.04.06 23:15:00","close":1.09872},{"time":"2025.04.06 23:00:00","close":1.09981},
{"time":"2025.04.06 22:45:00","close":1.09822},{"time":"2025.04.06 22:30:00","close":1.09803},
{"time":"2025.04.06 22:15:00","close":1.09826},{"time":"2025.04.06 22:00:00","close":1.09529},
{"time":"2025.04.06 21:45:00","close":1.09147},{"time":"2025.04.06 21:30:00","close":1.09046},
{"time":"2025.04.06 21:15:00","close":1.08910},{"time":"2025.04.06 21:00:00","close":1.08818},
{"time":"2025.04.04 20:45:00","close":1.09623},{"time":"2025.04.04 20:30:00","close":1.09435},
{"time":"2025.04.04 20:15:00","close":1.09339},{"time":"2025.04.04 20:00:00","close":1.09502},
{"time":"2025.04.04 19:45:00","close":1.09436},{"time":"2025.04.04 19:30:00","close":1.09631},
{"time":"2025.04.04 19:15:00","close":1.09425},{"time":"2025.04.04 19:00:00","close":1.09358},
{"time":"2025.04.04 18:45:00","close":1.09447},{"time":"2025.04.04 18:30:00","close":1.09611},
{"time":"2025.04.04 18:15:00","close":1.09604},{"time":"2025.04.04 18:00:00","close":1.09531},
{"time":"2025.04.04 17:45:00","close":1.09472},{"time":"2025.04.04 17:30:00","close":1.09408},
{"time":"2025.04.04 17:15:00","close":1.09311},{"time":"2025.04.04 17:00:00","close":1.09407},
{"time":"2025.04.04 16:45:00","close":1.09714},{"time":"2025.04.04 16:30:00","close":1.09690},
{"time":"2025.04.04 16:15:00","close":1.09845},{"time":"2025.04.04 16:00:00","close":1.09892},
{"time":"2025.04.04 15:45:00","close":1.10139},{"time":"2025.04.04 15:30:00","close":1.09998},
{"time":"2025.04.04 15:15:00","close":1.09837},{"time":"2025.04.04 15:00:00","close":1.09970},
{"time":"2025.04.04 14:45:00","close":1.09862},{"time":"2025.04.04 14:30:00","close":1.09706},
{"time":"2025.04.04 14:15:00","close":1.09991},{"time":"2025.04.04 14:00:00","close":1.10068},
{"time":"2025.04.04 13:45:00","close":1.10057},{"time":"2025.04.04 13:30:00","close":1.10252},
{"time":"2025.04.04 13:15:00","close":1.10288},{"time":"2025.04.04 13:00:00","close":1.10358},
{"time":"2025.04.04 12:45:00","close":1.10200},{"time":"2025.04.04 12:30:00","close":1.10289},
{"time":"2025.04.04 12:15:00","close":1.10794},{"time":"2025.04.04 12:00:00","close":1.10443},
{"time":"2025.04.04 11:45:00","close":1.10601},{"time":"2025.04.04 11:30:00","close":1.10697},
{"time":"2025.04.04 11:15:00","close":1.10502},{"time":"2025.04.04 11:00:00","close":1.10517},
{"time":"2025.04.04 10:45:00","close":1.10305},{"time":"2025.04.04 10:30:00","close":1.10340},
{"time":"2025.04.04 10:15:00","close":1.10447},{"time":"2025.04.04 10:00:00","close":1.09869},
{"time":"2025.04.04 09:45:00","close":1.09844},{"time":"2025.04.04 09:30:00","close":1.09757},
{"time":"2025.04.04 09:15:00","close":1.09820},{"time":"2025.04.04 09:00:00","close":1.09786},
{"time":"2025.04.04 08:45:00","close":1.09962},{"time":"2025.04.04 08:30:00","close":1.10002},
{"time":"2025.04.04 08:15:00","close":1.10062},{"time":"2025.04.04 08:00:00","close":1.10034},
{"time":"2025.04.04 07:45:00","close":1.10042},{"time":"2025.04.04 07:30:00","close":1.10223},
{"time":"2025.04.04 07:15:00","close":1.10490},{"time":"2025.04.04 07:00:00","close":1.10641},
{"time":"2025.04.04 06:45:00","close":1.10506},{"time":"2025.04.04 06:30:00","close":1.10638},
{"time":"2025.04.04 06:15:00","close":1.10649},{"time":"2025.04.04 06:00:00","close":1.10747},
{"time":"2025.04.04 05:45:00","close":1.10843},{"time":"2025.04.04 05:30:00","close":1.10809},
{"time":"2025.04.04 05:15:00","close":1.11057},{"time":"2025.04.04 05:00:00","close":1.10984},
{"time":"2025.04.04 04:45:00","close":1.10874},{"time":"2025.04.04 04:30:00","close":1.10896},
{"time":"2025.04.04 04:15:00","close":1.10906},{"time":"2025.04.04 04:00:00","close":1.10876},
{"time":"2025.04.04 03:45:00","close":1.10937},{"time":"2025.04.04 03:30:00","close":1.10918},
{"time":"2025.04.04 03:15:00","close":1.10766},{"time":"2025.04.04 03:00:00","close":1.10695},
{"time":"2025.04.04 02:45:00","close":1.10632},{"time":"2025.04.04 02:30:00","close":1.10668},
{"time":"2025.04.04 02:15:00","close":1.10625},{"time":"2025.04.04 02:00:00","close":1.10773},
{"time":"2025.04.04 01:45:00","close":1.10677},{"time":"2025.04.04 01:30:00","close":1.10625},
{"time":"2025.04.04 01:15:00","close":1.10610},{"time":"2025.04.04 01:00:00","close":1.10589},
{"time":"2025.04.04 00:45:00","close":1.10606},{"time":"2025.04.04 00:30:00","close":1.10603},
{"time":"2025.04.04 00:15:00","close":1.10403},{"time":"2025.04.04 00:00:00","close":1.10432},
{"time":"2025.04.03 23:45:00","close":1.10452},{"time":"2025.04.03 23:30:00","close":1.10467},
{"time":"2025.04.03 23:15:00","close":1.10446},{"time":"2025.04.03 23:00:00","close":1.10524},
{"time":"2025.04.03 22:45:00","close":1.10642},{"time":"2025.04.03 22:30:00","close":1.10631},
{"time":"2025.04.03 22:15:00","close":1.10582},{"time":"2025.04.03 22:00:00","close":1.10577},
{"time":"2025.04.03 21:45:00","close":1.10515},{"time":"2025.04.03 21:30:00","close":1.10497},
{"time":"2025.04.03 21:15:00","close":1.10505},{"time":"2025.04.03 21:00:00","close":1.10488},
{"time":"2025.04.03 20:45:00","close":1.10514},{"time":"2025.04.03 20:30:00","close":1.10448},
{"time":"2025.04.03 20:15:00","close":1.10312},{"time":"2025.04.03 20:00:00","close":1.10253},
{"time":"2025.04.03 19:45:00","close":1.10275},{"time":"2025.04.03 19:30:00","close":1.10164},
{"time":"2025.04.03 19:15:00","close":1.10192},{"time":"2025.04.03 19:00:00","close":1.10320},
{"time":"2025.04.03 18:45:00","close":1.10373},{"time":"2025.04.03 18:30:00","close":1.10362},
{"time":"2025.04.03 18:15:00","close":1.10322},{"time":"2025.04.03 18:00:00","close":1.10236},
{"time":"2025.04.03 17:45:00","close":1.10245},{"time":"2025.04.03 17:30:00","close":1.10222},
{"time":"2025.04.03 17:15:00","close":1.10273},{"time":"2025.04.03 17:00:00","close":1.10267},
{"time":"2025.04.03 16:45:00","close":1.10386},{"time":"2025.04.03 16:30:00","close":1.10404},
{"time":"2025.04.03 16:15:00","close":1.10367},{"time":"2025.04.03 16:00:00","close":1.10491},
{"time":"2025.04.03 15:45:00","close":1.10506},{"time":"2025.04.03 15:30:00","close":1.10452},
{"time":"2025.04.03 15:15:00","close":1.10613},{"time":"2025.04.03 15:00:00","close":1.10922},
{"time":"2025.04.03 14:45:00","close":1.11182},{"time":"2025.04.03 14:30:00","close":1.11197},
{"time":"2025.04.03 14:15:00","close":1.10950},{"time":"2025.04.03 14:00:00","close":1.10981},
{"time":"2025.04.03 13:45:00","close":1.10784},{"time":"2025.04.03 13:30:00","close":1.10911},
{"time":"2025.04.03 13:15:00","close":1.10943},{"time":"2025.04.03 13:00:00","close":1.11064},
{"time":"2025.04.03 12:45:00","close":1.10816},{"time":"2025.04.03 12:30:00","close":1.10910},
{"time":"2025.04.03 12:15:00","close":1.10858},{"time":"2025.04.03 12:00:00","close":1.10867},
{"time":"2025.04.03 11:45:00","close":1.10876},{"time":"2025.04.03 11:30:00","close":1.10839},
{"time":"2025.04.03 11:15:00","close":1.10570},{"time":"2025.04.03 11:00:00","close":1.10596},
{"time":"2025.04.03 10:45:00","close":1.10521},{"time":"2025.04.03 10:30:00","close":1.10696},
{"time":"2025.04.03 10:15:00","close":1.10859},{"time":"2025.04.03 10:00:00","close":1.11052},
{"time":"2025.04.03 09:45:00","close":1.10305},{"time":"2025.04.03 09:30:00","close":1.10280},
{"time":"2025.04.03 09:15:00","close":1.10336},{"time":"2025.04.03 09:00:00","close":1.10304},
{"time":"2025.04.03 08:45:00","close":1.10093},{"time":"2025.04.03 08:30:00","close":1.10092},
{"time":"2025.04.03 08:15:00","close":1.09885},{"time":"2025.04.03 08:00:00","close":1.09803},
{"time":"2025.04.03 07:45:00","close":1.09707},{"time":"2025.04.03 07:30:00","close":1.09658},
{"time":"2025.04.03 07:15:00","close":1.09497},{"time":"2025.04.03 07:00:00","close":1.09733},
{"time":"2025.04.03 06:45:00","close":1.09896},{"time":"2025.04.03 06:30:00","close":1.09775},
{"time":"2025.04.03 06:15:00","close":1.09488},{"time":"2025.04.03 06:00:00","close":1.09457},
{"time":"2025.04.03 05:45:00","close":1.09444},{"time":"2025.04.03 05:30:00","close":1.09515},
{"time":"2025.04.03 05:15:00","close":1.09431},{"time":"2025.04.03 05:00:00","close":1.09171},
{"time":"2025.04.03 04:45:00","close":1.09069},{"time":"2025.04.03 04:30:00","close":1.09104},
{"time":"2025.04.03 04:15:00","close":1.09109},{"time":"2025.04.03 04:00:00","close":1.09110},
{"time":"2025.04.03 03:45:00","close":1.09148},{"time":"2025.04.03 03:30:00","close":1.09118},
{"time":"2025.04.03 03:15:00","close":1.09196},{"time":"2025.04.03 03:00:00","close":1.09115},
{"time":"2025.04.03 02:45:00","close":1.09122},{"time":"2025.04.03 02:30:00","close":1.09207},
{"time":"2025.04.03 02:15:00","close":1.09220},{"time":"2025.04.03 02:00:00","close":1.09134},
{"time":"2025.04.03 01:45:00","close":1.09132},{"time":"2025.04.03 01:30:00","close":1.09137},
{"time":"2025.04.03 01:15:00","close":1.09078},{"time":"2025.04.03 01:00:00","close":1.08970},
{"time":"2025.04.03 00:45:00","close":1.08906},{"time":"2025.04.03 00:30:00","close":1.08995},
{"time":"2025.04.03 00:15:00","close":1.08831},{"time":"2025.04.03 00:00:00","close":1.08905},
{"time":"2025.04.02 23:45:00","close":1.09044},{"time":"2025.04.02 23:30:00","close":1.09068},
{"time":"2025.04.02 23:15:00","close":1.08874},{"time":"2025.04.02 23:00:00","close":1.08552},
{"time":"2025.04.02 22:45:00","close":1.08389},{"time":"2025.04.02 22:30:00","close":1.08277},
{"time":"2025.04.02 22:15:00","close":1.08221},{"time":"2025.04.02 22:00:00","close":1.08161},
{"time":"2025.04.02 21:45:00","close":1.08274},{"time":"2025.04.02 21:30:00","close":1.08286},
{"time":"2025.04.02 21:15:00","close":1.08156},{"time":"2025.04.02 21:00:00","close":1.08350},
{"time":"2025.04.02 20:45:00","close":1.08507},{"time":"2025.04.02 20:30:00","close":1.08184},
INFO:werkzeug:127.0.0.1 - - [09/Apr/2025 09:04:18] "POST /analyze HTTP/1.1" 200 -

Abaixo estão os logs da aba Experts do MetaTrader 5, que incluem os comentários do servidor Python sobre a análise de correlação. Os logs detalham os dados recebidos dos dias anteriores até o dia atual, mostrando como os dois pares de moedas, EUR/USD e GBP/USD, se movimentaram em relação um ao outro. O comentário interpreta o gráfico de correlação, explicando que, durante o período registrado, os pares geralmente mantiveram uma forte correlação positiva. 

2025.04.09 00:57:33.296 Correlation Pathfinder (GBPUSD,M15)     Server response: 
{"commentary":"The overall correlation is weakly positive, suggesting occasional movement together but 
limited consistency, which may offer diversification opportunities.\nRecently, the rolling correlation is at 
0.82. This high correlation suggests near mirror-like movement. Relative strength approaches may need 
reconsideration for diversification.","correlation":0.3697032305325312,"message":"Plot saved as rolling_
correlation.png"}
Isso indica que eles tendem a se movimentar em conjunto, embora tenham ocorrido pequenos desvios em determinados momentos. Esses desvios podem indicar uma divergência temporária do mercado, destacando potenciais oportunidades de diversificação de portfólio ou hedge. De modo geral, os logs confirmam a transmissão bem-sucedida dos dados e seu processamento preciso, oferecendo insights que podem ajudar a aprimorar as estratégias de trading com base na evolução da relação entre os pares de moedas.
2025.04.09 00:
57 :33.296 Correlation Pathfinder (EURUSD,M15)     Server response: 
{"commentary":"The overall correlation is weakly positive, suggesting occasional movement together but 
limited consistency, which may offer diversification opportunities.\nRecently, the rolling correlation is at
 0.83. This high correlation suggests near mirror-like movement. Relative strength approaches may need 
reconsideration for diversification.","correlation":0.33874205977082567,"message":"Plot saved as 
rolling_correlation.png"}

Abaixo está nossa análise do gráfico de correlação. De 2 a 9 de abril, a correlação móvel entre EUR/USD e GBP/USD permaneceu elevada, próxima de 0,8 a 1,0, mostrando que os pares geralmente se movimentaram em conjunto. Houve momentos em que a correlação caiu acentuadamente para aproximadamente 0,3, o que indica uma breve divergência, provavelmente causada por eventos de mercado de curta duração ou notícias específicas relacionadas às moedas. A correlação se recuperou rapidamente, retornando para próximo de 1,0, confirmando que as forças subjacentes do mercado realinham esses pares. Os traders podem utilizar essas quedas ocasionais como sinais de oportunidades de divergência e, em seguida, monitorar até que os níveis normais de correlação retornem.

Correlação

Fig 4. Correlação Móvel


Conclusão

Este diagrama fornece uma visão geral clara e visual do fluxo de trabalho do sistema, acompanhando o processo desde a recuperação dos dados no MetaTrader 5 até a geração da análise e dos comentários no servidor Python. Os elementos marcados de A a H representam cada etapa do processo, ilustrando como os dados são coletados, organizados em JSON, transmitidos ao servidor, analisados com Pandas, visualizados com Matplotlib e, por fim, acompanhados de comentários explicativos antes do retorno dos resultados da análise.

Data Nome da Ferramenta  Descrição Versão  Atualizações  Notas
01/10/24 Projetor de Gráfico Script para sobrepor a ação de preço do dia anterior com efeito fantasma. 1.0 Lançamento Inicial Ferramenta número 1
18/11/24 Comentário Analítico Ele fornece informações do dia anterior em formato tabular, além de antecipar a direção futura do mercado. 1.0 Lançamento Inicial Ferramenta número 2
27/11/24 Mestre Analítico Atualização regular das métricas de mercado a cada duas horas  1.01 Segundo Lançamento Ferramenta número 3
02/12/24 Previsor Analítico  Atualização regular das métricas de mercado a cada duas horas integração com o Telegram. 1.1 Terceira Edição Ferramenta número 4
09/12/24 Navegador de Volatilidade O EA analisa as condições do mercado utilizando os indicadores Bollinger Bands, RSI e ATR 1.0 Lançamento Inicial Ferramenta número 5
19/12/24 Coletor de Sinais de Reversão à Média  Analisa o mercado usando estratégia de reversão à média e fornece sinal  1.0  Lançamento Inicial  Ferramenta número 6 
9/01/25  Pulso de Sinais  Analisador de múltiplos prazos 1.0  Lançamento Inicial  Ferramenta número 7 
17/01/25  Painel de Métricas  Painel com botão para análise  1.0  Lançamento Inicial Ferramenta número 8 
21/01/25 Fluxo Externo Análises por meio de bibliotecas externas 1.0  Lançamento Inicial Ferramenta número 9 
27/01/25 VWAP Preço Médio Ponderado por Volume   1.3  Lançamento Inicial  Ferramenta número 10 
02/02/25  Heikin Ashi  Suavização de tendência e identificação de sinais de reversão  1.0  Lançamento Inicial  Ferramenta número 11
04/02/25  FibVWAP  Geração de sinais por meio de análise em Python  1.0  Lançamento Inicial  Ferramenta número 12
14/02/25  DIVERGÊNCIA RSI  Ação de preço versus divergências do RSI  1.0  Lançamento Inicial  Ferramenta número 13 
17/02/25  Parabolic SAR (PSAR) ou Parada e Reversão Parabólica (PSAR)  Automatização da estratégia PSAR 1.0 Lançamento Inicial  Ferramenta número 14
20/02/25  Script Quarters Drawer  Desenho de níveis de quarters no gráfico  1.0  Lançamento Inicial  Ferramenta número 15 
27/02/25  Detector de Intrusão Detecta e alerta quando o preço atinge níveis de quarters 1.0   Lançamento Inicial Ferramenta número 16 
27/02/25  Ferramenta TrendLoom  Painel de análise multi prazo 1.0 Lançamento Inicial Ferramenta número 17
11/03/25  Painel de Quarters  Painel com botões para ativar ou desativar níveis de quarters  1.0  Lançamento Inicial Ferramenta número 18
26/03/25  Analisador ZigZag  Desenho de linhas de tendência com o indicador ZigZag.  1.0  Lançamento Inicial  Ferramenta número 19 
10/04/25  Correlation Pathfinder Geração de gráficos de correlação entre moedas com bibliotecas Python. 1.0 Lançamento Inicial  Ferramenta número 20 

Traduzido do Inglês pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/en/articles/17742

Arquivos anexados |
plotter.py (4.46 KB)
Ferramentas de negociação em MQL5 (Parte 1): Assistente visual interativo para ordens pendentes Ferramentas de negociação em MQL5 (Parte 1): Assistente visual interativo para ordens pendentes
Neste artigo, apresentamos o desenvolvimento da ferramenta interativa Trade Assistant Tool em MQL5, criada para simplificar o envio de ordens pendentes no mercado Forex. Descrevemos a concepção da ferramenta, com atenção especial a uma interface gráfica intuitiva que permite definir visualmente no gráfico os níveis de entrada, Stop Loss e Take Profit. Além disso, detalhamos a implementação em MQL5 e os testes com dados históricos para confirmar a confiabilidade da ferramenta, estabelecendo a base para a inclusão de recursos mais avançados nas próximas partes da série.
Redes neurais no trading: Integração da teoria do caos à previsão de séries temporais (Conclusão) Redes neurais no trading: Integração da teoria do caos à previsão de séries temporais (Conclusão)
Continuamos integrando aos modelos de trading os métodos propostos pelos autores do framework Attraos. Vale lembrar que esse framework utiliza conceitos da teoria do caos para resolver tarefas de previsão de séries temporais, interpretando-as como projeções de sistemas dinâmicos caóticos multidimensionais.
Ferramentas de negociação em MQL5 (Parte 2): Aprimorando o assistente de negociação interativo com visualização dinâmican Ferramentas de negociação em MQL5 (Parte 2): Aprimorando o assistente de negociação interativo com visualização dinâmican
Neste artigo, vamos atualizar nossa ferramenta Trade Assistant, adicionando um painel arrastável e efeitos ao passar o cursor do mouse para tornar a interface mais intuitiva e responsiva. Também vamos aprimorar a validação das configurações das ordens em tempo real, garantindo que os parâmetros de negociação sejam definidos com precisão em relação aos preços de mercado. Além disso, testaremos essas melhorias com dados históricos para confirmar sua confiabilidade.
Redes neurais no trading: agregação do movimento ao longo do tempo (Conclusão) Redes neurais no trading: agregação do movimento ao longo do tempo (Conclusão)
Apresentamos o framework TMA, um sistema inteligente capaz de prever a dinâmica do mercado com precisão suficiente. Neste artigo, reunimos todos os componentes em uma única arquitetura e os transformamos em um agente de trading completo, que analisa o mercado e toma decisões em tempo real.