Каким образом в индикаторе можно совместить 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); }
Я правильно понял.
Нет. Неправильно:
- Почему происходит переопределение стиля отрисовки для буфера с индексом 0?
- Почему не назначен стиль для буфера с индексом 2, если указано, что буферов 3? Хотя бы DRAW_NONE нужно поставить.
- Почему 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 отображается в подвале?" есть мысль одна по пипсовки. По этому и вопрос возник как два стиля вместе увязать. Вот хочу
набросать индюк.
Дело в то, что если один стиль работает, второй правильно отказывается работать.
Если так задумано, то ладно. Больше было похоже на ошибку.
А дальше в коде:
Так что индикатор будет работать только с тремя буферами. Индексы: 0, 1, 2. С переопределением все-таки разберитесь. А то ведь в одной строке:
а чуть ниже уже:
В итоге один буфер отображает гистограмму, второй - линию, а третий - вообще непонятно, что.
Это уже по обстоятельствам. В зависимости от того, что нужно. Но если буфер определен, то нужно явно указать тип его отрисовки
(DRAW_NONE - не отрисовывать; это в случае, если буфер используется только для расчетов). Иначе поведение не определено.
Если так задумано, то ладно. Больше было похоже на ошибку.
Привет.
"Так что индикатор будет работать только с тремя буферами. Индексы: 0, 1, 2. С переопределением все-таки разберитесь."
На данном этапе мне нужно что бы отрисовывались 3 буфера (2 буфера по магди, 1 буфер по зигзаг). Если, что извини за тупость, но я не которые вопросы "не догоняю".
"В итоге один буфер отображает гистограмму, второй - линию, а третий - вообще непонятно, что."
Вопрос. На гистограмму сколько буферов надо? Если нужно 2 буфера, то как они должны идти, по порядку или нет?
На данном этапе мне нужно что бы отрисовывались 3 буфера (2 буфера по магди, 1 буфер по зигзаг).
Тогда нужно указать тип отрисовки для буфера с индексом 2 при помощи функции SetIndexStyle(). Для начала следует определиться, какой буфер будет отображать те или иные данные. Например:
- Буфер 0 - линии между непустыми значениями. Это DRAW_SECTION.
- Буфер 1 - гистограмма. Это DRAW_HISTOGRAM.
- Буфер 2 - непрерывная линия. Это DRAW_LINE.
Вопрос. На гистограмму сколько буферов надо? Если нужно 2 буфера, то как они должны идти, по порядку или нет?
Так как индикатор отображается в подвале, то на гистограмму нужен только один буфер. Для подвальных индикаторов гистограмма всегда начинается от точки 0. Вторая точка - значение индикаторного буфера.
Вот если бы индикатор отображался на ценовом графике, то потребовалось бы два буфера. Между значениями этих двух буферов и проводится столбик гистограммы.
Тогда нужно указать тип отрисовки для буфера с индексом 2 при помощи функции SetIndexStyle(). Для начала следует определиться, какой буфер будет отображать те или иные данные. Например:
- Буфер 0 - линии между непустыми значениями. Это DRAW_SECTION.
- Буфер 1 - гистограмма. Это DRAW_HISTOGRAM.
- Буфер 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 отображается соединяемыми экстремумами, какой-то буфер (не указано соответствие) - гистограммой, сигнальная линия - линией (в принципе, как и положено). Но место зигзагу не отведено вообще.
Что-то у Вас с порядком цифр не так ))
Буферов всего 3, а добрались до четвертого и умудрились пропустить второй.
Ну и, если я правильно понимаю названия буферов (ExtMacdBuffer - буфер значений MACD, отображаемый в виде гистограммы, ExtSignalBuffer - буфер сигнальной линии, отображаемый в виде линии, ExtZigzagBuffer - буфер зигзага, отображаемый в виде соединяемых экстремумов), то снова имеется полное несоответствие. В коде
указано, что MACD отображается соединяемыми экстремумами, какой-то буфер (не указано соответствие) - гистограммой, сигнальная линия - линией (в принципе, как и положено). Но место зигзагу не отведено вообще.
"Ну и, если я правильно понимаю названия буферов (ExtMacdBuffer - буфер значений MACD, отображаемый в виде гистограммы, ExtSignalBuffer - буфер сигнальной линии, отображаемый в виде линии, ExtZigzagBuffer - буфер зигзага, отображаемый в виде соединяемых экстремумов)"
Вы правильно всё поняли.
Нумерацию подправил. Я что то лишние убрал?- www.mql5.com
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования