//+------------------------------------------------------------------+ //| 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]; } } //+------------------------------------------------------------------+