Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
В библиотеке MQL5 уже больше 1500 программ. Поделись и ты своей!
prt
364
prt 2012.07.17 10:06 
Доброго дня.
Есть один вопрос В советнике на основе MACD (прошу не критиковать мол он плох)
Я пользуюсь для расчета основной линии и сигнальной функциями:


// Расчёт основной линии
OsnLin = iMACD(NULL,TimeFrame,FastEmaPeriod,SlowEmaPeriod,SignalPeriod,PRICE_CLOSE,MODE_MAIN,Sdvig);
// Расчёт сигнальной линии
SigLin = iMACD(NULL,TimeFrame,FastEmaPeriod,SlowEmaPeriod,SignalPeriod,PRICE_CLOSE,MODE_SIGNAL,Sdvig);

В этот же момент индикатор MACD производит расчёт по такому алгоритму

//+------------------------------------------------------------------+
//| Custom MACD.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net/"
//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Silver
#property indicator_color2 Red
#property indicator_width1 2
//---- indicator parameters
extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalSMA=9;
//---- indicator buffers
double MacdBuffer[];
double SignalBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- drawing settings
SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexStyle(1,DRAW_LINE);
SetIndexDrawBegin(1,SignalSMA);
IndicatorDigits(Digits+1);
//---- indicator buffers mapping
SetIndexBuffer(0,MacdBuffer);
SetIndexBuffer(1,SignalBuffer);
//---- name for DataWindow and indicator subwindow label
IndicatorShortName("MACD("+FastEMA+","+SlowEMA+","+SignalSMA+")");
SetIndexLabel(0,"MACD");
SetIndexLabel(1,"Signal");
//---- 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,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,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);
//---- done
return(0);
}
//+------------------------------------------------------------------+

Подскажите, пожалуйста, как сделать расчёт в советнике на основе индикатора.
Заранее благодарен.
o_O
Модератор
23291
o_O 2012.07.17 10:09  
Profit777:

Подскажите, пожалуйста, как сделать расчёт в советнике на основе индикатора.
Заранее благодарен.


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

Поэтому пользуйтесь индикатором.

Андрей
1890
Андрей 2012.07.17 13:33  
Задайте вопрос более понятно...
Если вопрос в том, как испольовать индикатор не через iMacd,
а как-то по-другому- те макди из mq4 файла,
то для этого нужен iCustom.
prt
364
prt 2012.07.18 14:35  
Доброго времени суток . Благодарен за ответ. Прочитал о https://docs.mql4.com/ru/indicators/iCustom

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


Столкнулся с тем что индикатор MACD (штатный не модифицированный) производит расчёт и выдает другие результаты чем эти строки


Расчёт основной линии
OsnLin = iMACD(NULL,TimeFrame,FastEmaPeriod,SlowEmaPeriod,SignalPeriod,PRICE_CLOSE,MODE_MAIN,Sdvig);
Расчёт сигнальной линии
SigLin = iMACD(NULL,TimeFrame,FastEmaPeriod,SlowEmaPeriod,SignalPeriod,PRICE_CLOSE,MODE_SIGNAL,Sdvig);



Задача вписать в индикатор для расчёта алгоритм идентичный штатному индикатору MACD для расчёта сигнальной и основной линий.


Как я понимаю модифицировать вот этот блок



{
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,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,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);
//---- done
return(0);
}


Заранее благодарен.
prt
364
prt 2012.07.18 20:56  
sergeev:

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

Поэтому пользуйтесь индикатором.


Подскажите пожалуйста почему нужен массив значений МАСД.


Как сделать на основе штатного индикатора подсчет этих линий?

o_O
Модератор
23291
o_O 2012.07.18 21:16  
Profit777:


Подскажите пожалуйста почему нужен массив значений МАСД.


Как сделать на основе штатного индикатора подсчет этих линий?


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

В это отношении - использование индикатора iCustom лучше.

prt
364
prt 2012.07.19 08:28  

А нет никакого способа просто достать этот расчёт из индикатора? Там же все как Вы говорите в массиве?

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий