//+------------------------------------------------------------------+ //| Gelium_Days.mq4 | //+------------------------------------------------------------------+ /* 1.2 Исправлено вычисление close на нулевом баре 1.1 Исправлена отрисовка диапазона по аналогии с индикатором для TS 9.1 1.0 Первоначальная реализация Pavik */ #property indicator_separate_window #property indicator_buffers 8 #property indicator_color1 Blue // тело свечи вверх #property indicator_color2 Blue // верхняя тень свечи вверх #property indicator_color3 Blue // нижняя тень свечи вверх #property indicator_color4 Blue // соединяем концы верхних теней #property indicator_color5 Red // тело свечи вниз #property indicator_color6 Red // верхняя тень свечи вниз #property indicator_color7 Red // нижняя тень свечи вниз #property indicator_color8 Red // соединяем концы нижних теней #property indicator_width1 4 #property indicator_width2 1 #property indicator_width3 1 #property indicator_width4 1 #property indicator_width5 4 #property indicator_width6 1 #property indicator_width7 1 #property indicator_width8 1 #property indicator_level2 0 #property indicator_levelstyle STYLE_SOLID #property indicator_levelcolor DarkSlateGray double ExtBuffer1[]; double ExtBuffer2[]; double ExtBuffer3[]; double ExtBuffer4[]; double ExtBuffer5[]; double ExtBuffer6[]; double ExtBuffer7[]; double ExtBuffer8[]; int PrevBars; // будем ловить появление новой свечи //+------------------------------------------------------------------+ int init() { SetIndexStyle(0,DRAW_HISTOGRAM); SetIndexStyle(1,DRAW_HISTOGRAM); SetIndexStyle(2,DRAW_HISTOGRAM); SetIndexStyle(3,DRAW_SECTION); SetIndexStyle(4,DRAW_HISTOGRAM); SetIndexStyle(5,DRAW_HISTOGRAM); SetIndexStyle(6,DRAW_HISTOGRAM); SetIndexStyle(7,DRAW_SECTION); IndicatorDigits(Digits+1); SetIndexBuffer(0,ExtBuffer1); SetIndexBuffer(1,ExtBuffer2); SetIndexBuffer(2,ExtBuffer3); SetIndexBuffer(3,ExtBuffer4); SetIndexBuffer(4,ExtBuffer5); SetIndexBuffer(5,ExtBuffer6); SetIndexBuffer(6,ExtBuffer7); SetIndexBuffer(7,ExtBuffer8); IndicatorShortName("Gelium_Days"); SetIndexLabel(0,NULL); SetIndexLabel(1,NULL); SetIndexLabel(2,NULL); SetIndexLabel(3,NULL); SetIndexLabel(4,NULL); SetIndexLabel(5,NULL); SetIndexLabel(6,NULL); SetIndexLabel(7,NULL); } //+------------------------------------------------------------------+ int start() { if (Period() > PERIOD_D1) { Alert("Период графика должен быть меньше или равен дневному"); return; } int counted_bars = IndicatorCounted(); if (counted_bars > 0) counted_bars--; int limit = Bars - counted_bars; // вычисляем число баров, нужное для экономной отрисовки int minlimit = 1440/Period() + 3; // минимальное кол-во баров, нужное для правильной отрисовки if (limit 0; i--) // перебираем бары слева направо до предпоследнего { if (High[i] > high) high=High[i]; if (Low[i] < low) low=Low[i]; if (TimeDay(Time[i]) != TimeDay(Time[i-1])) // если это последний бар дня { close = Close[i]; if ((open != 0) && (high != 0) && (low != 999999)) // если нашли все значения - рисуем { body = MathAbs(close-open) / Point; if (open < close) // если свеча вверх { shadowU = (high-low) / Point; shadowD = (open-low) / Point; ExtBuffer4[i] = shadowU; // соединяем концы верхних теней ExtBuffer8[i] = -shadowD; // соединяем концы нижних теней ExtBuffer1[i] = body; // тело свечи ExtBuffer2[i] = shadowU; // верхняя тень свечи ExtBuffer3[i] = -shadowD; // нижняя тень свечи } if (open > close) // если свеча вниз { shadowU = (high-open) / Point; shadowD = (high-low) / Point; ExtBuffer4[i] = shadowU; // соединяем концы верхних теней ExtBuffer8[i] = -shadowD; // соединяем концы нижних теней ExtBuffer5[i] = -body; // тело свечи ExtBuffer6[i] = shadowU; // верхняя тень свечи ExtBuffer7[i] = -shadowD; // нижняя тень свечи } } open=Open[i-1]; high=0; low=999999; close=0; } } i = 0; // на нулевой (текущей) свече немного по-другому if (High[i] > high) high=High[i]; if (Low[i] < low) low=Low[i]; close = Close[i]; // а отрисовка такая-же if ((open != 0) && (high != 0) && (low != 999999)) { body = MathAbs(close-open) / Point; if (open < close) // если свеча вверх { shadowU = (high-low) / Point; shadowD = (open-low) / Point; ExtBuffer4[i] = shadowU; // соединяем концы верхних теней ExtBuffer8[i] = -shadowD; // соединяем концы нижних теней ExtBuffer1[i] = body; // тело свечи ExtBuffer2[i] = shadowU; // верхняя тень свечи ExtBuffer3[i] = -shadowD; // нижняя тень свечи } if (open > close) // если свеча вниз { shadowU = (high-open) / Point; shadowD = (high-low) / Point; ExtBuffer4[i] = shadowU; // соединяем концы верхних теней ExtBuffer8[i] = -shadowD; // соединяем концы нижних теней ExtBuffer5[i] = -body; // тело свечи ExtBuffer6[i] = shadowU; // верхняя тень свечи ExtBuffer7[i] = -shadowD; // нижняя тень свечи } } if (PrevBars != Bars) // если появилась новая свеча { PrevBars = Bars; if (Period() < PERIOD_D1) // и период меньше дневок, то стираем только-что бывшую свечу слева { ExtBuffer1[1] = EMPTY_VALUE; ExtBuffer2[1] = EMPTY_VALUE; ExtBuffer3[1] = EMPTY_VALUE; ExtBuffer4[1] = EMPTY_VALUE; ExtBuffer5[1] = EMPTY_VALUE; ExtBuffer6[1] = EMPTY_VALUE; ExtBuffer7[1] = EMPTY_VALUE; ExtBuffer8[1] = EMPTY_VALUE; } } } //+------------------------------------------------------------------+