Barishpolets Channels v1.0.P_v2

Author:
Barishpolets Channels v1.0.P_v2
Price Data Components
Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
Barishpolets Channels v1.0.P_v2
//+------------------------------------------------------------------+
//|                                        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);
  }
//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---