//+------------------------------------------------------------------+

//|                                     Bollinger Bands Bi-Color.mq4 |

//|                                 G. GOUSSET  and Nicolas Vitale   |

//|                                http://www.trading-automatique.fr |

//+------------------------------------------------------------------+

#property copyright "G. GOUSSET  and Nicolas Vitale"

#property link      "http://www.trading-automatique.fr"





#property indicator_chart_window

#property indicator_buffers 5

#property indicator_color1 Red // bande boll sup décroissante

#property indicator_color2 Green // bande boll sup croissante

#property indicator_color3 LightSeaGreen // moyenne

#property indicator_color4 Red // bande boll inf décroissante

#property indicator_color5 Green // bande boll inf croissante





//---- indicator parameters

extern int Periode = 20;

extern int Decal_Band = 0;

extern double EType_Band = 2.0;



//---- buffers

double MovingBuffer[]; // valeurs de la moyenne

double UpperBuffer[]; // toutes les valeurs de la bande sup d'abord placées dans ce tableau

double LowerBuffer[]; // toutes les valeurs de la bande inf d'abord placées dans ce tableau



// puis on fera une sélection selon



double UpperBGreen[] ; // boll sup croissante

double UpperBRed[] ; // boll sup décroissante

double LowerBGreen[] ; // boll inf croissante

double LowerBRed[] ; // boll inf décroissante



double EType[] ; // Ecart-Type



//+------------------------------------------------------------------+

//| initialisation |

//+------------------------------------------------------------------+

int init()

{

//---- indicators

IndicatorBuffers(8);



SetIndexStyle(0,DRAW_LINE,0,2);

SetIndexBuffer(0,UpperBRed); // on trace la partie décroissante de la bande sup en rouge

SetIndexStyle(1,DRAW_LINE,0,2);

SetIndexBuffer(1,UpperBGreen); // on trace la partie croissante de la bande sup en vert



SetIndexStyle(2,DRAW_LINE,0,1);

SetIndexBuffer(2,MovingBuffer); // tracé de la moyenne



SetIndexStyle(3,DRAW_LINE,0,2);

SetIndexBuffer(3,LowerBRed); // on trace la partie décroissante de la bande inf en rouge

SetIndexStyle(4,DRAW_LINE,0,2);

SetIndexBuffer(4,LowerBGreen); // on trace la partie croissante de la bande inf en vert



SetIndexStyle(5,DRAW_NONE);

SetIndexBuffer(5,UpperBuffer);



SetIndexStyle(6,DRAW_NONE);

SetIndexBuffer(6,LowerBuffer);



SetIndexStyle(7,DRAW_NONE);

SetIndexBuffer(7,EType);





//----

return(0);

}

//+------------------------------------------------------------------+

//| Bollinger Bands |

//+------------------------------------------------------------------+

int start()

{

int index ;



int limit=Bars-Periode;



for(index=limit-2 ; index>=0 ; index--)

{

MovingBuffer[index]=iMA(NULL,0,Periode,Decal_Band,MODE_SMA,PRICE_CLOSE,index);

EType[index] = iStdDev(NULL,0,Periode,Decal_Band,MODE_SMA,PRICE_CLOSE,index);



UpperBuffer[index] = MovingBuffer[index] + EType[index] * EType_Band ; // on construit la bande sup



LowerBuffer[index] = MovingBuffer[index] - EType[index] * EType_Band ; // et la bande inf



UpperBGreen[index] = UpperBuffer[index] ; // puis transfert de toutes les valeurs de la bande sup

UpperBRed[index] = UpperBuffer[index] ; // dans les tableaux "vert" et "rouge"



LowerBGreen[index] = LowerBuffer[index] ; // idem avec toutes les valeurs de la bande inf

LowerBRed[index] = LowerBuffer[index] ; // vers les tableaux "vert" et "rouge"



if ((UpperBuffer[index] > UpperBuffer[index+1])&&(UpperBuffer[index+1] > UpperBuffer[index+2])) UpperBRed[index+1] = EMPTY_VALUE ; // test croissance bande sup et

else if((UpperBuffer[index] < UpperBuffer[index+1])&&(UpperBuffer[index+1] < UpperBuffer[index+2])) UpperBGreen[index+1] = EMPTY_VALUE ; // un seul tableau reste renseigné avec une valeur



if ((LowerBuffer[index] > LowerBuffer[index+1])&&(LowerBuffer[index+1] > LowerBuffer[index+2])) LowerBRed[index+1] = EMPTY_VALUE ; // idem avec la bande inf

else if ((LowerBuffer[index] < LowerBuffer[index+1])&&(LowerBuffer[index+1] < LowerBuffer[index+2]))LowerBGreen[index+1] = EMPTY_VALUE ;



} // fin boucle index



//----

return(0);

}

//+------------------------------------------------------------------+ 