//+------------------------------------------------------------------+ //| DMA.mq4 | //| Copyright © 2010, LenIFCHIK | //|Индикатор DMA (Displaced Moving Averages)отображает в основном | //|окне 3 скользящих средних: | //| - 3-периодная простая скользящая средняя от цен закрытия, | //| смещенная вперед на три периода (входной параметр - SR_DSMA); | //| - 7-периодная простая скользящая средняя от цен закрытия, | //| смещенная вперед на пять периодов (входной параметр - MR_DSMA);| //| - 25-периодная простая скользящая средняя от цен закрытия, | //| смещенная вперед на пять периодов(входной параметр - LR_DSMA). | //+------------------------------------------------------------------+ #property copyright "LenIFCHIK" #property indicator_chart_window // в основном окне #property indicator_buffers 3 // количество буферов #property indicator_color1 Red // цвет SR DSMA #property indicator_color2 Blue // цвет MR DSMA #property indicator_color3 Lime // цвет LR DSMA //---- внешние параметры индикатора //---- для SR DSMA extern int SR_DSMA_Period=3; // период SR DSMA extern int SR_DSMA_Shift=3; // сдвиг SR DSMA //---- для MR DSMA extern int MR_DSMA_Period=7; // период MR DSMA extern int MR_DSMA_Shift=5; // сдвиг MR DSMA //---- для LR DSMA extern int LR_DSMA_Period=25; // период LR DSMA extern int LR_DSMA_Shift=5; // сдвиг LR DSMA //---- параметры отображения линий (1-on,2-off) extern string Display_mode="0 - on, 1 - off"; extern int SR_DSMA_disp=1; // режим отображения SR DSMA extern int MR_DSMA_disp=1; // режим отображения MR DSMA extern int LR_DSMA_disp=1; // режим отображения LR DSMA //---- буферы индикатора double SR_DSMA_Buffer[]; // буфер SR DSMA double MR_DSMA_Buffer[]; // буфер MR DSMA double LR_DSMA_Buffer[]; // буфер LR DSMA //---- int ExtCountedBars=0; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- режим отображения //---- режим отображения SR DSMA switch(SR_DSMA_disp) { case 0 : SetIndexStyle(0,DRAW_NONE);break; // НЕ ОТОБРАЖАЕТСЯ case 1 : SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1);break; // ОТОБРАЖАЕТСЯ default : SR_DSMA_disp=1; // по умолчанию ОТОБРАЖАЕТСЯ } //---- режим отображения MR DSMA switch(MR_DSMA_disp) { case 0 : SetIndexStyle(1,DRAW_NONE);break; // НЕ ОТОБРАЖАЕТСЯ case 1 : SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1);break; // ОТОБРАЖАЕТСЯ default : MR_DSMA_disp=1; // по умолчанию ОТОБРАЖАЕТСЯ } //---- режим отображения LR DSMA switch(LR_DSMA_disp) { case 0 : SetIndexStyle(2,DRAW_NONE);break; // НЕ ОТОБРАЖАЕТСЯ case 1 : SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,1);break; // ОТОБРАЖАЕТСЯ default : LR_DSMA_disp=1; // по умолчанию ОТОБРАЖАЕТСЯ } //---- параметры смещения SetIndexShift(0,SR_DSMA_Shift); // смещения линии SR DSMA относительно начала графика SetIndexShift(1,MR_DSMA_Shift); // смещения линии MR DSMA относительно начала графика SetIndexShift(2,LR_DSMA_Shift); // смещения линии LR DSMA относительно начала графика IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)); // установка формата точности для визуализации значений индикатора //---- имена линий, для отображения информации в окне DataWindow и всплывающей подсказке SetIndexLabel(0,"SR DSMA"); SetIndexLabel(1,"MR DSMA"); SetIndexLabel(2,"LR DSMA"); //---- установка порядкового номера бара от начала данных, с которого должна начинаться отрисовка SetIndexDrawBegin(0,SR_DSMA_Period-1); SetIndexDrawBegin(1,MR_DSMA_Period-1); SetIndexDrawBegin(2,LR_DSMA_Period-1); //---- связь переменной, объявленной на глобальном уровне, с предопределенным буфером индикатора SetIndexBuffer(0,SR_DSMA_Buffer); SetIndexBuffer(1,MR_DSMA_Buffer); SetIndexBuffer(2,LR_DSMA_Buffer); //---- конец инициализации return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { if(Bars<=LR_DSMA_Period) return(0); ExtCountedBars=IndicatorCounted(); //---- if (ExtCountedBars<0) return(-1); //---- if (ExtCountedBars>0) ExtCountedBars--; //---- расчёт краткосрочной смещённой простой скользящей средней double sum=0; int i,pos=Bars-ExtCountedBars-1; if(pos=0) { sum+=Close[pos]; SR_DSMA_Buffer[pos]=sum/SR_DSMA_Period; sum-=Close[pos+SR_DSMA_Period-1]; pos--; } if(ExtCountedBars<1) for(i=1;i=0) { sum1+=Close[pos1]; MR_DSMA_Buffer[pos1]=sum1/MR_DSMA_Period; sum1-=Close[pos1+MR_DSMA_Period-1]; pos1--; } if(ExtCountedBars<1) for(i=1;i=0) { sum2+=Close[pos2]; LR_DSMA_Buffer[pos2]=sum2/LR_DSMA_Period; sum2-=Close[pos2+LR_DSMA_Period-1]; pos2--; } if(ExtCountedBars<1) for(i=1;i