Você já sonhou em ter um robô de trading que se otimiza sozinho? Eu sempre quis isso, pois assim saberia que ele estaria sempre operando com os melhores parâmetros. Este é meu humilde esforço para trazer um pouco desse sonho à realidade. O Expert Advisor (EA) que estou compartilhando aqui otimiza os níveis de sobrecompra e sobrevenda que utiliza para realizar as operações. Minha esperança é que outros possam pegar esse conceito e expandi-lo, criando algo ainda mais incrível. Se você fizer isso, por favor, me avise! E não esqueça de avaliar meu robô usando as estrelas acima. Essa estratégia pode ser aplicada a qualquer par de moedas e em qualquer período, desde que as configurações estejam corretas.
Para você que gosta de explorar, incluí várias opções de configuração nesse robô. Aproveite!
Configurações do Robô
- magic = 4376 - Número único para este EA.
- optimizingPeriods = 144 - Períodos de otimização (barras). Essa é a quantidade de barras que você gostaria que a otimização fosse executada. Por exemplo, se você estiver usando um gráfico horário e escolher 144, o robô irá olhar para as últimas 144 horas, o que equivale a seis dias.
- inAggressive = false - Tornar o robô agressivo? Risco. O modo agressivo fará com que o EA execute operações de forma mais ousada. Em vez de esperar pela cruzamento dos níveis de sobrecompra ou sobrevenda, ele fará uma compra simplesmente se as compras forem mais lucrativas que as vendas nos últimos tempos e vice-versa.
- inTradeReverse = false - Negociação inversa. A negociação inversa mudará a direção das suas operações.
- inOneOrderAtATime = true - Apenas uma ordem aberta por vez? Se verdadeiro, o robô só terá uma ordem ativa por vez. Se falso, ele abrirá ordens ilimitadas de acordo com as condições de entrada.
- Lot_sizing_dynamic_invalidates_static - Um espaçador para separar a mecânica de tamanho de lote de outras configurações.
- Lots = 0.01 - Tamanho de lote estático das ordens. Especifique o tamanho do lote para suas ordens usando um número fixo.
- inUseDynamicLotSize = true - Usar tamanho de lote dinâmico. Ativa o dimensionamento dinâmico do lote, que será utilizado em vez do tamanho de lote estático. No entanto, se o tamanho dinâmico do lote se mostrar inválido, o robô voltará ao tamanho de lote estático.
- inPercentageOfRisk = 2 - % do saldo a ser arriscado em cada operação (2 = 2%). Ao usar o tamanho de lote dinâmico, você especifica o tamanho do lote como uma porcentagem do saldo. 2 é igual a 2%. Não é necessário inserir 0.02; se você fizer isso, a porcentagem utilizada será bem pequena. O máximo que pode ser usado é 10%.
- Index_Indicator_Values - Um espaçador para separar parâmetros do indicador de índice de outras configurações.
- indicator index = _RSI_ - Escolha qual indicador utilizar. Permite que você escolha entre Índice de Força Relativa (RSI) ou Índice de Fluxo de Dinheiro (MFI).
- IndicatorTopValue = 100 - Valor máximo para operar. Este é o maior valor que você usaria para colocar uma operação com seu indicador. Deixe em 100 para considerar todos os valores do indicador.
- IndicatorBottomValue = 0 - Valor mínimo para operar. Este é o menor valor que você usaria para colocar uma operação com seu indicador. Deixe em 0 para considerar todos os valores do índice.
- IndyTimeframe = PERIOD_CURRENT - Período para o índice. Selecione qual período você gostaria de usar para o indicador durante a otimização e a negociação. PERIOD_CURRENT significa que usará o período do gráfico ao qual você anexou o EA. Você pode teoricamente usar um período para seus cálculos que seja diferente do gráfico ao qual o robô está anexado, se desejar, aqui é onde você mudaria essa configuração.
- inIndyPeriods = 14 - Período médio para o índice e cálculos de ATR. O Average True Range (ATR) é utilizado na definição de um stop loss ou take profit dinâmico nas opções abaixo.
- IndyAppPrice = PRICE_CLOSE - Preço aplicado para o índice, se necessário.
- SL_TP_Dynamic_invalidates_static_values - Um espaçador para separar parâmetros de stop loss e take profit de outras configurações.
- iStoploss = 1000 - Valor estático de stop loss em pontos. Os valores de stop loss estão em pontos, que é a menor unidade de movimento no seu terminal.
- iTakeprofit = 2000 - Valor estático de take profit em pontos. Os valores de take profit estão em pontos.
- input inDynamic = true - Usar stop loss e take profit dinâmicos baseados em múltiplos do ATR? Se você ativar os stop loss e take profit dinâmicos, eles serão utilizados em vez dos valores estáticos. As configurações dinâmicas podem ser atraentes, pois têm a capacidade de se ajustar ao comportamento do mercado. Como o ATR é maior quando há mais movimento, usar dinâmico resultará em stop losses e take profits maiores quando o mercado está em movimento rápido e configurações mais próximas quando o mercado desacelera.
- inStoplossMultiple = 2 - SL dinâmico = X * ATR (Período Médio). O stop loss será o valor que você colocar aqui multiplicado pelo Average True Range (ATR) usando os períodos especificados na configuração inIndyPeriods.
- inTakeProfitMultiple = 7 - TP dinâmico = X * ATR (Período Médio). O take profit será o valor que você colocar aqui multiplicado pelo Average True Range (ATR) usando os períodos especificados na configuração inIndyPeriods.
- Break_Even_Settings - O espaçador deve ser menor que o gatilho. Um separador para as configurações de break even. O funcionamento é o seguinte: quando os pontos em lucro superam a quantidade do gatilho, o stop loss é movido para o break even. Se você tiver uma configuração de padding, o stop loss será movido para o break even + padding para garantir a quantidade de lucro.
- bUseBreakEven = true - Usar Break Even (BE). Ativa ou desativa o uso do break even.
- inTrigger = 200 - Se BE = [verdadeiro] definir pontos em lucro para gatilho. Se a operação atingir essa quantidade de pontos em lucro, o stop loss será movido para o break even.
- inPadding = 100 - Pontos de padding a serem adicionados ao BE, devem ser menores que o gatilho. Este é um número de pontos de lucro que você deseja garantir ao mover para o break even; essa quantidade deve ser menor que o gatilho.
Como este robô se otimiza automaticamente? Aqui está o segredo: o robô testa cada variável no indicador duas vezes. Então, se um indicador tem cem valores possíveis, ele pega cada valor e tenta realizar uma operação naquele valor, retrocedendo um certo número de barras (optimizingPeriods). Em seguida, ele classifica esse valor com base em quanto dinheiro teria ganho ou perdido ao operar naquele valor. É um pouco mais complexo do que isso, mas você está aqui para entender os detalhes, então vou explicar.
Os dados são os seguintes: quando um indicador cruza o valor de sobrecompra de cima para baixo, uma ordem de venda é emitida; uma ordem de compra é emitida quando um indicador cruza de baixo para cima em um valor de sobrevenda. Por exemplo, se a sobrecompra estiver definida em 80 e o valor do seu indicador for 85 na barra anterior e o valor do indicador na última barra for 79, uma ordem de venda seria emitida. 85 → 79 cruza 80 para baixo, ordem de venda emitida. Se a sobrevenda = 23, então 19 → 27 para cima geraria uma ordem de compra.
Assim, este robô testa todos os valores do indicador entre o IndicatorTopValue e o IndicatorBottomValue, realizando dois testes em cada um. Por exemplo, se o valor máximo for 100, ele pega esse valor e realiza um backtest nos optimizingPeriods. Se, por exemplo, isso for 144 períodos, ele verifica se comprar e vender a 100 teria sido lucrativo nos últimos 144 períodos. Se for lucrativo, ele mantém esse valor monetário.
Considerando quantos períodos você está testando, pode ter havido oportunidades de comprar várias vezes durante o backtest. Se atingir o take profit antes de atingir o stop loss, o resultado será positivo. Se atingir o stop loss antes do take profit, o resultado será negativo. Após testar todos os períodos, ele soma todos os resultados lucrativos e as perdas para reter um valor monetário. Em seguida, o indicador passa para o próximo valor inferior e testa sua rentabilidade.
Quando ele tiver testado todos os valores, seleciona o que gerou o maior valor monetário como o valor ideal de compra. Em seguida, realiza verificações semelhantes para o valor de venda. Quando isso estiver completo, ele compara o melhor valor de compra com o melhor valor de venda e procura a operação que seja a melhor das melhores. Por exemplo, após realizar essa otimização, ele pode determinar que o melhor valor de compra seria 65 porque uma compra nesse nível gerou o maior lucro, digamos $329 em backtest. Ele verificaria o valor que obteve para o melhor vendedor, e se o melhor vendedor fosse 32 com um lucro de $530, o robô procuraria uma operação de venda com o indicador cruzando o nível 32, pois vender é melhor que comprar de acordo com os lucros gerados no backtest.
Ideias para Expansão Futura
- Negociar múltiplos pares de moedas ao mesmo tempo, possivelmente filtrados pelo tamanho do spread.
- Autoaprendizagem, onde aprende com suas próprias operações o que é melhor.
- O backtest também poderia incluir um componente de teste à frente.
- Mais indicadores para escolher.
Por favor, deixe suas sugestões e comentários e não se esqueça de avaliar!
Agora disponível no marketplace do MetaTrader: https://www.mql5.com/en/market/product/26332
Atualizado com colchetes ausentes nas linhas 137-142 para resolver erro identificado nos comentários.
Publicações relacionadas
- MACD Sample: Um Guia Prático para o Expert Advisor no MetaTrader 5
- Como Criar Sinais de Negociação com MQL5 Wizard Usando Estrelas da Manhã e da Noite + Estocástico
- MQL5 Wizard: Sinais de Negociação com Padrões Candlestick e RSI no MetaTrader 5
- Sinais de Negociação com Bullish Harami/Bearish Harami e MFI no MetaTrader 5
- Como Criar um Expert Advisor com MQL5: Sinais de Negociação Baseados em Padrões de Candlestick