//---- Trades limits
extern   double    Lots = 1;
extern   double    TakeProfit = 1500;
extern   double    TrailingStop = 2000; 
extern   double    StopLoss = 200;
extern   int       Slippage = 5;
extern   double    MaximumRisk        = 0.3;
extern   int       StartTrading = 0;
extern   int       EndTrading   = 24;
extern   bool      UseMM=false;


//--- Global variables
extern int      MagicNumber = 655321;
string   ExpertComment = "SMARTASS";
int      NumberOfTries = 5;

//+------------------------------------------------------------------
int init()
{
   return(0);
}

int deinit() 
{
   return(0);
}
//+------------------------------------------------------------------

bool isNewSymbol(string current_symbol)
  {
   //loop through all the opened order and compare the symbols
   int total  = OrdersTotal();
   for(int cnt = 0 ; cnt < total ; cnt++)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      string selected_symbol = OrderSymbol();
      if (current_symbol == selected_symbol && OrderMagicNumber()==MagicNumber)
      return (False);
    }
    return (True);
}

//+------------------------------------------------------------------+
int start()
  {
   
    if (Hour()< StartTrading || Hour()>(EndTrading-1))
   {
     CloseOrder(OP_BUY);
     CloseOrder(OP_SELL);

      return(0);
   }
   
   int cnt, ticket, total,n,trend;
   bool up1,up2,down1,down2,up3,down3;
   bool BuyCondition = false , SellCondition = false , CloseBuyCondition = false , CloseSellCondition = false ;
   double signal,signal1,signal2;
   if(Bars<50) {Print("bars less than 50"); return(0);}

   //Symbo settings:
   RefreshRates();
   Slippage = MarketInfo(Symbol(),MODE_SPREAD);
      
      
      
      double ma1=iMA(NULL,0,5,0,MODE_EMA,PRICE_TYPICAL,1);
      double ma2=iMA(NULL,0,12,0,MODE_EMA,PRICE_TYPICAL,1);
      
      double ma1last=iMA(NULL,0,5,0,MODE_EMA,PRICE_TYPICAL,2);
      double ma2last=iMA(NULL,0,12,0,MODE_EMA,PRICE_TYPICAL,2);
      
      double stoch_main = iStochastic(NULL,0,20,6,16,MODE_EMA,0,MODE_MAIN,1);
      double stoch_sig = iStochastic(NULL,0,20,6,16,MODE_EMA,0,MODE_SIGNAL,1);
      double stoch_main1 = iStochastic(NULL,0,20,6,16,MODE_EMA,0,MODE_MAIN,2);
      double stoch_sig1 = iStochastic(NULL,0,20,6,16,MODE_EMA,0,MODE_SIGNAL,2);

      
      double macd_main=iMACD(NULL,0,13,21,8,PRICE_CLOSE,MODE_MAIN,1); 
      double macd_sig=iMACD(NULL,0,13,21,8,PRICE_CLOSE,MODE_SIGNAL,1); 
      double macd_main1=iMACD(NULL,0,13,21,8,PRICE_CLOSE,MODE_MAIN,2); 
      double macd_sig1=iMACD(NULL,0,13,21,8,PRICE_CLOSE,MODE_SIGNAL,2); 
      
      double sar1=iSAR(NULL,0,0.0026,0.5,1);
      double sar2=iSAR(NULL,0,0.0026,0.5,2);

     if ((stoch_main>stoch_sig && macd_main>macd_sig)) up1=true; else up1=false;
     if ((stoch_main<stoch_sig && macd_main<macd_sig)) down1=true; else down1=false;
  
     if ((stoch_main1>stoch_sig1 && macd_main1>macd_sig1)) up2=true; else up2=false;
     if ((stoch_main1<stoch_sig1 && macd_main1<macd_sig1)) down2=true; else down2=false;
      

     static int arrow;
      if ((up1==true && up2!=true))
       {signal=1;}
     
   
      else if ((down1==true && down2!=true))
      {signal=-1;}
      
      if ((up2==true && up1!=true)) CloseBuyCondition=true;
      if (down2==true && down1!=true) CloseSellCondition=true;
      
   
   //Print(signal);
   //--- Trading conditions
/*   bool BuyCondition = false , SellCondition = false , CloseBuyCondition = false , CloseSellCondition = false ; */
   
   if (signal==1)
       BuyCondition = true;
       
   if (signal==-1)
      SellCondition = true;
   
   if (BuyCondition)
      CloseSellCondition = true;
   
   if (SellCondition)
      CloseBuyCondition = true;
      
      
   
   total  = OrdersTotal();
   
   if (UseMM)
   Lots=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
   
      
   if(total < 1 || isNewSymbol(Symbol())) 
     {
       if(BuyCondition) //<-- BUY condition
         {
           ticket = OpenOrder(OP_BUY); //<-- Open BUY order
            return(0);
         }
         if(SellCondition) //<-- SELL condition
         {
            ticket = OpenOrder(OP_SELL); //<-- Open SELL order
            return(0);
         }
         return(0);
     }
     
      for(cnt=0;cnt<total;cnt++) 
      {
         OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

         if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
         {
            if(OrderType()==OP_BUY)   //<-- Long position is opened
            {
                  if(CloseBuyCondition) //<-- Close the order and exit! 
                  {
                     CloseOrder(OrderType()); 
                  } 
               
               TrailOrder(OrderType()); //<-- Trailling the order
            }
            if(OrderType()==OP_SELL) //<-- Go to short position
            {
                 if(CloseSellCondition) //<-- Close the order and exit! 
                  {
                     CloseOrder(OP_SELL);
                  } 
               TrailOrder(OrderType()); //<-- Trailling the order
            }
         }
      }

   return(0);
  }
//+------------------------------------------------------------------+

int OpenOrder(int type)
{
   int ticket=0;
   int err=0;
   int c = 0;
   
   if(type==OP_BUY)
   {
      for(c = 0 ; c < NumberOfTries ; c++)
      {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,Ask-StopLoss*Point,Ask+TakeProfit*Point,ExpertComment,MagicNumber,0,Green);
         err=GetLastError();
         if(err==0)
         { 
            break;
         }
         else
         {
            if(err==4 || err==137 ||err==146 || err==136) //Busy errors
            {
               Sleep(5000);
               continue;
            }
            else //normal error
            {
               break;
            }  
         }
      }   
   }
   if(type==OP_SELL)
   {   
      for(c = 0 ; c < NumberOfTries ; c++)
      {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,Bid+StopLoss*Point,Bid-TakeProfit*Point,ExpertComment,MagicNumber,0,Red);
         err=GetLastError();
         if(err==0)
         { 
            break;
         }
         else
         {
            if(err==4 || err==137 ||err==146 || err==136) //Busy errors
            {
               Sleep(5000);
               continue;
            }
            else //normal error
            {
               break;
            }  
         }
      }   
   }  
   return(ticket);
}

bool CloseOrder(int type)
{
   if(OrderMagicNumber() == MagicNumber)
   {
      if(type==OP_BUY)
         return (OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet));
      if(type==OP_SELL)   
         return (OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Violet));
   }
}
void TrailOrder(int type)
{
   if(TrailingStop>0)
   {
      if(OrderMagicNumber() == MagicNumber)
      {
         if(type==OP_BUY)
         {
            if(Bid-OrderOpenPrice()>Point*TrailingStop)
            {
               if(OrderStopLoss()<Bid-Point*TrailingStop)
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
               }
            }
         }
         if(type==OP_SELL)
         {
            if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
            {
               if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
               }
            }
         }
      }
   }
}


