Desenvolvimento do Kit de Ferramentas de Análise de Ação de Preço (Parte 12): Fluxo Externo (III) Mapa de Tendências
Introdução
Durante a volatilidade do mercado em 2020, em meio à crise da COVID-19, traders recorreram a várias ferramentas técnicas para ajudar a avaliar quando uma recuperação poderia ocorrer. Alguns até experimentaram zonas de tempo de Fibonacci para identificar possíveis pontos de reversão com base no comportamento histórico de preços. Embora o alinhamento entre projeções de Fibonacci e grandes recuperações ainda seja objeto de debate, essas ferramentas ofereceram uma entre várias estruturas para navegar em um ambiente incerto, à medida que governos começaram a implementar medidas de estímulo e as economias reabriram gradualmente.
Em nossa série anterior Price Action Analysis Toolkit Development, examinamos uma estratégia baseada em VWAP que se concentrava em como os níveis de VWAP poderiam influenciar decisões de mercado — sinalizando uma compra quando o preço estava acima do VWAP e uma venda quando estava abaixo. No entanto, confiar apenas no VWAP pode ser problemático, particularmente durante períodos de condições extremas de mercado, quando reversões podem ocorrer.
Neste artigo, levamos nossa análise um passo adiante ao combinar VWAP com níveis de Fibonacci para gerar sinais de trading. Os níveis de retração de Fibonacci ajudam a identificar possíveis áreas de suporte e resistência e, quando combinados com o VWAP, podem aumentar a robustez da sua estratégia de trading. Começamos explicando os conceitos subjacentes, depois descrevemos as principais funções tanto no EA em MQL5 quanto no script em Python. Em seguida, aprofundamo-nos em detalhes adicionais das funções e discutimos os resultados esperados, antes de resumir os principais insights. Consulte a tabela de conteúdos abaixo.
Conceito
A retração de Fibonacci é baseada em proporções derivadas da sequência de Fibonacci, introduzida por Leonardo Fibonacci no século XIII, e é amplamente utilizada na análise técnica para identificar possíveis níveis de suporte e resistência onde reversões de preço podem ocorrer. Combinar a retração de Fibonacci com o VWAP (Volume Weighted Average Price) nos fornece uma ferramenta de trading mais robusta, pois o VWAP incorpora tanto dados de preço quanto de volume para refletir o verdadeiro sentimento de mercado e a liquidez. Essa integração aprimora a tomada de decisão ao confirmar zonas-chave de reversão com evidência apoiada por volume, reduzindo sinais falsos e oferecendo uma perspectiva dinâmica sobre o comportamento do mercado.
O sistema TrendMap é uma estrutura de geração de sinais de trading que integra MQL5 (Expert Advisor do MetaTrader 5) com um servidor analítico baseado em Python. O sistema processa níveis de retração de Fibonacci, VWAP (Volume Weighted Average Price) e dados de preço para gerar sinais de trading (Compra ou Venda).
- Se o VWAP estiver abaixo do nível de Fibonacci de 50% (preço médio), um sinal de compra é gerado.
- Se o VWAP estiver acima do nível de Fibonacci de 50% (preço médio), um sinal de venda é gerado.
Isso garante que os sinais sejam fornecidos com base na ação do preço em relação tanto ao VWAP quanto aos níveis de retração de Fibonacci. Abaixo, forneci um diagrama ilustrando como o mercado interage com os níveis de Fibonacci e o VWAP. Este diagrama representa as condições necessárias que nosso sistema baseado em Python monitora para geração de sinais.
- Fib 0 - 0%
- Fib 1 - 24%
- Fib 2 - 38%
- Fib 3 - 50%
- Fib 4 - 62%
- Fib 5 - 79%
- Fib 6 - 100%
Fib 3 representa o nível de retração de 50%, e observamos que o VWAP está acima desse nível, indicando uma possível reversão. Consequentemente, um sinal de venda é gerado. Também destaquei os níveis onde o preço interage com os níveis de Fibonacci e o VWAP.

Fig 1. Preço vs Fibonacci e VWAP
O expert advisor em MQL5 integra níveis de retração de Fibonacci e análise de VWAP para gerar sinais de trading sem executar operações. Ele calcula níveis de Fibonacci a partir de um número especificado de barras passadas, determina máximas e mínimas de swing e calcula o VWAP para avaliar tendências de mercado. O EA envia esses dados para um servidor Python via HTTP, que analisa as condições de mercado e retorna um sinal de compra ou venda. Ao receber um novo sinal, o EA atualiza o gráfico exibindo o sinal e desenhando linhas de Fibonacci, a linha do VWAP e setas para representação visual.
O sistema opera com base em um temporizador, garantindo atualizações periódicas enquanto registra e acompanha mudanças de mercado. Este script configura um servidor Flask que recebe dados de mercado do EA em MQL5, processa-os e retorna um sinal de trading.
Quando o EA envia dados JSON contendo VWAP, níveis de retração de Fibonacci, máximas/mínimas de swing e dados de preço, o script avalia se o VWAP está abaixo ou acima do preço médio do intervalo de swing para determinar um sinal de "Compra" ou "Venda". Ao mesmo tempo, ele gera um gráfico Matplotlib plotando VWAP, níveis de Fibonacci e dados de preço, salvando a imagem para referência. A plotagem é executada em uma thread separada para manter o funcionamento fluido.
Tudo é registrado para acompanhamento, e o servidor é executado em 127.0.0.1:5110. Vamos percorrer o fluxograma abaixo para obter uma visão completa do processo.

Fig 2. Fluxograma
Funções Principais
Expert Advisor em MQL5
Nesta parte, percorreremos as funções centrais que alimentam nosso EA Fibonacci-VWAP em MQL5. O objetivo é:
- Calcular níveis de retração de Fibonacci usando máximas e mínimas de swing
- Determinar o VWAP (Volume Weighted Average Price) para confirmação de tendência
- Enviar dados de mercado ao Python, que realizará uma análise mais profunda e retornará um sinal de compra/venda
- Desenhar setas de sinal no gráfico quando todas as condições forem atendidas
Vamos detalhar passo a passo.
1. Atualizando Indicadores de Fibonacci e VWAP
Para começar, devemos garantir que nossos níveis de retração de Fibonacci e o VWAP estejam atualizados antes de gerar qualquer sinal. Conseguimos isso chamando duas funções principais. Primeiro, a função CalculateFibonacciLevels() é responsável por identificar os pontos de máxima e mínima de swing, bem como calcular os níveis relevantes de retração de Fibonacci.
Esses níveis são cruciais para compreender possíveis zonas de suporte e resistência. A segunda função, CalculateVWAP(), calcula o Volume Weighted Average Price (VWAP), que serve como um indicador para determinar a tendência geral do mercado com base em volume e preço. Ao manter esses indicadores atualizados, garantimos que estamos trabalhando com os dados de mercado mais recentes, o que é essencial para análise precisa e tomada de decisão.
void UpdateIndicators() { CalculateFibonacciLevels(InpTimeFrame, InpNumBars, g_SwingHigh, g_SwingLow, g_FibLevels); g_VWAP = CalculateVWAP(InpTimeFrame, InpNumBars); Print("Updated Indicators: SwingHigh=" + DoubleToString(g_SwingHigh, Digits()) + ", SwingLow=" + DoubleToString(g_SwingLow, Digits()) + ", VWAP=" + DoubleToString(g_VWAP, Digits())); }
2. Enviando Dados de Mercado ao Python
Depois que os indicadores de Fibonacci e VWAP são atualizados, o próximo passo é enviar os dados de mercado ao Python para uma análise mais avançada. Isso é feito criando uma carga JSON que inclui todas as informações essenciais necessárias para processamento adicional. A carga é estruturada para conter pontos de dados-chave, como o símbolo e o timeframe do gráfico, os pontos de máxima e mínima de swing, o valor do VWAP e os níveis de Fibonacci calculados. Além disso, incluímos dados recentes de preço para análise adicional de mercado. Depois que os dados são estruturados nesse formato JSON, eles são enviados ao servidor Python por meio de uma requisição HTTP, onde o Python os processará e retornará um sinal de trading com base nos cálculos.
string BuildJSONPayload() { string jsonPayload = "{"; jsonPayload += "\"symbol\":\"" + Symbol() + "\","; jsonPayload += "\"timeframe\":\"" + EnumToString(InpTimeFrame) + "\","; jsonPayload += "\"swingHigh\":" + DoubleToString(g_SwingHigh, Digits()) + ","; jsonPayload += "\"swingLow\":" + DoubleToString(g_SwingLow, Digits()) + ","; jsonPayload += "\"vwap\":" + DoubleToString(g_VWAP, Digits()) + ","; jsonPayload += "\"fibLevels\":["; for(int i = 0; i < 7; i++) { jsonPayload += DoubleToString(g_FibLevels[i], 3); if(i < 6) jsonPayload += ","; } jsonPayload += "],"; jsonPayload += "\"priceData\":["; for(int i = 0; i < InpNumBars; i++) { jsonPayload += DoubleToString(iClose(Symbol(), InpTimeFrame, i), Digits()); if(i < InpNumBars - 1) jsonPayload += ","; } jsonPayload += "]}"; return jsonPayload; }
3. Comunicação com Python e Recebimento de Sinais
Nesta etapa, a requisição HTTP é realizada, enviando a carga JSON ao script Python. O servidor Python então analisará os dados e retornará uma resposta contendo um sinal de compra ou venda. A requisição HTTP é construída de forma a lidar tanto com o envio de dados quanto com o recebimento de respostas, verificando possíveis erros durante o processo. Se a requisição for bem-sucedida (indicada por um código de resposta 200), a resposta é analisada, e o sinal relevante (compra, venda ou espera) é extraído dos dados JSON retornados pelo Python. Isso permite que o EA em MQL5 integre poder computacional externo ao seu processo de tomada de decisão, possibilitando sinais de trading mais robustos.
string SendDataToPython(string payload) { string headers = "Content-Type: application/json\r\n"; char postData[]; StringToCharArray(payload, postData); char result[]; string resultHeaders; int resCode = WebRequest("POST", InpPythonURL, headers, InpHTTPTimeout, postData, result, resultHeaders); if(resCode == 200) { string response = CharArrayToString(result); Print("HTTP Response: " + response); string signal = ParseSignalFromJSON(response); return signal; } else { Print("Error: WebRequest failed with code " + IntegerToString(resCode)); return ""; } }
4. Plotando Sinais de Compra/Venda no Gráfico
Após receber o sinal de trading do Python, o próximo passo é representar visualmente esse sinal no gráfico. Isso é feito desenhando uma seta no preço atual de mercado para indicar a ação sugerida. Se o sinal for de compra, uma seta apontando para cima (na cor verde) é colocada, e para um sinal de venda, uma seta apontando para baixo (na cor vermelha) é desenhada. Esse indicativo visual é crucial para que traders interpretem rapidamente a sugestão de trading sem precisar analisar números.
As setas são criadas dinamicamente usando a função ObjectCreate, e sua aparência (como cor e tamanho) pode ser ajustada para melhor visibilidade. O uso dessas setas torna os sinais de trading claros e acessíveis, mesmo para aqueles que não estejam acompanhando cada detalhe da análise do sistema.
void DrawSignalArrow(string signal) { int arrowCode = 0; color arrowColor = clrWhite; string lowerSignal = MyStringToLower(signal); if(lowerSignal == "buy") { arrowCode = 233; // Upward arrow arrowColor = clrLime; } else if(lowerSignal == "sell") { arrowCode = 234; // Downward arrow arrowColor = clrRed; } else { Print("Invalid signal: " + signal); return; } string arrowName = "SignalArrow_" + IntegerToString(TimeCurrent()); ObjectCreate(0, arrowName, OBJ_ARROW, 0, TimeCurrent(), iClose(Symbol(), PERIOD_CURRENT, 0)); ObjectSetInteger(0, arrowName, OBJPROP_ARROWCODE, arrowCode); ObjectSetInteger(0, arrowName, OBJPROP_COLOR, arrowColor); ObjectSetInteger(0, arrowName, OBJPROP_WIDTH, 2); }
Script Python
1. Plotando VWAP & Fibonacci vs Preço
A função plot_vwap_fib_vs_price() visualiza o movimento de preço, o VWAP e os níveis de retração de Fibonacci. Ela é usada para ajudar a compreender a relação entre esses três indicadores. A função aceita os seguintes parâmetros:
- symbol: O ativo que está sendo analisado
- vwap: O Volume Weighted Average Price calculado
- swingHigh e swingLow: Os pontos máximo e mínimo usados para calcular os níveis de retração de Fibonacci
- fibLevels: Os níveis de retração de Fibonacci (valores padrão incluem retrações comuns como 0.236, 0.382, etc.)
- price_data: Uma Series do pandas contendo os dados de preço ao longo do tempo
Detalhamento da Função:
- Plotagem dos Dados de Preço: A função começa plotando os dados de preço ao longo do tempo usando sns.set para estilo e ax.plot para visualização
- Desenho dos Níveis de Fibonacci: Para cada nível de Fibonacci fornecido na lista, a função calcula o preço correspondente e desenha uma linha horizontal usando ax.axhline
- Desenho do VWAP: O VWAP é plotado como uma linha horizontal amarela
- Salvando o Gráfico: O gráfico é salvo com um timestamp para evitar sobrescrever gráficos anteriores
O gráfico é salvo como um arquivo de imagem, e isso ajuda a visualizar como o preço interage com os principais níveis de retração de Fibonacci e o VWAP.
def plot_vwap_fib_vs_price(symbol: str, vwap: float, swingHigh: float, swingLow: float, fibLevels: list, price_data: pd.Series) -> str: sns.set(style="whitegrid") fig, ax = plt.subplots(figsize=(7.5, 5), dpi=100) ax.plot(price_data.index, price_data.values, label="Price", color='blue', marker='o', markersize=4) for level in fibLevels: level_price = swingLow + (swingHigh - swingLow) * level ax.axhline(y=level_price, linestyle='--', linewidth=1.5, label=f'Fib {level*100:.1f}%: {level_price:.5f}') ax.axhline(y=vwap, color='yellow', linestyle='-', linewidth=2, label=f'VWAP: {vwap:.5f}') ax.set_title(f'VWAP & Fibonacci vs Price for {symbol}') ax.set_xlabel('Time Index') ax.set_ylabel('Price') ax.legend() filename = f"vwap_fib_plot_{symbol}_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.png" plt.savefig(filename) plt.close(fig) return filename
2. Rota Flask para Sinal e Análise
A função get_signal() é a rota principal que lida com requisições POST e é responsável por receber dados de mercado, realizar análise e retornar sinais de trading. Os dados são enviados para essa rota como uma carga JSON a partir do MQL5.
Detalhamento da Função:
- Receber Dados: A função recebe dados de mercado em formato bruto, decodifica-os e os converte em um objeto JSON.
- Extrair Dados: Pontos-chave de dados como símbolo, swingHigh, swingLow, vwap, fibLevels e priceData são extraídos do JSON recebido.
- Plotagem: Ela inicia uma nova thread que chama a função de plotagem para gerar a representação visual das condições de mercado (VWAP e Fibonacci).
- Geração de Sinal: O sinal de compra/venda é gerado comparando o VWAP com o ponto médio entre a máxima e a mínima de swing. Se o VWAP estiver abaixo do ponto médio, um sinal de "Compra" é gerado; caso contrário, um sinal de "Venda" é emitido.
- Resposta: Uma resposta é retornada com o sinal gerado ("Buy", "Sell" ou "None") e uma explicação.
A lógica de geração de sinais é simples, mas eficaz:
- Sinal de Compra: O VWAP está abaixo do ponto médio da máxima e mínima de swing, indicando potencial impulso de alta.
- Sinal de Venda: O VWAP está acima do ponto médio, sugerindo uma tendência de baixa ou condições de mercado baixistas.
@app.route('/getSignal', methods=['POST']) def get_signal(): try: # Get the raw data from the request raw_data = request.data.decode('utf-8').strip() logging.debug("Raw data received: " + raw_data) # Parse JSON decoder = json.JSONDecoder() data, idx = decoder.raw_decode(raw_data) if idx != len(raw_data): logging.error(f"Extra data found after valid JSON: index {idx} of {len(raw_data)}") logging.info("Data received from MQL5: " + json.dumps(data, indent=2)) except Exception as e: logging.error("Error parsing JSON: " + str(e)) return jsonify({"signal": "None", "error": str(e)}) try: # Extract parameters symbol = data.get('symbol', 'Unknown') swingHigh = float(data.get('swingHigh', 0)) swingLow = float(data.get('swingLow', 0)) vwap = float(data.get('vwap', 0)) fibLevels = data.get('fibLevels', [0.236, 0.382, 0.5, 0.618, 1.618]) # Default levels if not provided # Convert priceData list into a pandas Series price_data = pd.Series(data.get('priceData', [])) # Start thread for visualization threading.Thread(target=plot_vwap_fib_vs_price, args=(symbol, vwap, swingHigh, swingLow, fibLevels, price_data)).start() # Determine signal based on VWAP & Fibonacci mid_price = np.mean([swingHigh, swingLow]) if vwap < mid_price and price_data.iloc[-1] < swingLow + (swingHigh - swingLow) * 0.382: signal = "Buy" elif vwap > mid_price and price_data.iloc[-1] > swingLow + (swingHigh - swingLow) * 0.618: signal = "Sell" else: signal = "None" explanation = f"Signal: {signal} based on VWAP and Fibonacci analysis." except Exception as e: logging.error("Error processing data: " + str(e)) signal = "None" explanation = "Error processing the signal." # Build response response = { "signal": signal, "explanation": explanation, "received_data": data } logging.debug("Sending response to MQL5: " + json.dumps(response)) return jsonify(response)
No código, o processo de geração de sinal leva em consideração tanto o VWAP quanto o Fibonacci, com a lógica dependendo explicitamente de ambos para determinar se deve gerar um sinal de Compra ou Venda. O sinal de Compra ou Venda é diretamente baseado no alinhamento entre o VWAP e os níveis de Fibonacci. Por exemplo:
- Sinal de Compra: Quando o VWAP está abaixo do ponto médio e o preço está se aproximando de um nível de suporte (retração de Fibonacci), isso é uma forte indicação de Compra.
- Sinal de Venda: Se o VWAP está acima do ponto médio e o preço está em um nível de resistência de Fibonacci, o sinal de Venda é mais forte.
Outras Funções
EA em MQL5
- Funções Auxiliares
Vamos começar pelas funções auxiliares. Elas são como pequenas ferramentas em nossa caixa de ferramentas que simplificam nosso trabalho posteriormente. Por exemplo, a função BoolToString converte um valor verdadeiro/falso em uma string ("true" ou "false") para que, ao registrar ou exibir esses valores, eles sejam fáceis de ler. Depois temos CharToStr, que recebe um código de caractere (um unsigned short) e o converte em uma string — uma função útil quando você precisa trabalhar com dados de texto. Por fim, MyStringToLower percorre uma string fornecida caractere por caractere, convertendo quaisquer letras maiúsculas em minúsculas. Isso é especialmente útil quando você deseja comparar strings sem se preocupar com diferenças de maiúsculas e minúsculas. Aqui está o código exato:
//+------------------------------------------------------------------+ //| Helper: Convert bool to string | //+------------------------------------------------------------------+ string BoolToString(bool val) { return(val ? "true" : "false"); } //+------------------------------------------------------------------+ //| Helper: Convert ushort (character code) to string | //+------------------------------------------------------------------+ string CharToStr(ushort ch) { return(StringFormat("%c", ch)); } //+------------------------------------------------------------------+ //| Helper: Convert a string to lower case | //| This custom function avoids the implicit conversion warning. | //+------------------------------------------------------------------+ string MyStringToLower(string s) { string res = ""; int len = StringLen(s); for(int i = 0; i < len; i++) { ushort ch = s[i]; // Check if character is uppercase A-Z. if(ch >= 'A' && ch <= 'Z') ch = ch + 32; res += CharToStr(ch); } return res; }
Em essência, essas funções ajudam a garantir que o tratamento de texto e dados seja consistente em todo o EA.
- Inicialização e Encerramento
Em seguida, temos as rotinas de inicialização e encerramento. Pense nelas como preparar o palco antes do início da peça e organizar tudo depois. Na função OnInit, o EA começa exibindo uma mensagem de boas-vindas. Em seguida, define um temporizador usando EventSetTimer (o que é crítico para tarefas periódicas) e chama InitializeFibonacciArray para pré-carregar nossos níveis de Fibonacci. Além disso, registra o horário atual para gerenciar atualizações subsequentes. Se o temporizador falhar, o EA é interrompido imediatamente para evitar problemas adicionais. Por outro lado, a função OnDeinit é chamada quando o EA é removido do gráfico; ela encerra o temporizador com EventKillTimer e registra o motivo. Veja como isso se apresenta:
//+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { Print("FibVWAP No-Trade EA initializing..."); if(!EventSetTimer(InpTimerInterval)) { Print("Error: Unable to set timer."); return(INIT_FAILED); } InitializeFibonacciArray(); g_LastUpdateTime = TimeCurrent(); Print("FibVWAP No-Trade EA successfully initialized."); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { EventKillTimer(); Print("FibVWAP No-Trade EA deinitialized, reason code: " + IntegerToString(reason)); } //+------------------------------------------------------------------+ //| Initialize Fibonacci levels array | //+------------------------------------------------------------------+ void InitializeFibonacciArray() { g_FibLevels[0] = 0.000; g_FibLevels[1] = 0.236; g_FibLevels[2] = 0.382; g_FibLevels[3] = 0.500; g_FibLevels[4] = 0.618; g_FibLevels[5] = 0.786; g_FibLevels[6] = 1.000; }
Ao configurar cuidadosamente e encerrar nosso ambiente, garantimos que o EA funcione de forma suave sem deixar pontas soltas.
- Execução Periódica e Tratamento de Eventos
Agora, vamos observar como o EA gerencia suas tarefas durante a execução. A função OnTimer é fundamental aqui; ela é acionada em intervalos definidos pelo usuário (configurados por InpTimerInterval). Toda vez que esse temporizador é acionado, o EA atualiza seus indicadores, constrói uma carga JSON, envia essa carga para nosso endpoint Python e processa qualquer sinal retornado. Se houver um novo sinal, o EA até desenha uma seta no gráfico. Enquanto OnTick é chamado a cada atualização de mercado (ou tick), nós o utilizamos apenas para chamar MainProcessingLoop, de modo que o processamento pesado não aconteça a cada tick — apenas em intervalos controlados. Esse design ajuda a manter o EA eficiente. Confira o código:
//+------------------------------------------------------------------+ //| Expert timer function: periodic update | //+------------------------------------------------------------------+ void OnTimer() { UpdateIndicators(); string payload = BuildJSONPayload(); Print("Payload sent to Python: " + payload); string signal = SendDataToPython(payload); if(signal != "") { if(signal != g_LastSignal) { g_LastSignal = signal; Print("New signal received: " + signal); Comment("ML Signal: " + signal); // Draw an arrow on the chart for the new signal. DrawSignalArrow(signal); } else { Print("Signal unchanged: " + signal); } } else { Print("Warning: No valid signal received."); } UpdateChartObjects(); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { MainProcessingLoop(); } //+------------------------------------------------------------------+ //| Main processing loop: can be called from OnTick | //+------------------------------------------------------------------+ void MainProcessingLoop() { datetime currentTime = TimeCurrent(); if(currentTime - g_LastUpdateTime >= InpTimerInterval) { UpdateChartObjects(); g_LastUpdateTime = currentTime; } }
Essa configuração garante que nosso EA execute suas atualizações no ritmo adequado sem ser sobrecarregado por cada tick.
- Gerenciamento de Objetos do Gráfico
O feedback visual é importante no trading, e é aqui que entra o gerenciamento de objetos do gráfico. A função DrawChartObjects é responsável por desenhar elementos visuais no gráfico, como linhas horizontais que representam nossos níveis de Fibonacci e o VWAP. Ela primeiro limpa quaisquer objetos anteriores para evitar poluição visual e, em seguida, cria novos objetos com as cores, estilos e rótulos de texto apropriados. A função auxiliar UpdateChartObjects simplesmente chama DrawChartObjects para manter a modularidade, e ExtendedProcessing está disponível caso precisemos realizar atualizações extras ou ações de depuração. Aqui está o código:
//+------------------------------------------------------------------+ //| Draw objects on the chart for visual indicator levels | //+------------------------------------------------------------------+ void DrawChartObjects() { string objPrefix = "FibVWAP_"; // Remove previous objects with the given prefix. ObjectsDeleteAll(0, objPrefix); double range = g_SwingHigh - g_SwingLow; for(int i = 0; i < 7; i++) { double levelPrice = g_SwingLow + range * g_FibLevels[i]; string name = objPrefix + "FibLevel_" + IntegerToString(i); if(!ObjectCreate(0, name, OBJ_HLINE, 0, 0, levelPrice)) Print("Error creating object: " + name); else { ObjectSetInteger(0, name, OBJPROP_COLOR, clrDeepSkyBlue); ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_DOT); ObjectSetString(0, name, OBJPROP_TEXT, "Fib " + DoubleToString(g_FibLevels[i]*100, 0) + "%"); } } string vwapName = objPrefix + "VWAP"; if(!ObjectCreate(0, vwapName, OBJ_HLINE, 0, 0, g_VWAP)) Print("Error creating VWAP object."); else { ObjectSetInteger(0, vwapName, OBJPROP_COLOR, clrYellow); ObjectSetInteger(0, vwapName, OBJPROP_STYLE, STYLE_SOLID); ObjectSetString(0, vwapName, OBJPROP_TEXT, "VWAP"); } } //+------------------------------------------------------------------+ //| Periodically update chart objects | //+------------------------------------------------------------------+ void UpdateChartObjects() { DrawChartObjects(); } //+------------------------------------------------------------------+ //| Extended processing: additional updates and chart redraw | //+------------------------------------------------------------------+ void ExtendedProcessing() { Print("Extended processing executed."); UpdateChartObjects(); }
- Funções Utilitárias Adicionais
//+------------------------------------------------------------------+ //| Convert char array to string | //+------------------------------------------------------------------+ string CharArrayToString(const char &arr[]) { string ret = ""; for(int i = 0; i < ArraySize(arr); i++) ret += CharToStr(arr[i]); return(ret); } //+------------------------------------------------------------------+ //| Custom logging function for detailed debug information | //+------------------------------------------------------------------+ void LogDebugInfo(string info) { string logMessage = TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS) + " | " + info; Print(logMessage); } //+------------------------------------------------------------------+ //| Additional utility: Pause execution (for debugging) | //+------------------------------------------------------------------+ void PauseExecution(int seconds) { datetime endTime = TimeCurrent() + seconds; while(TimeCurrent() < endTime) { Sleep(100); } }
Essas funções podem não ser as estrelas do EA, mas fazem uma grande diferença quando se trata de solução de problemas e de garantir que tudo funcione conforme o esperado.
Script Python
- Principais Imports em Nosso Sistema de Trading em Python
import datetime import json import logging import threading import numpy as np import pandas as pd import pandas_ta as ta import matplotlib.pyplot as plt import seaborn as sns from flask import Flask, request, jsonify
| Biblioteca | Objetivo | Como é usada em nosso sistema |
|---|---|---|
| datetime | Gerenciamento de Tempo | Usado para registrar timestamp nos gráficos de trading salvos e nos eventos de log. Toda vez que geramos um gráfico, anexamos um timestamp para acompanhar diferentes condições de mercado ao longo do tempo. |
| json | Troca de Dados | Como nosso sistema se comunica com o MQL5, enviamos e recebemos dados no formato JSON. Esse módulo nos ajuda a codificar e decodificar mensagens JSON entre Python e MQL5. |
| logging | Depuração e monitoramento | Mantém o controle dos eventos do sistema. Usamos para registrar cada etapa — quando um sinal é recebido, processado ou quando ocorre um erro — facilitando a depuração. |
| threading | Execução de Tarefas em Segundo Plano | Quando geramos um gráfico VWAP-Fibonacci, executamos isso em uma thread separada para garantir que o servidor permaneça responsivo e não atrase o envio de sinais de volta ao MQL5. |
| numpy | Computação Numérica | Usamos NumPy para calcular o preço médio e realizar outras operações matemáticas de forma rápida e eficiente. Velocidade é importante ao processar dados de mercado em tempo real. |
| pandas | Manipulação de Dados | Como os dados de mercado são estruturados em linhas e colunas (como uma planilha), o pandas facilita armazenar, filtrar e manipular esses dados para análise. |
| pandas_ta | Indicadores Técnicos | Embora não seja uma parte central do nosso sistema atual, permite ferramentas adicionais de análise técnica, se necessário no futuro. |
| matplotlib.pyplot | Criação de Gráficos & Visualização | A base da nossa análise visual. Usamos para plotar movimentos de preço, níveis de VWAP e zonas de retração de Fibonacci. |
| seanborn | Estilização Aprimorada de Gráficos | Ajuda a tornar nossos gráficos visualmente atraentes, facilitando a identificação de tendências e níveis-chave. |
| flask | Comunicação entre MQL5 e Python | É isso que torna possível a troca de sinais em tempo real. O Flask cria uma API que permite ao nosso Expert Advisor em MQL5 enviar dados de preço e receber sinais de trading instantaneamente. |
- Inicialização do Servidor Flask (if name == 'main')
Como Funciona:
- Vincula o servidor à porta 5110
- Executa em modo de depuração para registro em tempo real e solução de problemas
- Garante que o servidor não reinicie automaticamente de forma desnecessária (use_reloader=False)
if __name__ == '__main__': port = 5110 logging.info(f"Starting Flask server on 127.0.0.1:{port} (debug mode ON)") app.run(host="127.0.0.1", port=port, debug=True, use_reloader=False)
Resultados
Para testar o sistema, comece executando o script Python para ativar a porta e o servidor para conexão. Se você não tiver certeza de como executar o script, consulte o artigo External Flow para orientação. Quando o servidor estiver ativo, execute o EA em MQL5. Agora, vamos examinar os resultados após a execução bem-sucedida do sistema.
Logs do Prompt de Comando
2025-02-06 12:45:32,384 DEBUG: Sending response to MQL5: {"signal": "Sell", "explanation": "Signal: Sell based on VWAP and Fibonacci analysis.", "received_data": {"symbol": "EURUSD", "timeframe": "PERIOD_H1", "swingHigh": 1.05331, "swingLow": 1.02099, "vwap": 1.03795, "fibLevels": [0.0, 0.236, 0.382, 0.5, 0.618, 0.786, 1.0], "priceData": [1.03622, 1.03594, 1.03651, 1.03799, 1.03901, 1.03865, 1.03871, 1.0392, 1.03951, 1.04025, 1.03974, 1.03986, 1.04041, 1.04017, 1.04049, 1.04072, 1.04156, 1.04197, 1.04181, 1.04223, 1.04224, 1.04079, 1.04192, 1.04147, 1.04251, 1.04039, 1.04039, 1.04026, 1.0385, 1.03778, 1.03786, 1.03796, 1.03845, 1.03734, 1.03786, 1.03714, 1.0378, 1.03786, 1.03854, 1.03817, 1.03811, 1.03767, 1.03784, 1.03801, 1.03593, 1.03404, 1.03254, 1.03223, 1.0335, 1.03386, 1.03344, 1.03115, 1.03067, 1.02932, 1.0306, 1.03147, 1.0322, 1.03221, 1.03178, 1.03281, 1.0342, 1.03441, 1.02955, 1.02846, 1.02785, 1.02795, 1.02761, 1.03162, 1.0251, 1.0264, 1.02577, 1.02522, 1.02438, 1.0231, 1.02436, 1.02249, 1.02431, 1.02404, 1.02265, 1.02216, 1.02235, 1.02377, 1.02314, 1.0247, 1.02504, 1.03583, 1.03733, 1.03763, 1.03698, 1.042, 1.03998, 1.03964, 1.03687, 1.03822, 1.03825, 1.03759, 1.03765, 1.03836, 1.03845, 1.0404, 1.03946, 1.03888, 1.03875, 1.0385, 1.03897, 1.03884, 1.03867, 1.03969, 1.03873, 1.03885, 1.04076, 1.0428, 1.0425, 1.0417, 1.04197, 1.04314, 1.0428, 1.04562, 1.04033, 1.03918, 1.04007, 1.04076, 1.04217, 1.04239, 1.04139, 1.0422, 1.04191, 1.04253, 1.0423, 1.042, 1.04259, 1.04247, 1.04216, 1.04209, 1.04105, 1.04164, 1.042, 1.04213, 1.04157, 1.04194, 1.04013, 1.03878, 1.0404, 1.04016, 1.04037, 1.04038, 1.04244, 1.04161, 1.04372, 1.04403, 1.04386, 1.04374, 1.0434, 1.04272, 1.04304, 1.04272, 1.04286, 1.04301, 1.04315, 1.0435, 1.04264, 1.04279, 1.04262, 1.04241, 1.04314, 1.04249, 1.04203, 1.04234, 1.0425, 1.04352, 1.04252, 1.04342, 1.04376, 1.04364, 1.04336, 1.04291, 1.04336, 1.04378, 1.04453, 1.0437, 1.04886, 1.04916, 1.04881, 1.04926, 1.04849, 1.04888, 1.04908, 1.04992, 1.05094, 1.05199, 1.05212, 1.0513, 1.05054, 1.04888, 1.04875, 1.04571, 1.04591, 1.0463, 1.04633, 1.04686]}} 2025-02-06 12:39:32,397 INFO: 127.0.0.1 - - [06/Feb/2025 12:39:32] "POST /getSignal HTTP/1.1" 200 - 2025-02-06 12:39:32,805 DEBUG: VWAP & Fibonacci vs Price graph saved as vwap_fib_plot_EURUSD_20250206_123932.png
MQL5 Logs
2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5) Fib Level 0 (0%): 1.02099 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5) Fib Level 1 (24%): 1.02862 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5) Fib Level 2 (38%): 1.03334 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5) Fib Level 3 (50%): 1.03715 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5) Fib Level 4 (62%): 1.04096 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5) Fib Level 5 (79%): 1.04639 2025.02.06 12:45:32.332 FIBVWAP (EURUSD,M5) Fib Level 6 (100%): 1.05331 2025.02.06 12:45:32.332 FIBVWAP (EURUSD,M5) Updated Indicators: SwingHigh=1.05331, SwingLow=1.02099, VWAP=1.03795 2025.02.06 12:45:32.332 FIBVWAP (EURUSD,M5) Payload sent to Python: {"symbol":"EURUSD","timeframe":"PERIOD_H1","swingHigh":1.05331,"swingLow":1.02099,"vwap":1.03795,"fibLevels":[0.000,0.236,0.382,0.500,0.618,0.786,1.000],"priceData":[1.03583,1.03594,1.03651,1.03799,1.03901,1.03865,1.03871,1.03920,1.03951,1.04025,1.03974,1.03986,1.04041,1.04017,1.04049,1.04072,1.04156,1.04197,1.04181,1.04223,1.04224,1.04079,1.04192,1.04147,1.04251,1.04039,1.04039,1.04026,1.03850,1.03778,1.03786,1.03796,1.03845,1.03734,1.03786,1.03714,1.03780,1.03786,1.03854,1.03817,1 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) HTTP Response: { 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) "explanation": "Signal: Sell based on VWAP and Fibonacci analysis.", 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) "received_data": { 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) "fibLevels": [ 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 0.0, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 0.236, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 0.382, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 0.5, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 0.618, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 0.786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.0 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) ], 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) "priceData": [ 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03583, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03594, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03651, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03799, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03901, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03865, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03871, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.0392, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03951, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04025, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03974, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03986, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04041, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04017, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04049, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04072, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04156, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04197, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04181, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04223, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04224, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04079, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04192, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04147, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04251, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04039, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04039, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04026, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.0385, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03778, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03796, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03845, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03734, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03714, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.0378, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03854, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03817, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03811, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03767, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03784, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03801, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03593, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03254, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03223, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0335, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03386, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03344, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03115, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03067, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02932, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0306, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03147, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0322, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03221, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03178, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03281, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0342, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03441, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02955, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02846, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02785, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02795, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02761, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03162, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0251, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0264, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02577, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02522, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02438, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0231, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02436, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02249, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02431, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02265, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02216, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02235, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02377, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02314, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0247, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02504, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03583, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03733, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03763, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03698, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.042, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03998, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03964, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03687, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03822, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03825, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03759, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03765, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03836, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03845, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03946, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03888, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03875, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0385, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03897, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03884, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03867, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03969, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03873, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03885, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04076, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0428, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0425, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0417, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04197, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04314, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0428, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04562, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04033, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03918, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04007, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04076, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04217, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04239, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04139, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0422, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04191, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04253, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0423, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.042, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04259, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04247, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04216, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04209, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04105, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04164, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.042, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04213, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04157, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04194, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04013, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03878, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04016, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04037, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04038, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04244, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04161, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04372, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04403, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04386, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04374, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0434, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04272, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04304, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04272, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04286, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04301, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04315, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0435, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04264, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04279, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04262, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04241, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04314, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04249, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04203, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04234, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0425, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04352, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04252, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04342, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04376, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04364, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04336, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04291, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04336, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04378, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04453, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0437, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04886, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04916, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04881, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04926, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04849, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04888, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04908, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04992, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.05094, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.05199, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.05212, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0513, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.05054, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04888, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04875, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04571, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04591, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0463, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04633, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04686 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) ], 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) "swingHigh": 1.05331, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) "swingLow": 1.02099, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) "symbol": "EURUSD", 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) "timeframe": "PERIOD_H1", 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) "vwap": 1.03795 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) }, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) "signal": "Sell" 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) }
O gráfico VWAP-Fibonacci vs. Preço também foi plotado e salvo no mesmo diretório do script Python. Esse gráfico ajuda a visualizar como o preço interage com os níveis de VWAP e Fibonacci.

Fig 3. Gráfico Matplotlib
No diagrama abaixo, o EA em MQL5 no gráfico do MetaTrader 5 registra e exibe a resposta do servidor Python. O gráfico mostra dois sinais de compra, indicados por setas, que também são registrados na aba Experts. Podemos ver que o mercado seguiu a direção desses sinais, confirmando sua validade. Escolhi visualizar o gráfico M1 para uma análise mais clara.

Fig 4. Teste no Índice Boom 300
Conclusão
Este sistema se mostra altamente útil para traders. Além de fornecer sinais, ele permite uma visualização clara de como o preço interage com os níveis de Fibonacci e o VWAP durante a geração de sinais. A visualização é alcançada de duas maneiras: o Python plota um gráfico usando a biblioteca Matplotlib, enquanto o EA em MQL5 exibe as linhas de VWAP e Fibonacci diretamente no gráfico para melhor análise. Essa representação visual aprimorada pode auxiliar traders na tomada de decisões informadas.
| 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 no Lynnchris Tool Chest |
| 18/11/24 | Comentário Analítico | Fornece informações do dia anterior em formato tabular, bem como antecipa a direção futura do mercado. | 1.0 | Lançamento Inicial | Segunda ferramenta no Lynnchris Tool Chest |
| 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 no Lynnchris Tool Chest |
| 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/25 | Pulso de sinal | Analisador de múltiplos períodos de tempo | 1.0 | Lançamento Inicial | Ferramenta número 7 |
| 17/01/25 | Quadro 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 |
Traduzido do Inglês pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/en/articles/17121
Aviso: Todos os direitos sobre esses materiais pertencem à MetaQuotes Ltd. É proibida a reimpressão total ou parcial.
Esse artigo foi escrito por um usuário do site e reflete seu ponto de vista pessoal. A MetaQuotes Ltd. não se responsabiliza pela precisão das informações apresentadas nem pelas possíveis consequências decorrentes do uso das soluções, estratégias ou recomendações descritas.
Automatizando Estratégias de Trading em MQL5 (Parte 6): Dominando a Detecção de Order Blocks para Trading com Smart Money
Rede neural na prática: Surgimento de C_Neuron
Está chegando o novo MetaTrader 5 e MQL5
Do básico ao intermediário: Sub Janelas (II)
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
1 atualize os scripts para usar seu endereço ou o host local 127.0.0.1
2 em tools options web request url, adicione o endereço que você está usando
4 certifique-se de que todas as partes do Python estejam instaladas
instalar o matplotlib
pip install pandas
pip install Flask seaborn e Numpty, se necessário
3 inicie o aplicativo flask nesse endereço executando o arquivo python com o endereço que você está usando
Obrigado, Chris, por todas as suas ideias e publicações, definitivamente úteis. Para este artigo, para que ele funcione, preciso fazer algumas configurações adequadas ao meu ambiente depois de verificar novamente o Price Action Analysis Toolkit Development (Parte 9): External Flow - MQL5 Articles Which Maybe are helpful to others
1 atualize os scripts para usar seu endereço ou o host local 127.0.0.1
2 em tools options web request url, adicione o endereço que você está usando
4 certifique-se de que todas as partes do Python estejam instaladas
instalar o matplotlib
pip install pandas
O pip instala o Flask seaborn e o Numpty, se necessário
3 inicie o aplicativo flask nesse endereço executando o arquivo python com o endereço que você está usando