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

Desenvolvimento do Kit de Ferramentas de Análise de Price Action (Parte 10): Fluxo Externo (II) VWAP

MetaTrader 5Sistemas de negociação |
22 4
Christian Benjamin
Christian Benjamin

Introdução

Em nosso artigo anterior, apresentamos a integração de dados de mercado com bibliotecas externas, demonstrando a capacidade de analisar mercados por meio de diversos sistemas automatizados. A estrutura robusta do Python oferece ferramentas poderosas para análise avançada de dados, modelagem preditiva e visualização, enquanto o MQL5 se concentra na execução fluida de negociações e em operações baseadas em gráficos. Ao combinar esses pontos fortes, alcançamos um sistema flexível, eficiente e sofisticado para análise de mercado e trading.

Este artigo apresenta uma ferramenta poderosa construída em torno do conceito de Preço Médio Ponderado pelo Volume (VWAP) para fornecer sinais de trading precisos. O uso das bibliotecas avançadas do Python para cálculos aumenta a precisão da análise, resultando em sinais de VWAP altamente acionáveis. Começaremos explorando a estratégia, depois nos aprofundaremos na lógica central do código MQL5 e discutiremos os resultados. Por fim, encerraremos com uma conclusão. Vamos dar uma olhada no índice abaixo:


Compreendendo a Estratégia

VWAP, ou preço médio ponderado pelo volume, é uma ferramenta de análise técnica que reflete a relação entre o preço de um ativo e seu volume total de negociação. Ele fornece a traders e investidores uma noção do preço médio pelo qual uma ação foi negociada ao longo de um período específico. O VWAP é frequentemente usado como referência por investidores mais passivos, como fundos de pensão e fundos mútuos, que buscam avaliar a qualidade de suas negociações. Também é valioso para traders que desejam determinar se um ativo foi comprado ou vendido a um preço ideal.
Para calcular o VWAP, a fórmula é:

VWAP = ∑(quantidade do ativo negociada × preço do ativo) / volume total negociado no dia

Fórmula do VWAP

O VWAP é normalmente calculado usando ordens realizadas durante um único dia de negociação. No entanto, também pode ser aplicado em vários períodos de tempo para uma análise de mercado mais abrangente. Em um gráfico, o VWAP aparece como uma linha e serve como um ponto de referência dinâmico. Quando o preço está acima do VWAP, o mercado geralmente está em uma tendência de alta. Por outro lado, quando o preço está abaixo do VWAP, o mercado é normalmente considerado em tendência de baixa. Na imagem abaixo, visualizei a estratégia VWAP destacando os principais níveis em que o preço tende a reagir em torno do VWAP. Esses níveis marcados mostram como o mercado frequentemente interage com a linha VWAP.

Estratégia VWAP

Fig 1. Estratégia VWAP

Vamos explorar a lógica por trás deste sistema. Primeiro, examinaremos os insights apresentados no diagrama abaixo, seguidos por uma explicação detalhada.

Lógica do EA

Fig 2. Lógica do Sistema

O Expert Advisor (EA) de VWAP foi projetado para monitorar gráficos e interagir de forma integrada com o Python para análises avançadas de mercado. Ele envia dados de mercado para o Python e registra os sinais de trading recebidos na aba Experts do MetaTrader 5. A estratégia utiliza o Preço Médio Ponderado pelo Volume (VWAP) como seu indicador principal para fornecer insights precisos e acionáveis. Abaixo está um detalhamento detalhado da estratégia:

1. Coleta de Dados

O EA coleta dados históricos de mercado (preço e volume) das últimas 150 velas. Ele garante que os dados sejam válidos (por exemplo, sem valores ausentes ou zerados). Os dados são salvos como um arquivo CSV para rastreabilidade e enviados a um servidor Python para análise.

2. Análise em Python

O script Python calcula o VWAP usando os dados recebidos e utiliza bibliotecas avançadas para uma computação precisa. Duas bibliotecas realizam os cálculos e a análise principais: Pandas e NumPy. O Pandas facilita a manipulação de dados, médias móveis e cálculos cumulativos, enquanto o NumPy gerencia operações numéricas, incluindo lógica condicional e computações vetorizadas. Juntas, elas fornecem um processamento eficiente e preciso para a análise de dados de séries temporais.

A análise inclui:

  • Cálculo do VWAP: Determina o preço médio ponderado pelo volume ao longo do período de tempo selecionado.
  • Geração de Sinais: Fornece sinais de trading (por exemplo, compra/venda) com base na relação entre o preço atual e os níveis de VWAP.
  • Explicações: Cada sinal inclui uma explicação textual para esclarecer por que ele foi gerado.

3. Confirmação de Sinal

O EA introduz um mecanismo de confirmação:

Os sinais só são atualizados se aparecerem de forma consistente ao longo de múltiplos intervalos (por exemplo, 2 períodos de confirmação).

Isso reduz falsos positivos e aumenta a confiabilidade dos sinais.

4. Saída e Alertas

Os sinais são exibidos como:

  • Alertas: Notificações em tempo real para ação imediata do trader.
  • Mensagens de Log: Impressas no terminal do EA para revisão.

Versões futuras podem incluir anotações gráficas no gráfico para melhor visualização.

Python 
MQL5 
Lida com grandes conjuntos de dados de forma eficiente. Monitora o mercado e se integra ao gráfico em tempo real
Utiliza bibliotecas robustas para computação avançada e modelagem Oferece alertas e notificações imediatas
Garante maior precisão e flexibilidade em estratégias baseadas em VWAP
O uso do VWAP no MQL5 ajuda a destacar níveis-chave de suporte e resistência do mercado. Isso permite que os traders tomem decisões com base na reação do mercado ao VWAP, que frequentemente atua como um forte ponto de pivô para os movimentos de preço.


Lógica Central

1. EA em MQL5 

Inicialização: Configurando o EA

Quando você aplica o Expert Advisor (EA) a um gráfico pela primeira vez, a função OnInit() é executada. Essa função é responsável por inicializar o EA, configurar os recursos necessários e garantir que tudo esteja pronto para ser executado. É nela que normalmente incluímos tarefas de configuração, como imprimir mensagens, inicializar variáveis ou definir parâmetros. No nosso caso, simplesmente imprimimos uma mensagem que confirma que o EA foi inicializado. Essa etapa também retorna INIT_SUCCEEDED para indicar que a inicialização foi bem-sucedida, o que é crucial para que o EA funcione corretamente.

int OnInit()
{
   Print("VWAP Expert initialized.");
   return(INIT_SUCCEEDED);
}

A inicialização é a primeira etapa em que o EA estabelece sua base. É fundamental garantir que quaisquer parâmetros ou recursos estejam configurados corretamente. Uma simples mensagem de confirmação informa que o EA está pronto para operar.

Desinicialização: Limpeza Quando o EA é Encerrado

A desinicialização ocorre quando o EA é removido do gráfico ou quando o MetaTrader é fechado. A função OnDeinit() é chamada para limpar quaisquer recursos que tenham sido alocados ou inicializados durante o OnInit(). Aqui, ela simplesmente imprime uma mensagem indicando que o EA está sendo desinicializado. Essa é uma boa prática para garantir que quaisquer recursos ou processos que o EA possa estar utilizando sejam encerrados corretamente, evitando vazamentos de memória ou a execução de processos desnecessários em segundo plano.

void OnDeinit(const int reason)
{
   Print("VWAP Expert deinitialized.");
}

A desinicialização adequada é crucial para manter o desempenho do sistema. Sempre limpe os recursos quando um EA for removido para evitar deixar processos pendentes. As funções de desinicialização podem incluir salvar dados, fechar conexões ou interromper temporizadores.

Coleta de Dados de Mercado (Velas)

O núcleo deste EA envolve a coleta de dados de mercado (velas) para análise. Esse processo começa dentro da função OnTick(), que é executada sempre que o preço de mercado é atualizado. O EA é configurado para coletar dados em intervalos definidos, sendo cada intervalo determinado por signalIntervalMinutes. Depois que tempo suficiente se passou desde o último sinal, o EA começa a coletar os dados de mercado (abertura, máxima, mínima, fechamento, volume) para o número de barras definido por numCandles.

Os dados são então formatados como uma string CSV, o que é crucial porque eles serão enviados ao servidor Python para processamento adicional. O loop itera de trás para frente a partir da vela mais recente para garantir que capturemos os dados de mercado mais atuais, e os dados são formatados de maneira padronizada usando StringFormat().

int totalBars = iBars(Symbol(), Period());
if (totalBars < numCandles)
{
   Print("Error: Not enough candles on the chart to collect ", numCandles, " candles.");
   return;
}

for (int i = numCandles - 1; i >= 0; i--)
{
   datetime currentTime = iTime(Symbol(), Period(), i);
   if (currentTime == 0) continue;

   double high = iHigh(Symbol(), Period(), i);
   double low = iLow(Symbol(), Period(), i);
   double close = iClose(Symbol(), Period(), i);
   double open = iOpen(Symbol(), Period(), i);
   long volume = iVolume(Symbol(), Period(), i);

   if (high == 0 || low == 0 || close == 0 || volume == 0)
   {
      Print("Skipping invalid data at ", TimeToString(currentTime, TIME_DATE | TIME_MINUTES));
      continue;
   }

   csvData += StringFormat("%s,%.5f,%.5f,%.5f,%.5f,%ld\n",
                           TimeToString(currentTime, TIME_DATE | TIME_MINUTES),
                           high, low, open, close, volume);
}

iBars():

iBars() recupera o número total de barras (velas) disponíveis no gráfico para o símbolo e o período de tempo atuais. O EA verifica se há pelo menos numCandles barras disponíveis. Caso contrário, ele imprime uma mensagem de erro e retorna da função, impedindo a coleta adicional de dados.

Loop for:

O loop for itera de trás para frente a partir da barra mais recente (numCandles - 1) até a barra mais antiga (0), coletando o número necessário de velas.

iTime(), iHigh(), iLow(), iOpen(), iClose(), iVolume():

Essas funções obtêm os dados de preço relevantes para cada vela. iTime() obtém o timestamp, iHigh() obtém o preço máximo, iLow() obtém o preço mínimo, e assim por diante.

Validação de Dados:

Antes de anexar os dados à string CSV, o EA verifica se há dados ausentes ou inválidos (valores zero). Se os dados de alguma vela forem inválidos, a iteração continua e essa vela é ignorada.

Validação de Dados:

StringFormat() é usada para formatar os dados da vela em uma linha CSV. Cada campo é separado por uma vírgula, e o timestamp é formatado em uma string legível usando TimeToString().

Gravação de Dados em um Arquivo CSV

Depois que coletamos os dados, o próximo passo é gravá-los em um arquivo CSV. Isso é essencial porque queremos salvar os dados coletados localmente antes de enviá-los ao servidor Python. A função FileOpen() abre o arquivo em modo de escrita, e FileWriteString() grava os dados CSV formatados nele. Após a gravação dos dados, o arquivo é fechado para finalizar o processo e garantir que nenhum dado seja perdido.

O arquivo CSV é salvo no diretório MQL5\Files, um diretório especial no MetaTrader usado para armazenar arquivos que a plataforma pode acessar. Isso garante que o arquivo seja facilmente recuperável, se necessário.

string fileName = StringFormat("%s_vwap_data.csv", Symbol());
string filePath = "MQL5\\Files\\" + fileName;
int fileHandle = FileOpen(filePath, FILE_WRITE | FILE_CSV | FILE_ANSI);
if (fileHandle != INVALID_HANDLE) {
    FileWriteString(fileHandle, csvData);
    FileClose(fileHandle);
} else {
    Print("Failed to open file for writing: ", filePath);
}

Gravar os dados em um arquivo CSV é uma forma de armazenar as informações localmente para análises futuras. O uso de FILE_CSV garante que os dados sejam salvos em um formato padronizado, tornando-os compatíveis com outros sistemas, como o Python. O tratamento de erros aqui garante que, se o arquivo não puder ser aberto, o EA lide com o problema de forma adequada e imprima uma mensagem de erro.

Envio de Dados ao Servidor Python para Análise de VWAP

Agora, os dados coletados estão prontos para serem enviados a um servidor Python para análise. Isso é feito usando a função WebRequest(), que permite ao EA realizar requisições HTTP. Os dados CSV são convertidos em um array de caracteres (StringToCharArray()) e enviados ao servidor por meio de uma requisição POST. Os cabeçalhos especificam que o conteúdo enviado é CSV, e a resposta do servidor é capturada em um array de resultados.

O parâmetro de tempo limite é definido como 5000 milissegundos (5 segundos), garantindo que a requisição não fique aguardando por muito tempo caso o servidor não responda.

char data[];
StringToCharArray(csvData, data); 

string headers = "Content-Type: text/csv\r\n";
char result[];
string resultHeaders;
int timeout = 5000;

int responseCode = WebRequest("POST", pythonUrl, headers, timeout, data, result, resultHeaders);

O método HTTP POST é usado aqui porque é a melhor maneira de enviar dados para um servidor sem alterar a URL. A função `WebRequest()` lida com a comunicação com o servidor Python, onde todo o processamento pesado (ou seja, os cálculos de VWAP) acontece. O tempo limite garante que o EA não trave caso o servidor não responda, mantendo o funcionamento estável.

Tratamento da Resposta do Servidor Python

Após enviar os dados, precisamos tratar a resposta do servidor Python. É aqui que a verdadeira mágica acontece, pois o servidor Python analisa os dados e fornece um sinal de negociação com base no VWAP (Preço Médio Ponderado pelo Volume). A resposta é retornada em formato JSON, e utilizamos uma função auxiliar, ExtractValueFromJSON(), para extrair os valores relevantes (VWAP e explicação) da resposta.

Se a resposta for bem-sucedida (código HTTP 200), analisamos as informações necessárias e prosseguimos com a lógica de negociação. Se a resposta contiver dados válidos, podemos prosseguir com a geração de um novo sinal.

// Check if the request was successful
if (responseCode == 200) {
    string response = CharArrayToString(result); // Convert the result array to a string
    Print("Server response: ", response);  // Print the server's response

    // Validate if the required data is present in the response
    if (StringFind(response, "\"vwap\":") == -1 || StringFind(response, "\"signal_explanation\":") == -1) {
        Print("Error: Invalid response from server. Response: ", response);
        return;
    }

    // Extract individual data points from the JSON response
    string vwap = ExtractValueFromJSON(response, "vwap");
    string explanation = ExtractValueFromJSON(response, "signal_explanation");
    string majorSupport = ExtractValueFromJSON(response, "major_support");
    string majorResistance = ExtractValueFromJSON(response, "major_resistance");
    string minorSupport = ExtractValueFromJSON(response, "minor_support");
    string minorResistance = ExtractValueFromJSON(response, "minor_resistance");

    // If valid data is received, update the signal
    if (vwap != "" && explanation != "") {
        string newSignal = "VWAP: " + vwap + "\nExplanation: " + explanation
                           + "\nMajor Support: " + majorSupport + "\nMajor Resistance: " + majorResistance
                           + "\nMinor Support: " + minorSupport + "\nMinor Resistance: " + minorResistance;

        // Confirm the signal and handle the response further
        if (newSignal != lastSignal) {
            signalConfirmationCount++; // Increment confirmation count
        }

        if (signalConfirmationCount >= confirmationInterval) {
            lastSignal = newSignal;  // Set the new signal
            signalConfirmationCount = 0;  // Reset the count
            Print("New VWAP signal: ", newSignal);
            Alert("New VWAP Signal Received:\n" + newSignal); // Alert user of the new signal
        }
    }
} else {
    Print("Error: WebRequest failed with code ", responseCode, ". Response headers: ", resultHeaders);
}

Tratar a resposta corretamente é fundamental para interpretar a análise do servidor. A função ExtractValueFromJSON() garante que recuperemos apenas os dados de que precisamos (VWAP e explicação do sinal) da resposta JSON potencialmente grande. Se a resposta for inválida ou os dados esperados não forem encontrados, é importante tratar os erros e evitar agir com base em sinais incorretos.

Confirmação do Sinal e Exibição do Sinal de Negociação

A etapa final envolve a confirmação do sinal de negociação. Após receber o sinal do servidor Python, não agimos imediatamente com base nele. Em vez disso, exigimos confirmação ao longo de vários intervalos (configurados por confirmationInterval). Isso garante que o sinal seja consistente ao longo de um determinado período, o que ajuda a evitar reações a ruídos de mercado de curto prazo.

Uma vez que o sinal é confirmado, atualizamos a variável lastSignal e exibimos o sinal ao usuário por meio de Alert(). O EA então aguarda o próximo sinal válido antes de ser acionado novamente.

// Confirm the signal multiple times before updating
if (newSignal != lastSignal)
{
    signalConfirmationCount++;  // Increment the confirmation count
}

// Once the signal has been confirmed enough times
if (signalConfirmationCount >= confirmationInterval)
{
    // Update the last signal and reset confirmation count
    lastSignal = newSignal;
    signalConfirmationCount = 0;  // Reset the count after confirmation

    // Display the new signal in the log and via an alert
    Print("New VWAP signal: ", newSignal);  // Print to the log
    Alert("New VWAP Signal Received:\n" + newSignal);  // Display alert to the user
}

A confirmação do sinal ajuda a evitar agir com base em sinais passageiros ou pouco confiáveis. Ao confirmar o sinal várias vezes, aumentamos a precisão e a confiabilidade das decisões de negociação. Os alertas fornecem feedback imediato ao trader, garantindo que ele esteja ciente de mudanças importantes.

2. Python

O fluxo do script é projetado para pré-processar os dados, calcular o VWAP e métricas relevantes, gerar sinais e retornar informações significativas ao EA para tomada de decisão. Isso inclui a determinação dos principais e secundários níveis de suporte/resistência, juntamente com o VWAP e as explicações dos sinais. Vamos seguir as etapas abaixo:

Preparação e Pré-processamento dos Dados

A primeira parte do script garante que os dados de entrada estejam limpos e prontos para análise, executando várias etapas de pré-processamento. Essas etapas garantem que todas as colunas necessárias tenham dados válidos e tratam casos extremos, como valores ausentes ou inválidos.

# Ensure critical columns have no missing values
df = df.dropna(subset=['volume', 'high', 'low', 'open', 'close'])

# Convert 'date' column to datetime
df.loc[:, 'date'] = pd.to_datetime(df['date'])

# Handle zero volume by replacing with NaN and dropping invalid rows
df.loc[:, 'volume'] = df['volume'].replace(0, np.nan)
df = df.dropna(subset=['volume'])

# Check if data exists after filtering
if df.empty:
    print("No data to calculate VWAP.")
    return pd.DataFrame()

O script garante que as colunas essenciais (volume, high, low, open, close) não contenham valores ausentes usando dropna(). Ele também trata volumes zero substituindo-os por NaN e removendo quaisquer linhas com volumes inválidos. A coluna de data é convertida para o formato datetime para análise de séries temporais.

Cálculo do VWAP e Métricas Adicionais

O script calcula o VWAP (Preço Médio Ponderado pelo Volume) e métricas adicionais, como preço típico, preço médio, volume médio e níveis de suporte/resistência.

# Calculate VWAP and additional metrics
df.loc[:, 'typical_price'] = (df['high'] + df['low'] + df['close']) / 3
df.loc[:, 'vwap'] = (df['typical_price'] * df['volume']).cumsum() / df['volume'].cumsum()
df.loc[:, 'avg_price'] = df[['high', 'low', 'open', 'close']].mean(axis=1)
df.loc[:, 'avg_volume'] = df['volume'].rolling(window=2, min_periods=1).mean()
df.loc[:, 'major_support'] = df['low'].min()
df.loc[:, 'major_resistance'] = df['high'].max()
df.loc[:, 'minor_support'] = df['low'].rolling(window=3, min_periods=1).mean()
df.loc[:, 'minor_resistance'] = df['high'].rolling(window=3, min_periods=1).mean()

  • Cálculo do VWAP: O VWAP é calculado como a soma cumulativa do preço típico ponderado pelo volume, dividida pelo volume cumulativo.
  • Preço Típico: O preço típico é calculado como a média dos preços high, low e close para cada período.

Suporte e Resistência

  • Suporte Principal: O menor valor nos preços low (ao longo de todo o período).
  • Resistência Principal: O maior valor nos preços high.
  • Suporte/Resistência Secundários: Médias móveis dos preços low e high em uma janela de 3 períodos.

Geração e Análise de Sinais

Esta parte calcula a tendência do mercado e gera sinais de negociação com base na posição do VWAP em relação ao preço de fechamento. Ela também fornece explicações para esses sinais.

# Calculate strength and generate signals
df.loc[:, 'strength'] = np.where(
    (df['high'] - df['low']) != 0,
    np.abs(df['close'] - df['open']) / (df['high'] - df['low']) * 100,
    0
)

# Generate Buy/Sell signals based on VWAP
df.loc[:, 'signal'] = np.where(
    df['close'] > df['vwap'], 'BUY',
    np.where(df['close'] < df['vwap'], 'SELL', 'NEUTRAL')
)

# Signal explanation
df.loc[:, 'signal_explanation'] = np.where(
    df['signal'] == 'BUY',
    'The price is trading above the VWAP, indicating bullish market tendencies.',
    np.where(
        df['signal'] == 'SELL',
        'The price is trading below the VWAP, indicating bearish market tendencies.',
        'The price is trading at the VWAP, indicating equilibrium in the market.'
    )
)

Cálculo de Força: Isso calcula a força do mercado usando a diferença entre os preços de fechamento e abertura em relação ao intervalo entre high e low. Um valor mais alto indica um movimento mais forte.

Geração de Sinais

  • BUY: Quando o preço de fechamento é maior que o VWAP.
  • SELL: Quando o preço de fechamento é menor que o VWAP.
  • NEUTRAL: Quando o preço de fechamento é igual ao VWAP.
  • Explicação do Sinal: Com base no sinal, é gerada uma explicação em texto indicando as tendências do mercado (altista, baixista ou neutra).

Resposta Final e Saída

Após todos os cálculos serem concluídos, o script prepara a saída final, que inclui o VWAP, o sinal de negociação, a explicação, e os principais níveis de suporte/resistência.

# Return data with major and minor support/resistance levels included
return df[['date', 'vwap', 'signal', 'signal_explanation', 'entry_point', 'major_support', 'major_resistance', 'minor_support', 'minor_resistance']].iloc[-1]

  • Saída Final: O script retorna os dados mais recentes (última linha), incluindo o VWAP, o sinal de negociação, sua explicação, o ponto de entrada (definido como o VWAP), e os níveis principais e secundários de suporte/resistência. Os níveis de suporte/resistência são calculados para ajudar a identificar ainda mais as tendências do mercado. A resposta enviada de volta ao EA inclui esses valores, permitindo que ele visualize ou tome ações com base neles.


Resultados

Fornecerei respostas de ambos os lados: o lado MQL5 e o lado Python. Antes de fazer isso, permita-me enfatizar a importância de garantir que o script Python seja executado primeiro. Para saber mais sobre como criar e executar o script Python, certifique-se de consultar meu artigo anterior. Para garantir uma comunicação tranquila entre o MetaTrader 5 e o servidor, adicione o endereço HTTP às configurações do MetaTrader 5. Navegue até Tools > Options, ative Allow WebRequest, e insira o endereço do servidor no campo fornecido. Consulte o GIF abaixo para obter orientação.

Webrequest

Fig 3. Configuração do Webrequest

Vamos dar uma olhada nas respostas tanto do Python quanto do MQL5.

  • Log do Python no Prompt de Comando

Received data: date,high,low,open,close,volume
2025.01.22 15:00,8372.10000,8365.60000,8368.90000,8367.80000,3600
2025.01.22 16:00,8369.00000,8356.60000,8367.90000,8356.80000,3600
2025.01.22 17:00,8359.00000,8347.800...
Calculating VWAP...
127.0.0.1 - - [28/Jan/2025 22:07:59] "POST /vwap HTTP/1.1" 200 -

O EA em MQL5 enviou com sucesso os dados das últimas 150 velas, incluindo data, high, low, open, close e volume. O Python recebeu os dados com sucesso, conforme mostrado no log do Prompt de Comando acima. Embora nem todas as informações sejam exibidas devido ao volume de dados, ainda podemos observar valores de várias velas.

  • Log do Expert Advisor do MetaTrader 5
2025.01.28 22:07:59.452 VWAP (Step Index,H1)    VWAP Expert initialized.
2025.01.28 22:07:59.513 VWAP (Step Index,H1)    CSV file created: MQL5\Files\Step Index_vwap_data.csv
2025.01.28 22:07:59.777 VWAP (Step Index,H1)    Server response: {
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "entry_point": 8356.202504986322,
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "major_resistance": 8404.5,
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "major_support": 8305.0,
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "minor_resistance": 8348.0,
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "minor_support": 8341.699999999999,
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "signal": "SELL",
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "signal_explanation": "The price is trading below the VWAP, indicating bearish market tendencies.",
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "vwap": 8356.202504986322
2025.01.28 22:07:59.777 VWAP (Step Index,H1)    }

O EA em MQL5 recebeu com sucesso a resposta do Python e a registrou no log de Experts do MetaTrader 5. Vamos revisar a resposta da análise e ver como ela se alinha com o gráfico do MetaTrader 5.

RESULTADOS DO SISTEMA

Fig 4. Exibição do Sinal

Vamos revisar como o mercado respondeu após o acionamento do sinal, conforme ilustrado no diagrama abaixo.

Resposta do Mercado

Fig 5. Resposta do Mercado


Conclusão

Após configurar com sucesso o sistema VWAP, é fundamental monitorar a direção do mercado e utilizar os níveis de VWAP para confirmação. O nível de VWAP é altamente respeitado pelo mercado, frequentemente atuando como uma zona-chave de suporte ou resistência. Além disso, selecionar o período gráfico adequado para se adequar à sua estratégia de negociação é essencial. Períodos mais curtos, como M1–M15, capturam movimentos intradiários; M30 equilibra precisão com uma perspectiva mais ampla; H1–H4 revelam tendências de vários dias; e gráficos diários/semanais fornecem insights sobre a dinâmica de mercado de longo prazo. Adaptar sua abordagem ao período apropriado garante melhor alinhamento com seus objetivos de negociação.

Data Nome da Ferramenta  Descrição Versão  Atualizações  Notas
01/10/24 Projetor de Gráficos Script para sobrepor a ação de preço do dia anterior com efeito fantasma. 1.0 Lançamento Inicial Primeira ferramenta na caixa de ferramentas Lynnchris
18/11/24 Comentário Analítico Ela fornece informações do dia anterior em formato tabular, além de antecipar a direção futura do mercado. 1.0 Lançamento Inicial Segunda ferramenta na caixa de ferramentas Lynnchris
27/11/24 Mestre em Análise Atualização regular das métricas de mercado a cada duas horas  1.01 Segundo Lançamento Terceira ferramenta na caixa de ferramentas Lynnchris
02/12/24 Previsor Analítico  Atualização regular das métricas de mercado a cada duas horas com integração ao Telegram 1.1 Terceira Edição Ferramenta número 4
09/12/24 Navegador de Volatilidade O EA analisa as condições de mercado usando os indicadores Bandas de Bollinger, RSI e ATR 1.0 Lançamento Inicial Ferramenta número 5
19/12/24 Reversão à Média Ceifador de Sinal  Analisa o mercado usando a estratégia de reversão à média e fornece sinais  1.0  Lançamento Inicial  Ferramenta número 6 
9/01/2025  Pulso de sinal  Analisador de múltiplos períodos de tempo 1.0  Lançamento Inicial  Ferramenta número 7 
17/01/2025  Quadro de Métricas  Painel com botão para análise  1.0  Lançamento Inicial Ferramenta número 8 
21/01/2025 Fluxo externo Análises por meio de bibliotecas externas 1.0  Lançamento Inicial Ferramenta número 9 
27/01/2025 VWAP Preço médio ponderado por volume   1.3  Lançamento Inicial  Ferramenta número 10 

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

Arquivos anexados |
VWAP.py (3.89 KB)
VWAP.mq5 (6.99 KB)
Últimos Comentários | Ir para discussão (4)
Isuru Weerasinghe
Isuru Weerasinghe | 31 jan. 2025 em 10:45
Você mostrou que esse código funciona no backtesting, mas recebo este erro Código HTTP: -1 | Error: 4014 . de acordo com a documentação, é "Function is not allowed for call "

Christian Benjamin
Christian Benjamin | 31 jan. 2025 em 10:51
Isuru Weerasinghe backtesting, mas recebo este erro Código HTTP: -1 | Error: 4014 . de acordo com a documentação, é "Function is not allowed for call "

Minhas desculpas. Você precisa importar as bibliotecas de backtesting, como Backtrader, BT ou VectorBT, no script Python. Sem elas, o backtesting não será possível.
Too Chee Ng
Too Chee Ng | 30 mai. 2025 em 15:19
Obrigado pelo artigo.
Podemos fazer o backtest(otimizar) do " EA habilitado para WebRequest " no MetaTrader com agentes de nuvem?
Too Chee Ng
Too Chee Ng | 30 mai. 2025 em 15:45
Too Chee Ng o backtest(otimizar) do " EA habilitado para WebRequest " no MetaTrader com agentes de nuvem?

De acordo com minhas descobertas:

- O uso de WebRequest() em Cloud Agents (rede remota MQL5.com) não é permitido

- Ao contrário dos agentes de nuvem do MetaTrader (que bloqueiam a comunicação externa), os agentes de LAN são permitidos

Construindo Expert Advisors Auto-Otimizáveis em MQL5 (Parte 5): Regras de Negociação Auto Adaptativas Construindo Expert Advisors Auto-Otimizáveis em MQL5 (Parte 5): Regras de Negociação Auto Adaptativas
As melhores práticas, que definem como usar um indicador com segurança, nem sempre são fáceis de seguir. Condições de mercado calmas podem, surpreendentemente, produzir leituras no indicador que não se qualificam como um sinal de negociação, levando à perda de oportunidades para traders algorítmicos. Este artigo irá sugerir uma solução potencial para esse problema, à medida que discutimos como construir aplicações de negociação capazes de adaptar suas regras de negociação aos dados de mercado disponíveis.
Redes Adversariais Generativas (GANs) para Dados Sintéticos em Modelagem Financeira (Parte 2): Criação de Símbolo Sintético para Testes Redes Adversariais Generativas (GANs) para Dados Sintéticos em Modelagem Financeira (Parte 2): Criação de Símbolo Sintético para Testes
Neste artigo, estamos criando um símbolo sintético usando uma Rede Adversarial Generativa (GAN), o que envolve a geração de dados financeiros realistas que imitam o comportamento de instrumentos reais do mercado, como o EURUSD. O modelo GAN aprende padrões e volatilidade a partir de dados históricos do mercado e cria dados de preços sintéticos com características semelhantes.
Critério de Independência de Hilbert-Schmidt (HSIC) Critério de Independência de Hilbert-Schmidt (HSIC)
O artigo examina o teste estatístico não paramétrico HSIC (Hilbert-Schmidt Independence Criterion) destinado a identificar dependências lineares e não lineares nos dados. São propostas implementações de dois algoritmos para o cálculo do HSIC na linguagem MQL5: o teste exato por permutação e a aproximação gama. A eficácia do método é demonstrada em dados sintéticos que modelam uma relação não linear entre os atributos e a variável-alvo.
Do básico ao intermediário: Sobrecarga de operadores (V) Do básico ao intermediário: Sobrecarga de operadores (V)
Neste artigo iremos ver como podemos manipular um código a fim de implementar algo completamente diferente daquilo que muitos acreditam ser possível ser feito no MQL5. Uma observação importante: Para entender de maneira adequada o que será visto aqui, é necessário que os conceitos vistos nos artigos anteriores tenham sido devidamente compreendidos.