Elite indicators :) - page 98

 

...

Doc,

2 buffers used all in all (so 6 more left to use) I don't know exactly how do you want the histo, so posting this one instead (no histo, alerts added at some point and I don't write out the "short" and "long" in the name) Yell if you need help with histo

regards

mladen

dr.house7:
Hy mladen,

could you tell me if is there any chance to have this indy on histo bars ?

all buffers are busy and i don't know how to modify it ...

Please some help here

Thanks to everyone.

Best regards

Doc
 

Thanks mladen !

You're amazing ! What a fantastic code in so few time !

Too fantastic for me ...i'm little confuse on how to modify it because it's totally different from my standard knowledge

i would like to have some histo bars for cross of these two lines : ergodic cci line with trigger line

Best regards

Doc

Files:
bars.png  17 kb
 

...

Two versions :

"Classical histo" - first sub-window

"Bars histo" -> the one you wanted - green when trigger bellow ergodic CCI, red when trigger above ergodic CCI, gray when (if) they are equal

regards

mladen

dr.house7:
Thanks mladen !

You're amazing ! What a fantastic code in so few time !

Too fantastic for me ...i'm little confuse on how to modify it because it's totally different from my standard knowledge

i would like to have some histo bars for cross of these two lines : ergodic cci line with trigger line

Best regards

Doc
 
mladen:
Two versions :

"Classical histo" - first sub-window

"Bars histo" -> the one you wanted - green when trigger bellow ergodic CCI, red when trigger above ergodic CCI, gray when (if) they are equal

regards

mladen

Exactly what i need it !

Thanks mladen you are a genius !

Best regards

Doc

 

Hi mladen,

Dropped in briefly this afternoon and have to rush off before saying hello.

Thanks for the new indicator and the article from McGinley himself. Still reading it. Yes, I was also surprised at the close resemblance when I first put your 1st version beside a 9-EMA. Yes, the Metastock formula does not resemble McGinley's formula. Sorry for the misinfo but that's what I got from the net.

At least now we know the Investopedia article had exaggerated it a bit. But because it was really quite unknown and that sparked some interest and on the whole it is fun.

Thanks & Best regards,

jswei.

 

Sorry mladen,

could you help me on this final part ?

is it possible to have (like in the picture) these colours without grey and yellow line and with bars all in the same row ?

Best regards

Doc

Files:
 

...

Like this ?

regards

mladen

dr.house7:
Sorry mladen,

could you help me on this final part ?

is it possible to have (like in the picture) these colours without grey and yellow line and with bars all in the same row ?

Best regards

Doc
 
mladen:
Like this ?

regards

mladen

exactly !

Many thanks mladen...good pips to you

Regards

Doc

 

I am trying to make (further) modifications to the bollinger %b indicator posted by linuxuser. I am trying to make it behave in a similiar way to stochastics, i.e. have a signal line, as well as be able to display multiple periods on one graph. I managed todo this with help from linuxuser before, so have it set up to display either two or three periods on the same window at the moment.

Now am I am trying to make it so I can use fractional values for standard deviation in the calculations. Am I correct in thinking I can't use the standard iBands function for this? I tried using the code supplied in the standard Bands indicator but haven't had much success. Could someone help me out please?

I am also hoping to be able to make the indicator display calculations from other timeframes but one step at a time I guess. I realised this might be a bit harder than I at first thought.

Thanks in advance!

//+------------------------------------------------------------------+

//| Bollinger %b - Multi.mq4 |

//| based on Bollinger Bands %b.mq4 |

//| Original indicator by Alejandro Galindo |

//| Modified and Corrected by Linuxser for forex TSD |

//| Further modifications made by whitebloodcell |

//|

//| John Bollinger original formula is: |

//| (Last - Lower BB)/(Upper BB - Lower BB) |

//+-------------------------------------------------------------------+

#property copyright ""

#property link ""

#property indicator_separate_window

#property indicator_buffers 6

#property indicator_color1 LightSalmon

#property indicator_color2 LightSalmon

#property indicator_color3 SkyBlue

#property indicator_color4 SkyBlue

#property indicator_color5 Green

#property indicator_color6 Green

//---- input parameters

extern bool ShowBand1 = TRUE;

extern int Timeframe_1 = 15;

extern int BBPeriod_1=5;

extern double StdDeviation_1=1.9;

extern int MainLineMAPeriod_1=1;

extern int MainLineMAMethod_1=1;

extern int SignalMAPeriod_1=2;//corresponds to %D - the signal line

extern int SignalMAMethod_1=1;

extern bool ShowBand2 = TRUE;

extern int Timeframe_2 = 15;

extern int BBPeriod_2=10;

extern double StdDeviation_2=2;

extern int MainLineMAPeriod_2=2;

extern int MainLineMAMethod_2=1;

extern int SignalMAPeriod_2=3;

extern int SignalMAMethod_2=1;

extern bool ShowBand3 = TRUE;

extern int Timeframe_3 = 15;

extern int BBPeriod_3=20;

extern double StdDeviation_3=2.0;

extern int MainLineMAPeriod_3=2;

extern int MainLineMAMethod_3=1;

extern int SignalMAPeriod_3=3;

extern int SignalMAMethod_3=1;

extern int AppliedPrice=0;

extern string s2 = "0=SMA,1=EMA,2=Smoothed,4=LWMA";

extern string s1 = "0=Close,1=Open,2=High,3=Low,4=Median,5=Typical,6=Weighted";

//---- buffers

double BLG_Buffer_1[];

double MainLineBuffer_1[];

double SignalBuffer_1[];

double BLG_Buffer_2[];

double MainLineBuffer_2[];

double SignalBuffer_2[];

double BLG_Buffer_3[];

double MainLineBuffer_3[];

double SignalBuffer_3[];

//#include

//+------------------------------------------------------------------+

//| Custom indicator initialization function |

//+------------------------------------------------------------------+

int init() {

string short_name;

SetIndexStyle(0,DRAW_LINE,EMPTY,2);

SetIndexBuffer(0,MainLineBuffer_1);

SetIndexStyle(1,DRAW_LINE,STYLE_DOT);

SetIndexBuffer(1,SignalBuffer_1);

SetIndexStyle(2,DRAW_LINE,EMPTY,2);

SetIndexBuffer(2,MainLineBuffer_2);

SetIndexStyle(3,DRAW_LINE,STYLE_DOT);

SetIndexBuffer(3,SignalBuffer_2);

SetIndexStyle(4,DRAW_LINE,EMPTY,2);

SetIndexBuffer(4,MainLineBuffer_3);

SetIndexStyle(5,DRAW_LINE,STYLE_DOT);

SetIndexBuffer(5,SignalBuffer_3);

//SetLevelValue(1,10);

SetLevelValue(0,0);

SetLevelValue(1,20);

SetLevelValue(2,40);

SetLevelValue(3,60);

SetLevelValue(4,80);

SetLevelValue(5,100);

SetLevelStyle(STYLE_DOT,1,DimGray);

SetIndexDrawBegin(0,BBPeriod_1);

SetIndexDrawBegin(1,BBPeriod_1+SignalMAPeriod_1);

SetIndexDrawBegin(2,BBPeriod_2);

SetIndexDrawBegin(3,BBPeriod_2+SignalMAPeriod_2);

SetIndexDrawBegin(4,BBPeriod_3);

SetIndexDrawBegin(5,BBPeriod_3+SignalMAPeriod_3);

//name for DataWindow and indicator subwindow label

short_name="Bollinger Percent B (%b)("+BBPeriod_1+","+MainLineMAPeriod_1+") ("+BBPeriod_2+","+MainLineMAPeriod_2+") ("+BBPeriod_3+","+MainLineMAPeriod_3+")";

IndicatorShortName(short_name);

return(0);

}

//+------------------------------------------------------------------+

//| Momentum |

//+------------------------------------------------------------------+

int start() {

if(ShowBand1==TRUE) {

if(Bars<=BBPeriod_1) return(0);

MainFunction(BLG_Buffer_1, MainLineBuffer_1, SignalBuffer_1, Timeframe_1, BBPeriod_1, StdDeviation_1,

AppliedPrice, MainLineMAPeriod_1, MainLineMAMethod_1, SignalMAPeriod_1, SignalMAMethod_1);

}

if(ShowBand2==TRUE) {

if(Bars<=BBPeriod_2) return(0);

MainFunction(BLG_Buffer_2, MainLineBuffer_2, SignalBuffer_2, Timeframe_2, BBPeriod_2, StdDeviation_2,

AppliedPrice, MainLineMAPeriod_2, MainLineMAMethod_2, SignalMAPeriod_2, SignalMAMethod_2);

}

if(ShowBand3==TRUE) {

if(Bars<=BBPeriod_3) return(0);

MainFunction(BLG_Buffer_3, MainLineBuffer_3, SignalBuffer_3, Timeframe_3, BBPeriod_3, StdDeviation_3,

AppliedPrice, MainLineMAPeriod_3, MainLineMAMethod_3, SignalMAPeriod_3, SignalMAMethod_3);

}

return(0);

}

//+------------------------------------------------------------------+

void MainFunction(double &BLGBuffer[], double &MainLineBuffer[], double &SignalBuffer[], int timefame, int BBPeriod, double StdDeviation,

int AppliedPrice, int MainLineMAPeriod, int MainLineMAMethod, int SignalMAPeriod, int SignalMAMethod) {

int i=0,limit=0;

double PriceArray[];

if (ArrayRange(BLGBuffer,0) != Bars) {

ArrayResize(BLGBuffer,Bars);

ArraySetAsSeries(BLGBuffer, TRUE);

}

//number of bars already processed by indicator

int counted_bars=IndicatorCounted();

//load empty values into array until enough elements for calculation

if(counted_bars<1) {

for(i=1;i<=BBPeriod;i++) {

BLGBuffer=EMPTY_VALUE;

}//end for(i=1;i<=BandsPeriod;i++)

}//end if(counted_bars<1)

if(counted_bars>0) counted_bars--;

limit = MathMin(Bars-counted_bars,Bars-BBPeriod);

for(i=limit;i>=0;i--) {

//(Last - Lower BB)/(Upper BB - Lower BB)

BLGBuffer=((Close - iBands(NULL,timefame,BBPeriod,StdDeviation,0,AppliedPrice,MODE_LOWER,i))/

(iBands(NULL,timefame,BBPeriod,StdDeviation,0,AppliedPrice,MODE_UPPER,i)-iBands(NULL,timefame,BBPeriod,StdDeviation,0,AppliedPrice,MODE_LOWER,i)))*100;

}//end for(i=limit;i>=0;i--)

//smooth the signal by applying a moving average

for (i = limit; i >= 0; i--) MainLineBuffer = iMAOnArray(BLGBuffer, 0, MainLineMAPeriod, 0, MainLineMAMethod, i);

//create a Signal line (akin to stochastics) by further smoothing the (already smoothed) signal line.

for (i = limit; i >= 0; i--) SignalBuffer = iMAOnArray(MainLineBuffer, 0, SignalMAPeriod, 0, SignalMAMethod, i);

}//end MainFunction()

//--------------------------------------------------------------------------------

//Function: BandCalculation - Not yet working

//Purpose: Calculate the value of either the upper or lower bollinger band depen-

// on input variables.

//Inputs: Mode (int) - Calculate either upper or lower band

// limit (int) - Number of bars to calculate

// timeframe (int)

// BandsPeriod (int)

// MAMethod (int)

// BandsDeviation (double)

// AppliedPrice (int)

//Returns:

//--------------------------------------------------------------------------------

/*

void BandCalculation(int Mode, int limit, int timeframe, int BandsPeriod, int MAMethod, double BandsDeviation, int AppliedPrice) {

int i,k;

double deviation;

double sum,oldval,newres;

//if(counted_bars>0) limit++;

for(i=0; i<limit; i++) {

MovingBuffer=iMA(NULL,0,BandsPeriod,BandsShift,MAMethod,AppliedPrice,i);

}//end for(i=0; i<limit; i++)

i=limit;

//i=Bars-BandsPeriod+1;

//if(counted_bars>BandsPeriod-1) i=Bars-counted_bars-1;

while(i>=0) {

sum=0.0;

k=i+BandsPeriod-1;

oldval=MovingBuffer;

while(k>=i) {

newres=Close[k]-oldval;

sum+=newres*newres;

k--;

}//end while(k>=i)

//calculate deviation

deviation=BandsDeviations*MathSqrt(sum/BandsPeriod);

//Upper/Lower bands are equal to the moving average +/- deviation.

if(Mode==0) {

UpperBuffer=oldval+deviation;

}

else {

LowerBuffer=oldval-deviation;

}

i--;

}//end while(i>=0)

}//end start()

*/
 

...

whitebloodcell,

You are right. The built in Bollinger bands indicator works only for integer values of standard deviations multiplier. Here is a simple one that allows you to use fractional multiplier and multiple deviations. Might be helpful.

As of harder : just don't give up coding it. When you finish what you wanted to code, you will see

regards

mladen

whitebloodcell:
I am trying to make (further) modifications to the bollinger %b indicator posted by linuxuser. I am trying to make it behave in a similiar way to stochastics, i.e. have a signal line, as well as be able to display multiple periods on one graph. I managed todo this with help from linuxuser before, so have it set up to display either two or three periods on the same window at the moment.

Now am I am trying to make it so I can use fractional values for standard deviation in the calculations. Am I correct in thinking I can't use the standard iBands function for this? I tried using the code supplied in the standard Bands indicator but haven't had much success. Could someone help me out please?

I am also hoping to be able to make the indicator display calculations from other timeframes but one step at a time I guess. I realised this might be a bit harder than I at first thought.

Thanks in advance!

//+------------------------------------------------------------------+

//| Bollinger %b - Multi.mq4 |

//| based on Bollinger Bands %b.mq4 |

//| Original indicator by Alejandro Galindo |

//| Modified and Corrected by Linuxser for forex TSD |

//| Further modifications made by whitebloodcell |

//|

//| John Bollinger original formula is: |

//| (Last - Lower BB)/(Upper BB - Lower BB) |

//+-------------------------------------------------------------------+

#property copyright ""

#property link ""

#property indicator_separate_window

#property indicator_buffers 6

#property indicator_color1 LightSalmon

#property indicator_color2 LightSalmon

#property indicator_color3 SkyBlue

#property indicator_color4 SkyBlue

#property indicator_color5 Green

#property indicator_color6 Green

//---- input parameters

extern bool ShowBand1 = TRUE;

extern int Timeframe_1 = 15;

extern int BBPeriod_1=5;

extern double StdDeviation_1=1.9;

extern int MainLineMAPeriod_1=1;

extern int MainLineMAMethod_1=1;

extern int SignalMAPeriod_1=2;//corresponds to %D - the signal line

extern int SignalMAMethod_1=1;

extern bool ShowBand2 = TRUE;

extern int Timeframe_2 = 15;

extern int BBPeriod_2=10;

extern double StdDeviation_2=2;

extern int MainLineMAPeriod_2=2;

extern int MainLineMAMethod_2=1;

extern int SignalMAPeriod_2=3;

extern int SignalMAMethod_2=1;

extern bool ShowBand3 = TRUE;

extern int Timeframe_3 = 15;

extern int BBPeriod_3=20;

extern double StdDeviation_3=2.0;

extern int MainLineMAPeriod_3=2;

extern int MainLineMAMethod_3=1;

extern int SignalMAPeriod_3=3;

extern int SignalMAMethod_3=1;

extern int AppliedPrice=0;

extern string s2 = "0=SMA,1=EMA,2=Smoothed,4=LWMA";

extern string s1 = "0=Close,1=Open,2=High,3=Low,4=Median,5=Typical,6=Weighted";

//---- buffers

double BLG_Buffer_1[];

double MainLineBuffer_1[];

double SignalBuffer_1[];

double BLG_Buffer_2[];

double MainLineBuffer_2[];

double SignalBuffer_2[];

double BLG_Buffer_3[];

double MainLineBuffer_3[];

double SignalBuffer_3[];

//#include

//+------------------------------------------------------------------+

//| Custom indicator initialization function |

//+------------------------------------------------------------------+

int init() {

string short_name;

SetIndexStyle(0,DRAW_LINE,EMPTY,2);

SetIndexBuffer(0,MainLineBuffer_1);

SetIndexStyle(1,DRAW_LINE,STYLE_DOT);

SetIndexBuffer(1,SignalBuffer_1);

SetIndexStyle(2,DRAW_LINE,EMPTY,2);

SetIndexBuffer(2,MainLineBuffer_2);

SetIndexStyle(3,DRAW_LINE,STYLE_DOT);

SetIndexBuffer(3,SignalBuffer_2);

SetIndexStyle(4,DRAW_LINE,EMPTY,2);

SetIndexBuffer(4,MainLineBuffer_3);

SetIndexStyle(5,DRAW_LINE,STYLE_DOT);

SetIndexBuffer(5,SignalBuffer_3);

//SetLevelValue(1,10);

SetLevelValue(0,0);

SetLevelValue(1,20);

SetLevelValue(2,40);

SetLevelValue(3,60);

SetLevelValue(4,80);

SetLevelValue(5,100);

SetLevelStyle(STYLE_DOT,1,DimGray);

SetIndexDrawBegin(0,BBPeriod_1);

SetIndexDrawBegin(1,BBPeriod_1+SignalMAPeriod_1);

SetIndexDrawBegin(2,BBPeriod_2);

SetIndexDrawBegin(3,BBPeriod_2+SignalMAPeriod_2);

SetIndexDrawBegin(4,BBPeriod_3);

SetIndexDrawBegin(5,BBPeriod_3+SignalMAPeriod_3);

//name for DataWindow and indicator subwindow label

short_name="Bollinger Percent B (%b)("+BBPeriod_1+","+MainLineMAPeriod_1+") ("+BBPeriod_2+","+MainLineMAPeriod_2+") ("+BBPeriod_3+","+MainLineMAPeriod_3+")";

IndicatorShortName(short_name);

return(0);

}

//+------------------------------------------------------------------+

//| Momentum |

//+------------------------------------------------------------------+

int start() {

if(ShowBand1==TRUE) {

if(Bars<=BBPeriod_1) return(0);

MainFunction(BLG_Buffer_1, MainLineBuffer_1, SignalBuffer_1, Timeframe_1, BBPeriod_1, StdDeviation_1,

AppliedPrice, MainLineMAPeriod_1, MainLineMAMethod_1, SignalMAPeriod_1, SignalMAMethod_1);

}

if(ShowBand2==TRUE) {

if(Bars<=BBPeriod_2) return(0);

MainFunction(BLG_Buffer_2, MainLineBuffer_2, SignalBuffer_2, Timeframe_2, BBPeriod_2, StdDeviation_2,

AppliedPrice, MainLineMAPeriod_2, MainLineMAMethod_2, SignalMAPeriod_2, SignalMAMethod_2);

}

if(ShowBand3==TRUE) {

if(Bars<=BBPeriod_3) return(0);

MainFunction(BLG_Buffer_3, MainLineBuffer_3, SignalBuffer_3, Timeframe_3, BBPeriod_3, StdDeviation_3,

AppliedPrice, MainLineMAPeriod_3, MainLineMAMethod_3, SignalMAPeriod_3, SignalMAMethod_3);

}

return(0);

}

//+------------------------------------------------------------------+

void MainFunction(double &BLGBuffer[], double &MainLineBuffer[], double &SignalBuffer[], int timefame, int BBPeriod, double StdDeviation,

int AppliedPrice, int MainLineMAPeriod, int MainLineMAMethod, int SignalMAPeriod, int SignalMAMethod) {

int i=0,limit=0;

double PriceArray[];

if (ArrayRange(BLGBuffer,0) != Bars) {

ArrayResize(BLGBuffer,Bars);

ArraySetAsSeries(BLGBuffer, TRUE);

}

//number of bars already processed by indicator

int counted_bars=IndicatorCounted();

//load empty values into array until enough elements for calculation

if(counted_bars<1) {

for(i=1;i<=BBPeriod;i++) {

BLGBuffer=EMPTY_VALUE;

}//end for(i=1;i<=BandsPeriod;i++)

}//end if(counted_bars<1)

if(counted_bars>0) counted_bars--;

limit = MathMin(Bars-counted_bars,Bars-BBPeriod);

for(i=limit;i>=0;i--) {

//(Last - Lower BB)/(Upper BB - Lower BB)

BLGBuffer=((Close - iBands(NULL,timefame,BBPeriod,StdDeviation,0,AppliedPrice,MODE_LOWER,i))/

(iBands(NULL,timefame,BBPeriod,StdDeviation,0,AppliedPrice,MODE_UPPER,i)-iBands(NULL,timefame,BBPeriod,StdDeviation,0,AppliedPrice,MODE_LOWER,i)))*100;

}//end for(i=limit;i>=0;i--)

//smooth the signal by applying a moving average

for (i = limit; i >= 0; i--) MainLineBuffer = iMAOnArray(BLGBuffer, 0, MainLineMAPeriod, 0, MainLineMAMethod, i);

//create a Signal line (akin to stochastics) by further smoothing the (already smoothed) signal line.

for (i = limit; i >= 0; i--) SignalBuffer = iMAOnArray(MainLineBuffer, 0, SignalMAPeriod, 0, SignalMAMethod, i);

}//end MainFunction()

//--------------------------------------------------------------------------------

//Function: BandCalculation - Not yet working

//Purpose: Calculate the value of either the upper or lower bollinger band depen-

// on input variables.

//Inputs: Mode (int) - Calculate either upper or lower band

// limit (int) - Number of bars to calculate

// timeframe (int)

// BandsPeriod (int)

// MAMethod (int)

// BandsDeviation (double)

// AppliedPrice (int)

//Returns:

//--------------------------------------------------------------------------------

/*

void BandCalculation(int Mode, int limit, int timeframe, int BandsPeriod, int MAMethod, double BandsDeviation, int AppliedPrice) {

int i,k;

double deviation;

double sum,oldval,newres;

//if(counted_bars>0) limit++;

for(i=0; i<limit; i++) {

MovingBuffer=iMA(NULL,0,BandsPeriod,BandsShift,MAMethod,AppliedPrice,i);

}//end for(i=0; i<limit; i++)

i=limit;

//i=Bars-BandsPeriod+1;

//if(counted_bars>BandsPeriod-1) i=Bars-counted_bars-1;

while(i>=0) {

sum=0.0;

k=i+BandsPeriod-1;

oldval=MovingBuffer;

while(k>=i) {

newres=Close[k]-oldval;

sum+=newres*newres;

k--;

}//end while(k>=i)

//calculate deviation

deviation=BandsDeviations*MathSqrt(sum/BandsPeriod);

//Upper/Lower bands are equal to the moving average +/- deviation.

if(Mode==0) {

UpperBuffer=oldval+deviation;

}

else {

LowerBuffer=oldval-deviation;

}

i--;

}//end while(i>=0)

}//end start()

*/
Reason: