Программное описание задание DRAW_BARS - страница 2

 
Nik107:

Спасибо, то, что нужно

За исключением одного "но" - помогите выбраться из 3 сосен - осталось не понятно как именно (или какие именно) буферы связаны с данным рядом баров или линией ?

Например, если мы в индикатор введем параметр задающий "Рисовать бары или линию" для первого значения (ряда_баров/линии) индикатора, то что ?
при переключении с баров на линию произойдет смещение буферов по отношению к индексам ?

остался открытым вопрос "Как буфер "привязан" к конкретной линии/ряду_баров индикатора ?"

 

 

 

 

 

Исходя из этого, правильно ли сделать вывод:

"Нельзя сделать программное переключение типа отрисовки одной из "линий" индикатора, затрагивающее буфферные патерны", так ?

Т.е. нельзя одну из линий индикатора отрисовать барами ( и наоборот) при смене параметра индикатора.

Правильный вывод ?

Если да, то как обойти это ограничение ? 

 

 
Urain:


SetIndexBuffer(0,hl_equityBuffer1,INDICATOR_DATA); вот тут идёт привязка номера буфера к имени.

 Это, имхо и к сожалению, всего лишь привязка МАССИВА_ДАННЫХ к 0 буферу

А вот буфер к номеру линии/ряда_отображения индикатора ЯВНО не понятно как привязать 

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Линии индикаторов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Линии индикаторов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Линии индикаторов - Документация по MQL5
 
Nik107:

Исходя из этого, правильно ли сделать вывод:

"Нельзя сделать программное переключение типа отрисовки одной из "линий" индикатора, затрагивающее буфферные патерны", так ?

 

 Не понял.

 

Nik107:


Т.е. нельзя одну из линий индикатора отрисовать барами ( и наоборот) при смене параметра индикатора.


 При смене параметра индикатора происходит переиницилизация индикатора.

Все свойства буферов и параметры их отображения находятся в  OnInit() , так, что все в ваших руках :)

 

 

 

 

 
Nik107:

 

 Это, имхо и к сожалению, всего лишь привязка МАССИВА_ДАННЫХ к 0 буферу

А вот буфер к номеру линии/ряда_отображения индикатора ЯВНО не понятно как привязать  

Для невнимательных повторяю, найдите 6 отличий в этих двух кодах:

//---  вот этот код указывает на 0 буфер
#property indicator_label1  "hl_equity"
#property indicator_type1   DRAW_COLOR_CANDLES
#property indicator_color1  C'192,192,192',C'128,128,128'
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- вот этот код указывает на 1 буфер
#property indicator_label2  "hl_equity"
#property indicator_type2   DRAW_COLOR_CANDLES
#property indicator_color2  C'192,192,192',C'128,128,128'
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

ЗЫ ладно ещё более локализую различия

//---  вот этот код указывает на 0 буфер
indicator_label1
indicator_type1 
indicator_color1  
indicator_style1 
indicator_width1  
//---  вот этот код указывает на 1 буфер
indicator_label2
indicator_type2 
indicator_color2  
indicator_style2 
indicator_width2  

ЗЗЫ а теперь ещё более локально

//---   0 
1
1 
1  
1 
1 
//---   1 
2
2 
2  
2 
2


 

Действительно, сразу не понял в чем задача. Тогда может так:

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots   1

enum types {
            tBars, //Бары
            tLine  //Линия
            };

input types InpType = tBars; //Тип отрисовки

//---- indicator buffers
double HighBuffer[];
double LowBuffer[];
double OpenBuffer[];
double CloseBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   
   SetIndexBuffer(0,OpenBuffer,INDICATOR_DATA);   
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrRed);
   
   if(InpType==tBars)
   {
      SetIndexBuffer(1,HighBuffer,INDICATOR_DATA);
      SetIndexBuffer(2,LowBuffer,INDICATOR_DATA);
      SetIndexBuffer(3,CloseBuffer,INDICATOR_DATA);

      PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_BARS);
   }
   else
   {
      PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);
   }

   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

//--- economic indicator calculation
   int limit;
   if(prev_calculated>rates_total || prev_calculated<=0) limit=0;
   else limit=prev_calculated-1;

//--- main loop
   for(int i=limit; i<rates_total; i++)
   {
      if(InpType==tBars)
      {
         OpenBuffer[i]=open[i];
         CloseBuffer[i]=close[i];
         HighBuffer[i]=high[i];
         LowBuffer[i]=low[i];
      }
      else
      {
         OpenBuffer[i] = close[i];
      }
   }    

   return(rates_total);
  }
//+------------------------------------------------------------------+

 

 
Urain:

Так же как и в червёрке рисуют разноцветный буффер. Создаёте два буфера. Обоим указываете уровень нерисуемого значение.

и двумя чередующимися буферами отрисовываете. Как только какой-то из буферов не нужен, ему присваиваете значение указанное в PLOT_EMPTY_VALUE.

таким образом видимым в любой момент будет только один буффер.

(под буфером баров я подразумеваю объеденённые в одно понятие 5 или 4 массива данных)

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

DRAW_COLOR_LINE

Разноцветная линия

1

1

DRAW_COLOR_SECTION

Разноцветные отрезки

1

1

DRAW_COLOR_HISTOGRAM

Разноцветная гистограмма от нулевой линии

1

1

DRAW_COLOR_HISTOGRAM2

Разноцветная гистограмма на двух индикаторных буферах

2

1

DRAW_COLOR_ARROW

Отрисовка разноцветными стрелками

1

1

DRAW_COLOR_ZIGZAG

Разноцветный ZigZag

2

1

DRAW_COLOR_BARS

Разноцветные бары

4

1

DRAW_COLOR_CANDLES

Разноцветные свечи

4

1


Посмотрите как написан индикатор TTrendMagic там для расчета всего один буфер, а рисует разным цветом.

Количество цветов задаеться этими свойствами

PLOT_COLOR_INDEXES

Количество цветов

int

PLOT_LINE_COLOR

Индекс буфера, содержащего цвет отрисовки

color     модификатор=номер индекса цвета


Советую почитать статьи:

Построение кода индикаторов с несколькими индикаторными буферами для начинающих

Цветные индикаторы - создание и применение

Как написать индикатор на основе другого индикатора

Построение мультивалютного индикатора с применением множества промежуточных индикаторных буферов

Стили рисования в MQL5

Создание индикатора с возможностями графического управления

 


Nik107 2011.03.23 10:57 2011.03.23 10:57:12

Как написать индикатор рисующий:

  1. бары/свеч БЕЗ указания
#property indicator_type1 DRAW_BARS
#property indicator_color1 Gray

   2.  и линии в том же окне

Повторяю "на пальцах": Нужно чтобы в окне одно значение отображалось барами, другие линиями. Свойства отображения должны задаваться ТОЛЬКО ПРОГРАММНО.


sergey1294:

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


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