A função ExpertRemove() realmente só vai fechar o próprio EA onde ela é executada.
Concordo com o colega acima que seria melhor e mais simples vc implementar a estratégia em 1 único EA.
Porém, se vc realmente precisar fazer um EA fechar outro, um jeito simples é criar um evento customizado (leia a documentação aqui).
Funcionaria assim:
1) O EA que for tomar a iniciativa de fechar o outro chama a função EventChartCustom() e em seguida "se suicida" chamando ExpertRemove().
2) A função EventChartCustom() chamada pelo primeiro EA vai gerar um evento que vai acionar a função OnChartEvent() no segundo EA.
3) Dentro da função OnChartEvent() do segundo EA vc verifica o id do evento e, quando for o id do evento customizado acionado pelo primeiro EA, vc chama ExpertRemove(), o que fará o segundo EA também "se suicidar".
Dessa forma vc pode fazer um EA fechar um ou mais outros EA's.
Consegui escrever um código que um EA fecha todas as ordens com o mesmo magic number e usa a função ExpertRemove() para remover todos os Eas, porém, essa função só remove 1 EA e não os dois.
Eu básicamente estou abrindo duas telas iguais de EURUSD. Em uma tela eu coloco o EA "A" e na segunda tela eu coloco o EA "B". Quando uma candle fecha o preço abaixo ou acima da váriavel PriceTest o EA "B" fecha todas as ordens e fecha somente o EA "B" o EA "A" continua em execução. Gostaria de remover os dois EA's mas a função ExpertRemove() não funciona. Alguem sabe outra forma de fazer isso?
Olá Lucas Santana, concordo com a análise dos colegas, note que a função ExpertRemove() é um recurso de exceção, extremo, e não vejo lógica de utilizar ele como lógica de sua estratégia, ainda mais se pode tudo rodar em um único EA. Na verdade, quando você remove o EA do gráfico perde todo e qualquer controle, o que também questiono se é uma boa prática, pois se precisa fazer isso é sinal que algo não está bem no ambiente.
Outro ponto que gostaria de comentar é que parece que você adaptou um código existente para MT4 agregando as funções "CloseOrders(Magic); ExpertRemove();" ao final de duas das linhas, e talvez essa seja sua maior dificuldade, pois se começar criando sua própria lógica não ficará dependendo de soluções de contorno como a de remover o EA para fazer o código original se comportar como deseja.
Além disso note que a própria rotina de fechamento de posições não faz nenhum teste da execução da função OrderClose(), e qualquer falha ou problema que acontecer no mundo real, com roteamento real, não existirá nenhum tratamento ou verificação, e as posições poderão ficar abertas. Nesse caso, permanentemente abertas, já que você mandaria remover o EA, ou seja, o pior dos mundos.
Dessa forma, recomendo repensar novamente todo seu código.
Sds.,
Rogério Figurelli
- 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
Consegui escrever um código que um EA fecha todas as ordens com o mesmo magic number e usa a função ExpertRemove() para remover todos os Eas, porém, essa função só remove 1 EA e não os dois.
Eu básicamente estou abrindo duas telas iguais de EURUSD. Em uma tela eu coloco o EA "A" e na segunda tela eu coloco o EA "B". Quando uma candle fecha o preço abaixo ou acima da váriavel PriceTest o EA "B" fecha todas as ordens e fecha somente o EA "B" o EA "A" continua em execução. Gostaria de remover os dois EA's mas a função ExpertRemove() não funciona. Alguem sabe outra forma de fazer isso?