[Dúvida] Identificando candle de abertura de uma operação

Christian Alves  

Bom dia, boa tarde ou boa noite senhoras e senhores! Espero que todos estejam bem.


Venho por meio deste tópico apresentar mais uma de minhas dúvidas decorrentes de meus estudos, esperando que algum ser possa me iluminar com vosso conhecimento!


Utilizo em um de meus filhotes a estratégia de fechou fora/fechou dentro com o indicador das bandas de Bollinger. Este robô que falo em especificamente identifica o fechou dentro ainda no candle 0, ou seja, após determinado tempo passado do candle aberto, caso este esteja fechando dentro das bandas e o candle anterior confirmou ter fechado fora, realiza a operação. Porém, ao lidar com as entradas no candle 0, é possível que a vela ainda assim feche fora, afinal, estou tentando prever o FF/FD, assim sendo, conceitualmente deixa de ser um fechou fora/fechou dentro, portanto o objetivo ao identificar isso é encerrar a operação.


Minha dúvida é: como fazer para identificar o candle em que a operação foi aberta, para que assim possa verificar se aconteceu de fato o FF/FD ou se o candle que estava fechando dentro das bandas, acabou por fechar fora, e assim encerrar a operação. O código que fiz até então é este que segue abaixo. Ele acaba por identificar qualquer fechou fora/fechou fora caso tenha ao menos uma operação deste robô aberta, e assim sendo, encerra a operação.  

   candleAtual = rates[0].time;
if(candleAtual != candleNovo)
{
candleNovo = rates[0].time;

  ////===========================IDENTIFICANDO FF/FF=============================================
for(int i = PositionsTotal()-1; i>=0; i--)
         {
            string symbol = PositionGetSymbol(i);
            ulong magic = PositionGetInteger(POSITION_MAGIC);
               if(symbol == _Symbol && magic == magic_number)
               {
                  
                   ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
                   
                   if(posType == POSITION_TYPE_BUY){
                        if(rates[1].close < lowBand[1] && rates[0].close < lowBand[0]){
                            
                            double posVolume = PositionGetDouble(POSITION_VOLUME);
                            
                            Trade.Sell(posVolume);
                            
                            Print("Fechou fora, fechou fora, operação encerrada!");
                        }
                   }
                   
                    
                   else if(posType == POSITION_TYPE_SELL){
                        if(rates[1].close > upBand[1] && rates[0].close > upBand[0]){
                        
                            double posVolume = PositionGetDouble(POSITION_VOLUME);
                            
                            Trade.Buy(posVolume);
                            
                             Print("Fechou fora, fechou fora, operação encerrada!");
                        }
                   } 
                       
                }
            }


Estava vendo que é possível utilizar o código PositionGetInteger (position_time) e (position_time_msc) para coletar a variável do tempo em que a operação foi aberta, mas percebi que o valor retornado é em millisegundos e acabei encontrando dificuldades para compreender como usar este código de fato... enfim, foi só uma ideia em que me veio a mente e que eventualmente poderia ser utilizada (ou não) para identificar o candle atual em que a operação foi aberta.


Espero que alguém possa me auxiliar com minha dúvida, agradeço desde já a atenção e o carinho de todos.


Grande abraço e tenham um ótimo dia!

Christian Alves

Vinicius Pereira De Oliveira  

Olá, Christian, bom dia!!


Dentro do loop acima, você pode utilizar a função iBarShift() para identificar o índice da barra de abertura da posição:

   int PosTimeIdx;

// . . .

   PosTimeIdx = iBarShift(_Symbol, _Period, PositionGetInteger(POSITION_TIME), false);
   if(PosTimeIdx < 0)
     {
      return;
     }
Christian Alves  
Vinicius de Oliveira #:

Olá, Christian, bom dia!!


Dentro do loop acima, você pode utilizar a função iBarShift() para identificar o índice da barra de abertura da posição:


Bom dia Vinicius!! 


Meu irmão, muito obrigado mais uma vez por me iluminar com seu conhecimento. Fiz exatamente isso que você sugeriu, a única coisa é que modifiquei o PosTimeIdx para 1, como também alterei as variáveis de identificação Fechou Fora/Fechou Fora dentro da minha própria estrutura de código, mas funcionou normalmente da maneira como desejado! Segue abaixo minhas linhas de código:


  ////===========================IDENTIFICANDO FF/FF=============================================
for(int i = PositionsTotal()-1; i>=0; i--)
         {
         
            string symbol = PositionGetSymbol(i);
            ulong magic = PositionGetInteger(POSITION_MAGIC);
               if(symbol == _Symbol && magic == magic_number)
               {
                  
         int PosTimeIdx;
         
         PosTimeIdx = iBarShift(_Symbol, _Period, PositionGetInteger(POSITION_TIME), false);
         
         Print ("O PosTime é: ", PosTimeIdx);
               
         ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
               if(PosTimeIdx <= 1){   
                
                   if(posType == POSITION_TYPE_BUY){
                        if(rates[2].close < lowBand[2] && rates[1].close < lowBand[1]){
                            
                            double posVolume = PositionGetDouble(POSITION_VOLUME);
                            
                            Trade.Sell(posVolume);
                            
                            Print("Fechou fora, fechou fora, operação encerrada!");
                        }
                   }
                   
                    
                   else if(posType == POSITION_TYPE_SELL){
                        if(rates[2].close > upBand[2] && rates[1].close > upBand[1]){
                        
                            double posVolume = PositionGetDouble(POSITION_VOLUME);
                            
                            Trade.Buy(posVolume);
                            
                             Print("Fechou fora, fechou fora, operação encerrada!");
                        }
                   } 
                       
            }
       } 
}
Vinicius Pereira De Oliveira  
Christian Alves #Bom dia Vinicius!! Meu irmão, muito obrigado mais uma vez por me iluminar com seu conhecimento. Fiz exatamente isso que você sugeriu, a única coisa é que modifiquei o PosTimeIdx para 1, como também alterei as variáveis de identificação Fechou Fora/Fechou Fora dentro da minha própria estrutura de código, mas funcionou normalmente da maneira como desejado! Segue abaixo minhas linhas de código:



Bom dia, Christian!! Que bom que funcionou!! 👍


Apenas pra esclarecer (eu vou "jogando" as coisas e acabo não explicando 😁): essa verificação que eu faço...

if(PosTimeIdx < 0)
   {
    return;
   }

... é pra saber se a função localizou algum índice. "Se não houver barra para o tempo especificado ('buraco' no histórico), a função retorna -1"...

Christian Alves  
Vinicius de Oliveira #:


Bom dia, Christian!! Que bom que funcionou!! 👍


Apenas pra esclarecer (eu vou "jogando" as coisas e acabo não explicando 😁): essa verificação que eu faço...

... é pra saber se a função localizou algum índice. "Se não houver barra para o tempo especificado ('buraco' no histórico), a função retorna -1"...


Obrigado pela explicação meu irmão!! Grande abraço.

Razão: