//+------------------------------------------------------------------+
//|                                     Expert Template for MT 4.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+

extern double TakeProfit = 90;
extern double Lots = 0.2;
extern double TrailingStop = 60;
extern double MACDOpenLevel=3;
extern double check=2;
extern double check2=2;

//-------------------------------------------------------------------+
// ������� ������������ ����� ���������� ���������(���������) ������ |
// ���� ���������� -1 (������ ����������), 0-������ �� ����������,   |
// ������������� �������� = �������� ������� ������                  |
//-------------------------------------------------------------------+
int CheckLastOrderTime (string mSymbol, int select, int mode_price)
  //�� ����� ��� ��������
  //1. ������������ �����������
  //2. �������� � �������(��������) ��� ����������� ������ (�������������� 0 � 1)
  //3. �������� ���� �������� ��� �������� (�������������� 0 � 1)
  {
//---- 
   int oTotal=0; //������ �������� ���������� ������� (������� ��� �����������)
   int co; //������ �������� ������ �������� ������
   datetime LastTime=0;
   //�������� ������������ ���������� ������� ��������
   if((select>1 || select<0) || (mode_price<0 || mode_price>1))
   {
      Print("������� ���������� ��������� (������� CheckLastOrderTime)");
      return(-1);
   }
   if(select!=1) //���� ����� �������� � ������� �������� �������
   {
      oTotal=HistoryTotal();
      for(co=0;co<oTotal;co++) // ���� �� �������
      {
         if(m_OSelect(co,SELECT_BY_POS,MODE_HISTORY,100)!=-1) //������ 100 ������� ����� ������
         {
            if(mSymbol==OrderSymbol())
            {
               if(LastTime==0) LastTime=1; //����� � �������
               if(mode_price!=1) //���� ����� �������� �� ����� �������� (��������)
               {
                  if(LastTime<OrderOpenTime()) LastTime=OrderOpenTime();
               }
               else //����� ������� ����� ��������
               {
                  if(LastTime<OrderCloseTime()) LastTime=OrderCloseTime();
               }
            }
         }
         else
         {
            Alert("�������� ������ , ��. ������!");
            return(-1);
         }
      }
   }
   else //����� ������� ����������� ������
   {
      oTotal=OrdersTotal();
      for(co=0;co<oTotal;co++) // ���� �� �������
      {
         if(m_OSelect(co,SELECT_BY_POS,MODE_TRADES,100)!=-1) //������ 100 ������� ����� ������
         {
            if(mSymbol==OrderSymbol())
            {
               if(LastTime==0) LastTime=1; //����� � �������
               if(mode_price!=1) //���� ����� �������� �� ����� �������� (��������)
               {
                  if(LastTime<OrderOpenTime()) LastTime=OrderOpenTime();
               }
               else
               {
                  Alert("������� ���������� ��������! ����� ��� � ��������.");
               }
            }
         }
         else
         {
            Alert("�������� ������ , ��. ������!");
            return(-1);
         }
      }
   }
//----
   return(LastTime);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ������� ������ Attempt ���������� ������� ����� ������           |
//+------------------------------------------------------------------+
int m_OSelect(int ct, int sel, int pool, int Attempt)
  {
   int i;
//---- 
//����� ������ �� Attempt �������
   for(i=0;i<Attempt;i++)
   {
      if( OrderSelect(ct,sel,pool)==1 ) //���� ����� ������
      {
         Print( "������� ����� ������ ������ "+OrderTicket() );
         return(1);//��������� �������
      }
   }
   Alert( "��� ������ - "+GetLastError() );
   Alert("���������� ����� ������! ������� "+Attempt+" �������.");
//---- 
   return(-1);
  }
//-------------------------------------------------------------------------------------------------


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double MacdCurrent, MacdPrevious, SignalCurrent,movbuffer,upbuffer,lowbuffer;
   double SignalPrevious, MaCurrent, MaPrevious, PSarCurrent,RSICurrent,RSIPrevious,StocMainCurrent,StocMainPrevious,StocSigCurrent,StocSigPrevious,MovAvCur200,MovAvCur288, MovAvCur13;
   int cnt=0, ticket, total;
   string smb;
   datetime temp1, temp2;

   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // check TakeProfit
     }

   MacdCurrent=iMACD(NULL,0,20,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,20,26,9,PRICE_CLOSE,MODE_MAIN,1);
    //---Parabolic SAR
   PSarCurrent= iSAR(NULL,0,0.02,0.2,0);
   //---RSI
   RSICurrent=iRSI(NULL,0,14,PRICE_CLOSE,0);
   RSIPrevious=iRSI(NULL,0,14,PRICE_CLOSE,1);
   //---Stochastic Oscillator
   StocMainCurrent=iStochastic(NULL,0,5,3,3,MODE_EMA,0,MODE_MAIN,0);
   StocMainPrevious=iStochastic(NULL,0,5,3,3,MODE_EMA,0,MODE_MAIN,1);
   StocSigCurrent=iStochastic(NULL,0,5,3,3,MODE_EMA,0,MODE_SIGNAL,0);
   StocSigPrevious=iStochastic(NULL,0,5,3,3,MODE_EMA,0,MODE_SIGNAL,1);
    //---Moving Average
   MovAvCur200=iMA(NULL,0,200,0,MODE_EMA,PRICE_CLOSE,0);
   MovAvCur288=iMA(NULL,0,288,0,MODE_EMA,PRICE_CLOSE,0);
   MovAvCur13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0);
   //---Bollinger Bands
   movbuffer=iCustom(NULL,0,"EMA Bands modified",0,0); //middle line value - primer ispolzovanija sobstvennogo
   upbuffer=iCustom(NULL,0,"EMA Bands modified",1,0);  //upper line value .. indikatora v sobstvennom eksperte
   lowbuffer=iCustom(NULL,0,"EMA Bands modified",2,0); //lower line value // EMA Bands modified.mq4
   

   total=OrdersTotal();
   if(total<10) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      smb=Symbol();
      // check for long position (BUY) possibility***************************************** //mozhno-li vojti v long
      if(MacdCurrent>15*Point && MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MacdCurrent>MacdPrevious && RSICurrent>RSIPrevious && RSICurrent>500000*Point && Close[0]>MovAvCur288 && Close[0]>MovAvCur200 && MovAvCur288>MovAvCur200)
        {
         //-------EURUSD-------
         if(smb=="EURUSD")
          {
           temp1=CheckLastOrderTime("EURUSD",1,0);
           if(temp1>10)
             {
              if((CurTime()-temp1)>3600)
              ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-95*Point,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
             }
           else
             {
              temp2=CheckLastOrderTime("EURUSD", 0, 0);
              if(temp2>10)
                {
                 if((CurTime()-temp2)>3600)
                 ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-95*Point,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
                }
              else ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-95*Point,Ask+TakeProfit*Point,"macd sample",16384,0,Green);  
             }
          }
         //-------EURUSD-------
         
         //-------GBPUSD-------
         if(smb=="GBPUSD")
          {
           temp1=CheckLastOrderTime("GBPUSD",1,0);
           if(temp1>10)
             {
              if((CurTime()-temp1)>3600)
              ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-95*Point,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
             }
           else
             {
              temp2=CheckLastOrderTime("GBPUSD", 0, 0);
              if(temp2>10)
                {
                 if((CurTime()-temp2)>3600)
                 ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-95*Point,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
                }
              else ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-95*Point,Ask+TakeProfit*Point,"macd sample",16384,0,Green);  
             }
          }
         //-------GBPUSD------- 
         
          //-------USDCHF-------
         if(smb=="USDCHF")
          {
           temp1=CheckLastOrderTime("USDCHF",1,0);
           if(temp1>10)
             {
              if((CurTime()-temp1)>3600)
              ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-95*Point,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
             }
           else
             {
              temp2=CheckLastOrderTime("USDCHF", 0, 0);
              if(temp2>10)
                {
                 if((CurTime()-temp2)>3600)
                 ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-95*Point,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
                }
              else ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-95*Point,Ask+TakeProfit*Point,"macd sample",16384,0,Green);  
             }
          }
         //-------USDCHF------- 
         
         //-------USDJPY-------
         if(smb=="USDJPY")
          {
           temp1=CheckLastOrderTime("USDJPY",1,0);
           if(temp1>10)
             {
              if((CurTime()-temp1)>3600)
              ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-95*Point,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
             }
           else
             {
              temp2=CheckLastOrderTime("USDJPY", 0, 0);
              if(temp2>10)
                {
                 if((CurTime()-temp2)>3600)
                 ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-95*Point,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
                }
              else ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-95*Point,Ask+TakeProfit*Point,"macd sample",16384,0,Green);  
             }
          }
         //-------USDJPY------- 
               
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // check for short position (SELL) possibility***************************************** 
      if(MacdCurrent<0 && MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MacdCurrent<MacdPrevious && PSarCurrent>Close[0] && RSICurrent<RSIPrevious && RSICurrent<500000*Point && StocMainCurrent<StocMainPrevious && StocMainCurrent<StocSigCurrent && StocSigCurrent<StocSigPrevious && StocMainCurrent>300000*Point && StocSigCurrent>300000*Point && Close[0]<MovAvCur288&& Close[0]<MovAvCur200 && MovAvCur288<MovAvCur200 && (Close[0]-Low[0])>=2*Point && (MovAvCur13-Close[0])>1*Point) 
        {
         //-------EURUSD-------
         if(smb=="EURUSD")
          {
           temp1=CheckLastOrderTime("EURUSD",1,0);
           if(temp1>10)
             {
              if((CurTime()-temp1)>3600)
              ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+95*Point,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
             }
           else
             {
              temp2=CheckLastOrderTime("EURUSD", 0, 0);
              if(temp2>10)
                {
                 if((CurTime()-temp2)>3600)
                 ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+95*Point,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
                }
              else ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+95*Point,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
             }
          }
         //-------EURUSD-------
         
         //-------GBPUSD-------
         if(smb=="GBPUSD")
          {
           temp1=CheckLastOrderTime("GBPUSD",1,0);
           if(temp1>10)
             {
              if((CurTime()-temp1)>3600)
              ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+95*Point,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
             }
           else
             {
              temp2=CheckLastOrderTime("GBPUSD", 0, 0);
              if(temp2>10)
                {
                 if((CurTime()-temp2)>3600)
                 ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+95*Point,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
                }
              else ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+95*Point,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
             }
          }
         //-------GBPUSD-------
         
         //-------USDCHF-------
         if(smb=="USDCHF")
          {
           temp1=CheckLastOrderTime("USDCHF",1,0);
           if(temp1>10)
             {
              if((CurTime()-temp1)>3600)
              ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+95*Point,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
             }
           else
             {
              temp2=CheckLastOrderTime("GBPUSD", 0, 0);
              if(temp2>10)
                {
                 if((CurTime()-temp2)>3600)
                 ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+95*Point,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
                }
              else ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+95*Point,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
             }
          }
         //-------USDCHF-------
         
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
   // it is important to enter the market correctly, 
   // but it is more important to exit it correctly...   
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // check for opened position 
         OrderSymbol()==Symbol())  // check for symbol
        {
         if(OrderType()==OP_BUY)   // long position is opened
           {
          
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else // go to short position
           {
            
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
// the end.