//+------------------------------------------------------------------+ //| LaGuerre RSI v2.1m_mtf.mq4 | //|LaGuerre_RSI_v2.1m_mtf mladen | //+------------------------------------------------------------------+ //mod //покоцал индюк Mаrtingeil, убрал все лишнее что насовал автор в него, //таймфрейм рекомендуемый автором М30. //-------------------------------------------------------------------- #property indicator_separate_window #property indicator_minimum 0.0 #property indicator_maximum 1.0 #property indicator_buffers 3 #property indicator_color1 Blue #property indicator_color2 Lime #property indicator_color3 OrangeRed //-------------------------------------------------------------------- extern double Gama = 0.21; //-------------------------------------------------------------------- int Smooth = 0; bool SmoothPrice = FALSE; bool ShowLevelSig = TRUE, ShowCrossings = TRUE; double Level1 = 0.75, Level2 = 0.5, Level3 = 0.25; //-------------------------------------------------------------------- double buffer1[]; double buffer2[]; double buffer3[]; double buffer4[]; double buffer5[]; double buffer6[]; double buffer7[]; double buffer8[]; //-------------------------------------------------------------------- int init() { IndicatorBuffers(8); SetIndexBuffer(0, buffer1);// сигнальная линия SetIndexBuffer(1, buffer2); SetIndexBuffer(2, buffer3); SetIndexBuffer(3, buffer4); SetIndexBuffer(4, buffer5); SetIndexBuffer(5, buffer6); SetIndexBuffer(6, buffer7); SetIndexBuffer(7, buffer8); if (ShowCrossings || ShowLevelSig) { SetIndexStyle(1, DRAW_ARROW); SetIndexStyle(2, DRAW_ARROW); SetIndexArrow(1, 159); SetIndexArrow(2, 159); } else { SetIndexStyle(1, DRAW_NONE); SetIndexStyle(2, DRAW_NONE); } string stringname = "Laguerre_RSI_v2 "; IndicatorShortName(stringname); SetIndexLabel(0, "Laguerre_RSI_v2"); //---- return (0);} //-------------------------------------------------------------------- int start() { int i; 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+1; for (i = limit; i >= 0; i--) buffer1[i] = LaGuerre(Gama, i); for (i = limit; i >= 0; i--) { buffer2[i] = EMPTY_VALUE; buffer3[i] = EMPTY_VALUE; if (ShowCrossings) { if (buffer1[i] > Level1 && buffer1[i + 1] < Level1) buffer2[i] = Level1; if (buffer1[i] < Level1 && buffer1[i + 1] > Level1) buffer3[i] = Level1; if (buffer1[i] > Level3 && buffer1[i + 1] < Level3) buffer2[i] = Level3; if (buffer1[i] < Level3 && buffer1[i + 1] > Level3) buffer3[i] = Level3; } if (ShowLevelSig) { if (buffer1[i] > Level1) buffer2[i] = Level1; if (buffer1[i] < Level3) buffer3[i] = Level3; } } return (0);} //-------------------------------------------------------------------- double LaGuerre(double gamma_lag, int shift) { double ma = iMA(NULL, 0, 1, 0, MODE_SMA, 0, shift); double rez = 0.0; double buf1 = 0.0; double buf2 = 0.0; if (SmoothPrice) { buffer8[shift] = ma; ma = smooth(buffer8, shift); } buffer4[shift] = (1.0 - gamma_lag) * ma + gamma_lag * (buffer4[shift + 1]); buffer5[shift] = (-gamma_lag) * buffer4[shift] + (buffer4[shift + 1]) + gamma_lag * (buffer5[shift + 1]); buffer6[shift] = (-gamma_lag) * buffer5[shift] + (buffer5[shift + 1]) + gamma_lag * (buffer6[shift + 1]); buffer7[shift] = (-gamma_lag) * buffer6[shift] + (buffer6[shift + 1]) + gamma_lag * (buffer7[shift + 1]); if (buffer4[shift] >= buffer5[shift]) buf1 = buffer4[shift] - buffer5[shift]; else buf2 = buffer5[shift] - buffer4[shift]; if (buffer5[shift] >= buffer6[shift]) buf1 = buf1 + buffer5[shift] - buffer6[shift]; else buf2 = buf2 + buffer6[shift] - buffer5[shift]; if (buffer6[shift] >= buffer7[shift]) buf1 = buf1 + buffer6[shift] - buffer7[shift]; else buf2 = buf2 + buffer7[shift] - buffer6[shift]; if (buf1 + buf2 != 0.0) rez = buf1 / (buf1 + buf2); if (!SmoothPrice) { buffer8[shift] = rez; rez = smooth(buffer8, shift); } return (rez); } //-------------------------------------------------------------------- double smooth(double buf[], int i) { double rez; if (Smooth <= 0) rez = buf[i]; if (Smooth == 1) rez = (buf[i] + (buf[i + 1]) + (buf[i + 2])) / 3.0; if (Smooth == 2) rez = (buf[i] + 2.0 * (buf[i + 1]) + 2.0 * (buf[i + 2]) + (buf[i + 3])) / 6.0; if (Smooth >= 3) rez = (buf[i] + 2.0 * (buf[i + 1]) + 3.0 * (buf[i + 2]) + 3.0 * (buf[i + 3]) + 2.0 * (buf[i + 4]) + (buf[i + 5])) / 12.0; return (rez); } //--------------------------------------------------------------------