Daytrade e encerramento de operações antes do final do pregão

afterdarkrj  

Olá pessoal boa noite,


Eu estava testando um robo em backtest e percebi que o teste estava considerando a virada do dia posicionado. Como faço para garantir que as posições serão encerradas 10 minutos antes do final do pregão?


Desde ja obrigado,

Junior

Rodrigo Malacarne  
afterdarkrj:

Olá pessoal boa noite,

Eu estava testando um robo em backtest e percebi que o teste estava considerando a virada do dia posicionado. Como faço para garantir que as posições serão encerradas 10 minutos antes do final do pregão?

Desde ja obrigado,

Junior

Olá afterdarkrj,

algum exemplo de código que você esteja utilizando? Seria interessante nos mostrar onde, exatamente, você está tendo dificuldades com relação ao desenvolvimento de seu código.

Apenas assim poderemos ajudá-lo de alguma forma.

Abraços,
Malacarne

afterdarkrj  
Malacarne:

Olá afterdarkrj,

algum exemplo de código que você esteja utilizando? Seria interessante nos mostrar onde, exatamente, você está tendo dificuldades com relação ao desenvolvimento de seu código.

Apenas assim poderemos ajudá-lo de alguma forma.

Abraços,
Malacarne

Malacarde tudo bem?


Na verdade conheci o Metatrader a alguns dias e estou apenas testando os robos que ja vem com ele com algumas parametrizações, logo não comecei a estudar sua linguagem de script ou sequer tentei mexer no codigo. Quando abri a pergunta pensei na possibilidade desta questao ser tratada com alguma parametrização da ferramenta ou um pequeno acréscimo de código, mas se não for tão trivial assim sem problemas vou iniciar os estudos mais aprofundados.


Obrigado pela ajuda,

Junior

Rodrigo Malacarne  
afterdarkrj:

Malacarde tudo bem?

Na verdade conheci o Metatrader a alguns dias e estou apenas testando os robos que ja vem com ele com algumas parametrizações, logo não comecei a estudar sua linguagem de script ou sequer tentei mexer no codigo. Quando abri a pergunta pensei na possibilidade desta questao ser tratada com alguma parametrização da ferramenta ou um pequeno acréscimo de código, mas se não for tão trivial assim sem problemas vou iniciar os estudos mais aprofundados.

Obrigado pela ajuda,

Junior

Olá afterdarkrj,

o MetaTrader é uma ferramenta fantástica... e você está no lugar certo caso queira aprender um pouco mais sobre essa ferramenta! Aqui no site você encontrará não apenas a Documentação oficial do MetaTrader, mas também poderá buscar exemplos de código gratuitamente e, caso necessário, você também poderá tirar suas dúvidas diretamente aqui no fórum.

Logo, o primeiro passo, nesse caso, seria realmente que você começasse seus estudos com a ferramenta e também com a linguagem de programação MQL5.

Por fim, caso não queira colocar a "mão na massa", você poderá utilizar a seção Freelance para solicitar algum serviço específico e também comprar produtos prontos diretamente na seção Mercado.

Abraços,
Malacarne

afterdarkrj  
Malacarne:

Olá afterdarkrj,

o MetaTrader é uma ferramenta fantástica... e você está no lugar certo caso queira aprender um pouco mais sobre essa ferramenta! Aqui no site você encontrará não apenas a Documentação oficial do MetaTrader, mas também poderá buscar exemplos de código gratuitamente e, caso necessário, você também poderá tirar suas dúvidas diretamente aqui no fórum.

Logo, o primeiro passo, nesse caso, seria realmente que você começasse seus estudos com a ferramenta e também com a linguagem de programação MQL5.

Por fim, caso não queira colocar a "mão na massa", você poderá utilizar a seção Freelance para solicitar algum serviço específico e também comprar produtos prontos diretamente na seção Mercado.

Abraços,
Malacarne

Malacarne,

Desculpe se a pergunta foi basica demais, o que pode ter dado a impressão que eu queria que fizessem para mim, só pensei que fosse algo bem trivial e que pudesse pegar um atalho com vocês de poucas linhas. Vou estudar com calma.

Obrigado e até a próxima,

Junior

Otavio Konmin Clemente  
afterdarkrj:

Malacarne,

Desculpe se a pergunta foi basica demais, o que pode ter dado a impressão que eu queria que fizessem para mim, só pensei que fosse algo bem trivial e que pudesse pegar um atalho com vocês de poucas linhas. Vou estudar com calma.

Obrigado e até a próxima,

Junior

Prezados,

Também estou com a mesma dúvida e não acho ela trivial.

Imagino que pode ser implementado uma venda a mercado 10 minutos antes do fechamento do pregão e ainda uma trava de horário para o robô não operar mais em determinado período.

Também estou começando, mas vou tentar desenvolver algo nesse sentido. Alguém já fez isso, ou mesmo poderia opinar se esse é o melhor caminho?

Att.

Otávio 

Rodrigo Malacarne  
otaviokc:

Prezados,

Também estou com a mesma dúvida e não acho ela trivial.

Imagino que pode ser implementado uma venda a mercado 10 minutos antes do fechamento do pregão e ainda uma trava de horário para o robô não operar mais em determinado período.

Também estou começando, mas vou tentar desenvolver algo nesse sentido. Alguém já fez isso, ou mesmo poderia opinar se esse é o melhor caminho?

Att.

Otávio 

Olá otaviokc ,

É bastante comum o desenvolvimento de robôs com travas de horário. Se a pergunta foi se esse é o melhor caminho, acredito que sim. Você já deveria pensar em desenvolver um EA que tivesse sim essa possibilidade de encerramento das operações antes do final do pregão.

Abraços,

Malacarne 

Otavio Konmin Clemente  
Rodrigo Malacarne:

Olá otaviokc ,

É bastante comum o desenvolvimento de robôs com travas de horário. Se a pergunta foi se esse é o melhor caminho, acredito que sim. Você já deveria pensar em desenvolver um EA que tivesse sim essa possibilidade de encerramento das operações antes do final do pregão.

Abraços,

Malacarne 

Malacarne.

Obrigado pela atenção.

Mas de fato a dúvida era bem trivial... rs...

Para quem está começando e está em dúvida de como implementar, recomendo a leitura desses 2 artigos:

https://www.mql5.com/pt/articles/599 

https://www.mql5.com/pt/articles/211 

Abs,

Otávio 

[Excluído]  
Rodrigo Malacarne:

Olá otaviokc ,

É bastante comum o desenvolvimento de robôs com travas de horário. Se a pergunta foi se esse é o melhor caminho, acredito que sim. Você já deveria pensar em desenvolver um EA que tivesse sim essa possibilidade de encerramento das operações antes do final do pregão.

Abraços,

Malacarne 

Olá Malacarne,

Acho este tema bem importante, porque em dias de pregão com meio período, nos backtests as posições passam para o dia seguinte, e em contas reais seriam liquidadas pelo robô da corretora (contas daytrade), o que sairia fora de qualquer estratégia programada.

Fiz alguns testes com "SymbolInfoSessionTrade" e "SymbolInfoSessionQuote" , retorna "true" mas os resultados não são corretos, retorna: Início "00:00" Fim "23:59" 

     datetime startSession,closeSession; 
     string commStr;
     MqlDateTime today;
     TimeToStruct(TimeCurrent(),today);   
      
      
    if(SymbolInfoSessionTrade(_Symbol,(ENUM_DAY_OF_WEEK)today.day_of_week,0,startSession,closeSession))
      commStr = "Trade:\nInício: "+TimeToString(startSession,TIME_MINUTES)+"\nFim: "+TimeToString(closeSession-1,TIME_MINUTES);

    if(SymbolInfoSessionQuote(_Symbol,(ENUM_DAY_OF_WEEK)today.day_of_week,0,startSession,closeSession))
      commStr += "\nQuote:\nInício: "+TimeToString(startSession,TIME_MINUTES)+"\nFim: "+TimeToString(closeSession-1,TIME_MINUTES);

     Comment(commStr);

 

Para backtest creio que um simples copyrates ou copytime seria suficiente para prever a ausência de candles futuros.

O maior problema que vejo é na operação real, talvez um "WebRequest" para algum servidor sincronizado com a bmfbovespa ou até mesmo direto para o servidor da bmfbovespa para saber exatamente o horário de abertura e do call de fechamento, mas parece uma solução meio complicada...

Acho que uma solução para está questão seria fundamental para robôs MT5 que operam na bmfbovespa.

Abraço

Fernando 

Mauricio Costa  

Desenvolvi um controlador de horários para Day Trade. Espero que sirva.

Substitua ExpMagicNumber pelo seu MagicNumber e myExpert pelo objeto Expert instanciado no seu Advisor.

A sua classe Expert (arquivo Expert.mqh) precisa de uma pequena alteração do método CloseAll() : ele precisa ser modificado para Public (por default ele é Protect).



Mauricio

//+------------------------------------------------------------------+
//|                                                     DayTrade.mq5 |
//|                                                         Mauricio |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Mauricio"
#property link      "https://www.mql5.com"
#property version   "1.00"

ulong ExpMagicNumber = 0;

sinput string Coment="- - - - - - - - - - - - - - - - - - - - - - - - - - - -";// --- TRADING TIME ---
input string             myStartTime                  = "09:00";         // Time to start operations (hh:mm)
input string             myCloseTime                  = "17:40";         // Time to finish all positions (hh:mm)
input string             myLastOperation              = "16:00";         // Time to last operation open (hh:mm)



//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
// Verify working time
// input: false = check start time / true = check last time to open position 
// return: 0: not working / 1: Working / -1: Close all positions
int checkWorkTime(bool bEnter)
{
   MqlDateTime Time;
   TimeCurrent(Time);
   int state = 0;
   string startTime[], closeTime[], lastOpen[];
   StringSplit(myStartTime,':',startTime);
   StringSplit(myCloseTime,':',closeTime);
   StringSplit(myLastOperation,':',lastOpen);

   if ( (((Time.hour == StringToInteger(startTime[0])) && (Time.min >= StringToInteger(startTime[1]))) || (Time.hour > StringToInteger(startTime[0]))) &&
        (((Time.hour == StringToInteger(closeTime[0])) && (Time.min <= StringToInteger(closeTime[1]))) || (Time.hour < StringToInteger(closeTime[0]))) && 
        ((!bEnter) || (((Time.hour == StringToInteger(lastOpen[0])) && (Time.min <= StringToInteger(lastOpen[1]))) || (Time.hour < StringToInteger(lastOpen[0])))) 
      )
   {
      state = 1;
   }
   
   // Don't run on weekends
   if ((state) && ((Time.day_of_week==0)||(Time.day_of_week==6))) { state = 0;}
   
   // Check time for closing positions
   if (((Time.hour == StringToInteger(closeTime[0]))   && (Time.min > StringToInteger(closeTime[1])))   || (Time.hour > StringToInteger(closeTime[0]))  )
   {
      state = -1;
   } 
   
   
   return state;
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int work = checkWorkTime(false);
   static bool waitForClose = false;
   
   if ( work > 0)
   {    
      //--- new tick handler
      myExpert.OnTick();
   }
   else
   {
      if (work < 0)
      {
         if ((!waitForClose) && (PositionSelect(_Symbol)))
         {
            int openTrades = (int)PositionGetDouble(POSITION_VOLUME);
            if (openTrades > 0)
            {
               myExpert.CloseAll(openTrades);
               waitForClose = true;
            }
         }
         else
         {
            waitForClose = false;
         }
      }
   }
  }
//+------------------------------------------------------------------+
MetaLucson  
Mauricio Costa:

Desenvolvi um controlador de horários para Day Trade. Espero que sirva.

Substitua ExpMagicNumber pelo seu MagicNumber e myExpert pelo objeto Expert instanciado no seu Advisor.

A sua classe Expert (arquivo Expert.mqh) precisa de uma pequena alteração do método CloseAll() : ele precisa ser modificado para Public (por default ele é Protect).



Mauricio

Maurício, fiz uma adaptação do seu algoritmo dentro do próprio programa do EA, mais ou menos assim: Se o horário atual estiver dentro do intervalo de daytrade, as operações de compra e venda são realizadas, se no horário final houver posições abertas, ele fecha as posições.

Porém reconheço que a sua idéia de instanciar o robô como uma classe na função OnTick é mais interessante, porém não sei como fazer para tornar o meu EA uma classe, poderias me dar uma dica?

Valeu