Gartley Reversal Auto





//+------------------------------------------------------------------+
//|                                        Gartley Reversal Auto.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                         http://forum.fxexpert.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://forum.fxexpert.ru"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Yellow

extern int BarsCount=300;
extern int depth=16;
extern int deviation=5;
extern int backstep=3;
extern int maf=1;
extern int info=0;
extern int FontSize=8;
extern int DeleteType=0; /*0-delete all objects, 1-keet all*, 2-keep targets, 3-keep targets and reverses*/

double    PointX=0;
double    PointA=0;
double    PointB=0;
double    PointC=0;
double    PointD=0;

double ReversalRangeMax=0;
double ReversalRangeMin=0;

double D_Revers1=0;
double D_Revers3=0;
double D_Revers2=0;

double Target1=0;
double Target3=0;
double Target2=0;

double    zz=0;
double    zzp=0;

int shift=0, Bars_=200, k=0, cnt=0;
bool ft=true; 
bool ftp=true;

double RevPoint[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   //IndicatorBuffers(1);
   SetIndexStyle(0,DRAW_ARROW,EMPTY,EMPTY,Yellow);
   SetIndexArrow(0, 159);
   SetIndexBuffer(0,RevPoint); 
   SetIndexLabel(0, "ZigZagE");  
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   if (DeleteType==0)
   {
    ObjectDelete("D_Revers1");
    ObjectDelete("D_Revers2");
    ObjectDelete("D_Revers3");
    ObjectDelete("D_Revers1_txt");
    ObjectDelete("D_Revers2_txt");
    ObjectDelete("D_Revers3_txt");
   
    ObjectDelete("ReversalRangeMax");
    ObjectDelete("ReversalRangeMin");
    ObjectDelete("ReversalRangeMax_txt");
    ObjectDelete("ReversalRangeMin_txt");
   
    ObjectDelete("Target1");
    ObjectDelete("Target2");
    ObjectDelete("Target3");
    ObjectDelete("Target1_txt");
    ObjectDelete("Target2_txt");
    ObjectDelete("Target3_txt");
   }
   if (DeleteType==2)
   {
    ObjectDelete("D_Revers1");
    ObjectDelete("D_Revers2");
    ObjectDelete("D_Revers3");
    ObjectDelete("D_Revers1_txt");
    ObjectDelete("D_Revers2_txt");
    ObjectDelete("D_Revers3_txt");
   
    ObjectDelete("ReversalRangeMax");
    ObjectDelete("ReversalRangeMin");
    ObjectDelete("ReversalRangeMax_txt");
    ObjectDelete("ReversalRangeMin_txt");
   
   }
if (DeleteType==3)
   {
    ObjectDelete("D_Revers1");
    ObjectDelete("D_Revers2");
    ObjectDelete("D_Revers3");
    ObjectDelete("D_Revers1_txt");
    ObjectDelete("D_Revers2_txt");
    ObjectDelete("D_Revers3_txt");
   }   
   
   
//----
   Comment("");
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
//---- 
   int    counted_bars=IndicatorCounted();
   int limit; // îãðàíè÷èòåëü ðàñ÷åòîâ
//---- 
   if (counted_bars==0)   limit=Bars-1; // ïîñ÷èòàííûõ áàðîâ åùå íåò, áóäåò ñ÷èòàòü ñ ñàìîãî íà÷àëà
   if (counted_bars>0)   limit=Bars-counted_bars-1; // âû÷òåì èç ÷èñëà äîñòóïíûõ áàðîâ êîëè÷åñòâî 
   //ïîñ÷èòàííûõ áàðîâ è óìåíüøèì íà åäèíèöó

   if (ftp) {Comment(" "); ftp=false; }
   
   for(shift=limit; shift>0; shift--)   
   {
      if (maf==0) {PointX=0;}
      zz=iCustom(NULL, 0, "ZigZag",depth,deviation,backstep,0,shift);
      if ((ft) || (zz!=0)) 
      {
         k=0;
         for(cnt = shift; cnt<BarsCount; cnt++)
         {
            zzp=iCustom(NULL, 0, "ZigZagE",depth,deviation,backstep,0,cnt);
            if ((zzp!=0) && (k==4) && (maf==1)) {PointX=zzp;RevPoint[cnt]=zzp;break;}
            if ((zzp!=0) && (k==3)) {k=k+1;PointA=zzp;RevPoint[cnt]=zzp;}
            if ((zzp!=0) && (k==2)) {k=k+1;PointB=zzp;RevPoint[cnt]=zzp;}
            if ((zzp!=0) && (k==1)) {k=k+1;PointC=zzp;RevPoint[cnt]=zzp;}
            if ((zzp!=0) && (k==0)) {k=k+1;PointD=zzp;RevPoint[cnt]=zzp;}
             
         }
       
      }
       
   }
  
ReversalRangeMax=NormalizeDouble(PointA+(PointX-PointA)*0.786,4);
ReversalRangeMin=NormalizeDouble(PointA+(PointX-PointA)*0.618,4);

D_Revers1=NormalizeDouble(PointC+(PointB-PointA),4);
D_Revers3=NormalizeDouble(PointC+(PointB-PointC)*1.618,4);
D_Revers2=NormalizeDouble(PointC+(PointB-PointC)*1.272,4);

Target1=NormalizeDouble(PointD-(PointD-PointC)*0.618,4);
Target3=PointD-(PointB-PointC);
Target2=NormalizeDouble(PointD-(PointD-PointC)*0.786,4);

if ((zz!=0) || (ft))
{

  if (ObjectFind("ReversalRangeMax") != 0) 
         {
            ObjectCreate("ReversalRangeMax",OBJ_HLINE,0,Time[25],ReversalRangeMax,Time[1],ReversalRangeMax);
            ObjectCreate("ReversalRangeMax_txt",OBJ_TEXT,0,Time[40],ReversalRangeMax,Time[1],ReversalRangeMax);
            ObjectSet("ReversalRangeMax",OBJPROP_COLOR,Red);
            ObjectSet("ReversalRangeMax",OBJPROP_WIDTH,1);
            ObjectSet("ReversalRangeMax",OBJPROP_STYLE,STYLE_SOLID);
            ObjectSetText("ReversalRangeMax_txt", "ReversalRangeMax "+DoubleToStr(ReversalRangeMax,4), FontSize, "Tahoma", Red);
         }
      else 
         {
            ObjectMove("ReversalRangeMax", 0,Time[1],ReversalRangeMax);
            ObjectMove("ReversalRangeMax_txt", 0,Time[40],ReversalRangeMax);
         }
      if (ObjectFind("ReversalRangeMin") != 0) 
         {
            ObjectCreate("ReversalRangeMin",OBJ_HLINE,0,Time[25],ReversalRangeMin,Time[1],ReversalRangeMin);
            ObjectCreate("ReversalRangeMin_txt",OBJ_TEXT,0,Time[40],ReversalRangeMin,Time[1],ReversalRangeMin);
            ObjectSet("ReversalRangeMin",OBJPROP_COLOR,Red);
            ObjectSet("ReversalRangeMin",OBJPROP_WIDTH,1);
            ObjectSet("ReversalRangeMin",OBJPROP_STYLE,STYLE_SOLID);
            ObjectSetText("ReversalRangeMin_txt", "ReversalRangeMin "+DoubleToStr(ReversalRangeMin,4), FontSize, "Tahoma", Red);
         }
      else 
         {
            ObjectMove("ReversalRangeMin", 0,Time[1],ReversalRangeMin);
            ObjectMove("ReversalRangeMin_txt", 0,Time[40],ReversalRangeMin);
         }
      if (ObjectFind("D_Revers1") != 0) 
         {
            ObjectCreate("D_Revers1",OBJ_HLINE,0,Time[25],D_Revers1,Time[1],D_Revers1);
            ObjectCreate("D_Revers1_txt",OBJ_TEXT,0,Time[25],D_Revers1,Time[1],D_Revers1);
            ObjectSet("D_Revers1",OBJPROP_COLOR,Blue);
            ObjectSet("D_Revers1",OBJPROP_WIDTH,1);
            ObjectSet("D_Revers1",OBJPROP_STYLE,STYLE_DOT);
            ObjectSetText("D_Revers1_txt", "D_Revers1 "+DoubleToStr(D_Revers1,4), FontSize, "Tahoma", Blue);
         }
      else 
         {
            ObjectMove("D_Revers1", 0,Time[1],D_Revers1);
            ObjectMove("D_Revers1_txt", 0,Time[25],D_Revers1);
         }
      if (ObjectFind("D_Revers2") != 0) 
         {
            ObjectCreate("D_Revers2",OBJ_HLINE,0,Time[25],D_Revers2,Time[1],D_Revers2);
            ObjectCreate("D_Revers2_txt",OBJ_TEXT,0,Time[25],D_Revers2,Time[1],D_Revers2);
            ObjectSet("D_Revers2",OBJPROP_COLOR,LimeGreen);
            ObjectSet("D_Revers2",OBJPROP_WIDTH,1);
            ObjectSet("D_Revers2",OBJPROP_STYLE,STYLE_DOT);
            ObjectSetText("D_Revers2_txt", "D_Revers2 "+DoubleToStr(D_Revers2,4), FontSize, "Tahoma", LimeGreen);
         }
      else 
         {
            ObjectMove("D_Revers2", 0,Time[1],D_Revers2);
            ObjectMove("D_Revers2_txt", 0,Time[25],D_Revers2);
         }
      if (ObjectFind("D_Revers3") != 0) 
         {
            ObjectCreate("D_Revers3",OBJ_HLINE,0,Time[25],D_Revers3,Time[1],D_Revers3);
            ObjectCreate("D_Revers3_txt",OBJ_TEXT,0,Time[25],D_Revers3,Time[1],D_Revers3);
            ObjectSet("D_Revers3",OBJPROP_COLOR,Yellow);
            ObjectSet("D_Revers3",OBJPROP_WIDTH,1);
            ObjectSet("D_Revers3",OBJPROP_STYLE,STYLE_DOT);
            ObjectSetText("D_Revers3_txt", "D_Revers3 "+DoubleToStr(D_Revers3,4), FontSize, "Tahoma", Yellow);
         }
      else 
         {
            ObjectMove("D_Revers3", 0,Time[1],D_Revers3);
            ObjectMove("D_Revers3_txt", 0,Time[25],D_Revers3);
         }
      if (ObjectFind("Target1") != 0) 
         {
            ObjectCreate("Target1",OBJ_HLINE,0,Time[25],Target1,Time[1],Target1);
            ObjectCreate("Target1_txt",OBJ_TEXT,0,Time[10],Target1,Time[1],Target1);
            ObjectSet("Target1",OBJPROP_COLOR,Goldenrod);
            ObjectSet("Target1",OBJPROP_WIDTH,2);
            ObjectSet("Target1",OBJPROP_STYLE,STYLE_SOLID);
            ObjectSetText("Target1_txt", "Target1 "+DoubleToStr(Target1,4), FontSize, "Tahoma", Goldenrod);
         }
      else 
         {
            ObjectMove("Target1", 0,Time[1],Target1);
            ObjectMove("Target1_txt", 0,Time[10],Target1);
         }
      if (ObjectFind("Target2") != 0) 
         {
            ObjectCreate("Target2",OBJ_HLINE,0,Time[25],Target2,Time[1],Target2);
            ObjectCreate("Target2_txt",OBJ_TEXT,0,Time[10],Target2,Time[1],Target2);
            ObjectSet("Target2",OBJPROP_COLOR,Goldenrod);
            ObjectSet("Target2",OBJPROP_WIDTH,2);
            ObjectSet("DTarget2",OBJPROP_STYLE,STYLE_SOLID);
            ObjectSetText("Target2_txt", "Target2 "+DoubleToStr(Target2,4), FontSize, "Tahoma", Goldenrod);
         }
      else 
         {
            ObjectMove("Target2", 0,Time[1],Target2);
            ObjectMove("Target2_txt", 0,Time[10],Target2);
         }
      if (ObjectFind("Target3") != 0) 
         {
            ObjectCreate("Target3",OBJ_HLINE,0,Time[25],Target3,Time[1],Target3);
            ObjectCreate("Target3_txt",OBJ_TEXT,0,Time[10],Target3,Time[1],Target3);
            ObjectSet("Target3",OBJPROP_COLOR,Goldenrod);
            ObjectSet("Target3",OBJPROP_WIDTH,2);
            ObjectSet("Target3",OBJPROP_STYLE,STYLE_SOLID);
            ObjectSetText("Target3_txt", "Target3 "+DoubleToStr(Target3,4), FontSize, "Tahoma", Goldenrod);
         }
      else 
         {
            ObjectMove("Target3", 0,Time[1],Target3);
            ObjectMove("Target3_txt", 0,Time[10],Target3);
         }
      Comment("Dot B retrace of X-A: ",(PointB-PointA)/(PointX-PointA),"\n",
              "Dot C retrace of X-A: ",(PointC-PointA)/(PointX-PointA),"\n",
              "Dot C retrace of A-B: ",(PointB-PointC)/(PointB-PointA));         
  
 
}
   return(0);
  }
//+------------------------------------------------------------------+



Sample





Analysis



Market Information Used:


Series array that contains open time of each bar


Indicator Curves created:

Implements a curve of type DRAW_ARROW

Indicators Used:




Custom Indicators Used:
ZigZag
ZigZagE

Order Management characteristics:

Other Features: