Ordens para reversão

 
Pessoal, estou tentando o seguinte. Tem um candle que dá o sinal de entrada, a ordem é executada no próximo, os dois candles na tendência. As vezes após o candle de entrada, no terceiro candle, ocorre uma reversão de tendência. Criei uma função que fecha a ordem anterior e entra como uma ordem invertida no candle de reversão. Até aqui está tudo certo. O problema é que quero que a função de reversão aconteça somente no terceiro candle (candle que deu o sinal, candle de entrada, candle que reverteu). Não quero que fique tentando aplicar a reversão nos próximos candles. Obs: se a reversão não acontecer também não quero que siga tentando.
Alguém pode me ajudar?


// Chamada no OnTick()
if(estrategia==LMA_PSAR_MACD
  {MmPsarMacd();StopRevertCandle();}


// Condições de entrada MmPsarMacd
void MmPsarMacd() // Testa condições para Marubozu/Marubozu_long/Long
   {CANDLE_STRUCTURE cand;
    RecognizeCandle(_Symbol,_Period,velas[1].time,10,cand);
    if(cand.type==CAND_MARIBOZU||cand.type==CAND_MARIBOZU_LONG||cand.type==CAND_LONG)
      {if(wma_220_Buffer[1]<wma_62_Buffer[1]&&wma_14_Buffer[1]<wma_8_Buffer[1])
         {if(velas[1].open<wma_8_Buffer[1]&&velas[1].close>wma_8_Buffer[1])
            {if(psar_Buffer[1]<velas[1].open&&macd_Buffer[1]>0)
               {if(OrdersTotal()==0&&PositionsTotal()==0&&pode_operar)
                  {ObjectCreate(0,"x"+velas[1].time,OBJ_ARROW_CHECK,0,velas[1].time,velas[1].low);
                   CompraAMercado(num_lots,tick.ask,TK,SL);}}}}
       else if(wma_220_Buffer[1]>wma_62_Buffer[1]&&wma_14_Buffer[1]>wma_8_Buffer[1])
          {if(velas[1].open>wma_8_Buffer[1]&&velas[1].close<wma_8_Buffer[1])
             {if(psar_Buffer[1]>velas[1].open&&macd_Buffer[1]<0)
                {if(OrdersTotal()==0&&PositionsTotal()==0&&pode_operar)
                   {ObjectCreate(0,"x"+velas[1].time,OBJ_ARROW_CHECK,0,velas[1].time,velas[1].high);
                    VendaAMercado(num_lots,tick.bid,TK,SL);}}}}}}


// Para envio de ordens
void CompraAMercado(double num_lots_,double ask,double TK_,double SL_)
  {trade.Buy(num_lots_,_Symbol,NormalizeDouble(ask,_Digits),NormalizeDouble(ask-SL_*_Point,_Digits),
   NormalizeDouble(ask+TK_*_Point,_Digits));
   if(trade.ResultRetcode()==10008||trade.ResultRetcode()==10009)
     {Print("Ordem de Compra executada com sucesso!");}
   else
     {Print("Erro ao enviar Ordem de Compra. Erro = ", GetLastError());
      ResetLastError();}}
void VendaAMercado(double num_lots_,double bid,double TK_,double SL_)
  {trade.Sell(num_lots_,_Symbol,NormalizeDouble(bid,_Digits),NormalizeDouble(bid+SL_*_Point,_Digits),
   NormalizeDouble(bid-TK_*_Point,_Digits));
   if(trade.ResultRetcode()==10008||trade.ResultRetcode()==10009)
     {Print("Ordem de Venda executada com sucesso!");}
   else
     {Print("Erro ao enviar Ordem de Venda. Erro = ", GetLastError());
      ResetLastError();}}

// Stop de reversão de ordem
void StopRevertCandle()
   {if(PositionSelect(_Symbol)&&PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
      {if(close_Buffer[2]>close_Buffer[1])
         {FechaPosicao();
          ObjectCreate(0,"x"+velas[1].time,OBJ_ARROW_CHECK,0,velas[1].time,velas[1].low);
          VendaAMercado(num_lots,tick.bid,TK,SL);}}
    if(PositionSelect(_Symbol)&&PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
      {if(close_Buffer[1]>close_Buffer[2])
         {FechaPosicao();
          ObjectCreate(0,"x"+velas[1].time,OBJ_ARROW_CHECK,0,velas[1].time,velas[1].low);
          CompraAMercado(num_lots,tick.ask,TK,SL);}}}
Razão: