Help

 
Каким образом в индикаторе можно совместить DRAW_SECTION и DRAW_HISTOGRAM?
 
Игорь:
Каким образом в индикаторе можно совместить DRAW_SECTION и DRAW_HISTOGRAM?

Два буфера на отрисовку гистограммы, если индикатор не "подвальный" (отображается в нижней части графика цен), и один буфер на секции. Если индикатор "подвальный", то на каждый тип по одному буферу.

 

 Я правильно понял.

//+------------------------------------------------------------------+
//|                                                            1.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                                          https:/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https:/"
#property version   "1.00"
#property strict

#include <MovingAverages.mqh>

//--- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 5
#property  indicator_color1  Silver
#property  indicator_color2  Red
#property  indicator_color1 White
#property  indicator_width1  2
#property  indicator_width2  2
#property  indicator_width3  2
//--- indicator parameters
input int InpFastEMA=12;   // Fast EMA Period
input int InpSlowEMA=26;   // Slow EMA Period
input int InpSignalSMA=9;  // Signal SMA Period
//
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
//--- indicator buffers
double    ExtMacdBuffer[];
double    ExtSignalBuffer[];
double    ExtZigzagBuffer[];
double    ExtHighBuffer[];
double    ExtLowBuffer[];
//--- globals
int    ExtLevel=3; // recounting's depth of extremums
//--- right input parameters flag
bool      ExtParameters=false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(InpBackstep>=InpDepth)
     {
      Print("Backstep cannot be greater or equal to Depth");
      return(INIT_FAILED);
     }
//--- 2 additional buffers
   IndicatorBuffers(3);
//---- drawing settings
   SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers
   SetIndexBuffer(0,ExtZigzagBuffer);
   SetIndexBuffer(1,ExtHighBuffer);
   SetIndexBuffer(2,ExtLowBuffer);
   SetIndexEmptyValue(0,0.0);
//---- indicator short name
   IndicatorShortName("ZigZag("+string(InpDepth)+","+string(InpDeviation)+","+string(InpBackstep)+")");
//---- initialization done
 IndicatorDigits(Digits+1);
//--- drawing settings
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexDrawBegin(1,InpSignalSMA);
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtMacdBuffer);
   SetIndexBuffer(1,ExtSignalBuffer);
//--- name for DataWindow and indicator subwindow label
   IndicatorShortName("MACD("+IntegerToString(InpFastEMA)+","+IntegerToString(InpSlowEMA)+","+IntegerToString(InpSignalSMA)+")");
   SetIndexLabel(0,"MACD");
   SetIndexLabel(1,"Signal");
//--- check for input parameters
   if(InpFastEMA<=1 || InpSlowEMA<=1 || InpSignalSMA<=1 || InpFastEMA>=InpSlowEMA)
     {
      Print("Wrong input parameters");
      ExtParameters=false;
      return(INIT_FAILED);
     }
   else
      ExtParameters=true;



   return(INIT_SUCCEEDED);
  }
 
Игорь:

 Я правильно понял.

Нет. Неправильно:

  1. Почему происходит переопределение стиля отрисовки для буфера с индексом 0?
  2. Почему не назначен стиль для буфера с индексом 2, если указано, что буферов 3? Хотя бы DRAW_NONE нужно поставить.
  3. Почему ZigZag отображается в подвале?
 

"1.Почему происходит переопределение стиля отрисовки для буфера с индексом 0?" Я так понимаю , буферов 5, а это значит, что отсчёт производится 0,1,2,3,4.

"2. Почему не назначен стиль для буфера с индексом 2, если указано, что буферов 3? Хотя бы DRAW_NONE нужно поставить." А он какой должен быть, DRAW_SECTION или DRAW_HISTOGRAM?

"Почему ZigZag отображается в подвале?" есть мысль одна по пипсовки. По этому и вопрос возник как два стиля вместе увязать. Вот хочу набросать индюк.

Дело в то, что если один стиль работает, второй правильно отказывается работать.
 
Игорь:

"1.Почему происходит переопределение стиля отрисовки для буфера с индексом 0?" Я так понимаю , буферов 5, а это значит, что отсчёт производится 0,1,2,3,4.

А дальше в коде:

IndicatorBuffers(3);

Так что индикатор будет работать только с тремя буферами. Индексы: 0, 1, 2. С переопределением все-таки разберитесь. А то ведь в одной строке:

SetIndexStyle(0,DRAW_SECTION);

а чуть ниже уже:

SetIndexStyle(0,DRAW_HISTOGRAM);

В итоге один буфер отображает гистограмму, второй - линию, а третий - вообще непонятно, что.

"2. Почему не назначен стиль для буфера с индексом 2, если указано, что буферов 3? Хотя бы DRAW_NONE нужно поставить." А он какой должен быть, DRAW_SECTION или DRAW_HISTOGRAM?

Это уже по обстоятельствам. В зависимости от того, что нужно. Но если буфер определен, то нужно явно указать тип его отрисовки (DRAW_NONE - не отрисовывать; это в случае, если буфер используется только для расчетов). Иначе поведение не определено.

"Почему ZigZag отображается в подвале?" есть мысль одна по пипсовки. По этому и вопрос возник как два стиля вместе увязать. Вот хочу набросать индюк.

Дело в то, что если один стиль работает, второй правильно отказывается работать.

Если так задумано, то ладно. Больше было похоже на ошибку.

 
Ihor Herasko:

А дальше в коде:

Так что индикатор будет работать только с тремя буферами. Индексы: 0, 1, 2. С переопределением все-таки разберитесь. А то ведь в одной строке:

а чуть ниже уже:

В итоге один буфер отображает гистограмму, второй - линию, а третий - вообще непонятно, что.

Это уже по обстоятельствам. В зависимости от того, что нужно. Но если буфер определен, то нужно явно указать тип его отрисовки (DRAW_NONE - не отрисовывать; это в случае, если буфер используется только для расчетов). Иначе поведение не определено.

Если так задумано, то ладно. Больше было похоже на ошибку.

Привет.

"Так что индикатор будет работать только с тремя буферами. Индексы: 0, 1, 2. С переопределением все-таки разберитесь."

На данном этапе мне нужно что бы отрисовывались 3 буфера (2 буфера по магди, 1 буфер по зигзаг). Если, что извини за тупость, но я не которые вопросы "не догоняю".

"В итоге один буфер отображает гистограмму, второй - линию, а третий - вообще непонятно, что."

Вопрос. На  гистограмму сколько буферов надо? Если нужно 2 буфера, то как они должны идти, по порядку или нет?

 
Игорь:

На данном этапе мне нужно что бы отрисовывались 3 буфера (2 буфера по магди, 1 буфер по зигзаг).

Тогда нужно указать тип отрисовки для буфера с индексом 2 при помощи функции SetIndexStyle(). Для начала следует определиться, какой буфер будет отображать те или иные данные. Например:

  1. Буфер 0 - линии между непустыми значениями. Это DRAW_SECTION.
  2. Буфер 1 - гистограмма. Это DRAW_HISTOGRAM.
  3. Буфер 2 - непрерывная линия. Это DRAW_LINE.

Вопрос. На  гистограмму сколько буферов надо? Если нужно 2 буфера, то как они должны идти, по порядку или нет?

Так как индикатор отображается в подвале, то на гистограмму нужен только один буфер. Для подвальных индикаторов гистограмма всегда начинается от точки 0. Вторая точка - значение индикаторного буфера.

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

 
Ihor Herasko:

Тогда нужно указать тип отрисовки для буфера с индексом 2 при помощи функции SetIndexStyle(). Для начала следует определиться, какой буфер будет отображать те или иные данные. Например:

  1. Буфер 0 - линии между непустыми значениями. Это DRAW_SECTION.
  2. Буфер 1 - гистограмма. Это DRAW_HISTOGRAM.
  3. Буфер 2 - непрерывная линия. Это DRAW_LINE.

Так как индикатор отображается в подвале, то на гистограмму нужен только один буфер. Для подвальных индикаторов гистограмма всегда начинается от точки 0. Вторая точка - значение индикаторного буфера.

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

Спасибо, сейчас попробую подправить.

Что касается графики, вот что я хочу примерно изобразить.


После правки , вот что получилось.

int OnInit()
  {
   IndicatorDigits(Digits+1);
   if(InpBackstep>=InpDepth)
     {
      Print("Backstep cannot be greater or equal to Depth");
      return(INIT_FAILED);
     }
//--- 
   IndicatorBuffers(3);
//---- drawing settings
   SetIndexStyle(0,DRAW_SECTION);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexDrawBegin(1,InpSignalSMA);
   SetIndexEmptyValue(0,0.0);
//---- 
   IndicatorShortName("ZigZag("+string(InpDepth)+","+string(InpDeviation)+","+string(InpBackstep)+")");
//--- indicator buffers mapping
   //SetIndexBuffer(0,ExtMacdBuffer);
   //SetIndexBuffer(1,ExtSignalBuffer);
  SetIndexBuffer(0,ExtMacdBuffer);
  SetIndexBuffer(2,ExtSignalBuffer); 
  SetIndexBuffer(3,ExtZigzagBuffer);
//--- 
IndicatorShortName("MACD("+IntegerToString(InpFastEMA)+","+IntegerToString(InpSlowEMA)+","+IntegerToString(InpSignalSMA)+")");
   SetIndexLabel(0,"MACD");
   SetIndexLabel(1,"Signal");
//--- check for input parameters
   if(InpFastEMA<=1 || InpSlowEMA<=1 || InpSignalSMA<=1 || InpFastEMA>=InpSlowEMA)
     {
      Print("Wrong input parameters");
      ExtParameters=false;
      return(INIT_FAILED);
     }
   else
      ExtParameters=true;
   return(INIT_SUCCEEDED);
  }
  
 
Игорь:

Спасибо, сейчас попробую подправить.

Что касается графики, вот что я хочу примерно изобразить.


После правки , вот что получилось.

Что-то у Вас с порядком цифр не так ))

 SetIndexBuffer(0,ExtMacdBuffer);
  SetIndexBuffer(2,ExtSignalBuffer); 
  SetIndexBuffer(3,ExtZigzagBuffer);

Буферов всего 3, а добрались до четвертого и умудрились пропустить второй.

Ну и, если я правильно понимаю названия буферов (ExtMacdBuffer - буфер значений MACD, отображаемый в виде гистограммы, ExtSignalBuffer - буфер сигнальной линии, отображаемый в виде линии, ExtZigzagBuffer - буфер зигзага, отображаемый в виде соединяемых экстремумов), то снова имеется полное несоответствие. В коде

   SetIndexStyle(0,DRAW_SECTION);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexStyle(2,DRAW_LINE);

указано, что MACD отображается соединяемыми экстремумами, какой-то буфер (не указано соответствие) - гистограммой, сигнальная линия - линией (в принципе, как и положено). Но место зигзагу не отведено вообще.

 
Ihor Herasko:

Что-то у Вас с порядком цифр не так ))

Буферов всего 3, а добрались до четвертого и умудрились пропустить второй.

Ну и, если я правильно понимаю названия буферов (ExtMacdBuffer - буфер значений MACD, отображаемый в виде гистограммы, ExtSignalBuffer - буфер сигнальной линии, отображаемый в виде линии, ExtZigzagBuffer - буфер зигзага, отображаемый в виде соединяемых экстремумов), то снова имеется полное несоответствие. В коде

указано, что MACD отображается соединяемыми экстремумами, какой-то буфер (не указано соответствие) - гистограммой, сигнальная линия - линией (в принципе, как и положено). Но место зигзагу не отведено вообще.

"Ну и, если я правильно понимаю названия буферов (ExtMacdBuffer - буфер значений MACD, отображаемый в виде гистограммы, ExtSignalBuffer - буфер сигнальной линии, отображаемый в виде линии, ExtZigzagBuffer - буфер зигзага, отображаемый в виде соединяемых экстремумов)"

Вы правильно всё поняли.

Нумерацию подправил.  Я что то лишние убрал?
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
При создании пользовательского индикатора можно указать один из 18 типов графического построения (способа отображения на главном окне графика или в подокне графика), значения которых указаны в перечислении ENUM_DRAW_TYPE. В зависимости от стиля рисования, может потребоваться от одного до четырех буферов значений (отмеченных как...