Operaciones despues de cada spike

 

Duda, estoy tratando de realizar operaciones despues del spike, entonces con la función de nueva vela logro hacer que despues del spike, realize una operacion, pero digamos que sucede otro spike, requiero que despues del otro spike se abra otra operacion, este es codigo que estoy utilizando pero no me realiza la segunda operacion despues del segun spike, siempre y cuando la suma de las operaciones de cada activo sean < a 0

#property copyright "Alejandro Ramirez Moreno"
#property link      ""
#property version   "1.00"
#include <Trade/Trade.mqh>

input double Volumen= 0.20;
double MG = 1;
int contador = 1;
bool bandera = true;
bool bandera2 = false;
bool bandera3 = false;
bool bandera4 = false;
CTrade trade;
MqlRates velas[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double ASK = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double BID = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
   ArraySetAsSeries(velas,true);
   CopyRates(_Symbol,PERIOD_CURRENT,0,10,velas);
   if(nueva_vela() == true && bandera == true)
     {
      if(velas[1].open < velas[1].close && AccountInfoDouble(ACCOUNT_PROFIT) <= 0)
        {
         if(bandera == true)
           {
            trade.Sell(Volumen*MG,_Symbol,BID);
            MG = MG *2;
            bandera = false;
            bandera2 = true;
           }

        }
     }
   if( nueva_vela() == true && bandera2 == true)
     {
      Print("Entra al segundo Spike");
      if(velas[1].open < velas[1].close && AccountInfoDouble(ACCOUNT_PROFIT) <= 0)
        {
         if(bandera2 == true)
           {
            trade.Sell(Volumen*MG,_Symbol,BID);
            MG = MG *2;
            bandera2 = false;
            bandera3 = true;
           }

        }
     }

   if(nueva_vela() == true && bandera3 == true)
     {
      if(velas[1].open > velas[1].close && AccountInfoDouble(ACCOUNT_PROFIT) <= 0)
        {
         if(bandera3 == true)
           {
            trade.Sell(Volumen*MG,_Symbol,BID);

            MG = MG *2;
            bandera3 = false;
            bandera4 = true;
           }

        }
     }




   if(AccountInfoDouble(ACCOUNT_PROFIT) > 0.61)
     {
      for(int i=0; i<PositionsTotal(); i++)
        {
         ulong trade_ticket = PositionGetTicket(i);
         trade.PositionClose(trade_ticket);
         contador=1;
         MG = 1;
         bandera = true;
         bandera2 = true;
         bandera3 = true;
         bandera4 = true;
        }

     }
  }
//+------------------------------------------------------------------+
int bars;
bool nueva_vela()
  {
   int current_bars = Bars(_Symbol, _Period);
   if(current_bars != bars)
     {
      bars = current_bars;
      return true;
     }

   return false;
  }
//+------------------------------------------------------------------+
Razón de la queja: