Вопрос по свечкам в нижнем окне

 

Сварил сегодня новый вариант индикатора WmiFor. Сравниваю по Спирмену все параметры свечей (OLHC). В нижней части окна вывожу 10 самых похожих комбинаций свечек на истории. Правая - самая похожая комбинация. Крайняя левая - менее всего похожая. Зеленые свечки - закрытые, красные - будущие (прогноз из истории).

 

 

Как делать свечки в нижнем - курил форумы и потрошил один платный индикатор. Так как гистограмма в нижнем окне рисуется только в одну сторону, приходится формировать свечку восемью последовательными наложениями полосок. Кстати, видно как в нижней части свечки белая полоска перекрывает сетку графика. Остался один неприятный момент. Между телом свечи и нижней тенью свечек всегда остается зазор в один пиксель, что сильно портит внешний вид. Кто подскажет, какого дьявола он образуется и как его убрать? 

#property indicator_separate_window
#property indicator_minimum -1.0
#property indicator_maximum 101.0
#property indicator_buffers 8
#property indicator_color1 Black
#property indicator_color2 Black
#property indicator_color3 Black
#property indicator_color4 Black
#property indicator_color5 Black
#property indicator_color6 Black
#property indicator_color7 Black
#property indicator_color8 Black

 Существенная часть кода:

  SetIndexBuffer(0, bufUpperShadow);
  SetIndexBuffer(1, bufWhiteBody);
  SetIndexBuffer(2, bufBlackBody);
  SetIndexBuffer(3, bufWhiteBodyFuture);
  SetIndexBuffer(4, bufBlackBodyFuture);
  SetIndexBuffer(5, bufLowerSpace);
  SetIndexBuffer(6, bufLowerShadow);
  SetIndexBuffer(7, bufSpace);
  
  SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID, 1, ColorShadow);
  SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID, BarBodyWidth, ColorWhiteBody);
  SetIndexStyle(2, DRAW_HISTOGRAM, STYLE_SOLID, BarBodyWidth, ColorBlackBody);
  SetIndexStyle(3, DRAW_HISTOGRAM, STYLE_SOLID, BarBodyWidth, ColorWhiteBodyFuture);
  SetIndexStyle(4, DRAW_HISTOGRAM, STYLE_SOLID, BarBodyWidth, ColorBlackBodyFuture);
  SetIndexStyle(5, DRAW_HISTOGRAM, STYLE_SOLID, BarBodyWidth, White);
  SetIndexStyle(6, DRAW_HISTOGRAM, STYLE_SOLID, 1, ColorShadow);
  SetIndexStyle(7, DRAW_HISTOGRAM, STYLE_SOLID, 1, White);

  for (i = 0; i < 8; i++) {
    SetIndexEmptyValue(i, EMPTY_VALUE);
    SetIndexShift(i, ForecastInBars + 1);
  }
  indexGraph = 0;
  for (i = 0; i < foundAlts; i++) {
    bufUpperShadow[indexGraph] = 100.0;
    indexGraph++;
    indexGraph++;
    
    indexShift = iAlt[i];
    yBase = HistoryClose[indexShift];
    for (indexBar = -ForecastInBars; indexBar < PastInBars; indexBar++) {
      rel = HistoryHigh[indexShift + indexBar] - yBase;
      bufUpperShadow[indexGraph] = (rel - relMin) * 100.0 / (relMax - relMin);
      
      relOpen = HistoryOpen[indexShift + indexBar] - yBase;
      relClose = HistoryClose[indexShift + indexBar] - yBase;
      
      if (indexBar >= 0) {
        if (relOpen < relClose) {
          bufWhiteBody[indexGraph] = (relClose - relMin) * 100.0 / (relMax - relMin);
          bufLowerSpace[indexGraph] = (relOpen - relMin) * 100.0 / (relMax - relMin);
          bufLowerShadow[indexGraph] = bufLowerSpace[indexGraph];
        }
        else {
          bufBlackBody[indexGraph] = (relOpen - relMin) * 100.0 / (relMax - relMin); 
          bufLowerSpace[indexGraph] = (relClose - relMin) * 100.0 / (relMax - relMin);
          bufLowerShadow[indexGraph] = bufLowerSpace[indexGraph];
        }
      }
      else {
        if (relOpen < relClose) {
          bufWhiteBodyFuture[indexGraph] = (relClose - relMin) * 100.0 / (relMax - relMin);
          bufLowerSpace[indexGraph] = (relOpen - relMin) * 100.0 / (relMax - relMin);
          bufLowerShadow[indexGraph] = bufLowerSpace[indexGraph];
        }
        else {
          bufBlackBodyFuture[indexGraph] = (relOpen - relMin) * 100.0 / (relMax - relMin); 
          bufLowerSpace[indexGraph] = (relClose - relMin) * 100.0 / (relMax - relMin);
          bufLowerShadow[indexGraph] = bufLowerSpace[indexGraph];
        }
      }
      
      rel = HistoryLow[indexShift + indexBar] - yBase;
      bufSpace[indexGraph] = (rel - relMin) * 100.0 / (relMax - relMin);      
      
      indexGraph++;
    }    
    
    indexGraph++;
  }  
  
  bufUpperShadow[indexGraph] = 100.0;
 
Код, это конечно хорошо... Написали бы индикатор рисующий пару свечек, так, чтобы взять его, без лишних напрягов, и увидеть в терминале, понять откуда берется этот пиксель. Пробовал рисовать свечи, сложностей не возникало.
 

Точно. Есть дырки в пиксель. Но не всегда. Зависит от масштаба графика

 Еще можно графическими объектами рисовать.  Две трендовых линии и все.

 

Может это поможет

Тип рисования DRAW_HISTOGRAM, примененный к индикатору главного окна, имеет свои особенности. Гистограмма рисуется между соответствующими значениями двух индексных массивов: 
чётного и нечетного. При этом используется цвет того индексного массива, значение которого больше.
 

Подсмотри код здесь:

https://www.mql5.com/ru/code/9065

ИМХО: идея - бесперспективняк.

 
Integer:
Код, это конечно хорошо... Написали бы индикатор рисующий пару свечек, так, чтобы взять его, без лишних напрягов, и увидеть в терминале, понять откуда берется этот пиксель. Пробовал рисовать свечи, сложностей не возникало.

Конечно, нет проблем. Пристыковал индикатор, рисующий одну свечку. Результат:

 

Файлы:
 
Heroix:

Подсмотри код здесь:

https://www.mql5.com/ru/code/9065

ИМХО: идея - бесперспективняк.


Здесь за счет того, что тень и тело одного цвета. 
 
Heroix:

Подсмотри код здесь:

https://www.mql5.com/ru/code/9065

ИМХО: идея - бесперспективняк.


Ха! За ссылку спасибо. Но автор схитрил - у него тело свечи и тень одного цвета, и тень кладется "внахлест", чтобы дырки не было видно.
 
wmlab:

Конечно, нет проблем. Пристыковал индикатор, рисующий одну свечку. Результат:

 


Да уж сварганил. 
 

Замени

bufLowerShadow[0] = bufLowerSpace[0];

на

bufLowerShadow[0] = bufLowerSpace[0]+1;
 
Roger:

Замени

Неспортивно. Поправка "+1" - не соответствует одному пикселу на экране; при больших масштабах тень некрасиво налезает на тело свечки.
Причина обращения: