Donchian Channels - Generalized version_v1

Author: Copyright � 2005, Luis Guilherme Damiani
Donchian Channels - Generalized version_v1

This tool is designed to visualize price volatility and boundaries on a trading chart using a method known as Donchian Channels. It helps traders identify the historical "ceiling" (highest price) and "floor" (lowest price) over a specific period of time, creating a visual corridor that defines the current trading range.

Core Logic and Functionality

The script operates by scanning a set number of past price bars (the Periods) to determine the extremes of market movement. Based on your settings, it calculates these boundaries using one of three distinct logic paths:

  • Highest/Lowest Extremes: The tool identifies the absolute highest peak and lowest valley reached within the timeframe. This is used to capture the total range of price action.
  • Open Price Extremes: Instead of looking at the tips of the candles, the tool looks for the "Open" price of the candles that had the highest and lowest highs/lows. This focuses on where the price was at the beginning of those significant moves.
  • Median Point Extremes: The tool calculates a middle ground between the opening price and the extreme high (or low). This provides a balanced calculation that considers both the starting point and the peak of the price action.

Visual Adjustments and Positioning

To make the data more practical for trading analysis, the script includes several refinement features:

  • Margin Offsets: You can shrink or expand the visual boundaries slightly. By applying a percentage margin, the tool can draw the lines slightly inside or outside the actual extremes, allowing you to define a "buffer zone" before a breakout is considered confirmed.
  • Advance Feature: This allows for a forward shift of the lines on the chart, which can be used to adjust how the data aligns with current price candles.
  • Dynamic Mapping: The tool automatically calculates these values across a large history of bars (up to 700), drawing two distinct lines on your chart that represent the moving upper and lower limits of the market's reach.

In summary, this script transforms raw historical data into a clear visual corridor, helping you see where the price has lived in the past so you can better anticipate where it might head next.

Miscellaneous
Implements a curve of type %1
14 Views
0 Downloads
0 Favorites
Donchian Channels - Generalized version_v1
//+------------------------------------------------------------------+
//|                      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 Magenta

//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);

//----
   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);

   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