Вопрос про массивы и индикаторы

 

Дорбрый день. У меня есть индикатор, который выводит в отдельное окно МАКД и МАКД гистограмму. Мне нужно переделать код так что бы отображался только МАКД гистограм. Ниже приведен изначальный код вывода этих двух индикаторов.


#property indicator_separate_window

#property indicator_buffers 3
#property indicator_color1 Silver
#property indicator_color2 Red
#property indicator_color3 Blue
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 2
//---- indicator parameters
extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalEMA=9;
//---- indicator buffers
double MacdBuffer[];
double SignalBuffer[];
double HistogramBuffer[];


int init()
{
//---- drawing settings
SetIndexStyle(0,DRAW_LINE);
SetIndexStyle(1,DRAW_LINE);
SetIndexStyle(2,DRAW_HISTOGRAM);
SetIndexDrawBegin(1,SignalEMA);
IndicatorDigits(Digits+1);
//---- indicator buffers mapping
SetIndexBuffer(0,MacdBuffer);
SetIndexBuffer(1,SignalBuffer);
SetIndexBuffer(2,HistogramBuffer);
//---- name for DataWindow and indicator subwindow label
IndicatorShortName("MACD("+FastEMA+","+SlowEMA+","+SignalEMA+")");
SetIndexLabel(0,"MACD");
SetIndexLabel(1,"Signal");
SetIndexLabel(2,"Histogram");
//---- initialization done
return(0);
}


int start()

{
int limit;
int counted_bars=IndicatorCounted();

if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;

for(int i=0; i<limit; i++)
MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
for(i=0; i<limit; i++)
{
SignalBuffer[i]=iMAOnArray(MacdBuffer,Bars,SignalEMA,0,MODE_EMA,i);
HistogramBuffer[i]=MacdBuffer[i]-SignalBuffer[i];
}

return(0);
}

//+------------------------------------------------------------------+



Далее я переделываю код, так чтобы выводился только МАКД гистограмм, но ничего не выводиться вообще. Вот переделанный код.


#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 1
//---- indicator parameters
extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalEMA=9;
//---- indicator buffers
double MacdBuffer[];
double SignalBuffer[];
double HistogramBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{

SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexBuffer(0,HistogramBuffer);

return(0);
}

int start()
{
int limit;
int counted_bars=IndicatorCounted();

if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;

for(int i=0; i<limit; i++)
MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
for(i=0; i<limit; i++)
{
SignalBuffer[i]=iMAOnArray(MacdBuffer,Bars,SignalEMA,0,MODE_EMA,i);
HistogramBuffer[i]=MacdBuffer[i]-SignalBuffer[i];
}

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


Неужели чтобы использовать массивы нужно буферу назначть эти массивы? Еще раз повторю, что мне нужно отобразить только МАКД гистограмму. Как известно: МАКД гистограмма это разница двух линий МАКД. Спасибо.

 
knocking >>:

Как известно: МАКД гистограмма это разница двух линий МАКД.

Нам про это ничего неизвестно. У нас на сей счет совершенно иная информация.

 
Reshetov >>:

Нам про это ничего неизвестно. У нас на сей счет совершенно иная информация.

Элдер. Как играть и выигрывать на бирже.

Для получения линий MACD и MACD-гистограммы проделайте следующее:

1. Вычислите 12-дневное и 26-дневное ЕМА по ценам закрытия.

2. Вычтите 26-дневное ЕМА из 12-дневного, чтобы получить быструю линию MACD.

3. Вычислите 9-дневное ЕМА от быстрой линии MACD, чтобы получить медленную сигнальную линию. Нарисуйте обе, это будет классический индикатор MACD.

4. Вычтите сигнальную линию из линии MACD, чтобы получить MACD-гистограмму.

 
knocking писал(а) >>

Дорбрый день. У меня есть индикатор, который выводит в отдельное окно МАКД и МАКД гистограмму. Мне нужно переделать код так что бы отображался только МАКД гистограм. Ниже приведен изначальный код вывода этих двух индикаторов.

Неужели чтобы использовать массивы нужно буферу назначть эти массивы? Еще раз повторю, что мне нужно отобразить только МАКД гистограмму. Как известно: МАКД гистограмма это разница двух линий МАКД. Спасибо.

если вы программист то легко обойдетесь без назначения массива как буфера индикатора,
т.к. знаете как он работает, и знаете зачем он так работает
а если не знаетe, - объяснять бесполезно - все равно не поймете.

 
Korey >>:

если вы программист то легко обойдетесь без назначения массива как буфера индикатора,
т.к. знаете как он работает, и знаете зачем он так работает
а если не знаетe, - объяснять бесполезно - все равно не поймете.

Оказывается есть ведь тех.индикатор к которому можно обратиться. И тогда построение МАКД гистограммы сводится практически к одной строке:


Histogram[i]=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i)-iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i);


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


SignalBuffer[i]=iMAOnArray(MacdBuffer,Bars,SignalEMA,0,MODE_EMA,i) != iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i)


А какая гистограмма является класической? Та которая в которой используется сигнальная линия iMAOnArray(MacdBuffer,Bars,SignalEMA,0,MODE_EMA,i) или та в которой iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i)?


Конечно напрашивается ответ что нужно использовать сигнальную iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i). Но зачем тогда какой-то умный человек решил воспользоваться iMAOnArray? Наверно тогда, когда был написан этот индикатор, то просто не было тех.индикатора iMACD. И придилось делать все через одно место.



Ответьте пожалуйста МАСД гистограмма построенная таким образом является "классической"?

Histogram[i]=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i)-iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i);


Спасибо.

 

Вроде я нашел ответ:

iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i) использует простое усреднение SMA


а iMAOnArray(MacdBuffer,Bars,SignalEMA,0,MODE_EMA,i) - ЕМА


Для кого то это может быть принципиально... Интересно почему разработчики не добавили еще один параметр в иМАКД, что бы можно было указывать какое усреднение использовать...?

 
knocking >>:

Элдер. Как играть и выигрывать на бирже.

Для получения линий MACD и MACD-гистограммы проделайте следующее:

1. Вычислите 12-дневное и 26-дневное ЕМА по ценам закрытия.

2. Вычтите 26-дневное ЕМА из 12-дневного, чтобы получить быструю линию MACD.

3. Вычислите 9-дневное ЕМА от быстрой линии MACD, чтобы получить медленную сигнальную линию. Нарисуйте обе, это будет классический индикатор MACD.

4. Вычтите сигнальную линию из линии MACD, чтобы получить MACD-гистограмму.

Это называется не MACD - гистограммой, а осциллятором OsMA, и он идет в поставке c MT4. А в MACD главная линия прорисовывается гистограммой.


С Элдером все понятно, он - диссидент и анонимный алкоголик. Нахрюкался денатурата и понаписал всякую пургу, где биржа ассоциируется с алкоголизмом.

 
Reshetov >>:

Это называется не MACD - гистограммой, а осциллятором OsMA, и он идет в поставке c MT4. А в MACD главная линия прорисовывается гистограммой.


С Элдером все понятно, он - диссидент и анонимный алкоголик. Нахрюкался денатурата и понаписал всякую пургу, где биржа ассоциируется с алкоголизмом.

:))) Понятно. Спасибо за просвещение.

 
Reshetov >>:

Это называется не MACD - гистограммой, а осциллятором OsMA, и он идет в поставке c MT4. А в MACD главная линия прорисовывается гистограммой.


С Элдером все понятно, он - диссидент и анонимный алкоголик. Нахрюкался денатурата и понаписал всякую пургу, где биржа ассоциируется с алкоголизмом.




Кстати, вот что пишут на https://docs.mql4.com/ru/indicators/iOsMA

Расчет Moving Average of Oscillator. Осциллятор OsMA показывает разницу между значениями MACD и его сигнальной линии. В некоторых системах этот осциллятор называется гистограммой MACD.

Причина обращения: