Discussão do artigo "Automatização de estratégias de negociação em MQL5 (Parte 24): Sistema de negociação por rompimento da sessão de Londres com gerenciamento de risco e trailing stops"

Novo artigo Automatização de estratégias de negociação em MQL5 (Parte 24): Sistema de negociação por rompimento da sessão de Londres com gerenciamento de risco e trailing stops foi publicado:

Neste artigo, desenvolveremos um sistema de negociação por rompimento da sessão de Londres que identificará rompimentos da faixa de preços formada antes da abertura da sessão e posicionará ordens pendentes com configuração do tipo de operação e dos parâmetros de risco. Implementaremos trailing stop, relação risco/retorno, controle do drawdown máximo e um painel de controle para monitoramento em tempo real.

A estratégia de rompimento da sessão de Londres aproveita o aumento da volatilidade na abertura do mercado londrino. Ela identifica a faixa de preços formada nas horas que antecedem a abertura e posiciona ordens pendentes para operar seu rompimento. A sessão de Londres costuma apresentar alta liquidez e movimentos expressivos de preços, criando boas oportunidades de lucro. No entanto, a estratégia exige um gerenciamento de risco rigoroso para proteger o capital contra falsos rompimentos e drawdowns.

Para isso, calcularemos a máxima e a mínima do período anterior à sessão de Londres e utilizaremos esses níveis para posicionar ordens Buy Stop e Sell Stop com distâncias configuráveis em relação a eles. Também configuraremos a relação risco/retorno para determinar os níveis de take profit, trailing stops para assegurar os lucros e limites para o número de operações abertas e o drawdown diário, visando preservar o capital. Além disso, utilizaremos um painel de controle para monitoramento em tempo real e verificações do horário da sessão, garantindo que as operações sejam executadas apenas nos períodos definidos. O sistema também será capaz de se adaptar a diferentes condições de mercado. A seguir, apresentamos a estrutura conceitual do sistema que implementaremos.

ESTRUTURA DA ESTRATÉGIA


Autor: Allan Munene Mutiiria

etherxp #:
Obrigado;)

Seja bem-vindo

[Excluído]
Você poderia enviar o indicador aqui?
hungxiro #:
Você poderia enviar o indicador aqui?

Por favor, leia o artigo acima.

Ótimo artigo. Obrigado pelo seu empenho!
Kyle Young Sangster #:
Ótimo artigo. Obrigado pelo seu empenho!

De nada. Obrigado pelo comentário gentil. De nada.

Baixei e executei esse código tal como está no Testador de Estratégias. Ele identifica a variação diária e desenha a caixa no gráfico. No entanto, ele não realiza uma operação todos os dias (embora se esperasse que o fizesse). Ao longo de um mês e meio, ele realizou apenas três operações.


histórico comercial


A segunda questão é que os níveis de alta/baixa e os níveis de compra/venda no painel de controle não são atualizados.

O painel de controle não está sendo atualizado


Os níveis de alta e baixa da variação estão claramente sendo identificados no gráfico; portanto, imagino que os níveis de compra e venda também devam ser exibidos no gráfico e atualizados no painel de controle, já que são derivados diretamente dos níveis de alta e baixa da variação.

Que sugestões você tem para que isso funcione corretamente?

Agradeço desde já.

Kyle Young Sangster Strategy Tester. Ele identifica a variação diária e desenha a caixa no gráfico. No entanto, ele não realiza uma operação todos os dias (embora se espere que o faça). Ao longo de um mês e meio, ele realizou apenas três operações.



O segundo problema é que os níveis de alta/baixa e os níveis de compra/venda no painel de controle não são atualizados.


Os níveis de alta e baixa estão claramente sendo identificados no gráfico, então imagino que os níveis de compra e venda também devam ser exibidos no gráfico e atualizados no painel de controle, já que são derivados diretamente dos níveis de alta e baixa.

Quais sugestões vocês têm para que isso funcione corretamente?

Agradeço desde já.

Não consigo editar meu comentário; estou usando a versão 5.00, build 5214 do MT5

Kyle Young Sangster Strategy Tester. Ele identifica a variação diária e desenha a caixa no gráfico. No entanto, ele não realiza uma operação todos os dias (embora se espere que o faça). Ao longo de um mês e meio, ele realizou apenas três operações.



O segundo problema é que os níveis de alta/baixa e os níveis de compra/venda no painel de controle não são atualizados.


Os níveis de alta e baixa estão claramente sendo identificados no gráfico; portanto, imagino que os níveis de compra e venda também devam ser exibidos no gráfico e atualizados no painel de controle, já que são derivados diretamente dos níveis de alta e baixa.

Que sugestões vocês têm para que isso funcione corretamente?

Agradeço desde já.

Olá. Obrigado pela resposta gentil e pelo feedback. Supondo que você não tenha realmente lido o artigo, você simplesmente instalou e começou a usar; o programa foi desenvolvido para o símbolo AUDUSD, então teste-o lá primeiro antes de passar para outras moedas. Isso lhe dará uma compreensão mais profunda, pois os pontos precisam de ajuste conforme os pares mudam. Talvez você precise também verificar o diário em busca de possíveis pistas sobre o motivo da falha, que pode ser devido a configurações incorretas, mas, aparentemente, os pontos para AUDUSD e EURUSD deveriam funcionar quase da mesma forma. Por exemplo, você está executando no EURUSD; então, faremos um teste semelhante para verificar.

TESTE DO EURUSD

Pela imagem, veja que há um erro ali. Isso faria com que o teste não fosse executado corretamente.

Outra razão possível seria a falta de confiabilidade dos dados históricos, especialmente ao executar o teste com dados muito antigos. No seu exemplo, você executou a partir de 2020. Então, vamos testar e verificar para o período mostrado na sua captura de tela.

DADOS HISTÓRICOS INSUFICIENTES

Após o teste do período de 01/01/2020 a 31/01/2020 — tecnicamente, janeiro de 2020 —, nenhuma operação foi efetivamente realizada. Como você pode ver, a qualidade dos dados nesse período é ruim; 15% é um índice muito pouco confiável. As seções em vermelho mostram dados totalmente nulos e, ao passar o mouse sobre elas, é possível ver o período em branco. Agora, vamos testar com os dados de janeiro de 2025 e ver o que acontece.

100 DADOS

Pela imagem, dá para ver que, com 100% de qualidade do histórico, temos algumas negociações: 19 delas em um mês.

Portanto, com base no seu problema, talvez você precise verificar a qualidade dos seus dados de teste, já que comprovamos que as configurações padrão funcionam bem no símbolo EURUSD. Espero que isso esclareça as coisas e seja útil. Obrigado. Boas negociações.

Kyle Young Sangster Strategy Tester. Ele identifica a variação diária e desenha a caixa no gráfico. No entanto, ele não realiza uma operação todos os dias (embora se espere que o faça). Ao longo de um mês e meio, ele realizou apenas três operações.



O segundo problema é que os níveis de alta/baixa e os níveis de compra/venda no painel de controle não são atualizados.


Os níveis de alta e baixa estão claramente sendo identificados no gráfico, então imagino que os níveis de compra e venda também devam ser exibidos no gráfico e atualizados no painel de controle, já que são derivados diretamente dos níveis de alta e baixa.

Quais sugestões vocês têm para que isso funcione corretamente?

Agradeço desde já.

Quanto à sua segunda questão, o artigo explica isso, mas, supondo que o problema se deva a dados de teste insuficientes e para dar uma dica: quando a faixa está sendo calculada, você sempre verá o status “Calculando...” até que haja dados suficientes para definir a sessão da faixa de Londres ou qualquer outra sessão que você definir nas configurações. Supondo que você esteja usando as configurações padrão, com 3 horas pré-Londres, e que a data na captura de tela compartilhada seja 13 de fevereiro, duas barras após as 22h, o que equivale a 2 × 15 minutos = 30, o que resulta em 22h30, está fora do horário de cálculo do intervalo; portanto, os dados no painel devem continuar visíveis, já que o intervalo definido anteriormente ainda está em vigor, a menos que a primeira sessão ainda não tenha sido encontrada, e serão apagados assim que o cálculo do intervalo for concluído a partir da meia-noite. Veja abaixo:

const int PreLondonStartHour = 3; //--- Horário fixo de início antes de Londres
const int PreLondonStartMinute = 0; //--- Minuto fixo antes do início da corrida em Londres

Talvez seja necessário conferir a lógica abaixo para identificar o intervalo

//+------------------------------------------------------------------+
//| Verificar as condições de negociação e inserir ordens                        |
//+------------------------------------------------------------------+
void CheckTradingConditions(datetime currentTime) {
   MqlDateTime timeStruct;            //--- Estrutura temporal
   TimeToStruct(currentTime, timeStruct); //--- Converter a hora
   datetime today = StringToTime(StringFormat("%04d.%02d.%02d", timeStruct.year, timeStruct.mon, timeStruct.day)); //--- Obter a data de hoje

   datetime preLondonStart = today + PreLondonStartHour * 3600 + PreLondonStartMinute * 60; //--- Início antes de Londres
   datetime londonStart = today + LondonStartHour * 3600 + LondonStartMinute * 60; //--- Início em Londres
   datetime londonEnd = today + LondonEndHour * 3600 + LondonEndMinute * 60; //--- Fim da parte de Londres
   analysisTime = londonStart;        //--- Definir o tempo de análise

   if (currentTime < analysisTime) return; //--- Sair antes da análise

   double preLondonRange = GetRange(preLondonStart, currentTime, PreLondonHigh, PreLondonLow, PreLondonHighTime, PreLondonLowTime); //--- Obter intervalo
   if (preLondonRange < MinRangePoints || preLondonRange > MaxRangePoints) { //--- Verificar os limites do intervalo
      noTradeToday = true;            //--- Definir como “sem negociação”
      sessionChecksDone = true;       //--- Verificações concluídas
      DrawSessionRanges(preLondonStart, londonEnd); //--- Desenhar intervalos
      return;                         //--- Sair
   }

   LondonRangePoints = preLondonRange; //--- Definir pontos do intervalo
   PlacePendingOrders(PreLondonHigh, PreLondonLow, today); //--- Fazer pedidos
   noTradeToday = true;               //--- Definir como “sem negociação”
   sessionChecksDone = true;          //--- Verificações concluídas
   DrawSessionRanges(preLondonStart, londonEnd); //--- Desenhar intervalos
}

e como ele é definido.

//+------------------------------------------------------------------+
//| Atualizar o painel com os dados atuais                                   |
//+------------------------------------------------------------------+
void UpdatePanel() {
   string rangeText = "Range (points): " + (LondonRangePoints > 0 ? DoubleToString(LondonRangePoints, 0) : "Calculating..."); //--- Formatar o texto do intervalo
   ObjectSetString(0, panelPrefix + "RangePoints", OBJPROP_TEXT, rangeText); //--- Atualizar o texto do intervalo

   //---

}

Veja a imagem abaixo; embora não saibamos o ano do seu teste, vamos considerar 2025. Se for 2020, como no seu caso, não temos dados de qualidade para esse ano; de qualquer forma, usamos 2025 e, portanto, o cálculo do intervalo deve começar à meia-noite.

23h55

Na imagem, você pode ver que os dados às 23h55 ainda estão intactos. No entanto, quando chega a meia-noite, devemos reiniciar. Veja abaixo.

DADOS DA MEIA-NOITE 00:00

Você pode ver que reiniciamos os dados à meia-noite para o cálculo do outro intervalo. Na verdade, quando o cálculo do intervalo é concluído, a visualização pode ajudar você a entender o que realmente aconteceu. Por exemplo, no seu caso, usando as configurações padrão, veremos as barras de intervalo das 03h00 às 08h00, pois foi isso que definimos. Veja abaixo:

HORÁRIO DE FUNCIONAMENTO DO CAMPO DE TIRO

Espero que isso esclareça as coisas novamente. Você pode ajustar tudo de acordo com seu estilo de negociação. Para evitar os problemas que você está enfrentando, é recomendável usar dados de teste confiáveis. Obrigado.