Barishpolets Channels v1.0.P





/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                        Barishpolets Channels.mq4 |
//|                                                                  |
//| Conversion from MT3 by Mike & ...                                |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- Inputs
extern int  CalcBars=240;     //number of bars counted. 0-all bars counted
extern int  BarsForFract=0;	//bars of fractal's "shoulder"
//---- Variables
int    B1=-1,B2=-1,UpDown=0,CurrentBar=0,limit,k,i,i2,NumBars;
int    BFF=0,ishift=0,LowBar,HighBar,BMax,BMin,start;
double P1=0,P2=0,PP=0,Step=0,iprice=0,PMax,PMin,price;
//---- Buffers
double Buffer1[];
//+------------------------------------------------------------------+
int init()
{
//---- indicators
   IndicatorBuffers(1);
   SetIndexBuffer(0,Buffer1);
   SetIndexStyle(0,DRAW_ARROW,EMPTY);
   SetIndexArrow(0,164);
//---- selections
   if (BarsForFract>0) {BFF=BarsForFract;}
   else
   {
	   switch (Period())
	   {
		   case 1:     BFF=12; break;
		   case 5:     BFF=48; break;
		   case 15:    BFF=24; break;
		   case 30:    BFF=24; break;
		   case 60:    BFF=24; break;
		   case 240:   BFF=24; break;
		   case 1440:  BFF=12; break;
		   case 10080: BFF=12; break;
		   default:	   return(-1);
	   }
   }
//+----
   return(0);
}
//+------------------------------------------------------------------+
int deinit()
{
   for(k=0; k<limit; k++) 
   {
      Buffer1[k]=0.0;
   }
   ObjectDelete("TL1");
   ObjectDelete("TL2");
   ObjectDelete("MIDL");
//----
   return(0);
}
//+------------------------------------------------------------------+
int start()
{
//---- check inputs
   if (Bars<=CalcBars || CalcBars<1)
	{
		Print("ERROR: Bars("+Bars+")<=CalcBars("+CalcBars+") or CalcBars("+CalcBars+")<1");
		return(-1);
	}
//----
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) {Print("Error at counted_bars..."); return (-1);}
//---- Calc. area
   if (CalcBars==0 || CalcBars>Bars) NumBars=Bars; else NumBars=CalcBars;
   limit=NumBars-1;
//----
   if(counted_bars<1)
   {
      for(k=limit; k>=0; k--) 
      {
         Buffer1[k]=0.0;
      }
   }
   if(counted_bars>0) counted_bars--;
//----
CurrentBar=2; //start counting from the third bar as the fractal is "pinned down"
B1=-1; B2=-1; UpDown=0;
while ((B1==-1 || B2==-1) && CurrentBar<NumBars)
{
	//UpDown=1 means the 1st fractal has been found on top,
	//UpDown=-1 means the 1st fractal has been found at the bottom,
	//UpDown=0 means a fractal has not yet been found
	//Â1 è Â2 - base line fractal bars
	//Ð1 è Ð2 - prices for this line
//
// Low section
//
	if (UpDown<1 && CurrentBar==Lowest(NULL,0,MODE_LOW,BFF*2+1,CurrentBar))
	{
		if (UpDown==0) { UpDown=-1; B1=CurrentBar; P1=Low[B1];}
		else				{ B2=CurrentBar; P2=Low[B2];}
	}
//
// High section
//
	if (UpDown>-1 && CurrentBar==Highest(NULL,0,MODE_HIGH,BFF*2+1,CurrentBar))
	{
		if (UpDown==0) { UpDown=1; B1=CurrentBar; P1=High[B1];}
		else				{ B2=CurrentBar; P2=High[B2];}
	}
	CurrentBar++;
} // end while
//----
if	(B1==-1 || B2==-1) return(-1); // No fractals have been found in 300 bar range 8-)
Step=(P2-P1)/(B2-B1);             //step calculated, if positive then the channel is descending 
P1=P1-B1*Step; B1=0;              //price and the 1st bar are being restored to zero
//
//Reference point for opposite trendline
//
ishift=0; iprice=0;
if (UpDown==1)
{
	PP=Low[2]-2*Step;
	for (i=3; i<=B2; i++)
	{
		if (Low[i]<PP+Step*i) {PP=Low[i]-i*Step;}
		if (Low[0]<PP) {ishift=0; iprice=PP;}
		if (Low[1]<PP+Step) {ishift=1; iprice=PP+Step;}
		if (High[0]>P1) {ishift=0; iprice=P1;}
		if (High[1]>P1+Step) {ishift=1; iprice=P1+Step;}
   }
}
else
{
	PP=High[2]-2*Step;
	for (i=3; i<=B2; i++)
	{
		if (High[i]>PP+Step*i) {PP=High[i]-i*Step;}   
		if (Low[0]<P1) {ishift=0; iprice=P1;}
		if (Low[1]<P1+Step) {ishift=1; iprice=P1+Step;}
		if (High[0]>PP) {ishift=0; iprice=PP;}
		if (High[1]>PP+Step) {ishift=1; iprice=PP+Step;}
   }
}
//----
//Last price and bar to be set on ÀÂ to draw the line to the upmost right
P2=P1+NumBars*Step;
B1=Time[B1]; B2=Time[NumBars];
// 0 (zero) means the channel line remains intact, dot means the channel is broken
Buffer1[ishift]=iprice;
//----
ObjectCreate("TL1",OBJ_TREND,0,B2,PP+Step*NumBars,B1,PP);
ObjectCreate("TL2",OBJ_TREND,0,B2,P2,B1,P1);
ObjectCreate("MIDL",OBJ_TREND,0,B2,(P2+PP+Step*NumBars)/2,B1,(P1+PP)/2);            
//----
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 open time of each bar


Indicator Curves created:


Implements a curve of type DRAW_ARROW

Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features: