#property indicator_chart_window #property indicator_buffers 2 #property indicator_plots 1 //---- plot ColorLine #property indicator_label1 "ColorLine" #property indicator_type1 DRAW_COLOR_LINE #property indicator_color1 clrRed,clrGreen,clrBlue #property indicator_style1 STYLE_SOLID #property indicator_width1 3 //--- indicator buffers double ColorLineBuffer[]; double ColorBuffer[]; int MA_handle; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,ColorLineBuffer,INDICATOR_DATA); SetIndexBuffer(1,ColorBuffer,INDICATOR_COLOR_INDEX); //--- get MA handle MA_handle=iMA(Symbol(),0,10,0,MODE_EMA,PRICE_CLOSE); //--- } //+------------------------------------------------------------------+ //| get color index | //+------------------------------------------------------------------+ int getIndexOfColor(int i) { int j=i%300; if(j<100) return(0);// first index if(j<200) return(1);// second index return(2); // third index } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- static int ticks=0,modified=0; int limit; //--- first calculation or number of bars was changed if(prev_calculated==0) { //--- copy values of MA into indicator buffer ColorLineBuffer int copied=CopyBuffer(MA_handle,0,0,rates_total,ColorLineBuffer); if(copied<=0) return(0);// copying failed - throw away //--- now set line color for every bar for(int i=0;i<rates_total;i++) ColorBuffer[i]=getIndexOfColor(i); } else { //--- copy values of MA into indicator buffer ColorLineBuffer int copied=CopyBuffer(MA_handle,0,0,rates_total,ColorLineBuffer); if(copied<=0) return(0); ticks++;// ticks counting if(ticks>=5)//it's time to change color scheme { ticks=0; // reset counter modified++; // counter of color changes if(modified>=3)modified=0;// reset counter ResetLastError(); switch(modified) { case 0:// first color scheme PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrRed); PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrBlue); PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrGreen); Print("Color scheme "+modified); break; case 1:// second color scheme PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrYellow); PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrPink); PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrLightSlateGray); Print("Color scheme "+modified); break; default:// third color scheme PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrLightGoldenrod); PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrOrchid); PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrLimeGreen); Print("Color scheme "+modified); } } else { //--- set start position limit=prev_calculated-1; //--- now we set line color for every bar for(int i=limit;i<rates_total;i++) ColorBuffer[i]=getIndexOfColor(i); } } //--- return value of prev_calculated for next call return(rates_total); } |