Closing positions isn't working

 
Does someone know what's wrong here because positions are not closing after senkou spanB crossing chinkou span from below for buy?


#include <Indicators/Trend.mqh>
CiIchimoku*Ichimoku;

#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>

input int Magic = 400;
input double lot_size = 0.1;
input int TimeStartHour = 1;
input int TimeStartMin = 0;
input int TimeStopHour = 20;
input int TimeStopMin = 00;
input int points_sl = 500;
input int points_tp = 500;

CTrade Trade;
CPositionInfo PositionInfo;

void OnInit() {

   Trade.SetExpertMagicNumber(Magic);

   Ichimoku = new CiIchimoku();
   Ichimoku.Create(_Symbol,PERIOD_CURRENT,9,26,52);
  }

void OnTick() { 

   Ichimoku.Refresh(-1);
   double TenkanVal = Ichimoku.TenkanSen(0);
   double KijunVal = Ichimoku.KijunSen(0);
   double SpanAVal = Ichimoku.SenkouSpanA(26);
   double SpanBVal = Ichimoku.SenkouSpanB(26);
   double ChinkouVal = Ichimoku.ChinkouSpan(26);

   double TenkanValPrevious = Ichimoku.TenkanSen(1);
   double KijunValPrevious = Ichimoku.KijunSen(1);
   double SpanAValPrevious = Ichimoku.SenkouSpanA(27);
   double SpanBValPrevious = Ichimoku.SenkouSpanB(27);
   double ChinkouValPrevious = Ichimoku.ChinkouSpan(27);
   
   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); //ask price
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); //bid price
   
   MqlDateTime structTime;
   TimeCurrent(structTime);
   structTime.sec = 0;
   
   structTime.hour = TimeStartHour;
   structTime.min = TimeStartMin;
   datetime timeStart = StructToTime(structTime);
   
   structTime.hour = TimeStopHour;
   structTime.min = TimeStopMin;
   datetime timeStop = StructToTime(structTime);
   
   if(TimeCurrent() >= timeStart && TimeCurrent() < timeStop) {
   if(PositionsTotal() == 0) {
   if(ChinkouValPrevious < SpanBValPrevious && ChinkouVal > SpanBVal) {
      Comment("The trend is up","\n",
              "Tenkan Sen Value is: ",TenkanVal,"\n",
              "Kijun Sen Value is: ",KijunVal,"\n",
              "Senkou Span A Value is: ", SpanAVal,"\n",
              "Senkou Span B Value is: ",SpanBVal,"\n",
              "Chikou Span Value is: ",ChinkouVal);
  
     double tp = Ask + points_tp * SymbolInfoDouble(_Symbol,SYMBOL_POINT);      
     double sl = Ask - points_sl * SymbolInfoDouble(_Symbol,SYMBOL_POINT);  
     
     Trade.Buy(lot_size,_Symbol,Ask,sl,tp); 
       
     if(ChinkouVal <= SpanBVal){
     for(int i = PositionsTotal()-1; i >= 0; i--){
     ulong Ticket = PositionGetTicket(i);
     if(PositionSelectByTicket(Ticket)){
     Trade.PositionClose(Ticket);
      }}}
    
       }
      } 
    }   

   if(TimeCurrent() >= timeStart && TimeCurrent() < timeStop) {
   if(PositionsTotal() == 0) {
   if(ChinkouValPrevious > SpanBValPrevious && ChinkouVal < SpanBVal) {
      Comment("The trend is down","\n",
              "Tenkan Sen Value is: ",TenkanVal,"\n",
              "Kijun Sen Value is: ",KijunVal,"\n",
              "Senkou Span A Value is: ", SpanAVal,"\n",
              "Senkou Span B Value is: ",SpanBVal,"\n",
              "Chikou Span Value is: ",ChinkouVal);
              
    double tp = Bid - points_tp * SymbolInfoDouble(_Symbol,SYMBOL_POINT); 
    double sl = Bid + points_sl * SymbolInfoDouble(_Symbol,SYMBOL_POINT);           
    
    Trade.Sell(lot_size,_Symbol,Bid,sl,tp);
   
    
/*   if (ChinkouValPrevious > SpanBValPrevious && ChinkouVal < SpanBVal) {
   for (int i = PositionsTotal()-1; i >= 0; i--) {
   ulong ticket = PositionGetTicket(i);
   if (ticket > 0 && PositionSelectByTicket(ticket)) {
   int posType = (int)PositionGetInteger(POSITION_TYPE);
   if (posType == POSITION_TYPE_BUY) {
   Trade.PositionClose(ticket);
   posType = 0;
   }}}}
*/    
     if(ChinkouVal >= SpanBVal){
     for(int i = PositionsTotal()-1; i >= 0; i--){
     ulong posTicket = PositionGetTicket(i);
     if(PositionSelectByTicket(posTicket)){
     Trade.PositionClose(posTicket);
     }}}
     
      }
     }
    }
  }    
  
 

see what the error code is:

if(ChinkouVal >= SpanBVal){
    for(int i = PositionsTotal()-1; i >= 0; i--){
        ulong posTicket = PositionGetTicket(i);
        if(PositionSelectByTicket(posTicket)){
            if(!Trade.PositionClose(posTicket)){
                Print("Failed to close position: ", posTicket, " Error: ", GetLastError());
            }
        }
    }
}
 

There is a problem with the brackets, and your closing code is embedded within the opening condition, this is why it cannot close the trades. I have corrected your code this way:

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2020, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#include <Indicators/Trend.mqh>
CiIchimoku*Ichimoku;

#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>

input int Magic = 400;
input double lot_size = 0.1;
input int TimeStartHour = 1;
input int TimeStartMin = 0;
input int TimeStopHour = 20;
input int TimeStopMin = 00;
input int points_sl = 500;
input int points_tp = 500;

CTrade Trade;
CPositionInfo PositionInfo;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {

   Trade.SetExpertMagicNumber(Magic);

   Ichimoku = new CiIchimoku();
   Ichimoku.Create(_Symbol,PERIOD_CURRENT,9,26,52);
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

   Ichimoku.Refresh(-1);
   double TenkanVal = Ichimoku.TenkanSen(0);
   double KijunVal = Ichimoku.KijunSen(0);
   double SpanAVal = Ichimoku.SenkouSpanA(26);
   double SpanBVal = Ichimoku.SenkouSpanB(26);
   double ChinkouVal = Ichimoku.ChinkouSpan(26);

   double TenkanValPrevious = Ichimoku.TenkanSen(1);
   double KijunValPrevious = Ichimoku.KijunSen(1);
   double SpanAValPrevious = Ichimoku.SenkouSpanA(27);
   double SpanBValPrevious = Ichimoku.SenkouSpanB(27);
   double ChinkouValPrevious = Ichimoku.ChinkouSpan(27);

   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); //ask price
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); //bid price

   MqlDateTime structTime;
   TimeCurrent(structTime);
   structTime.sec = 0;

   structTime.hour = TimeStartHour;
   structTime.min = TimeStartMin;
   datetime timeStart = StructToTime(structTime);

   structTime.hour = TimeStopHour;
   structTime.min = TimeStopMin;
   datetime timeStop = StructToTime(structTime);


   if(PositionsTotal() > 0)
     {
      if(ChinkouVal <= SpanBVal)
        {
         for(int i = PositionsTotal()-1; i >= 0; i--)
           {
            ulong Ticket = PositionGetTicket(i);
            if(PositionSelectByTicket(Ticket) && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
              {
               Trade.PositionClose(Ticket);
              }
           }
        }
      if(ChinkouVal >= SpanBVal)
        {
         for(int i = PositionsTotal()-1; i >= 0; i--)
           {
            ulong posTicket = PositionGetTicket(i);
            if(PositionSelectByTicket(posTicket)  && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
              {
               Trade.PositionClose(posTicket);
              }
           }
        }
     }

   if(TimeCurrent() >= timeStart && TimeCurrent() < timeStop)
     {

      if(PositionsTotal() == 0)
        {
         if(ChinkouValPrevious < SpanBValPrevious && ChinkouVal > SpanBVal)
           {
            Comment("The trend is up","\n",
                    "Tenkan Sen Value is: ",TenkanVal,"\n",
                    "Kijun Sen Value is: ",KijunVal,"\n",
                    "Senkou Span A Value is: ", SpanAVal,"\n",
                    "Senkou Span B Value is: ",SpanBVal,"\n",
                    "Chikou Span Value is: ",ChinkouVal);

            double tp = Ask + points_tp * SymbolInfoDouble(_Symbol,SYMBOL_POINT);
            double sl = Ask - points_sl * SymbolInfoDouble(_Symbol,SYMBOL_POINT);

            Trade.Buy(lot_size,_Symbol,Ask,sl,tp);


           }
        }
     }

   if(TimeCurrent() >= timeStart && TimeCurrent() < timeStop)
     {
      if(PositionsTotal() == 0)
        {
         if(ChinkouValPrevious > SpanBValPrevious && ChinkouVal < SpanBVal)
           {
            Comment("The trend is down","\n",
                    "Tenkan Sen Value is: ",TenkanVal,"\n",
                    "Kijun Sen Value is: ",KijunVal,"\n",
                    "Senkou Span A Value is: ", SpanAVal,"\n",
                    "Senkou Span B Value is: ",SpanBVal,"\n",
                    "Chikou Span Value is: ",ChinkouVal);

            double tp = Bid - points_tp * SymbolInfoDouble(_Symbol,SYMBOL_POINT);
            double sl = Bid + points_sl * SymbolInfoDouble(_Symbol,SYMBOL_POINT);

            Trade.Sell(lot_size,_Symbol,Bid,sl,tp);

           }
        }
     }

  }


//+------------------------------------------------------------------+