Вопрос по техническому индикатору - страница 2

 
granit77:

Не понял вашей мысли, Юрий. Не вижу причин, почему бы ему не работать.


Я воспользовался кодом Вашего индикатора. Наложил его на график и получил такой же, как и тот, который я создал вручную. Вопрос в том, как теперь в советнике вычислить значение второй сигнальной линии? Мне нужно не столько показывать эту скользящую среднюю на экране, сколько воспользоваться в советнике ее значением для текущей свечи.
 
AlexMain:
... Вопрос в том, как теперь в советнике вычислить значение второй сигнальной линии? Мне нужно не столько показывать эту скользящую среднюю на экране, сколько воспользоваться в советнике ее значением для текущей свечи.
double Line2=iCustom(NULL,0,"MACD_mod",FastEMA,SlowEMA,SignalSMA,SignalSMA2,2,CheckBar);
// 2-номер буфера со второй сигнальной, CheckBar-номер бара, на котором смотрим сигнал 
 
granit77:


Очень благадарен Вам за помощь! Дали мне толчек к пониманию программирования пользовательских индикаторов. Я попытался решить поставленную мной задачу без создания пользовательского индикатора, поскольку мне это надо для нужд моего эксперта. В теле советника я написал следующий код:

double macd_buffer[300];
double signal2;
int i, limit=ArraySize(macd_buffer);
ArraySetAsSeries(macd_buffer,true);
for(i=0;i<limit;i++)
macd_buffer[i]=iMA(NULL,0,15,1,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,1,MODE_EMA,PRICE_CLOSE,i);
signal2=iMAOnArray(macd_buffer,limit,15,0,MODE_LWMA,0);

Переменная signal2 вычисляет значение скользящей средней (именно той, которая мне и нужна). Единственная неприятность заключается в том, что эта переменная предназначена для значения скользящей средней на тукущем баре, а в действительности в ней оказывается значение этой скользящей средней на предыдущем баре (это выяснилось по результатам тестирования и сравнения значений с показаниями скользящей средней, нанесенной на график MACD вручную). Что я сделал не так? Почему моя переменная signal2 опаздывает на одину свечу?

 
AlexMain:


Очень благадарен Вам за помощь! Дали мне толчек к пониманию программирования пользовательских индикаторов. Я попытался решить поставленную мной задачу без создания пользовательского индикатора, поскольку мне это надо для нужд моего эксперта. В теле советника я написал следующий код:

double macd_buffer[300];
double signal2;
int i, limit=ArraySize(macd_buffer);
ArraySetAsSeries(macd_buffer,true);
for(i=0;i<limit;i++)
macd_buffer[i]=iMA(NULL,0,15,1,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,1,MODE_EMA,PRICE_CLOSE,i);
signal2=iMAOnArray(macd_buffer,limit,15,0,MODE_LWMA,0);

Переменная signal2 вычисляет значение скользящей средней (именно той, которая мне и нужна). Единственная неприятность заключается в том, что эта переменная предназначена для значения скользящей средней на тукущем баре, а в действительности в ней оказывается значение этой скользящей средней на предыдущем баре (это выяснилось по результатам тестирования и сравнения значений с показаниями скользящей средней, нанесенной на график MACD вручную). Что я сделал не так? Почему моя переменная signal2 опаздывает на одину свечу?


В теле советника так поступать не стоит. В нем нет динамических (индикаторных массивов)
 
granit77:


Немного поменял значения параметров индикатора и внес изменение в строку, определяющую значение второй линии на графике MACD. Вот текс Вашего примера, в который я внес изменения.

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Silver
#property indicator_color2 Red
#property indicator_color3 Yellow
#property indicator_width1 2
//---- indicator parameters
extern int FastEMA=15;
extern int SlowEMA=26;
extern int SignalSMA=1;
extern int SignalSMA2=15;
//---- indicator buffers
double MacdBuffer[];
double SignalBuffer[];
double SignalBuffer2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- drawing settings
SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexStyle(1,DRAW_LINE);
SetIndexStyle(2,DRAW_LINE);
SetIndexDrawBegin(1,SignalSMA);
IndicatorDigits(Digits+1);
//---- indicator buffers mapping
SetIndexBuffer(0,MacdBuffer);
SetIndexBuffer(1,SignalBuffer);
SetIndexBuffer(2,SignalBuffer2);
//---- name for DataWindow and indicator subwindow label
IndicatorShortName("MACD("+FastEMA+","+SlowEMA+","+SignalSMA+")");
SetIndexLabel(0,"MACD");
SetIndexLabel(1,"Signal");
SetIndexLabel(2,"Signal2");
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence |
//+------------------------------------------------------------------+
int start()
{
int limit;
int counted_bars=IndicatorCounted();
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
//---- macd counted in the 1-st buffer
for(int i=0; i<limit; i++)
MacdBuffer[i]=iMA(NULL,0,FastEMA,1,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,1,MODE_EMA,PRICE_CLOSE,i);
//---- signal line counted in the 2-nd buffer
for(i=0; i<limit; i++)
SignalBuffer[i]=iMAOnArray(MacdBuffer,Bars,SignalSMA,0,MODE_SMA,i);
for(i=0; i<limit; i++)
//SignalBuffer2[i]=iMAOnArray(SignalBuffer,Bars,SignalSMA2,0,MODE_LWMA,i);
SignalBuffer2[i]=iMAOnArray(MacdBuffer,Bars,SignalSMA2,0,MODE_LWMA,i);
//---- done
return(0);
}
//+------------------------------------------------------------------+

После наложения его на график видно, что значения MCAD, полученные вручную и с помещью пользовательского индикатора полностью совпадают, в том числе и значения сигнальной линии. Но значения второй линии пользовательского индикатора отличаются от значений скользящей средней, наложенной на график MACD вручную. Значения параметров индикатора MACD, вручную наложенного на график следующие:

Быстрый EMA: 15; Медленный EMA: 26; MACD SMA: 1; Применить к: CLOSE

Значения параметров скользящей средней, наложенной вручную на график MACD следующие:

Период: 15; Сдвиг: 0; Метод MA: Linear Weighted; Применить к: Previous Indicator's Data

Визуально линии почти совпадают, если для скользящей средней, наложенной вручную на график параметр Сдвиг сделать равным 3.

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

 
Vinin:

В теле советника так поступать не стоит. В нем нет динамических (индикаторных массивов)

Странно, что в советнике нет динамических массивов. В коде, который я ранее привел, тем не менее значение скользящей средней вычисляется правильно, только со здвигом на один бар. Чтобы устронить эту ошибку следует написать пользовательский индикатор, а затем использовать значения этой скользящей средней в теле советника?
 
Я с Вашего разрешения немного Вас покритикую, пока зубры не подтянулись, а то порвут на части и Вас и меня. :))
1. Публикуйте код вставкой через кнопку SRC на верхней панели редактора, а то неудобно читать.
2. Если я правильно понял, надо было дополнительно сгладить сигнальную линию МАСД, что и было сделано. То есть, мы поимели двойное последовательное сглаживание гистограммы.
3. Последний вариант сглаживает гистограмму двумя разными периодами МА и разбрасывает каждую сигналку в свой буфер. То есть мы имеем параллельное однократное сглаживание гистограммы в двух вариантах.

Это все ни хорошо, ни плохо, получилось два МАКДа в одном окне, отличающиеся периодами и типами сглаживания.
4. Не должны они отличаться, если период и метод совпадают, больше добавить ничего не могу. Посмотрите в окне данных, там хорошо видно.

 
granit77:
Я с Вашего разрешения немного Вас покритикую, пока зубры не подтянулись, а то порвут на части и Вас и меня. :))
1. Публикуйте код вставкой через кнопку SRC на верхней панели редактора, а то неудобно читать.
2. Если я правильно понял, надо было дополнительно сгладить сигнальную линию МАСД, что и было сделано. То есть, мы поимели двойное последовательное сглаживание гистограммы.
3. Последний вариант сглаживает гистограмму двумя разными периодами МА и разбрасывает каждую сигналку в свой буфер. То есть мы имеем параллельное однократное сглаживание гистограммы в двух вариантах.

Это все ни хорошо, ни плохо, получилось два МАКДа в одном окне, отличающиеся периодами и типами сглаживания.
4. Не должны они отличаться, если период и метод совпадают, больше добавить ничего не могу. Посмотрите в окне данных, там хорошо видно.


Вы правильно меня поняли. Нужно применить скользящую среднюю к сигнальной синии индикатора MACD. Не знаю, на сколько мое замечание внесет ясность, я бы не сказал, что врезультате мы имеем два MCAD в одном окне. Мы по-прежнему имеем один MCAD, только в его окне добавлена еще одна линия со своими параметрами. Если теперь наложить получен пользовательский индикатор на график и добавить на график индикатор MCAD вручную с интересующей меня дополнительной линией, то по логике в двух дополнительных окнах линии будут совпадать в случае совпадения одинаковых значениях параметров. Теме не менее совпадают лишь сами MCAD. Интересующая меня линия имеет одинаковую форму в обоих окнах, но похоже имеется сдвиг на 3 свечи друготносительно друга.

Как Вы считаете, фрагмент, который я привел ранее должен работать в советнике? Виктор написал, что не должен, а у меня советник с этим фрагментом кода работает. Только интересующая меня линия оказывается сдвинута вперед на одну свечу (значение интересующей меня линии в приведенном фрагменте кода на текущей свече оказывается то, которое будет правильным на следующей свече). Тем не менее с учетом сдвига значения на одну свечу этот фрагмент кода работет в советнике. Я не запускал его в реальной торговле, только в режиме тестирования.

В любом случае, Вы своими примерами кода помогли мне разобраться в понимании новых для меня разделов программирования на MQL4.

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