
Otimização Automatizada de Parâmetros para Estratégias de Trading Usando Python e MQL5
Por Que a Auto-Otimização é Essencial
Imagine que você tem um robô de trading desenvolvido com muito esforço. Você está ansioso para vê-lo em ação, mas começa sem uma otimização adequada. Resultados iniciais positivos podem enganá-lo ao pensar que está tudo bem, mas logo inconsistências e perdas começam a aparecer.
Um robô não otimizado carece de consistência e pode responder a dados irrelevantes, resultando em lucros e perdas imprevisíveis. Ele pode tomar decisões com base em sinais falsos, não se adaptando às mudanças do mercado, e assumir riscos inesperados, causando perdas significativas. A otimização garante um desempenho e confiabilidade melhores.
Os leitores entenderão a importância da auto-otimização, os diferentes algoritmos utilizados e verão exemplos práticos em scripts Python e Expert Advisor (EA). Eles aprenderão como configurar a auto-otimização, comparar resultados e configurar corretamente a otimização de parâmetros, aumentando a eficiência de suas estratégias de trading.
Algoritmos de auto-otimização para estratégias de trading incluem otimização de parâmetros, algoritmos evolutivos, métodos heurísticos, técnicas baseadas em gradiente, aprendizado de máquina e otimização baseada em simulação. Cada um possui vantagens e desvantagens únicas, adaptadas para diferentes necessidades de trading e condições de mercado.
Técnicas de Otimização de Parâmetros
- Otimização por Força Bruta: Testa todas as combinações de parâmetros para obter resultados precisos, mas é intensivo em recursos.
- Pesquisa em Grade: Avalia combinações em uma grade para um equilíbrio entre exaustividade e eficiência.
- Pesquisa Aleatória: Testa combinações aleatoriamente para resultados mais rápidos, sacrificando um pouco de precisão.
Cada técnica possui suas vantagens, tornando a escolha dependente dos recursos disponíveis, do tempo e da precisão desejada.
Por que e quando devemos usar Python?
Programas em Python são uma excelente ferramenta para testar ideias, criar gráficos rapidamente e confirmar afirmações teóricas com dados históricos de trading. O Python permite que os usuários desenvolvam e ajustem modelos de forma ágil, o que facilita a experimentação com diferentes estratégias e parâmetros. Sua capacidade de gerar gráficos detalhados e visualizações ajuda a interpretar os resultados de forma mais intuitiva. Além disso, a possibilidade de integrar dados históricos permite verificar como as estratégias teriam funcionado em cenários passados, fornecendo uma validação prática para as teorias levantadas. Essa combinação de velocidade, flexibilidade e capacidade analítica torna o Python uma ferramenta inestimável para qualquer trader que busca otimizar suas estratégias e entender melhor os mercados financeiros.
Qual Estratégia Usaremos Neste Artigo e Seu Indicador
A Estratégia de Cruzamento de Médias Móveis (MAs Crossing) é uma técnica de trading baseada na interseção de duas médias móveis para gerar sinais de Compra e Venda. Ela usa duas médias móveis de diferentes períodos, uma curta e uma longa, para identificar mudanças na tendência de preço. Quando a média móvel curta cruza acima da média móvel longa, um sinal de Compra é gerado, indicando uma possível tendência de alta. Por outro lado, quando a média móvel curta cruza abaixo da média longa, um sinal de Venda é gerado, sugerindo uma possível tendência de baixa. Essa estratégia é popular devido à sua simplicidade e eficácia em mercados com tendências claras.
O indicador SMA (Média Móvel Simples) é uma ferramenta que calcula o preço médio de um ativo durante um período específico. Para calcular uma SMA, somam-se os preços de fechamento de um ativo durante o período selecionado e, em seguida, divide-se pelo número de períodos. A SMA suaviza as flutuações de preço e ajuda a identificar a direção geral da tendência. Esse indicador é útil para eliminar ruídos do mercado e fornecer uma visão mais clara da tendência subjacente. No Python, a SMA pode ser facilmente calculada usando bibliotecas como pandas, que oferecem funções para calcular médias móveis de forma eficiente e precisa.
Otimizações de Parâmetros com Python. Estudo de Caso
Temos um script para cada técnica em Python. Já vimos as diferenças de cada abordagem.
A estratégia é a mesma nos três scripts. Se você quiser usar outra estratégia, é isso que deve alterar:
data = data.copy() # Create a copy of the original DataFrame data['Short_MA'] = data['Close'].rolling(window=short_window).mean() data['Long_MA'] = data['Close'].rolling(window=long_window).mean() data['Signal'] = 0 data.loc[data.index[short_window:], 'Signal'] = np.where( data['Short_MA'][short_window:] > data['Long_MA'][short_window:], 1, 0) data['Position'] = data['Signal'].diff()
Python é muito direto, então não explicarei o código.
Os três scripts estão anexados ao artigo (b forec.py, grid search v2.py e random search v2.py).
Antes de usar esses scripts, é necessário instalar as bibliotecas. Você pode usar o pip para isso:
pip install numpy pandas matplotlib itertools MetaTrader5 random
Os resultados para cada script mostrarão algo semelhante a isto, com estas entradas:
symbol = "EURUSD" timeframe = mt5.TIMEFRAME_D1 start = pd.Timestamp("2020-01-01") end = pd.Timestamp("2021-01-01")
Força Bruta
Melhores parâmetros: Curto = 14.0, Longo = 43.0 Melhor desempenho: 10014.176, Risco: 3.7431030827241524e-05
Pesquisa em Grade
Melhores parâmetros: Curto = 14.0, Longo = 43.0 Melhor desempenho: 10014.176, Risco: 3.7431030827241524e-05
Pesquisa Aleatória
Melhores parâmetros: Curto = 14.0, Longo = 44.0 Melhor desempenho: 10013.697, Risco: 3.725494046576829e-05
Esses scripts não se auto-otimizam, então você deve selecionar cada período para estudar.
Os resultados são bons em todos eles e iguais, mas devemos levar em conta que a estratégia era simples, enquanto outras estratégias podem ter mais parâmetros e intervalos maiores.
Com que frequência devo otimizar uma estratégia?
Otimizar uma estratégia de trading é crucial para manter sua eficácia ao longo do tempo. A frequência e o período de retrocesso para otimização dependem de vários fatores, especialmente da volatilidade do mercado.
Imagine que você está desenvolvendo uma estratégia de trading que opera com um período de 1 dia, ou seja, cada sinal é baseado em dados diários do mercado. A volatilidade desempenha um papel importante aqui: quando o mercado é mais volátil, os movimentos de preço são maiores e mais rápidos, o que pode afetar a eficácia de sua estratégia se ela não se ajustar adequadamente.
Para determinar quando otimizar e qual retrocesso usar, você precisa monitorar a volatilidade do mercado. Uma boa forma de fazer isso é observar o intervalo diário de preços (ALTO - BAIXO) ou o intervalo médio verdadeiro dos ativos com os quais você opera. Abaixo está um guia aproximado baseado na volatilidade.
Baixa volatilidade: Quando o mercado está calmo e os intervalos diários são pequenos, as estratégias tendem a precisar de ajustes menos frequentes. Você pode pensar em otimizar a cada 1-3 meses com um período de retrocesso mais longo para capturar tendências mais estáveis. Um retrocesso de 50-100 dias pode ser adequado.
Volatilidade moderada: Em condições normais de mercado, com movimentos de preço mais regulares, mas não extremamente grandes, considere otimizar a cada 1-2 meses. Um retrocesso de 20-50 dias pode ser suficiente para capturar mudanças significativas na tendência.
Alta volatilidade: Durante períodos de alta volatilidade, como em tempos de crise ou eventos econômicos importantes, os movimentos de preço são grandes e rápidos. Aqui, é crucial otimizar com mais frequência, possivelmente a cada 2-4 semanas, e usar um retrocesso mais curto, como 10-20 dias, para se adaptar rapidamente às mudanças nas condições do mercado.
Exemplo de Auto-Otimização em MQL5
Este código em MQL5 é um robô de trading que implementa uma estratégia de cruzamento de médias móveis (MA). Ele funciona na plataforma MetaTrader 5 e foi projetado para operar no mercado financeiro automaticamente. O bot usa duas MAs simples (SMA) com períodos ajustáveis para gerar sinais de Compra e Venda quando se cruzam.
O principal objetivo do bot é otimizar automaticamente os períodos das MAs para maximizar o benefício líquido, minimizar o rebaixamento ou maximizar o índice de Sharpe, de acordo com a configuração escolhida pelo usuário. Isso é alcançado através de um processo de otimização que testa diferentes combinações de períodos de MA em um período específico de dados históricos.
O bot é estruturado com várias seções-chave:
1. Inicialização e configuração: Define os parâmetros iniciais, como períodos de MA, tamanho de lote, número mágico para identificação de ordens, etc.
2. Otimização: Usa um algoritmo de busca exaustiva para testar todas as combinações possíveis de períodos de MA dentro dos intervalos especificados. A otimização é realizada com base nos critérios selecionados: Benefício líquido ou rebaixamento mínimo.
3. Execução de operações: Monitora continuamente o mercado e abre posições de compra ou venda quando ocorrem cruzamentos de MA de acordo com a estratégia definida. Também gerencia posições abertas, aplicando perdas e níveis de ganhos com base no ATR (Average True Range).
4. Reotimização automática: Em certos períodos de tempo (configurável), o bot reotimiza os parâmetros das MAs para se adaptar às condições de mercado em mudança.
5. Trailing Stop: Implementa diferentes tipos de Trailing Stops (Simples e Expectativa Moral) para garantir lucros e proteger contra perdas.
6. Horários de negociação: Pode ser configurado para não operar em certos dias da semana ou em horários específicos.
7. Finalização e limpeza: O robô realiza a limpeza adequada e o fechamento de todas as operações abertas ao parar.
Em resumo, este robô de trading é uma implementação complexa que combina análise técnica (cruzamento de MAs) com estratégias de gerenciamento de risco (Stops e Trailing Stops) e otimização automatizada de parâmetros. Ele é projetado para operar de forma autônoma e é otimizado para maximizar o desempenho ajustado ao risco em um ambiente de trading automatizado.
Os trailing stops usados no artigo e no código são obtidos do artigo: Trailing stop em trading de Aleksej Poljakov.
Código
Para usar outra Técnica de Otimização, você deve alterar esta parte do código:
for(int fastPeriod = FastMAPeriodStart; fastPeriod <= FastMAPeriodStop; fastPeriod += FastMAPeriodStep) { for(int slowPeriod = SlowMAPeriodStart; slowPeriod <= SlowMAPeriodStop; slowPeriod += SlowMAPeriodStep) { double criterionValue = PerformBacktest(fastPeriod, slowPeriod, startBar); if(IsNewOptimal(criterionValue, bestCriterionValue, OptimizationCriterion)) { bestCriterionValue = criterionValue; bestFastPeriod = fastPeriod; bestSlowPeriod = slowPeriod; } } }
Para usar outra Estratégia, você deve alterar esta parte do código (e suas entradas):
double fastMA_curr[]; double slowMA_curr[]; double fastMA_prev[]; double slowMA_prev[]; ArraySetAsSeries(fastMA_curr, true); ArraySetAsSeries(slowMA_curr, true); ArraySetAsSeries(fastMA_prev, true); ArraySetAsSeries(slowMA_prev, true); int fastMA_current = iMA(_Symbol, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE); int fastMA_previous = iMA(_Symbol, 0, FastMAPeriod, 1, MODE_SMA, PRICE_CLOSE); int slowMA_current = iMA(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE); int slowMA_previous = iMA(_Symbol, 0, SlowMAPeriod, 1, MODE_SMA, PRICE_CLOSE); CopyBuffer(fastMA_current, 0, 0, 2, fastMA_curr); CopyBuffer(slowMA_current, 0, 0, 2, slowMA_curr); CopyBuffer(fastMA_previous, 0, 0, 2, fastMA_prev); CopyBuffer(slowMA_previous, 0, 0, 2, slowMA_prev); double fastMA_previousFF = fastMA_prev[0]; double slowMA_previousSS = slowMA_prev[0]; double fastMA_currentFF = fastMA_curr[0]; double slowMA_currentSS = slowMA_curr[0]; // Check for buy signal (fast MA crosses above slow MA) if(fastMA_previousFF < slowMA_previousSS && fastMA_currentFF > slowMA_currentSS) { // Close any existing sell positions if(PositionsTotal() > 0) { for(int i = PositionsTotal() - 1; i >= 0; i--) { if(PositionSelectByTicket(i)) { if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) { Print("Closing sell position: Ticket ", PositionGetInteger(POSITION_TICKET)); ClosePosition(PositionGetInteger(POSITION_TICKET)); } } } } // Open a buy position double openPrice = SymbolInfoDouble(_Symbol, SYMBOL_ASK); double atrMultiplier = ATRmultiplier; OpenPosition(ORDER_TYPE_BUY, openPrice, atrMultiplier); } // Check for sell signal (fast MA crosses below slow MA) else if(fastMA_previousFF > slowMA_previousSS && fastMA_currentFF < slowMA_currentSS) { // Close any existing buy positions if(PositionsTotal() > 0) { for(int i = PositionsTotal() - 1; i >= 0; i--) { if(PositionSelectByTicket(i)) { if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) { Print("Closing buy position: Ticket ", PositionGetInteger(POSITION_TICKET)); ClosePosition(PositionGetInteger(POSITION_TICKET)); } } } } // Open a sell position double openPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); double atrMultiplier = ATRmultiplier; OpenPosition(ORDER_TYPE_SELL, openPrice, atrMultiplier); } IndicatorRelease(fastMA_current); IndicatorRelease(slowMA_current); IndicatorRelease(fastMA_previous); IndicatorRelease(slowMA_previous); }
É importante observar que, se você não liberar os indicadores, a janela do gráfico ficará cheia deles.
Diferença com e sem auto-otimização
Usaremos o mesmo período (de 20-04-2024 a 20-05-2024) para EURUSD e um período de barras de 1 dia.
Com Otimização
Sem auto-otimização
Claramente, é uma solução melhor auto-otimizar. Nenhuma operação foi realizada sem auto-otimização. A primeira foi auto-otimizada no início, e então teve 40 dias para reotimizar (fora do período).
Conclusão
A auto-otimização é crucial para garantir o desempenho consistente e confiável dos bots de trading nos mercados financeiros em constante mudança. Neste artigo, os leitores obtiveram uma compreensão abrangente do porquê a auto-otimização é essencial, os vários tipos de algoritmos disponíveis para otimizar estratégias de trading e parâmetros, e os benefícios e desvantagens das diferentes técnicas de otimização de parâmetros. A importância do Python como ferramenta para back-testing de estratégias de maneira rápida e eficiente foi destacada, juntamente com um estudo de caso que demonstra a otimização de parâmetros usando uma estratégia de cruzamento de Médias Móveis.
O artigo explorou ainda a necessidade de otimização regular com base na volatilidade do mercado, enfatizando a necessidade de ajustes frequentes para manter a eficácia. Um exemplo de auto-otimização usando MQL5 ilustrou a aplicação prática desses conceitos, mostrando as melhorias significativas de desempenho alcançáveis através da auto-otimização. A comparação entre bots auto-otimizados e não otimizados ressaltou as claras vantagens do primeiro, com bots otimizados demonstrando maior adaptabilidade e eficiência.
Em conclusão, a auto-otimização não só aprimora o desempenho do bot de trading, mas também proporciona aos traders maior confiança e tranquilidade, sabendo que seu bot pode navegar pelas complexidades dos mercados financeiros de forma eficaz. Essa abordagem estratégica para o desenvolvimento e manutenção de bots de trading é indispensável para quem deseja alcançar sucesso consistente e sustentável no trading.
Livros e recursos educacionais
- "Avanços em Machine Learning Financeiro" de Marcos López de Prado.
- "Algorithmic Trading and DMA" de Barry Johnson.
- "Python para Análise de Dados" de Wes McKinney.
- "Machine Learning para Gestores de Ativos" de Marcos López de Prado.
- "Quantitative Trading: How To Build Your Own Algorithmic Trading Business" de Ernest P.
Traduzido do Inglês pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/en/articles/15116
Aviso: Todos os direitos sobre esses materiais pertencem à MetaQuotes Ltd. É proibida a reimpressão total ou parcial.
This article was written by a user of the site and reflects their personal views. MetaQuotes Ltd is not responsible for the accuracy of the information presented, nor for any consequences resulting from the use of the solutions, strategies or recommendations described.





- 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
Olá, obrigado! Você verificou o número de dias para reotimizar? (Settings->Reoptimize every 22 days-> use 16 (days) for the same example, desculpe-me por não ter explicado bem essa opção de configuração)
Olá, obrigado! Você verificou o número de dias para reotimização? (Settings->Reoptimize every 22 days-> use 16 (days) para o mesmo exemplo, desculpe-me por não ter explicado bem essa opção de configuração)
Olá, sim, já tentei isso, mas tentarei novamente.
Mais uma vez, obrigado!
Este é um artigo muito bom. Você tem um Ea em que o aplicou e ele funcionou bem?
Obrigado, tente fazer isso você mesmo, este é apenas um exemplo que ajuda um pouco. Você pode se basear nesse e em outros artigos sobre esse tópico. Saudações ... Não quero tirar EAs até que eu tenha um sinal. Outra saudação. Se quiser fazer o EA e enviar suas dúvidas para este chat ou para o fórum, e nós daremos uma olhada nelas.