Не получается раскрасить осцилятор

 

Не будучи особо искушенным в кодировании, решил попробовать слить два индикатора в один, а именно: индикатор чайкина я решил раскрасить наподобие MACD_4CZ. К сожалению, не хватает опыта понять, что сделал неправильно.

Результирующий код ничего не выводит.

Может я с буферами напутал?

//+----------------------------------------------------------------------------+
//|               CHO_4CZ                           Custom CHO_4CZ.mq4         |
//|                      Copyright © 2004, MetaQuotes Software Corp.           |
//|       mod. from ASilver CHO534     https://www.metaquotes.net/ik            |
//| mod. from MACD_4CZ    4colors  up/dn over/under zero;    www.forexTSD.com  |
//+----------------------------------------------------------------------------+
#property  copyright "Copyright © 2004, MetaQuotes Software Corp."
#property  link      "https://www.metaquotes.net/" 

//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 5
#property  indicator_color1  LimeGreen
#property  indicator_color2  Red
#property  indicator_color3  Red
#property  indicator_color4  Lime
#property  indicator_color5  Silver
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2
#property indicator_width5 2
#property indicator_level1 0.004
#property indicator_level2 0.002
#property indicator_level3 0.0004
#property indicator_level4 0
#property indicator_level5 -0.0004
#property indicator_level6 -0.002
#property indicator_level7 -0.004
#property indicator_levelcolor SlateGray
#property indicator_levelstyle 2

//---- indicator parameters
extern int       SlowPeriod=10;
extern int       FastPeriod=3;
extern int       TypeSmooth=1;// 0 - SMA, 1 - EMA
//---- indicator buffers
double green_buffer[];
double DarkGreen_buffer[];
double red_buffer[];
double Maroon_buffer[];
double Line_buffer[];

double AD[];
double CHO[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- drawing settings
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID);
   SetIndexBuffer(0,green_buffer);
//----
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID);
   SetIndexBuffer(1,DarkGreen_buffer);
//----
   SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID);
   SetIndexBuffer(2,red_buffer);
//----
   SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_SOLID);
   SetIndexBuffer(3,Maroon_buffer);
   
   SetIndexStyle(4,DRAW_LINE,STYLE_SOLID);
   SetIndexBuffer(4,Line_buffer);   
//----

   IndicatorDigits(Digits+1);
//---- name for DataWindow and indicator subwindow label
   string name,smoothString;
   if (TypeSmooth<0 || TypeSmooth>1) TypeSmooth=0;
   if (TypeSmooth==0) smoothString="SMA"; else smoothString="EMA";
   name="Chaikin Oscillator("+SlowPeriod+","+FastPeriod+","+smoothString+")";
   
   IndicatorShortName(name);
   SetIndexLabel(0,name);
   SetIndexLabel(1,name);
   SetIndexLabel(2,name);
   SetIndexLabel(3,name);
   SetIndexLabel(4,name);   



//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Chaikin Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
 //  double CHO;
   int limit,i;
   int counted_bars=IndicatorCounted();

//---- check for possible errors
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted

   if (counted_bars==0) 
      {
      limit=Bars-1;
      for (i=limit;i>=0;i--)
        {
         AD[i]=iAD(NULL,0,i);
        }
      for(i=limit-SlowPeriod;i>=0;i--)
        {
         CHO[i]=iMAOnArray(AD,0,FastPeriod,0,TypeSmooth,i)-iMAOnArray(AD,0,SlowPeriod,0,TypeSmooth,i);
        }
      }

   if (counted_bars>0) 
     {
      limit=Bars-counted_bars;
      for (i=limit;i>=0;i--)
        {
         AD[i]=iAD(NULL,0,i);
        }
      for(i=limit;i>=0;i--)
        {
         CHO[i]=iMAOnArray(AD,0,FastPeriod,0,TypeSmooth,i)-iMAOnArray(AD,0,SlowPeriod,0,TypeSmooth,i);
        }
      }        
      

Line_buffer[i] = CHO[i];           
if(CHO[i]>0) {
      if ( ( (green_buffer[i+1] != 0) && (CHO[i] >= green_buffer[i+1]) ) ||
           ( (DarkGreen_buffer[i+1] != 0) && (CHO[i] > DarkGreen_buffer[i+1]) ) ||
           ( (red_buffer[i+1] != 0) && (CHO[i] >= green_buffer[i+1]) ) ||
           ( (Maroon_buffer[i+1] != 0) && (CHO[i] >= green_buffer[i+1]) )
            ) {
        green_buffer[i] = CHO[i];
        DarkGreen_buffer[i] = 0;
        Maroon_buffer[i] = 0;
        red_buffer[i] = 0;
      }
      else {
        green_buffer[i] = 0;
        DarkGreen_buffer[i] = CHO[i];
        Maroon_buffer[i] = 0;
        red_buffer[i] = 0;}
     }
       else {
     if ( ( (red_buffer[i+1] != 0) && (CHO[i] >= red_buffer[i+1]) ) ||
           ( (Maroon_buffer[i+1] != 0) && (CHO[i] > Maroon_buffer[i+1]) ) ) {
        red_buffer[i] = CHO[i];
        Maroon_buffer[i] = 0;
        green_buffer[i] = 0;
        DarkGreen_buffer[i] = 0;
      }
      else {
        red_buffer[i] = 0;
        Maroon_buffer[i] = CHO[i];
        green_buffer[i] = 0;
        DarkGreen_buffer[i] = 0;
   } 
      }
   
//---- done
   return(0);
  }
 

подправил #property indicator_buffers 7

в инит добавил описания буферов

К сожалению, видимо, не в этом ошибка :(

 
А дальше ищите ошибки в раскраске.
 
тут, видимо, не в окраске дело, индикатор вообще ничего не выводит
 
Заработал индюк, ссылка тут https://www.mql5.com/ru/code/10361
 
Круто, все бы так поступали.
 

eXaR:

Заработал индюк, ссылка тут https://www.mql5.com/ru/code/10361


Прежде чем устанавливать окрашивающим буферам значения, надо каждый раз очищать эти буферы. Глючит раскраска.

//-----------раскраска--------------//
for (i=limit;i>=0;i--)
{


//Добавить:
green_buffer[i]=0;
DarkGreen_buffer[i]=0;
red_buffer[i]=0;
Maroon_buffer[i]=0;

if(CHO[i]>0) 
      {
...
...
...
 
Да, к сожалению, я ошибся. Сейчас исправлю. Благодарю за помощь!
Причина обращения: