TrendEnvelopes_v5_001

Download script
Author: Copyright � 2007, TrendLaboratory Ltd.
TrendEnvelopes_v5_001

This script functions as a technical analysis tool designed to identify and visualize market trends by creating dynamic "envelopes" around price action. Rather than just looking at where the price is currently trading, it analyzes the relationship between recent high and low prices to determine the prevailing direction of the market.

Core Logic and Trend Identification

The tool works by calculating a moving average of two specific data points: the highest price (High) and the lowest price (Low) reached over a set number of candles. By doing this, it establishes a corridor of "resistance" and "support."

The logic determines the trend based on price breakouts:

  • Bullish Trend: If the current closing price moves above the previous high-point average, the script identifies an upward trend.
  • Bearish Trend: If the current closing price moves below the previous low-point average, the script identifies a downward trend.

Visual Envelopes and Signals

Once a trend is identified, the indicator draws specific visual boundaries on your chart:

  • Upper/Lower Bounds: When the market is in an uptrend, it tracks the lowest point of that move to create a floor; when in a downtrend, it tracks the highest point to create a ceiling.
  • Dynamic Tracking: These bounds are "sticky," meaning they only update if the price makes a new extreme in the direction of the trend (e.g., in an uptrend, the bottom bound only moves up if a new lower low is established).
  • Visual Cues: The script provides distinct lines for these trends and uses specific icons (arrows) to highlight the exact moments where the trend shifts from bearish to bullish, or vice versa.

Alerts and Notifications

To help traders act quickly without constantly watching the screen, the logic includes an automated notification system:

  • Trend Detection: The script monitors for "flips." If the trend status changes (for example, moving from a negative state to a positive state) and there is active trading volume, it triggers a signal.
  • Alerting Options: Depending on your settings, the tool can provide visual alerts on the screen, play an audio warning sound, or generate a pop-up message notifying you that a "Buy" or "Sell" signal has been generated.

In summary, this tool filters out market noise by focusing on price breakthroughs. It visually maps out the "territory" of the current trend and provides clear markers when the market sentiment shifts from one direction to another.

Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1It plays sound alerts
8 Views
0 Downloads
0 Favorites
TrendEnvelopes_v5_001
//+------------------------------------------------------------------+
//|                                            TrendEnvelopes_v2.mq4 |
//|                           Copyright © 2007, TrendLaboratory Ltd. |
//|            http://finance.groups.yahoo.com/group/TrendLaboratory |
//|                                   E-mail: igorad2003@yahoo.co.uk |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, TrendLaboratory Ltd."
#property link      "http://finance.groups.yahoo.com/group/TrendLaboratory"
//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Yellow
#property indicator_color2 Yellow
#property indicator_width1 2
#property indicator_width2 2
#property indicator_color3 Yellow
#property indicator_color4 Yellow
#property indicator_width3 1
#property indicator_width4 1
//---- indicator parameters
extern int     MA_Period      =  3;
extern int     MA_Method      =  1;
extern int     UseSignal      =  0; 
extern int     AlertMode      =  0;
extern int     WarningMode    =  0;

//---- indicator buffers
double UpBuffer[];
double DnBuffer[];
double UpSignal[];
double DnSignal[]; 
double smax[];
double smin[];
double trend[];

//----
int ExtCountedBars=0;
bool UpTrendAlert=false, DownTrendAlert=false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   int    draw_begin;
   string short_name;
//---- drawing settings
   IndicatorBuffers(7);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexArrow(2,108);
   SetIndexStyle(3,DRAW_ARROW);
   SetIndexArrow(3,108);
   
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   if(MA_Period<2) MA_Period=10;
   draw_begin=MA_Period-1;
//---- indicator short name
   IndicatorShortName("TrendEnvelopes("+MA_Period+")");
   SetIndexLabel(0,"UpTrendEnv");
   SetIndexLabel(1,"DnTrendEnv");
   SetIndexLabel(2,"UpSignal");
   SetIndexLabel(3,"DnSignal");
   SetIndexDrawBegin(0,draw_begin);
   SetIndexDrawBegin(1,draw_begin);
   SetIndexDrawBegin(2,draw_begin);
   SetIndexDrawBegin(3,draw_begin);
   //---- indicator buffers mapping
   SetIndexBuffer(0,UpBuffer);
   SetIndexBuffer(1,DnBuffer);
   SetIndexBuffer(2,UpSignal);
   SetIndexBuffer(3,DnSignal);
   SetIndexBuffer(4,smax);
   SetIndexBuffer(5,smin);
   SetIndexBuffer(6,trend);
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   if(Bars<=MA_Period) return(0);
   ExtCountedBars=IndicatorCounted();
//---- check for possible errors
   if (ExtCountedBars<0) return(-1);
//---- last counted bar will be recounted
   if (ExtCountedBars>0) ExtCountedBars--;
   limit=Bars-ExtCountedBars;
//---- EnvelopesM counted in the buffers
   for(int i=limit; i>=0; i--)
     { 
      smax[i] = iMA(NULL,0,MA_Period,0,MA_Method,PRICE_HIGH,i);
      smin[i] = iMA(NULL,0,MA_Period,0,MA_Method,PRICE_LOW,i);
   
      trend[i]=trend[i+1]; 
	   
	   if (Close[i]>smax[i+1])  trend[i]=1; 
	   if (Close[i]<smin[i+1])  trend[i]=-1;

	   if(trend[i]>0)
	   {
	   if (smin[i]<smin[i+1]) smin[i]=smin[i+1];
	   UpBuffer[i]=smin[i];
	     if (UseSignal>0)
	     { 
	        if (trend[i+1]<0) 
	        {
	        UpSignal[i] = smin[i];
	        if (WarningMode>0 && i==0) PlaySound("alert2.wav");
	        }
	        else UpSignal[i] = EMPTY_VALUE;
	     }
	   DnBuffer[i]=EMPTY_VALUE;
	   DnSignal[i]=EMPTY_VALUE; 
	   }
	   else
	   {
	   if(smax[i]>smax[i+1]) smax[i]=smax[i+1];
	   DnBuffer[i]=smax[i];
	     if (UseSignal>0)
	     { 
	        if (trend[i+1]>0) 
	        {
	        DnSignal[i] = smax[i];
	        if (WarningMode>0 && i==0) PlaySound("alert2.wav");
	        }
	        else DnSignal[i] = EMPTY_VALUE;
	     }
	   UpBuffer[i]=EMPTY_VALUE;
	   UpSignal[i]=EMPTY_VALUE; 
	   }
   }
//----------   
   string Message;
   
   if ( trend[2]<0 && trend[1]>0 && Volume[0]>1 && !UpTrendAlert)
	  {
	  Message = " "+Symbol()+" M"+Period()+": Signal for BUY";
	  if ( AlertMode>0 ) Alert (Message); 
	  UpTrendAlert=true; DownTrendAlert=false;
	  } 
	 	  
	  if ( trend[2]>0 && trend[1]<0 && Volume[0]>1 && !DownTrendAlert)
	  {
	  Message = " "+Symbol()+" M"+Period()+": Signal for SELL";
	  if ( AlertMode>0 ) Alert (Message); 
	  DownTrendAlert=true; UpTrendAlert=false;
	  } 	         
//---- done
   return(0);
  }
//+------------------------------------------------------------------+

Comments