Encerrar operações EA

 

Olá a todos!


Tenho um EA que possui 2 condições para encerrar as posições e parar de operar. A primeira é uma meta de ganho e a segundo é um limite de perda, ambos diários. Porém ocorreu no dia de ontem de o limite de perda ser atingido e as operações não serem encerradas e o EA continuar operando. Que tipo de condição eu posso adicionar para que caso isso acontece haja uma ambiguidade que possa me proteger? 

Eu utilizo o seguinte código: 

    input double                  meta                     = 60;               // Meta diária (R$)
    input double                  limite_neg               = 180;              // Limite perda (R$)    

    double lucro_realizado = PositionGetDouble(POSITION_PROFIT);
    double lucro_corrente = Results(dia, MN_estrutura);
    double lucro_final = NormalizeDouble((lucro_corrente+lucro_realizado), 2);

    if(lucro_final >= meta) Fechar();
    if(lucro_final <= -limite_neg) Fechar();
 
Marcel Cardoso:

Olá a todos!


Tenho um EA que possui 2 condições para encerrar as posições e parar de operar. A primeira é uma meta de ganho e a segundo é um limite de perda, ambos diários. Porém ocorreu no dia de ontem de o limite de perda ser atingido e as operações não serem encerradas e o EA continuar operando. Que tipo de condição eu posso adicionar para que caso isso acontece haja uma ambiguidade que possa me proteger? 

Eu utilizo o seguinte código: 

Isso só diz sobre fechamento de ordem e não nos diz nada sobre como voce esta enviando as ordens de posições novas. Assim, daria pra dizer para colocar uma variavel global quando o Fechar() for chamado ser ativada e em algum ponto do seu codigo não mostrado antes dele analisar o(s) ativo(s) checar essa variavel para verificar se tem ou não que continuar. Se esse teste do lucro for a primeira coisa na parte do OnTick() daria pra fazer o Fechar() retornar se deve encerrar ou nao o dia. Coloquei as condições juntas só pra simplificar a escrita, a ideia seria isso:

if(lucro_final >= meta || lucro_final <= -limite_neg)
{
  if (Fechar())
        {
        return ;
        }
  else
        {
        // Fechar retornou false que seria para ele continuar com a analise e abertura...
        }
}

Note que o fechar() é chamado somente dentro do bloco if, daria pra fazer algo numa linha so também deixando a condição assim:

if((lucro_final >= meta || lucro_final <= -limite_neg) && Fechar()) return ;
 
Ricardo Rodrigues Lucca #:

Isso só diz sobre fechamento de ordem e não nos diz nada sobre como voce esta enviando as ordens de posições novas. Assim, daria pra dizer para colocar uma variavel global quando o Fechar() for chamado ser ativada e em algum ponto do seu codigo não mostrado antes dele analisar o(s) ativo(s) checar essa variavel para verificar se tem ou não que continuar. Se esse teste do lucro for a primeira coisa na parte do OnTick() daria pra fazer o Fechar() retornar se deve encerrar ou nao o dia. Coloquei as condições juntas só pra simplificar a escrita, a ideia seria isso:

Note que o fechar() é chamado somente dentro do bloco if, daria pra fazer algo numa linha so também deixando a condição assim:

Não sei se eu entendi o que vc quis dizer, mas na verdade caso ele execute corretamente essa função que eu coloquei o código não haverá mais novas posições no dia. A ideia é ter algum outro modo de verificar se a condição foi preenchida pra não acontecer de o EA continuar operando (por algum erro ou bug) mesmo ja tendo satisfeito a condição, seja de meta ou de limite de perda.
Os meus EA rodam numa nuvem, essa ideia de ter um EA e rodar na nuvem ja é com a intenção de não ter que ficar o tempo todo na frente da tela neh. Por isso eu gostaria dessa ambiguidade na verificação, mas por meios diferentes, pra que não aconteça uma catastrofe com a minha conta sem eu ver. 

 
Marcel Cardoso #:

Não sei se eu entendi o que vc quis dizer, mas na verdade caso ele execute corretamente essa função que eu coloquei o código não haverá mais novas posições no dia. A ideia é ter algum outro modo de verificar se a condição foi preenchida pra não acontecer de o EA continuar operando (por algum erro ou bug) mesmo ja tendo satisfeito a condição, seja de meta ou de limite de perda.
Os meus EA rodam numa nuvem, essa ideia de ter um EA e rodar na nuvem ja é com a intenção de não ter que ficar o tempo todo na frente da tela neh. Por isso eu gostaria dessa ambiguidade na verificação, mas por meios diferentes, pra que não aconteça uma catastrofe com a minha conta sem eu ver. 

Falaria primeiro pra focar em corrigir esse erro e depois criar essa camada de redundância. Acredito que depende do que voce quer, poderia ser um outro robo que verifica um possível estado de "margin call" e derruba todos os robos, entretanto isso pode ser pior que se voce encerra um robo em atividade (mesmo indevida) pode ser pior. No caso tem como criar variaveis globais na plataforma (https://www.mql5.com/pt/docs/globals), mas só é valida para o terminal em execução. Acredito que deva funcionar em ambiente de nuvem e ser compartilhada por todos os robos para comandar um encerrar "emergencial". Uma forma também seria notificar por algum uso de mensageria(telegram, whats, app do mt5, ...), voce ou seu usuário que um estado crítico foi alcançado e precisa de intervenção humana.
Documentação sobre MQL5: Variáveis Globais do Terminal
Documentação sobre MQL5: Variáveis Globais do Terminal
  • www.mql5.com
Variáveis Globais do Terminal - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Ricardo Rodrigues Lucca #:
Falaria primeiro pra focar em corrigir esse erro e depois criar essa camada de redundância. Acredito que depende do que voce quer, poderia ser um outro robo que verifica um possível estado de "margin call" e derruba todos os robos, entretanto isso pode ser pior que se voce encerra um robo em atividade (mesmo indevida) pode ser pior. No caso tem como criar variaveis globais na plataforma (https://www.mql5.com/pt/docs/globals), mas só é valida para o terminal em execução. Acredito que deva funcionar em ambiente de nuvem e ser compartilhada por todos os robos para comandar um encerrar "emergencial". Uma forma também seria notificar por algum uso de mensageria(telegram, whats, app do mt5, ...), voce ou seu usuário que um estado crítico foi alcançado e precisa de intervenção humana.

Qual erro vc está se referindo?

Como posso implementar essa parte de notificação por mensagem? Pode me mostrar um exemplo?

 
Marcel Cardoso #:

Qual erro vc está se referindo?

Como posso implementar essa parte de notificação por mensagem? Pode me mostrar um exemplo?

Aqui tem um exemplo de como criar um bot: https://www.mql5.com/pt/articles/2355

Aqui tem como configurar o push notification que dai a função alert e alarmes podem ser enviados pro app: https://www.metatrader5.com/pt/mobile-trading/iphone/help/settings_messages#notification_setup

Como criar bots para Telegram em MQL5
Como criar bots para Telegram em MQL5
  • www.mql5.com
Este artigo contém instruções passo-a-passo para a criação de bots para o Telegram em MQL5. Esta informação pode ser útil aos usuários que desejam sincronizar o seu robô de negociação a um dispositivo móvel. Existem exemplos de bots no artigo que fornecem sinais de negociação, busca de informações em sites, enviam informações sobre o balanço da conta, cotações e imagens de gráficos ao seu telefone celular.