need help with basic logic

 
Hello,
I have written very basic EA that based on iOsMA for trade signals.
First iOsMA uses Main set of external parameters.
Now I have added one more iStDev that I want to use as a triger
for use of alternative set of extern parameters for tha same iOsMA indicator
It doesn work properly or it looks like only one part works
Please help me to solve this simple logic problem

code is here:
//+------------------------------------------------------------------+
//|                                                    NEWEXPERT.mq4 |
//+------------------------------------------------------------------+
extern double sl = 50;
extern double size = 0.1;
extern int    MagicNumber = 888;
static int    p_time = 0;
static int    spread = 3;
extern bool   UseMain_Alt = false;
extern double Level = 0.02;
extern int    SDPeriod = 100;
extern bool   UseMainLogic = false;
extern bool   UseAltLogic = false;
 
extern string MainLogic_S1    = "=== MAIN LOGIC S1 ====";
extern bool   UseS1 = false;
//extern double PeriodM = 20;
extern int    Fast_P   = 13;
extern int    Slow_P   = 19;
extern int    signal_p = 4;
 
//------new logic---- 
extern string AltLogic_S1A = "===ALT LOGIC S1A======";
extern bool   UseS1A = false;                                        
//extern double PeriodA = 5;
extern int    Fast_PA   = 5;
extern int    Slow_PA   = 15;
extern int    signal_pa = 4;
//---
 
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   if(Time[0] == p_time) 
       return(0);
   p_time = Time[0];
   if(IsTradeAllowed()) 
     {
       spread = MarketInfo(Symbol(), MODE_SPREAD);
     } 
   else 
     {
       p_time = Time[1];
       return(0);
     }
   int order = -1;
   int Signal = 0;
 
// check for opened position
   int total = OrdersTotal();   
   for(int i = 0; i < total; i++) 
     {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES); 
      if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) 
       {
        int p_order = OrderTicket();
         // have 'open long'
          if (OrderType() == OP_BUY) 
           {
            if (CheckSignal(Signal) == 1)   // '1' means 'sell' = reversal for 'open long'
             { 
              order = OrderSend(Symbol(), OP_SELL, size * 2, Bid, 3, 
                       Ask + sl * Point, 0, "newexpert", MagicNumber,0, Red); 
              Sleep(10000);
              if(order < 0) 
               {
                p_time = Time[1];
               } 
              else 
               {
                OrderCloseBy(order, p_order, Blue);   
               }
             } 
            else 
             { //  modify  SL   for 'open long' 
              if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - sl * Point, 0, 0, Blue)) 
                {
                 Sleep(10000);
                 p_time = Time[1];
                }
             } 
               //have 'open short'
             } 
           else 
             {
               if (CheckSignal(Signal) == 2) //2 means 'buy' = reversal for "open short" 
                { 
                 order = OrderSend(Symbol(), OP_BUY, size * 2, Ask, 3, 
                          Bid - sl * Point, 0, "newexpert", MagicNumber,0, Blue); 
                 Sleep(10000);
                 if(order < 0) 
                   {
                    p_time = Time[1];
                   } 
                 else 
                   {
                    OrderCloseBy(order, p_order, Blue);   
                   }
                } 
               else 
                { //  modify  SL   for 'open short'
                  if(!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + sl * Point, 0, 0, Blue)) 
                    {
                     Sleep(10000);
                     p_time = Time[1];
                    }
                }
              } 
         return(0);
       }
   }
// check for possibility to open  long or short position 
    if (CheckSignal(Signal)== 2) 
     { //open new long position
      order = OrderSend(Symbol(), OP_BUY, size, Ask, 3, Bid - sl * Point, 0, 
                         "newexpert", MagicNumber, 0, Blue); 
      if(order < 0) 
       {
        Sleep(10000);
        p_time = Time[1];
       }
     } 
   else 
     {// open new short position
      order = OrderSend(Symbol(), OP_SELL, size, Bid, 3, Ask + sl * Point, 0, 
                         "newexpert", MagicNumber, 0, Red); 
       if(order < 0) 
        {
         Sleep(30000);
         p_time = Time[1];
        }
     }
   return(0);
  }
//+--------------------------------------------------+
//| Entry  Logic                                     |
//+--------------------------------------------------+
//****************MAIN LOGIC*****************   
//===========SIGNAL1========================
int CheckSignal(int Signal)
{
 bool BuyS1 = false, SellS1 = false;
 //double S1 = iCustom(NULL,0,"Indicator",PeriodM,1,1);
 double S1 = iOsMA (NULL,0,Fast_P,Slow_P,signal_p,1,1);
 if(UseS1  && UseMainLogic) // added UseMainLogic here
  {
   if(S1 >= 0) {BuyS1 = true;} 
   if(S1 < 0) {SellS1 = true;}
  }
 else {BuyS1 =true; SellS1 =true;}
//=====
//**************  
 
 
//********Added  ALT LOGIC  here***************** 
//====SIGNAL1Alt===========
 bool BuyS1A = false, SellS1A = false;
// double S1A = iCustom(NULL,0,"Indicator",PeriodA,1,1);
   double S1A = iOsMA (NULL,0,Fast_PA,Slow_PA,signal_pa,1,1);
 if(UseS1A  &&  UseAltLogic)
  {
   if(S1A >= 0) {BuyS1A = true;} 
   if(S1A < 0) {SellS1A = true;}
  }
 else {BuyS1A =true; SellS1A =true;}
//======= 
//*************
 
 
//>>>>>>>>>>>new switch here>>>>>>>>>>>...
//+---------------------------------------------+
//|          switch main/alt                    |
//+---------------------------------------------+  
  if (UseMain_Alt ) //if we are using Main/Alt control
      { 
      double ALT = iStdDev(NULL,0,SDPeriod,0,MODE_EMA,PRICE_CLOSE,1);
  
        if (ALT < Level)
          { 
           UseMainLogic = false;
           UseAltLogic = true;
             if (ALT < Level)
              {
               UseMainLogic = true;
               UseAltLogic = false;
              }
           }
       }
//>>>>>>>>>>>>>>>>
 
          
    if (
       (BuyS1==true)
          
            
//-----new condition------          
 //   || (BuyS1A==true)         
//----
 
       ) 
             
 return (2);
 
     if(
        (SellS1==true)
 
 
//---new condition--              
//      || (SellS1A==true)
//---
        )
              
 return (1);
               
          
 }//end
 
Check this once more.

if (ALT < Level) // <-- Ok. Seems to be logic
          { 
           UseMainLogic = false;
           UseAltLogic = true;
             if (ALT < Level) // <-- And what does it mean? Expert going to check condition which was checked already and in processing...
              {
               UseMainLogic = true;
               UseAltLogic = false;
              }
           }
Reason: