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