Você tem alguma questão sobre Metatrader 5! Pergunte Aqui! - página 22

Para adicionar comentários, por favor Faça o login ou registrar
André Barbisan
107
André Barbisan  

Prezados,

Alguém sabe informar como faço (exemplo de código no MQL5) para cancelar uma ordem enviada se a mesma não for executado em, por exemplo, 5 minutos?

Tentei usar a função EventSetTimer() quando envio uma nova ordem e depois usar a função OnTimer() mas não funcionou.

Obrigado.

Abraços,

André Barbisan.

Rogerio Figurelli
Moderador
58782
Rogerio Figurelli  
Phemor:
Phemor 2014.10.12 18:43 
Existe alguma função na platorma MT5 para iphone (IOS) que possa habilitar/desabilitar a negociação automatica da conta principal do PC ?
Olá Phemor, as Apps de smartphones do MT5 estão em constante evolução, mas até onde eu saiba não existe esse recurso ainda.

Uma solução de contorno poderia ser feita através de uma página web lida pelo seu EA, com controle remoto, caso isso seja muito importante para teus objetivos.
Rogerio Figurelli
Moderador
58782
Rogerio Figurelli  
barbisan:

Prezados,

Alguém sabe informar como faço (exemplo de código no MQL5) para cancelar uma ordem enviada se a mesma não for executado em, por exemplo, 5 minutos?

Tentei usar a função EventSetTimer() quando envio uma nova ordem e depois usar a função OnTimer() mas não funcionou.

Obrigado.

Abraços,

André Barbisan.

Olá André, o ideal seria publicares o código que está sendo utilizado para facilitar a análise.

Seja como for, e analisando de forma genérica e independentemente do que você quer fazer após determinado período (5 minutos no caso), recomendo o seguinte:

1) Não chamar novamente o EventSetTimer() sem antes chamar um EventKillTimer(). O mais recomendado é utilizar o EventSetTimer() na OnInit() e o EventKillTimer() na OnDeinit(). Outra alternativa é utilizar um flag ou semáforo para sinalizar se o timer já está 'setado'.

2) Testar o retorno da EventSetTimer() para ver se realmente teve sucesso na criação do timer.

André Barbisan
107
André Barbisan  
Obrigado figurelli.

Eu refiz os testes e consegui!

Na  verdade eu tinha entendido erroneamente o uso da função EventSetTimer(). Eu achei que ela seria chamada uma vez somente quando acabasse o tempo pré-definido, mas não, ela é chamada recorrentemente (ate algum EventKillTimer()) com o intervalo de tempo pré-definido.

Abraços.

Rogerio Figurelli
Moderador
58782
Rogerio Figurelli  
barbisan:
Obrigado figurelli.

Eu refiz os testes e consegui!

Na  verdade eu tinha entendido erroneamente o uso da função EventSetTimer(). Eu achei que ela seria chamada uma vez somente quando acabasse o tempo pré-definido, mas não, ela é chamada recorrentemente (ate algum EventKillTimer()) com o intervalo de tempo pré-definido.

Abraços.

Perfeito, como o SetTimer e KillTimer da API do Windows, que possivelmente sejam utilizados para isso.
thiagom_rs
188
thiagom_rs  
Pessoal, eu havia instalado o Metatrader antes e tinha a Ajuda em portugues, agora reinstalei e veio em portugues, como altero para portugues?
André Barbisan
107
André Barbisan  

figurelli e amigos do fórum,

Eu fiz vários testes no MQL5, na conta demo da XP, com a função EventSetTimer().

Notei que quando você não a inclui no OnInit() e a chama, por exemplo dentro do OnTick() com 1 segundo, ela somente inicia na próxima hora cheia. Por exemplo, se a chamou a função EventSetTimer() às 12h36, a primeira chamada do OnTimer() será somente às 13h00. Ou seja, a saída seria realmente colocá-la no OnInit() que ai sim, é chamada desde o início da execução do EA.

Perguntas:

1. Estou fazendo alguma coisa errada nos meus testes ou a função EventSetTimer() funciona assim mesmo?

2. Pode ser algo por conta de estar fazendo backtesting em uma conta demo?

3. OK. A alternativa de chamá-la no OnInit() pode ser usada, mas sendo setada em 1 segundo, não degradaria muito a performance do meu EA?

4. A minha intenção é setar um timer para, após colocar uma ordem de compra ou venda, verificar se ele foi atendida integralmente e caso contrário tomar alguma ação (cancelá-la, por exemplo). Existe alguma outra forma de fazer esta lógica sem o uso do EventSetTimer()?

Obrigado e abraços.

Rogerio Figurelli
Moderador
58782
Rogerio Figurelli  
barbisan:

figurelli e amigos do fórum,

Eu fiz vários testes no MQL5, na conta demo da XP, com a função EventSetTimer().

Notei que quando você não a inclui no OnInit() e a chama, por exemplo dentro do OnTick() com 1 segundo, ela somente inicia na próxima hora cheia. Por exemplo, se a chamou a função EventSetTimer() às 12h36, a primeira chamada do OnTimer() será somente às 13h00. Ou seja, a saída seria realmente colocá-la no OnInit() que ai sim, é chamada desde o início da execução do EA.

Perguntas:

1. Estou fazendo alguma coisa errada nos meus testes ou a função EventSetTimer() funciona assim mesmo?

2. Pode ser algo por conta de estar fazendo backtesting em uma conta demo?

3. OK. A alternativa de chamá-la no OnInit() pode ser usada, mas sendo setada em 1 segundo, não degradaria muito a performance do meu EA?

4. A minha intenção é setar um timer para, após colocar uma ordem de compra ou venda, verificar se ele foi atendida integralmente e caso contrário tomar alguma ação (cancelá-la, por exemplo). Existe alguma outra forma de fazer esta lógica sem o uso do EventSetTimer()?

Obrigado e abraços.

Olá André, acredito que você está fazendo algo errado pois não existe essa limitação de primeira chamada do OnTimer() no início da próxima hora cheia quando chamada pelo OnTick() ou outro ponto qualquer.

O que deve estar acontecendo é que teu backtesting não está rodando minuto a minuto, e nesse caso tenta refazer com a opção de otimização em OHLC ou ainda mudar a periodicidade de simulação para M1.

Se for programação, fiz um código de exemplo (abaixo) para facilitar a comunicação e identificação do problema que está te acontecendo:

// teste de chamada da OnTimer dentro da OnTick
static bool timerON=false;

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(timerON==false) 
     {
      timerON=true;
      EventSetTimer(60);
     }

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   Print("Executa OnTimer()");
   EventKillTimer();
   timerON=false;
  }
//+------------------------------------------------------------------+

 Aguardo teus novos testes.

André Barbisan
107
André Barbisan  

Obrigado figurelli.

Eu fiz o teste com seu código e simplesmente alterei dentro do OnTimer a função para Print("Executa OnTimer() - ",TimeCurrent());

No log, deu para ver a seguinte informação: Timer (BBDC4,M1) 2014.10.23 10:04:00     Executa OnTimer() - 2014.10.23 11:00:00

Note que a hora de execução está correta (10:04:00), porém a hora da função TimeCurrent() (11:00:00) está errada. E eu estava olhando esta! :-(

Notei que este "erro" ocorre somente dentro do OnTimer(), pois por exemplo dentro do OnTick() os dois horários são idênticos.

Eu tentei com otimização para OHLC, Cada tick, M1, M30, H1, em diferentes datas e deu a mesma coisa!

Deve ser um "bug" no processo de backtesting... Não testei se em modo real (não backtesting) para ver se este "erro" ocorre também.  Mas creio que deve funcionar.

Aguardo seus comentários.

Mais uma vez muito obrigado!!!

Abraços.

Rogerio Figurelli
Moderador
58782
Rogerio Figurelli  
barbisan:

Obrigado figurelli.

Eu fiz o teste com seu código e simplesmente alterei dentro do OnTimer a função para Print("Executa OnTimer() - ",TimeCurrent());

No log, deu para ver a seguinte informação: Timer (BBDC4,M1) 2014.10.23 10:04:00     Executa OnTimer() - 2014.10.23 11:00:00

Note que a hora de execução está correta (10:04:00), porém a hora da função TimeCurrent() (11:00:00) está errada. E eu estava olhando esta! :-(

Notei que este "erro" ocorre somente dentro do OnTimer(), pois por exemplo dentro do OnTick() os dois horários são idênticos.

Eu tentei com otimização para OHLC, Cada tick, M1, M30, H1, em diferentes datas e deu a mesma coisa!

Deve ser um "bug" no processo de backtesting... Não testei se em modo real (não backtesting) para ver se este "erro" ocorre também.  Mas creio que deve funcionar.

Aguardo seus comentários.

Mais uma vez muito obrigado!!!

Abraços.

Olá André,

Entendi, mas para mim funcionou corretamente, segue tela abaixo, e fiz a mesma alteração no Print() que você.

Note que o TimeCurrent() é a última data do servidor e talvez exista alguma diferença nos dados conforme o servidor utilizado para backtesting (no meu caso foi o de produção da XP). 

 

Para adicionar comentários, por favor Faça o login ou registrar