Использование стиля рисования DRAW_COLOR_ARROW - страница 2

 
Виктор Демихов:

Присваивать цвет отрисовку нужно по индексу из буфера цветов?

Я поправил функцию findInsideBar(). Теперь она выглядит вот так:

Цвет верхних стрелочек должен быть красный, как я понимаю, но я вижу совсем другое. В буфере цветов для нижних стрелок красного цвета нет, но они покрасились в красный..))


Или всё-таки цевт задаётся не по индексу в массиве?

Построения индексируются с 1. И вы перепутали номера стрелок


int OnInit() {
//---
  IndicatorSetString(INDICATOR_SHORTNAME, "Inside Bar");
  IndicatorSetInteger(INDICATOR_DIGITS, _Digits);

  SetIndexBuffer(0, upperArrowBuffer, INDICATOR_DATA);
  SetIndexBuffer(1, upperArrowColor, INDICATOR_COLOR_INDEX);
  PlotIndexSetInteger(1, PLOT_ARROW, 217);        
  PlotIndexSetInteger(1, PLOT_ARROW_SHIFT, arrowShift);
  PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);

  SetIndexBuffer(2, lowerArrowBuffer, INDICATOR_DATA);
  SetIndexBuffer(3, lowerArrowColor, INDICATOR_COLOR_INDEX);
  PlotIndexSetInteger(2, PLOT_ARROW, 218);
  PlotIndexSetInteger(2, PLOT_ARROW_SHIFT, -arrowShift);
  PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, EMPTY_VALUE);  

//  ArraySetAsSeries(upperArrowBuffer, true);
  //ArraySetAsSeries(lowerArrowBuffer, true);
    
  return INIT_SUCCEEDED;
}
 
Alexey Viktorov:

Построения индексируются с 1. И вы перепутали номера стрелок


Коды я не перепул. Взял пару схожих стрелок для того, чтобы ониотличались. Но это не важно, в принципе. Если прописать так как вы написали то будет так:

//+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Custom indicator initialization function                                                                                                                                       |
//+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
int OnInit() {
//---
  IndicatorSetString(INDICATOR_SHORTNAME, "Inside Bar");
  IndicatorSetInteger(INDICATOR_DIGITS, _Digits);

  SetIndexBuffer(0, upperArrowBuffer, INDICATOR_DATA);
  SetIndexBuffer(1, upperArrowColor, INDICATOR_COLOR_INDEX);
  PlotIndexSetInteger(1, PLOT_ARROW, 217);
  PlotIndexSetInteger(1, PLOT_ARROW_SHIFT, arrowShift);
  PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);

  SetIndexBuffer(2, lowerArrowBuffer, INDICATOR_DATA);
  SetIndexBuffer(3, lowerArrowColor, INDICATOR_COLOR_INDEX);
  PlotIndexSetInteger(2, PLOT_ARROW, 218);
  PlotIndexSetInteger(2, PLOT_ARROW_SHIFT, -arrowShift);
  PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, EMPTY_VALUE);  

//  ArraySetAsSeries(upperArrowBuffer, true);
  //ArraySetAsSeries(lowerArrowBuffer, true);
    
  return INIT_SUCCEEDED;
}

Вот скрин графика в таком случае:


Теперь снизу уже не стрелки даже, а кружочки. А это, как я понимаю, дефолтное значение равное 159. Интересно, что кружок красного цвета. У меня же в свойствах препроцессора красный цвет фигурирует лишь в 1-ом буфере. А 1-ый буфер это верхний Wingdings-символ. Во-втором буфере красного цвета нет. Тем не менее, верхний не окрасился в красный, а нижний окрасился. Почему?

 
Виктор Демихов:

Коды я не перепул.

Ну как-же не перепутал если

void findInsideBar(const double& high[], const double& low[], int index) {
//---
  if (high[index + 1] <= high[index + 2] && low[index + 1] >= low[index + 2]) {
    upperArrowBuffer[index] = low[index];
    upperArrowColor[index] = 0;
    lowerArrowBuffer[index] = high[index];
    lowerArrowColor[index] = 2;
  } else {
    upperArrowBuffer[index] = EMPTY_VALUE;
    lowerArrowBuffer[index] = EMPTY_VALUE;
  }
}

в буфер upperArrowBuffer заносите low а в lowerArrowBuffer заносите high

Вот и получается, что стрелки внизу красные, назначенные для верхних стрелок.

А вообще выложите весь код прикреплённым файлом на посмотреть что у вас получилось.

 
Alexey Viktorov:

А вообще выложите весь код прикреплённым файлом на посмотреть что у вас получилось.

Весь код, учитывая вашу поправку называется InsideBar_Other.mq5

А Изначальный вариант до правки называется InsideBar_4_buffer.mq5

Кроме того, действительно, у меня изначально всё было верно, кроме блока:

void findInsideBar(const double& high[], const double& low[], int index) {
//---
  if (high[index + 1] <= high[index + 2] && low[index + 1] >= low[index + 2]) {
    upperArrowBuffer[index] = low[index];
    upperArrowColor[index] = 0;
    lowerArrowBuffer[index] = high[index];
    lowerArrowColor[index] = 2;
  } else {
    upperArrowBuffer[index] = EMPTY_VALUE;
    lowerArrowBuffer[index] = EMPTY_VALUE;
  }
}

Исправил и всё теперь в порядке.

Файлы: