//+------------------------------------------------------------------+
//| Three Line Break.mq4 |
//| Equipe Forex |
//| http://www.equipeforex.com |
//+------------------------------------------------------------------+
#property copyright "Equipe Forex"
#property link "http://www.equipeforex.com"
//----
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
//---- input parameters
extern int BreakPeriod=5;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1,DRAW_HISTOGRAM);
SetIndexBuffer(1,ExtMapBuffer2);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int i, j, CurrentTrend;
bool CalculateLowHigh=true;
double Value1, Value2, LowestBox, HighestBox;
double BoxHigh[], BoxLow[];
//----
ArrayResize(BoxHigh, BreakPeriod + 2);
ArrayResize(BoxLow, BreakPeriod + 2);
//
ArrayInitialize(BoxHigh, -1000);
ArrayInitialize(BoxLow, 1000);
//
i=Bars-1;
if (Close[i] < Open[i])
{
CurrentTrend=-1;
BoxHigh[BreakPeriod + 1]=Open[i];
BoxLow[BreakPeriod + 1]=Close[i];
Value1=Low[i];
Value2=High[i];
}
else
{
CurrentTrend=1;
BoxHigh[BreakPeriod + 1]=Close[i];
BoxLow[BreakPeriod + 1]=Open[i];
Value1=High[i];
Value2=Low[i];
}
ExtMapBuffer1[i]=Value1;
ExtMapBuffer2[i]=Value2;
i--;
while(i>=0)
{
Value1=0;
Value2=0;
//----
if (CalculateLowHigh)
{
LowestBox=BoxLow[ArrayMinimum(BoxLow)];
HighestBox=BoxHigh[ArrayMaximum(BoxHigh)];
CalculateLowHigh=false;
}
if (((CurrentTrend > 0) && (Close[i] < LowestBox)) ||
(CurrentTrend < 0) && (Close[i] < BoxLow[BreakPeriod + 1]))
{
Value1=Low[i];
Value2=High[i];
//
shiftArrays(BoxLow, BoxHigh);
//
BoxHigh[BreakPeriod + 1]=BoxLow[BreakPeriod + 1];
BoxLow[BreakPeriod + 1]=Close[i];
//
CurrentTrend=-1;
CalculateLowHigh=true;
}
else if (((CurrentTrend < 0) && (Close[i] > HighestBox)) ||
(CurrentTrend > 0) && (Close[i] > BoxHigh[BreakPeriod + 1]))
{
Value1=High[i];
Value2=Low[i];
//
shiftArrays(BoxLow, BoxHigh);
//
BoxLow[BreakPeriod + 1]=BoxHigh[BreakPeriod + 1];
BoxHigh[BreakPeriod + 1]=Close[i];
//
CurrentTrend=1;
CalculateLowHigh=true;
}
ExtMapBuffer1[i]=Value1;
ExtMapBuffer2[i]=Value2;
i--;
}
//----
return(0);
}
//+------------------------------------------------------------------+
//| shift array function |
//+------------------------------------------------------------------+
void shiftArrays(double& array1[], double& array2[])
{
for(int j=0; j<=BreakPeriod; j++)
{
array1[j]=array1[j + 1];
array2[j]=array2[j + 1];
}
}
//+------------------------------------------------------------------+
Comments