//+-------------------------------------------------------------------------+
//|                                                        e-Parabolic .mq4 |
//|                            Copyright © 2011, Victor Lukashuk aka lukas1 |
//|                            Exclusive public edition. 
//|                                                             version 2.0 |
//+-------------------------------------------------------------------------+
/* Ñîâåòíèê òîðãóåò ïî èíäèêàòîðó Parabolic. 
   Èñïîëüçóåòñÿ ðàñ÷åò äàííûõ èíäèêàòîðà íà óæå ïðîøåäøåì áàðå (Ind_Bar=1).
   ====     Ïîêóïêà, òîëüêî îäèí îðäåð:     ====
 1. Èíäèêàòîð íà÷àë ðèñîâàòü ëèíèþ íèæå öåíû.
    Çíà÷åíèå áóôåðà èíäèêàòîðà íà çàäàííîì áàðå íèæå öåíû.
   ====     Ïðîäàæà, òîëüêî îäèí îðäåð:     ====
 1. Èíäèêàòîð íà÷àë ðèñîâàòü ëèíèþ âûøå öåíû.
    Çíà÷åíèå áóôåðà èíäèêàòîðà íà çàäàííîì áàðå âûøå öåíû.
   ====     Âûõîä èç ïîçèöèè:               ====
 1. Ñðàáàòûâàíèå îðäåðà Stop Loss, TakeProfit.
 2. Ïî ñèãíàëó ïðè ïåðåêëþ÷åíèè ëèíèè.   
*/
#property copyright "Copyright © 2011, lukas1"
#property link      "lukas1@ngs.ru"
#include <stdlib.mqh>   // áèáëèîòåêà îòîáðàæåíèÿ îøèáîê
extern int TakePr = 0; //òåéêïðîôèò
extern int StopLs = 0; //ñòîïëîññ 
       string Íàçâàíèå_èíäèêàòîðà  = "Parabolic";//òîëüêî âíóòðåííèé ÌÒ4
extern double Param1  = 0.2;//âíåøíèé ïàðàìåòð èíäèêàòîðà
extern double Param2  = 0.2;//âíåøíèé ïàðàìåòð èíäèêàòîðà
              // èñïðàâëåí ðàñ÷åò èíäèêàòîðà íà ñòàðøõ ÒÔ (âåð.1.2)
extern int    TimeFrm = 30;//Òàéìôðåéì íà êîòîðîì ðàñ÷èòûâàþòñÿ äàííûå
extern int    Ind_Bar = 1;//áàð, äëÿ ðàñ÷åòà èíäèêàòîðà
extern double lots = 0.1;
extern int magic = 111222;
extern int slippage = 9;
string msg;
int num_buy,num_sell,sss1,sss2,i;
int m11,m12,m21,m22; 
double m31,m32,m4; 
int br0=1, br1=1, br2=1,nn=1,stoplevel,spread;
//+-------------------------------------------------------------------------+
int init() {
   if(Digits==2 || Digits==4) nn=1;
   else
   if(Digits==3 || Digits==5) nn=10;
   
   TakePr   = TakePr   * nn; 
   StopLs   = StopLs   * nn; 
   slippage = slippage * nn;
   stoplevel= MarketInfo(Symbol(),MODE_STOPLEVEL);
   
   if(!TimeFrame() && !IsOptimization()) 
      Print("Çíà÷åíèå Òàéìôðåéìà= \""+TimeFrm+
            " ìèíóò\" âûáðàíî íå ïðàâèëüíî.");
   return(0);
}
//+-------------------------------------------------------------------------+
int start() {
   //ïðîâåðêà ïðàâèëüíîñòè TF
   if(!TimeFrame()) return(0);
   //êîððåêöèÿ îòîáðàæåíèÿ èíäèêàòîðà íà ãðàôèêå
   if(TimeFrm==0) TimeFrm=Period();
   //ïðîâåðêà ïðàâèëüíîñòè ïàðàìåòðîâ èíäèêàòîðà
   if(Param1>Param2) return(0);
      m11 = f_ind11(); //äëÿ îòêðûòèÿ ÁÀÉ
      m12 = f_ind12(); //äëÿ îòêðûòèÿ ÑÅËË
      m21 = f_ind21(); //äëÿ çàêðûòèÿ ÑÅËË
      m22 = f_ind22(); //äëÿ çàêðûòèÿ ÁÀÉ
      m31 = f_ind31(); //îòîáðàæåíèå íà ãðàôèê 
      m4  = f_ind4(); //îòîáðàæåíèå íà ãðàôèê 
   num_buy=0;num_sell=0; 
   int total = OrdersTotal();
   if (total>0)
   for (i = total - 1; i >= 0; i--) 
     {OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
        {if(OrderType() == OP_BUY)
           {num_buy++;
            if(m22 > 0 ) 
              {if(Close_Buy()==true) num_buy--;}
           }
         if(OrderType() == OP_SELL) 
           {num_sell++;
            if(m21 > 0 ) 
              {if(Close_Sell()==true) num_sell--;}
           }
        }
     }
   text();
   
   if(m11 > 0 && m22 == 0 && num_buy==0 && br1<Bars ) 
      Open_Buy();
   if(m12 > 0 && m21 == 0 && num_sell==0 && br2<Bars ) 
      Open_Sell();
   return(0);
}
//+-------------------------------------------------------------------------+
int f_ind11() {//äëÿ îòêðûòèÿ ÁÀÉ
   
   int    result = 0;
   double ind11,dPrc1;
   //Parabolic 
   ind11 = iSAR(Symbol(), TimeFrm, 
                  Param1,Param2, 
                  Ind_Bar);//ïî 1 áàðó 
   dPrc1 = iHigh(Symbol(), TimeFrm, Ind_Bar);             
   if(ind11 > 0 && ind11 < dPrc1-13*nn*Point )
      result = 1;
   
   return(result);
}
//+-------------------------------------------------------------------------+
int f_ind12() {//äëÿ îòêðûòèÿ ÑÅËË
   
   int    result = 0;
   double ind11,ind12,dPrc1;
   //Parabolic 
   ind11 = iSAR(Symbol(), TimeFrm, 
                  Param1,Param2, 
                  Ind_Bar);//ïî 1 áàðó 
   dPrc1 = iLow(Symbol(), TimeFrm, Ind_Bar);             
   if(ind11 > 0 && ind11 > dPrc1+13*nn*Point )
      result = 1;
   
   return(result);
}
//+-------------------------------------------------------------------------+
int f_ind21() {//äëÿ çàêðûòèÿ ÑÅËË
   
   int    result = 0;
   double ind11,dPrc1;
   //Parabolic 
   ind11 = iSAR(Symbol(), TimeFrm, 
                  Param1,Param2, 
                  Ind_Bar);//ïî 1 áàðó 
   dPrc1 = iHigh(Symbol(), TimeFrm, Ind_Bar);             
   if(ind11 > 0 && ind11 < dPrc1- 3*nn*Point )
      result = 1;
   
   return(result);
}
//+-------------------------------------------------------------------------+
int f_ind22() {//äëÿ çàêðûòèÿ ÁÀÉ
   
   int    result = 0;
   double ind11,ind12,dPrc1;
   //Parabolic 
   ind11 = iSAR(Symbol(), TimeFrm, 
                  Param1,Param2, 
                  Ind_Bar);//ïî 1 áàðó 
   dPrc1 = iLow(Symbol(), TimeFrm, Ind_Bar);             
   if(ind11 > 0 && ind11 > dPrc1+ 3*nn*Point )
      result = 1;
   
   return(result);
}
//+-------------------------------------------------------------------------+
double f_ind31() {//îòîáðàæåíèå íà ãðàôèê èíäèêàòîðà
   
   //Parabolic 
   int bb1=iBarShift(Symbol(),TimeFrm,iTime(Symbol(),TimeFrm, 
                  Ind_Bar),false);
   double ind11 = iSAR(Symbol(), TimeFrm, 
                  Param1,Param2, 
                  bb1);//ïî 1 áàðó 
   string ttt = StringConcatenate("a",Time[0]," Parabolic");
   if(!IsOptimization() && ObjectFind(ttt)<0) 
     {
      int smeschenie = 0;
      ObjectCreate(ttt,OBJ_ARROW,0,Time[Ind_Bar*TimeFrm/Period()],ind11); 
      ObjectSet(ttt,OBJPROP_ARROWCODE,4) ;
     }
                    
   return(ind11);
}
//+-------------------------------------------------------------------------+
double f_ind4() {//îòîáðàæåíèå íà ãðàôèê íîìåðà áàðà äëÿ ðàñ÷åòà èíäèêàòîðà 
   
   //Parabolic 
   int bb1=iBarShift(Symbol(),TimeFrm,iTime(Symbol(),TimeFrm, 
                  Ind_Bar),false);
   return(bb1);
}
//+-------------------------------------------------------------------------+
double nd0(double DOUBLE){return(NormalizeDouble(DOUBLE,Digits));}
//+-------------------------------------------------------------------------+
int Open_Buy() {
   double stop=0,take=0;
   spread=Ask-Bid;
   if(StopLs>0) 
      stop = MathMin(Ask-StopLs*Point,Bid-MathMax(stoplevel,spread)*Point);
   if(TakePr>0) 
      take = MathMax(Ask+TakePr*Point,Ask+MathMax(stoplevel,spread)*Point);
   int ticket = OrderSend(Symbol(), OP_BUY, lots, nd0(Ask), slippage, 
                nd0(stop), nd0(take),
                WindowExpertName()+" "+Symbol()+" "+Period()+" min", 
                magic, 0, Blue);
   if(ticket < 0) 
     {Print("Oøèáêà îòêðûòèÿ ÁÀÉ: ",ErrorDescription(GetLastError())); 
      Print("Öåíà îòêðûòèÿ ÁÀÉ = ", Ask);
      Print("SL ÁÀÉ = ", stop);
      Print("TP ÁÀÉ = ", take);
     }
   else br1 = Bars;
   return(ticket);
  }
//+-------------------------------------------------------------------------+
int Open_Sell() {
   double stop=0,take=0;
   if(StopLs>0) 
      stop = MathMax(Bid+StopLs*Point,Ask+MathMax(stoplevel,spread)*Point);
   if(TakePr>0) 
      take = MathMin(Bid-TakePr*Point,Bid-MathMax(stoplevel,spread)*Point);
   int ticket = OrderSend(Symbol(), OP_SELL, lots, nd0(Bid), slippage, 
                nd0(stop), nd0(take),
                WindowExpertName()+" "+Symbol()+" "+Period()+" min",
                magic, 0, Red);
   if(ticket < 0) 
     {Print("Oøèáêà îòêðûòèÿ ÑÅËË: ",ErrorDescription(GetLastError())); 
      Print("Öåíà îòêðûòèÿ ÑÅËË = ", Bid);
      Print("SL ÑÅËË = ", stop);
      Print("TP ÑÅËË = ", take);
     }
   else br2 = Bars;
   return(ticket);
  }
//+-------------------------------------------------------------------------+
bool Close_Buy(){
   bool make = OrderClose(OrderTicket(),OrderLots(),nd0(OrderClosePrice()), 
               slippage, Blue);
   if(make==false)
     {Print("Oøèáêà çàêðûòèÿ ÁÀÉ: ",ErrorDescription(GetLastError()));
     }
   return(make);    
  }
//+-------------------------------------------------------------------------+
bool Close_Sell(){
   bool make = OrderClose(OrderTicket(),OrderLots(),nd0(OrderClosePrice()),
               slippage, Red);
   if(make==false)
     {Print("Oøèáêà çàêðûòèÿ ÑÅËË: ",ErrorDescription(GetLastError()));
     }
   return(make);    
  }
//+-------------------------------------------------------------------------+
bool TimeFrame(){
   bool valid = false;
   int p1 = TimeFrm;
   if(p1==0 || p1==PERIOD_M1 || 
      p1==PERIOD_M5  || p1==PERIOD_M15 || 
      p1==PERIOD_M30 || p1==PERIOD_H1 || 
      p1==PERIOD_H4  || p1==PERIOD_D1 || 
      p1==PERIOD_W1  || p1==PERIOD_MN1 
      ) valid = true;
   return(valid);   
  }
//+-------------------------------------------------------------------------+
void text () {
   if(IsOptimization()==false) {
      msg="";
      int num1=1;
      if(MathMod(10*Param1,1)>0 ) num1=2;
      if(MathMod(100*Param1,1)>0 ) num1=3;
      int num2=1;
      if(MathMod(10*Param2,1)>0 ) num2=2;
      if(MathMod(100*Param2,1)>0 ) num2=3;
      msg=msg+"\n"+"Èíäèêàòîð \""      +Íàçâàíèå_èíäèêàòîðà+"\" ( "
             +DoubleToStr(Param1, num1)+"; "+DoubleToStr(Param2, num2)+" )";
      int timefr = TimeFrm;
      if(TimeFrm==0) timefr= Period();
      msg=msg+"\n"+"Òàéìôðåéì äëÿ \""
             +Íàçâàíèå_èíäèêàòîðà+"\" = "   +timefr+" min";
      msg=msg+"\n"+"Çíà÷åíèå èíä1 \""  +Íàçâàíèå_èíäèêàòîðà+"\" íà "
             +Ind_Bar+" áàðå= "+DoubleToStr(m31, Digits);
      msg=msg+"\n"+"Çíà÷åíèå èíä1 \""  +Íàçâàíèå_èíäèêàòîðà+"\" íà "
             +(Ind_Bar+1)+" áàðå= "+DoubleToStr(m32, Digits);
      msg=msg+"\n"+"Ðàñ÷åò èíä1 íà ñòàðøåì ÒÔ - íîìåð áàðà= "
             +DoubleToStr(m4, 0);
      msg=msg+"\n"+"Çíà÷åíèå òåêóùåé öåíû "  +DoubleToStr(Bid, Digits);
      if(num_buy==0 && num_sell==0)
        {msg=msg+"\n"+"Íåò îðäåðîâ äëÿ êîíòðîëÿ";}
      if(num_buy>0)
        {msg=msg+"\n"+"Îòêðûòî îðäåðîâ ÁÀÉ "+num_buy;}
      if(num_sell>0)
        {msg=msg+"\n"+"Îòêðûòî îðäåðîâ ÑÅËË "+num_sell;}
      Comment(msg);
     }
  }
//+-------------------------------------------------------------------------+
             
            
            
            
Comments