Donchian Channels - Generalized version

Download script
Author: Copyright � 2005, Luis Guilherme Damiani
Donchian Channels - Generalized version

This script functions as a specialized charting tool designed to visualize price boundaries over specific timeframes. It identifies the historical range of a financial asset and projects those boundaries onto your chart, helping traders identify "channels" or corridors where the price has recently traded.

How the Logic Works

The core objective of this script is to calculate a high and low boundary based on a user-defined number of previous candles (periods). By looking at this historical window, it determines the upper and lower limits of the market's activity.

1. Defining the Extremes The tool allows for three different ways to identify these boundaries, depending on how strictly you want to measure the price action:

  • Standard Extremes: It looks purely at the absolute highest and lowest points reached during the period.
  • Open-Price Focus: Instead of looking at the tips of the candles, it focuses on the opening prices of the candles that contained those highs and lows. This is often used to find more "stable" areas of price concentration.
  • Median Extremes: It calculates a middle point between the opening price and the extreme high/low of the period. This provides a balanced view of the range.

2. Calculating the Margins Once the tool identifies the core high and low points, it applies a "Margin" percentage. This allows you to slightly expand or contract the lines. For example, if you want the boundary to sit slightly outside the actual price action, you can adjust this margin to create a buffer zone.

3. Visual Projection The script then draws two distinct lines on your chart:

  • An Upper Boundary (the ceiling)
  • A Lower Boundary (the floor)

By observing these lines, traders can see where the price is currently reacting relative to its recent history. If the price stays within these lines, it suggests a range-bound market; if it breaks through them, it may signal a shift in trend or a breakout.

Key Customization Options

  • Periods: Controls how far back into the past the script looks to find the highs and lows.
  • Extremes: Determines which specific price point (High, Open, or Median) is used for the calculation.
  • Margins: Adjusts the width of the channel by a small percentage.
  • Advance: Allows you to shift the position of the lines forward or backward on the timeline.
Miscellaneous
Implements a curve of type %1
18 Views
0 Downloads
0 Favorites
Donchian Channels - Generalized version
//+------------------------------------------------------------------+
//|                      Donchian Channels - Generalized version.mq4 |
//|                         Copyright © 2005, Luis Guilherme Damiani |
//|                                      http://www.damianifx.com.br |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Luis Guilherme Damiani"
#property link      "http://www.damianifx.com.br"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Magenta
#property indicator_color2 SteelBlue

//Periods: number of bars used for calculating the Donchian channel 
//Extremes: if 1 uses the highest high and the lowest low -> I do not recomend using this
//			if 0 uses the open of the extremes bar -> the open point of a bar (as well as the close
//				are the points of maximum probability of concentration of the prices during the bar
//			if 3 uses the median point most extreme open and lowest low or highest high
//Margins: is the percent of the channel subtrated from the channel border before printing it, negative values are allowed
//Advance: the numbers of bars ahead
//---- input parameters
extern int       Periods=24;
extern int       Extremes=3;
extern int       Margins=-2;
extern int       Advance=0;
extern int       max_bars=700;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE,1,2);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_LINE,1,2);
   SetIndexBuffer(1,ExtMapBuffer2);

   IndicatorShortName("DoC("+Periods+")");

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
   int    fixed_bars=IndicatorCounted();
   //---- 
   
   //int shift=0;//, cnt(0), loopbegin(0);
   double smin=0, smax=0, SsMax=0, SsMin=0;
   //Variables : bar(0), prevbars(0), start(0), cs(0), prevcs(0),commodt(0);
   
   if(max_bars == 0) max_bars = Bars;

   for (int shift=0;shift< max_bars;shift++)
   {
	  if (Extremes ==1)
	  {
		 SsMax = High[Highest(NULL,0,MODE_HIGH,Periods,shift)];
		 SsMin = Low[Lowest(NULL,0,MODE_LOW,Periods,shift)];
	  }
	  else if (Extremes == 3)
	  {
		 SsMax = (Open[Highest(NULL,0,MODE_OPEN,Periods,shift)]+High[Highest(NULL,0,MODE_HIGH,Periods,shift)])/2;
		 SsMin = (Open[Lowest(NULL,0,MODE_OPEN,Periods,shift)]+Low[Lowest(NULL,0,MODE_LOW,Periods,shift)])/2;
	  }
	     else
	  {
		SsMax = Open[Highest(NULL,0,MODE_OPEN,Periods,shift)];
		SsMin = Open[Lowest(NULL,0,MODE_OPEN,Periods,shift)];
	  }
	  smin = SsMin+(SsMax-SsMin)*Margins/100;
	  smax = SsMax-(SsMax-SsMin)*Margins/100;
	  ExtMapBuffer1[shift-Advance]=smin;
	  ExtMapBuffer2[shift-Advance]=smax;
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments