FractalChannel_v4

Download script
Author: Copyright � 2006, TrendLaboratory
FractalChannel_v4

This tool is designed to provide traders with a visual representation of market structure by identifying key price boundaries and trend channels on a trading chart. It works by automatically detecting significant "fractals"—essentially the high and low peaks—that define the current price action, and then projects a structured channel based on those points.

Core Logic Overview

The script functions by scanning historical price data to locate specific geometric patterns where the market reaches a temporary peak or valley. Once these pivot points are identified, the tool calculates three distinct lines to help visualize the market's range:

  • Upper and Lower Channels: These lines represent the outer boundaries of the current price movement. They are derived from the highest highs and lowest lows found within a specific window of time.
  • Middle Channel: This serves as a centerline, calculated by finding the midpoint between the upper and lower boundaries, providing a clear "equilibrium" point for the market.

Key Features & Behavior

  • Dynamic Boundary Detection: The script looks backward at a set number of price bars to confirm whether a peak or valley is significant enough to be considered a boundary. It ensures that these points are not just random noise but are meaningful structural turns in the price trend.
  • Customizable Sensitivity: Users can adjust how many bars the tool considers when looking for these peaks. A higher setting will identify broader, more long-term market structures, while a lower setting will react to shorter-term fluctuations.
  • Margin Adjustments: The logic includes a "Margins" feature, which allows the upper and lower boundary lines to be offset slightly from the absolute highs and lows. This is useful for traders who want to see a buffer zone rather than just the extreme price points.
  • Trend Tracking: By constantly updating these boundaries as new price data arrives, the tool creates a trailing visual guide. It helps traders see where the market "ceiling" and "floor" are currently located, making it easier to identify potential breakout zones or areas of resistance and support.

Summary for the User

In simple terms, this script acts like an automated "map maker" for your chart. Instead of you having to manually draw lines to see where price is pushing against resistance or falling toward support, this tool scans the market history, identifies the significant high and low points, and draws a balanced channel that adapts as the market moves.

Miscellaneous
Implements a curve of type %1
8 Views
0 Downloads
0 Favorites
FractalChannel_v4
//+------------------------------------------------------------------+
//|                                            FractalChannel_v4.mq4 |
//|                                Copyright © 2006, TrendLaboratory |
//|            http://finance.groups.yahoo.com/group/TrendLaboratory |
//|                                   E-mail: igorad2003@yahoo.co.uk |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, TrendLaboratory"
#property link      "http://finance.groups.yahoo.com/group/TrendLaboratory"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 LightBlue
#property indicator_color2 Tomato
#property indicator_color3 Yellow
#property indicator_width1 2
#property indicator_width2 2
//---- input parameters
extern int     ChannelType = 1;
extern double  Margins     = 0;
extern int     Shift       = 0;
extern int     Mode        = 0;

//---- buffers
double UpBuffer[];
double DnBuffer[];
double MdBuffer[];
double smin[];
double smax[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- indicator line
   IndicatorBuffers(5);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(2,DRAW_LINE,2);
   SetIndexBuffer(0,UpBuffer);
   SetIndexBuffer(1,DnBuffer);
   SetIndexBuffer(2,MdBuffer);
   SetIndexBuffer(3,smin);
   SetIndexBuffer(4,smax);
//---- name for DataWindow and indicator subwindow label
   short_name="Fractal Channel("+ChannelType+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,"Up Channel");
   SetIndexLabel(1,"Down Channel");
   SetIndexLabel(2,"Middle Channel");

   SetIndexShift(0,Shift);
   SetIndexShift(1,Shift);
   SetIndexShift(2,Shift);
//----
   SetIndexDrawBegin(0,2*ChannelType);
   SetIndexDrawBegin(1,2*ChannelType);
   SetIndexDrawBegin(2,2*ChannelType);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| FractalChannel_v3.1                                                |
//+------------------------------------------------------------------+
int start()
{
int  	   shift,k,counted_bars=IndicatorCounted();
double   v1,v2,cond[100];
			
   if ( counted_bars > 0 )  int limit=Bars-counted_bars-1;
   if ( counted_bars < 0 )  return(0);
   if ( counted_bars ==0 )  limit=Bars-2*ChannelType-1; 
     
	for(shift=limit;shift>=0;shift--) 
   {	
	v1 = Fractals(0,ChannelType,shift);
	v2 = Fractals(1,ChannelType,shift);
	
	smax[shift]=smax[shift+1];			
	if ( v1>0 ) smax[shift]=v1; 
	if (Mode == 0)
	if (High[shift]>smax[shift]) smax[shift]=High[shift];
	smin[shift]=smin[shift+1];
	if ( v2>0 ) smin[shift]=v2; 
	if (Mode == 0)
	if (Low[shift]<smin[shift]) smin[shift]=Low[shift];
	
	if (shift==Bars-1-2*ChannelType) {smin[shift]=Low[shift];smax[shift]=High[shift];}
	
	UpBuffer[shift]=smax[shift]-(smax[shift]-smin[shift])*Margins;
	DnBuffer[shift]=smin[shift]+(smax[shift]-smin[shift])*Margins;
	MdBuffer[shift]=(UpBuffer[shift]+DnBuffer[shift])/2;
	}
return(0);
}

double Fractals(int Type, int Size, int i)
{
   int k=1;
	double v1, cond[100];
	
	while (k<=Size) 
	{
      if (Type==0) bool condition = High[i+Size+k]<=High[i+Size] && High[i+Size-k]<High[i+Size];
      else condition = Low[i+Size+k]>=Low[i+Size] && Low[i+Size-k]>Low[i+Size];
      
      if (condition) 
      {
      if (Type==0) cond[k]=High[i+Size]; else cond[k]=Low[i+Size];
	     if(k==1)
	     {v1=cond[k];k++;} 
	     else
	     if(cond[k-1]==cond[k]){v1=cond[k];k++;}else {v1=0; break;}
	     
      }     
      else
      {
      v1=0;
      break;
	   }
	}
return(v1);	
}  
//+------------------------------------------------------------------+

Comments