XPoints





//+------------------------------------------------------------------+
//|                                                      XPoints.mq4 |
//|                               Copyright © 2007, RedPlumSoft, Inc |
//|                                       http://www.redplumsoft.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, RedPlumSoft, Inc"
#property link      "http://www.redplumsoft.com"

//---- indicator props
#define Buffer_Count 5
#define Buffer_Lines 5

#property indicator_chart_window
#property indicator_buffers Buffer_Lines

#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Blue
#property indicator_color4 Red
#property indicator_color5 Yellow

//---- Âõîäíûå ïàðàìåòðû
extern int per=3;            
extern double xrate=1.5;            
extern double xsize=5.0;            
extern double xslope=0.0;            
extern double xminupdn=10.0;         

extern int xhour1=9;
extern int xhour2=19;
extern int xindent=15;

double BfXB[],BfXS[];
double BufD[],BufU[],BufM[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   int j=0;

   IndicatorBuffers(Buffer_Count);
   IndicatorShortName("XPoints");

   SetIndexBuffer(j,BfXB);    SetIndexStyle(j,DRAW_ARROW,0,1);  SetIndexLabel(j,"X up");  SetIndexArrow(j,233);  SetIndexEmptyValue(j, 0.0); j++;
   SetIndexBuffer(j,BfXS);    SetIndexStyle(j,DRAW_ARROW,0,1);  SetIndexLabel(j,"X dn");  SetIndexArrow(j,234);  SetIndexEmptyValue(j, 0.0); j++;

   SetIndexBuffer(j,BufD);    SetIndexStyle(j,DRAW_LINE,2);     SetIndexLabel(j,"Lower");    j++;
   SetIndexBuffer(j,BufU);    SetIndexStyle(j,DRAW_LINE,2);     SetIndexLabel(j,"Upper");    j++;
   SetIndexBuffer(j,BufM);    SetIndexStyle(j,DRAW_LINE,2);     SetIndexLabel(j,"Middle");   j++;

   return(0);
  }
  
//+------------------------------------------------------------------+
//| Custom indicator start function                                  |
//+------------------------------------------------------------------+
int start()
  {
   int SH,CB=IndicatorCounted(),limit;
   
   if(CB<0) return(-1); 

   limit = Bars-CB;

   if(CB>0) 
      limit++; 
   else
     {
      ArrayInitialize(BfXB,0.0);
      ArrayInitialize(BfXS,0.0);
      ArrayInitialize(BufD,0.0);
      ArrayInitialize(BufU,0.0);
      ArrayInitialize(BufM,0.0);
     }

   // check params
   
   if(xrate<1) xrate=1;
   if(xsize<3) xsize=3;
   if(xindent<3) xindent=3;   

   if(xhour1<0) xhour1=0;
   if(xhour1>23) xhour1=23;
   if(xhour2<=xhour1) xhour2=xhour1+1;
   if(xhour2==0) xhour2=24;
   
   // indicator

   double MaxP,MinP,ArrowB,ArrowS; 
   double xrate0,xrate1;
   
   double HeightHL0,HeightHL1,HeightCO0,HeightCO1,HeightUD;
   double CenterHL0,CenterHL1,CenterCO0,CenterCO1;
   
   int th;
   
   //double CurWPR;

   for(SH=limit-1; SH>=0; SH--) 
     {
      BfXB[SH] = 0.0;
      BfXS[SH] = 0.0;
     
      MinP = Low[iLowest(NULL,0,MODE_LOW,per,SH)];
      MaxP = High[iHighest(NULL,0,MODE_HIGH,per,SH)];
      
      BufD[SH] = MinP;  
      BufU[SH] = MaxP;  
      BufM[SH] = (MinP+MaxP)/2;  

      HeightUD = (MaxP-MinP)/Point;
      if(HeightUD < xminupdn) continue;

      // check time 
      
      th = TimeHour(iTime(NULL, 0, SH));
      if(th < xhour1 || th > xhour2) continue; 
      
      // arrow positions

      ArrowB = Low[SH] - xindent*Point; 
      ArrowS = High[SH] + xindent*Point;

      // signal measurements

      HeightHL0 = (High[SH+0]-Low[SH+0])/Point; 
      HeightHL1 = (High[SH+1]-Low[SH+1])/Point;

      HeightCO0 = (Close[SH+0]-Open[SH+0])/Point; 
      HeightCO1 = (Close[SH+1]-Open[SH+1])/Point; 

      CenterHL0 = (High[SH+0]+Low[SH+0])/2;
      CenterHL1 = (High[SH+1]+Low[SH+1])/2;
      
      CenterCO0 = (Open[SH+0]+Close[SH+0])/2; 
      CenterCO1 = (Open[SH+1]+Close[SH+1])/2; 

      // check if X-point      

      if(HeightHL1 < xsize) continue; 

      xrate1 = HeightCO1/HeightHL1;
      if(MathAbs(xrate1) > 1/xrate) continue; 
      
      // check if there is a trend
     
      if(true 
         && Low[SH+1]  <= BufD[SH+1] 
         && High[SH+1] <  BufU[SH+1]
         && Low[SH+0]  >= Low[SH+1] + xslope*Point

         && (CenterCO1  <= BufM[SH+1] 
             || CenterCO0 >= CenterCO1 + xslope*Point 
             || CenterHL0 >= CenterHL1 + xslope*Point)
         ) 
         BfXB[SH] = ArrowB; 

      if(true 
         && High[SH+1] >= BufU[SH+1]
         && Low[SH+1]  >  BufD[SH+1] 
         && High[SH+0] <= High[SH+1] - xslope*Point  
         
         && (CenterCO1  >= BufM[SH+1] 
             || CenterCO0 <= CenterCO1 - xslope*Point 
             || CenterHL0 <= CenterHL1 - xslope*Point)
         ) 
         BfXS[SH] = ArrowS; 
     }
     
   return(0);
  }
//+------------------------------------------------------------------+



Sample





Analysis



Market Information Used:

Series array that contains the lowest prices of each bar
Series array that contains the highest prices of each bar
Series array that contains close prices for each bar
Series array that contains open prices of each bar


Indicator Curves created:

Implements a curve of type DRAW_ARROW

Implements a curve of type DRAW_LINE

Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features: