//+------------------------------------------------------------------+ //| MACD full.mq4 | //|Индикатор состоит из: | //| - стандартного MACD (FastEMA[12]-SlowEMA[26] и SignalISMA[9]); | //| - гистограммы MACD с применением пятипериодного SMA в качестве | //| сигнальной линии (MACD[12,26]- SignalISMA[9] и SignSMA[5]). | //| | //|Входные параметры, предлагаемые Metatrader 4: | //| - FastEMA=12; | //| - SlowEMA=26; | //| - SignalSMA=9; | //|Для методики ДиНаполи первые три значения заменены на 8 | //|(округлённое 8,3897), 18 (округлённое 17,5185) и 9 (округлённое | //|9,0503) соответственно. | //+------------------------------------------------------------------+ #property copyright "Copyright © 2010, LenIFCHIK" //---- настройки индикатора #property indicator_separate_window //в отдельном окне #property indicator_buffers 8 //изпользуется 6 буферов //---- цветовая палитра //---- гистограмма MACD #define COL_1 RoyalBlue //цвет восходящей линии гистограммы MACD #define COL_2 FireBrick //цвет нисходящей линии гистограммы MACD #define COL_3 MidnightBlue //цвет сигнальной линии гистограммы MACD #define COL_4 LightSteelBlue //цвет восходящей линии гистограммы MACD #define COL_5 CornflowerBlue //цвет нисходящей линии гистограммы MACD #define COL_6 C'86,138,235' //цвет "обводки" гистограммы MACD #define COL_7 Red //сигнальной линии гистограммы MACD //---- MACD #define COL_8 LightGray //цвет восходящей MACD #define COL_9 DarkGray //цвет нисходящей MACD #define COL_10 DarkSlateGray //цвет "обводки" MACD #define COL_11 Red //цвет сигнальной линии MACD //---- параметры индикатора extern int FastEMA=8; //период быстрого EMA extern int SlowEMA=18; //период медленного EMA extern int SignalSMA=9; //период сигнальной линии MACD extern int SignSMA=5; //период сигнальной линии гистограммы MACD extern string MACD_Hist_display_mode="0 - nothing, 1 - line, 2 - histogram"; extern int MACD_Hist_disp=0; //режим отображения гистограммы MACD (0-не отображается, 1-отображается) extern string MACD_display_mode="0 - nothing, 1 - line, 2 - histogram"; extern int MACD_disp=2; //режим отображения MACD (0-не отображается, 1-отображается) //---- буферы индикатора: //---- буферы гистограммы MACD double ExtBuffer1[]; //буфер восходящей линии гистограммы MACD double ExtBuffer2[]; //буфер нисходящей линии гистограммы MACD double OsmaBuffer[]; //буфер гистограммы MACD double SignSMABuffer[]; //буфер сигнальной линии гистограммы MACD //---- буферы MACD double ExtBuffer3[]; //буфер восходящего MACD double ExtBuffer4[]; //буфер нисходящего MACD double MacdBuffer[]; //буфер MACD double SignalBuffer[]; //буфер сигнальной линии MACD //+------------------------------------------------------------------+ //| Инициализация. Функция init | //+------------------------------------------------------------------+ int init() { //---- 2 дополнительных буфера используются для вычислений IndicatorBuffers(8); //число буферов индикатора //---- параметры отрисовки: //---- гистограммы MACD switch(MACD_Hist_disp) //режим отображения гистограммы MACD { case 0 : //НЕ ОТОБРАЖАЕТСЯ SetIndexStyle(0,DRAW_NONE); //стиль восходящей линии гистограммы MACD SetIndexStyle(1,DRAW_NONE); //стиль нисходящей линии гистограммы MACD SetIndexStyle(2,DRAW_NONE); //стиль основной гистограммы MACD SetIndexStyle(3,DRAW_NONE); //стиль сигнальной линии гистограммы MACD break; case 1 : //ОТОБРАЖАЕТСЯ В ВИДЕ ЛИНИЙ SetIndexStyle(0,DRAW_LINE, STYLE_SOLID,1,COL_1); //стиль восходящей линии гистограммы MACD SetIndexStyle(1,DRAW_LINE, STYLE_SOLID,1,COL_2); //стиль нисходящей линии гистограммы MACD SetIndexStyle(2,DRAW_NONE, STYLE_SOLID,1,NULL); //стиль основной линии гистограммы MACD SetIndexStyle(3,DRAW_LINE, STYLE_SOLID,1,COL_3); //стиль сигнальной линии гистограммы MACD break; case 2 : //ОТОБРАЖАЕТСЯ В ВИДЕ ГИСТОГРАММЫ С СИГНАЛЬНОЙ ЛИНИЕЙ SetIndexStyle(0,DRAW_HISTOGRAM, STYLE_SOLID,1,COL_4); //стиль восходящей линии гистограммы MACD SetIndexStyle(1,DRAW_HISTOGRAM, STYLE_SOLID,1,COL_5); //стиль нисходящей линии гистограммы MACD SetIndexStyle(2,DRAW_LINE, STYLE_SOLID,1,COL_6); //стиль "обводки" гистограммы MACD SetIndexStyle(3,DRAW_LINE, STYLE_SOLID,1,COL_7); //стиль сигнальной линии гистограммы MACD default : MACD_Hist_disp=0; //по умолчанию НЕ ОТОБРАЖАЕТСЯ } //---- MACD switch(MACD_disp) //режим отображения MACD { case 0 : //НЕ ОТОБРАЖАЕТСЯ SetIndexStyle(4,DRAW_NONE); //стиль восходящей MACD SetIndexStyle(5,DRAW_NONE); //стиль нисходящей MACD SetIndexStyle(6,DRAW_NONE); //стиль "обводки" MACD SetIndexStyle(7,DRAW_NONE); //стиль сигнальной линии MACD break; case 1 : //ОТОБРАЖАЕТСЯ В ВИДЕ ЛИНИЙ SetIndexStyle(4,DRAW_NONE); //стиль восходящей MACD SetIndexStyle(5,DRAW_NONE); //стиль нисходящей MACD SetIndexStyle(6,DRAW_LINE, STYLE_SOLID,1,COL_10); //стиль линии MACD SetIndexStyle(7,DRAW_LINE, STYLE_SOLID,1,COL_11); //стиль сигнальной линии MACD break; case 2 : //ОТОБРАЖАЕТСЯ В ВИДЕ ГИСТОГРАММЫ С СИГНАЛЬНОЙ ЛИНИЕЙ SetIndexStyle(4,DRAW_HISTOGRAM, STYLE_SOLID,1,COL_8); //стиль восходящей MACD SetIndexStyle(5,DRAW_HISTOGRAM, STYLE_SOLID,1,COL_9); //стиль нисходящей MACD SetIndexStyle(6,DRAW_LINE, STYLE_SOLID,1,COL_10); //стиль "обводки" MACD SetIndexStyle(7,DRAW_LINE, STYLE_SOLID,1,COL_11); //стиль сигнальной линии MACD break; default : MACD_disp=2; //по умолчанию ОТОБРАЖАЕТСЯ ГИСТОГРАММА С СИГНАЛЬНОЙ ЛИНИЕЙ } //---- координаты начала отрисовки: //---- гистограммы MACD SetIndexDrawBegin(0,SlowEMA); //бар, с которого начнётся отрисовка восходящей линии гистограммы MACD SetIndexDrawBegin(1,SlowEMA); //бар, с которого начнётся отрисовка нисходящей линии гистограммы MACD SetIndexDrawBegin(2,SlowEMA); //бар, с которого начнётся отрисовка гистограммы MACD SetIndexDrawBegin(3,SlowEMA); //бар, с которого начнётся отрисовка сигнальной линии гистограммы MACD //---- MACD SetIndexDrawBegin(4,SlowEMA); //ар, с которого начнётся отрисовка восходящей MACD SetIndexDrawBegin(5,SlowEMA); //ар, с которого начнётся отрисовка нисходящей MACD SetIndexDrawBegin(6,SlowEMA); //бар, с которого начнётся отрисовка MACD SetIndexDrawBegin(7,SlowEMA); //бар, с которого начнётся отрисовка сигнальной линии MACD //---- параметры округления IndicatorDigits(Digits); //округление до параматров округления цены //---- разметка буферов: //---- гистограммы MACD SetIndexBuffer(0,ExtBuffer1); //буфер восходящей линии гистограммы MACD SetIndexBuffer(1,ExtBuffer2); //буфер нисходящей линии гистограммы MACD SetIndexBuffer(2,OsmaBuffer); //буфер гистограммы MACD SetIndexBuffer(3,SignSMABuffer); //буфер сигнальной линии гистограммы MACD //---- MACD SetIndexBuffer(4,ExtBuffer3); //буфер восходящей MACD SetIndexBuffer(5,ExtBuffer4); //буфер нисходящей MACD SetIndexBuffer(6,MacdBuffer); //буфер MACD SetIndexBuffer(7,SignalBuffer); //буфер сигнальной линии MACD //---- назание окна данных и окна индикатора IndicatorShortName("MACD full("+FastEMA+","+SlowEMA+","+SignalSMA+","+SignSMA+")"); //---- конец инициализации return(0); } //+------------------------------------------------------------------+ //| MACD и гистограмма MACD | //+------------------------------------------------------------------+ int start() { double current, current1, prev, prev1; //---- пересчёт последнего расчитанного бара int counted_bars=IndicatorCounted(); if(counted_bars<0) return(-1); if(counted_bars>0) counted_bars--; int limit=Bars-counted_bars; if(counted_bars==0) limit-=1+2; //---- расчёт MACD for(int i=0; i=0; i--) { current=OsmaBuffer[i]; //текущее значение гистограммы MACD prev=OsmaBuffer[i+1]; //предыдущее значение гистограммы MACD current1=MacdBuffer[i]; //текущее значение MACD prev1=MacdBuffer[i+1]; //предыдущее значение MACD //---- для гистограммы MACD if(current>=prev) //если текущее значение гистограммы MACD равно или превышает предыдущее, то... { ExtBuffer1[i]=current; //...отображается буфер восходящей гистограммы MACD, ExtBuffer2[i]=EMPTY_VALUE; //буфер нисходящей гистограммы MACD не отображается } else //в ином случае... { ExtBuffer1[i]=current; //...отображается буфер нисходящей гистограммы MACD, ExtBuffer2[i]=current; //и буфер нисходящей (чтобы линия отрисовывалась без разрывов) } //---- для MACD if(current1>=prev1) //если текущее значение MACD равно или превышает предыдущее, то... { ExtBuffer3[i]=current1; //...отображается буфер восходящего MACD, ExtBuffer4[i]=EMPTY_VALUE; //буфер нисходящего MACD не отображается } else //в ином случае... { ExtBuffer4[i]=current1; //...отображается буфер нисходящего MACD, ExtBuffer3[i]=EMPTY_VALUE; //буфер восходящего MACD не отображается { } //---- конец } } return(0); } //+------------------------------------------------------------------+