Fechar todas ordens em um determinado horário...

 

Olá galera, estou iniciando agora na programação de mql5 e estou montando meu EA, alguem sabe alguma função que fecha todas ordens pendentes em um determinado horário?


Eu queria que as 17:40 meu EA fechasse todas ordens pendentes...


alguem pode me dar uma luz de como programar isso?


vllwww

 
lucasregis:

Olá galera, estou iniciando agora na programação de mql5 e estou montando meu EA, alguem sabe alguma função que fecha todas ordens pendentes em um determinado horário?


Eu queria que as 17:40 meu EA fechasse todas ordens pendentes...


alguem pode me dar uma luz de como programar isso?


vllwww

Não em um determinado horário. Eu uso a função TimeCurrent() para passar a alguma estrutura MqlDateTime (dt, por exemplo) o horário corrente. Uso os membros dt.hour >= 17 e dt.min >= 40 para testar ps horários e para retirar ordens pendentes se houver. 
 
lucasregis:

Olá galera, estou iniciando agora na programação de mql5 e estou montando meu EA, alguem sabe alguma função que fecha todas ordens pendentes em um determinado horário?


Eu queria que as 17:40 meu EA fechasse todas ordens pendentes...


alguem pode me dar uma luz de como programar isso?


vllwww

Olá,

A solução mais simples (ao meu ver) seria primeiramente utilizar um Magic Number no seu expert, isso garante que você possa diferenciar entre ordens para fechar apenas as ordens do expert em questão. Se, ao contrário, você quiser fechar todas e quaisquer ordens, independentemente se forem manuais ou do próprio expert, então basta implementar de maneira diferente a parte da lógica que irei indicar.

Começo:
Atribua duas variaveis (inputs) ao seu expert como strings que serão do tipo "xx:xx", onde, claramente, irá atribuir valores como "00:00" ou "17:40" no seu caso.
Vamos chamar essas duas variaveis de startTime e endTime, ok?

Corpo:
Crie uma função booleana que irá retornar positivo (true) ou negativo (false) caso o horário atual seja algo entre o horário estipulado em startTime e endTime, em seguida, use como parâmetro o horário atual (do tipo datetime) e faça as comparações como datetime para o horario atual (vamos chamar de "Time"), o seu startTime e seu endTime, em seguida, basta comparar e retornar o resultado, segue a função:

bool checkTime(datetime Time)
  {
   bool result=false;                           //Caso o horário não se encontre nos intervalos estipulados, garante que retornará negativo
   datetime start = StringToTime(startTime);    //convertemos seu input startTime de string para o formato datetime
   datetime end   = StringToTime(endTime);      //mesma coisa acima porém para endTime

//---
   if(start<end) if(Time>=start && Time<end)  result=true;  //caso o startTime seja menor que o endTime, verifica se o horário atual se encontra nesse intervalo
   if(start>=end) if(Time>=start || Time<end) result=true;  //Caso startTime seja maior que endTime, verifica se o horário atual se encontra nesse intervalo
//---
   return(result); //retorna o resultado
  }  
Tendo essa função pronta, basta criar uma rotina para conferir o resultado da mesma antes de cada tick em que seu expert irá rodar (caso possua um sistema para rodar apenas com um novo candle ou caso funcione em todos os ticks) e chamar sua função (ou bloco de código) para encerrar as operações em aberto.

É nessa última parte que reside meu comentário sobre o Magic Number: se você utilizar um Magic Number, basta selecionar todas as posições com o mesmo número do MN do Expert e encerra-las, caso contrário, basta seguir o processo padrão para fechar todas as posições abertas.

Em tempo, existem algumas particularidades desse método, porém, acredito que será eficiente e útil para você, portanto, não irei adentrar nessas questões.

Espero ter sido claro e didático!

Boa sorte com seus experts!

Att,
Yan
 

opa galera, show de bola as dicas de vcs... Vou testar e conto pra vcs!


Obrigado novamente!

Razão: