Не красится гистограмма в MACD

 
Здравствуйте, помогите разобраться что я не так сделал. Не удаётся покрасить гисторграмму. Код прописал вроде верно, но что-то не так. Вот мой MACD:
Файлы:
MACDNew.mq5  6 kb
 
Andrey:
Здравствуйте, помогите разобраться что я не так сделал. Не удаётся покрасить гисторграмму. Код прописал вроде верно, но что-то не так. Вот мой MACD:
#property indicator_type1   DRAW_HISTOGRAM
Нужен тип DRAW_COLOR_HISTOGRAM
 
Alexey Kozitsyn:
#property indicator_type1   DRAW_HISTOGRAM
Нужен тип DRAW_COLOR_HISTOGRAM
Спасибо, поставил, но чего-то всё-равно не хватает
 
Andrey:
Спасибо, поставил, но чего-то всё-равно не хватает
SetIndexBuffer(0,ExtMacdBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA);
SetIndexBuffer(2,ExtSignalBuffer2,INDICATOR_DATA);
SetIndexBuffer(3,ExtMACDColor,INDICATOR_COLOR_INDEX);

Нужно изменить последовательность индексации буферов. Буфер цвета должен идти сразу же за буфером значений соответствующей граф. серии.

Да, вставляйте код прямо на форум через кнопку SRC, чтобы каждый раз не скачивать файл.

 

Благодарю за помощь.

Теперь всё заработало.

А можно последний вопрос? Я всё пытаюсь привязать к MACD осциллятор Volatility FBA NR чтобы тот показывал перекупленнось\перепроданость на макди другим цветом при достижение границы. На mq4 у меня был рабочий вариант. 

 

/*
iCustom(NULL,0,"_MACD_Xtr",FastMA,SlowMA,SignalSMA1,SignalSMA2,Source,SourcePeriod,FrontPeriod,xVolatility,Sens, N,i);
*/

#property indicator_separate_window // в окне индикатора
#property indicator_buffers 8
#property indicator_color1 RoyalBlue //
#property indicator_color2 Crimson // скользящая средняя симпл
#property indicator_color3 RoyalBlue // скользящая средняя симпл
#property indicator_color4 Lime // уровень ПК
#property indicator_color5 Crimson // уровень ПП
#property indicator_color6 Lime // бар в зоне ПК
#property indicator_color7 Crimson // бар в зоне ПП

// входные параметры
   // MACD
extern int FastMA=5; // период быстрой EMA
extern int SlowMA=13; // период медленной EMA
   // Скользящие средние cимпл
extern int SignalSMA1=5;
extern int SignalSMA2=34;
   // волатильность
extern int Source=1; // источник: 0 - объем, 1 - ATR, 2 - ст.девиация
extern int SourcePeriod=5; // период источника
      // сигнальная
double FrontPeriod=1; // период сглаживания фронта; м.б. <1
extern double BackPeriod=444; // период сглаживания затухания; м.б. <1
   // уровни ПК/ПП
extern double xVolatility=0.5;
extern double Sens=0; // порог чувствительности в пп. или в тиках (для объема)

extern bool SoundON=false;

int History=0; // кол-во баров предыстории; 0 - все

// инд.буферы
double   MACD[], // MACD
         SMAI[], // Скользящая средняя cимпл
                 SMAII[], // Скользящая средняя cимпл
         OB[], // уровень ПК
         OS[], // уровень ПП
         OBH[], // бар в зоне ПК
         OSH[]; // бар в зоне ПП
// общие (глобальные) переменные
bool first=1; // флаг первого запуска
double sens; // порог чувствительности в ценах

// Сигнал уведомления
#define SIGNAL_BAR 1

// инициализация
int init()
  {
   first=1;
   sens=Sens*Point; // порог чувствительности в ценах
   string _md="MACD("+FastMA+","+SlowMA+","+SignalSMA1+","+SignalSMA2+")";
  
   SetIndexBuffer(0,MACD);
   SetIndexStyle(0,DRAW_HISTOGRAM,0);
   SetIndexLabel(0,_md);

   SetIndexBuffer(1,SMAI);
   SetIndexStyle(1,DRAW_LINE,0,2);
   SetIndexLabel(1,"SMAS");

   SetIndexBuffer(2,SMAII);
   SetIndexStyle(2,DRAW_LINE,0,2);
   SetIndexLabel(2,"SMAL");
  
   SetIndexBuffer(3,OB);
   SetIndexStyle(3,DRAW_LINE,2);
   SetIndexLabel(3,"OB");

   SetIndexBuffer(4,OS);
   SetIndexStyle(4,DRAW_LINE,2);
   SetIndexLabel(4,"OS");

   SetIndexBuffer(5,OBH);
   SetIndexStyle(5,DRAW_HISTOGRAM,0,2);
   SetIndexLabel(5,"Peak");

   SetIndexBuffer(6,OSH);
   SetIndexStyle(6,DRAW_HISTOGRAM,0,2);
   SetIndexLabel(6,"Trough");

   if(BackPeriod<1) string _bk=DoubleToStr(BackPeriod,3); else _bk=DoubleToStr(BackPeriod,0);
      // чувствительность
   if(Sens>0) string _src=DoubleToStr(Sens,1)+" ";
      // источник
   switch(Source) {
      case 0: _src=_src+"Volume"; break; // объем
      case 1: _src=_src+"ATR"; break; // ATR
      case 2: _src=_src+"StDev"; // ст.девиация
     }
   _src=_src+"("+SourcePeriod+","+_bk+")";

   IndicatorShortName(_md+" "+_src);
  
   return(0);
  }

// ф-я дополнительной инициализации
int reinit()
  {
   ArrayInitialize(MACD,0.0); // обнуление массива
   ArrayInitialize(SMAI,0.0); // обнуление массива
   ArrayInitialize(OB,0.0); // обнуление массива
   ArrayInitialize(OS,0.0); // обнуление массива
   ArrayInitialize(OBH,0.0); // обнуление массива
   ArrayInitialize(OSH,0.0); // обнуление массива
   return(0);
  }

int start()
  {
   int ic=IndicatorCounted();
  
   if(!first && Bars-ic-1>1) ic=reinit(); // если есть пропущенные бары не на подключении - пересчет
   bool ic0=ic==0; // флаг пересчета
   int limit=Bars-ic-1; // кол-во пересчетов
   if(History!=0 && limit>History) limit=History-1; // кол-во пересчетов по истории

   for(int i=limit; i>=0; i--) { // цикл пересчета по ВСЕМ барам
      
      double macd=iMACD(NULL,0,FastMA,SlowMA,1,0, 0,i);
      MACD[i]=macd;
      
      double SMA1=iMAOnArray(MACD,Bars,SignalSMA1,0,MODE_SMA,i);
      SMAI[i]=SMA1;
          
      double SMA2=iMAOnArray(MACD,Bars,SignalSMA2,0,MODE_SMA,i);
      SMAII[i]=SMA2;
      
      double vlt=xVolatility*iCustom(NULL,0,"Volatility FBA NR",Source,SourcePeriod,FrontPeriod,BackPeriod,0, 1,i);
      double lev=MathMax(sens,vlt);
      OB[i]=lev; OS[i]=-lev;

      if(macd> lev) OBH[i]=macd; else OBH[i]=0;
      if(macd<-lev) OSH[i]=macd; else OSH[i]=0;

     }
   first=0; // сброс флага первого цикла
  
//---- Сигнал уведомления
static int PrevSignal = 0, PrevTime = 0;
   if(SIGNAL_BAR > 0 && Time[0] <= PrevTime )
   return(0);
   PrevTime = Time[0];
   if(PrevSignal <= 0)
     {
        if(MACD[SIGNAL_BAR] - MACD[SIGNAL_BAR+1] > 0)
          {
            PrevSignal = 1;
            if (SoundON) PlaySound ("alert.wav");
          }
      }
   if(PrevSignal >= 0)
      {
        if(MACD[SIGNAL_BAR+1] - MACD[SIGNAL_BAR] > 0)
          {
            PrevSignal = -1;
            if (SoundON) PlaySound ("alert.wav");
          }
      }
   return(0);
  }

Но вот как это сделать в mql5? Мне бы хотя бы пример кодовой части подсказать, а то в mql5 я плохо разбираюсь.

 Сам Volatility прикреплю ниже на всякий случай. Он уже переделан под mql5.

Файлы:
 
Andrey:

Благодарю за помощь.

Теперь всё заработало.

А можно последний вопрос? Я всё пытаюсь привязать к MACD осциллятор Volatility FBA NR чтобы тот показывал перекупленнось\перепроданость на макди другим цветом при достижение границы. На mq4 у меня был рабочий вариант. 

Вся разница в том, что в mql4 вы получаете значение осциллятора "сразу" через iCustom, а в mql5 нужно сначала получить хэндл управления индикатором (на этапе инициализации МАCD), также через iCustom, а затем уже запрашивать данные осциллятора с помощью функции CopyBuffer(). Смотрите примеры в документации: https://www.mql5.com/ru/docs/indicators/icustom и https://www.mql5.com/ru/docs/series/copybuffer
Документация по MQL5: Технические индикаторы / iCustom
Документация по MQL5: Технические индикаторы / iCustom
  • www.mql5.com
Технические индикаторы / iCustom - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

[spoiler]

//+------------------------------------------------------------------+
//|                                                         MACD.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2009, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property description "Moving Average Convergence/Divergence"
#include <MovingAverages.mqh>
//--- настройки индикатора
#property indicator_separate_window
#property indicator_buffers 11
#property indicator_plots   7
#property indicator_type1   DRAW_LINE
#property indicator_type2   DRAW_LINE
#property indicator_type3   DRAW_COLOR_HISTOGRAM
#property indicator_type4   DRAW_HISTOGRAM
#property indicator_type5   DRAW_HISTOGRAM
#property indicator_type6   DRAW_LINE
#property indicator_type7   DRAW_LINE

#property indicator_color1  Red
#property indicator_color2  Blue
#property indicator_color3  White, LimeGreen, DarkGreen, Maroon, Red
#property indicator_color4  Blue
#property indicator_color5  Blue
#property indicator_color6  Blue
#property indicator_color7  Blue

#property indicator_width1  2
#property indicator_width2  2
#property indicator_width3  2
#property indicator_width4  2
#property indicator_width5  2
#property indicator_width6  2
#property indicator_width7  2

#property indicator_label1  "Скользящая"
#property indicator_label2  "Скользящая+"
#property indicator_label3  "MACD"
#property indicator_label4  "ПК"
#property indicator_label5  "ПП"
#property indicator_label6  "Уровень ПК"
#property indicator_label7  "Уровень ПП"

//--- входные параметры
input int                InpFastEMA=5;                // Fast EMA period
input int                InpSlowEMA=13;               // Slow EMA period
input int                InpSignalSMA=5;              // Signal SMA period
input int                InpSignalSMA2=34;            // Signal SMA period
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Applied price
//--- волатильность
input int                Source=1;                    // источник: 0 - объем, 1 - ATR, 2 - ст.девиация
input int                SourcePeriod=5;              // период источника
//--- сигнальная линия
input double             FrontPeriod=1;               // период сглаживания фронта; м.б. <1
input double             BackPeriod=444;              // период сглаживания затухания; м.б. <1
//--- уровни ПК/ПП
input double             xVolatility=0.5;
input double             Sens=0;                      // порог чувствительности в пп. или в тиках (для объема)


//--- indicator buffers
double                   ExtSignalBuffer[];
double                   ExtSignalBuffer2[];
double                   ExtMacdBuffer[];
double                   ExtMACDColor[];
double                   OBH[];
double                   OSH[];
double                   OB[];
double                   OS[];
double                   VolatilityBuffer[];
double                   ExtFastMaBuffer[];
double                   ExtSlowMaBuffer[];

//--- MA handles
int                      ExtFastMaHandle;
int                      ExtSlowMaHandle;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtSignalBuffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ExtMacdBuffer,INDICATOR_DATA);
   SetIndexBuffer(3,ExtMACDColor,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(4,OBH,INDICATOR_DATA);
   SetIndexBuffer(5,OSH,INDICATOR_DATA);
   SetIndexBuffer(6,OB,INDICATOR_DATA);
   SetIndexBuffer(7,OS,INDICATOR_DATA);
   SetIndexBuffer(8,VolatilityBuffer,INDICATOR_DATA);
   SetIndexBuffer(9,ExtFastMaBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(10,ExtSlowMaBuffer,INDICATOR_CALCULATIONS);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpSignalSMA-1);
//--- name for Dindicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"MACD("+string(InpFastEMA)+","+string(InpSlowEMA)+","+string(InpSignalSMA)+","+string(InpSignalSMA)+")");

//--- получение хэндлов
   ExtFastMaHandle=iMA(NULL,0,InpFastEMA,0,MODE_EMA,InpAppliedPrice);
   ExtSlowMaHandle=iMA(NULL,0,InpSlowEMA,0,MODE_EMA,InpAppliedPrice);

//---а это как вписать?
   if(BackPeriod<1) string _bk=DoubleToStr(BackPeriod,3); else _bk=DoubleToStr(BackPeriod,0);
      // чувствительность
   if(Sens>0) string _src=DoubleToStr(Sens,1)+" ";
//---------------------

   Volatility_Handle=iCustom(NULL,0,"Examples\\Volatility FBA NR",
                     Volume,
                     ATR,
                     STDEV,
                     );
   Print("Volatility_Handle = ",Volatility_Handle,"  error = ",GetLastError());

//---и это?
double lev=MathMax(sens,vlt);
      OB[i]=lev; OS[i]=-lev;
//--- инициализация закончена
  }

//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
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[])
  {
//--- скопируем значения индикатора Volatility FBA NR в наш индикаторный буфер
   int copy=CopyBuffer(Volatility_Handle,0,0,rates_total,VolatilityBuffer);
   Print("copy =",copy,"    rates_total =",rates_total);
//--- если попытка неудачная - сообщим об этом
   if(copy<=0)
      Print("Неудачная попытка получить значения индикатора Volatility FBA NR");
//--- return value of prev_calculated for next call

//--- check for data
   if(rates_total<InpSignalSMA)
      return(0);
//--- not all data may be calculated
   int calculated=BarsCalculated(ExtFastMaHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtFastMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }
   calculated=BarsCalculated(ExtSlowMaHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtSlowMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }
//--- we can copy not all data
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0) to_copy++;
     }
//--- get Fast EMA buffer
   if(IsStopped()) return(0); //Checking for stop flag
   if(CopyBuffer(ExtFastMaHandle,0,0,to_copy,ExtFastMaBuffer)<=0)
     {
      Print("Getting fast EMA is failed! Error",GetLastError());
      return(0);
     }
//--- get SlowSMA buffer
   if(IsStopped()) return(0); //Checking for stop flag
   if(CopyBuffer(ExtSlowMaHandle,0,0,to_copy,ExtSlowMaBuffer)<=0)
     {
      Print("Getting slow SMA is failed! Error",GetLastError());
      return(0);
     }
//---
   int limit;
   if(prev_calculated==0)
      limit=0;
   else limit=prev_calculated-1;
//--- calculate MACD
   for(int i=limit;i<rates_total && !IsStopped();i++)
   {
      ExtMacdBuffer[i]=ExtFastMaBuffer[i]-ExtSlowMaBuffer[i];
      if(ExtMacdBuffer[i] > lev) OBH[i]=ExtMacdBuffer[i]; else OBH[i]=0;
      if(ExtMacdBuffer[i] < -lev) OSH[i]=ExtMacdBuffer[i]; else OSH[i]=0;
      if(ExtMacdBuffer[i] > 0)
      {
        if(ExtMacdBuffer[i] > ExtMacdBuffer[i-1])
          ExtMACDColor[i] = 1;
        else
          ExtMACDColor[i] = 2;
      }
      else if(ExtMacdBuffer[i] < 0)
      {
        if(ExtMacdBuffer[i] < ExtMacdBuffer[i-1])
          ExtMACDColor[i] = 3;
        else
          ExtMACDColor[i] = 4;
      }
      else
        ExtMACDColor[i] = 0;
   }  
//--- calculate Signal
   SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);
   SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA2,ExtMacdBuffer,ExtSignalBuffer2);
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+

[/spoiler] 

 Как всегда где-то запряталась ошибка.

А как мне это вписать в индикатор? И нужно ли делать обнуление массивов? 

//---а это как вписать?
   if(BackPeriod<1) string _bk=DoubleToStr(BackPeriod,3); else _bk=DoubleToStr(BackPeriod,0);
      // чувствительность
   if(Sens>0) string _src=DoubleToStr(Sens,1)+" ";
//---------------------
//---и это?
double lev=MathMax(sens,vlt);
      OB[i]=lev; OS[i]=-lev;
//--- инициализация закончена

 

 Далее я попытался присоединить код для отображения ПП\ПК другим цветом на макди, причем так, чтоб он не мешал работе 4ёхцветного макди(т.е в зоне ПП\ПК гистограмма отображается только синим, а не 4ёхцветом). Вот что у меня получилось:

//--- calculate MACD
   for(int i=limit;i<rates_total && !IsStopped();i++)
   {
      ExtMacdBuffer[i]=ExtFastMaBuffer[i]-ExtSlowMaBuffer[i];
      if(ExtMacdBuffer[i] > lev) OBH[i]=ExtMacdBuffer[i]; else OBH[i]=0;
      if(ExtMacdBuffer[i] < -lev) OSH[i]=ExtMacdBuffer[i]; else OSH[i]=0;
      if(ExtMacdBuffer[i] > 0)
      {
        if(ExtMacdBuffer[i] > ExtMacdBuffer[i-1])
          ExtMACDColor[i] = 1;
        else
          ExtMACDColor[i] = 2;
      }
      else if(ExtMacdBuffer[i] < 0)
      {
        if(ExtMacdBuffer[i] < ExtMacdBuffer[i-1])
          ExtMACDColor[i] = 3;
        else
          ExtMACDColor[i] = 4;
      }
      else
        ExtMACDColor[i] = 0;
   }  

 

Похоже я много допустил ошибок, подскажите пожалуйста что мне нужно исправить?