Функция дивергенции MACD
Вчера возникла задача срочно сделать функцию поиска двух горбов MACD для дальнейшего выявления дивергенции.
Получилось целых две функции: для выявления горба при MACD выше нуля и для выявления впадины при MACD ниже нуля.
Каждая функция возвращает номер бара, на котором образовался горб или впадина.
Вызов функции поиска горбов:
GorbMacdHigh(sy,tf,ne);
Где Sy — Символ, tf — таймфрейм, ne — какой горб по счету нужен начиная с нуля. Например — 0 — это самый ближайший горб MACD, 1 — следующий за ним горб.
Также вызывается и функция поиска впадины с теми же передаваемыми значениями.
VpadinaMacdLow(sy,tf, ne)
После того, как известны номера баров-горбов и впадин, можно определить наличие дивергенции. Для поиска бычьей дивергенции я сделал так:
int vpadina0 = VpadinaMacdLow(Symbol(),0, 0);
int vpadina1 = VpadinaMacdLow(Symbol(),0, 0);
double VP_MACD_0 = iMACD(Symbol(),0,FastMACD,SlowMACD,SignalMACD,PRICE_CLOSE,MODE_MAIN,vpadina0);
double VP_MACD_1 = iMACD(Symbol(),0,FastMACD,SlowMACD,SignalMACD,PRICE_CLOSE,MODE_MAIN,vpadina1);
if(VP_MACD_0 > VP_MACD_1 && Low[vpadina0] < Low[vpadina1])
{
// тут то, что надо делать дальше
}
Т.е. мы сравниваем цену Low-дальнего горба с ценой Low-ближнего горба и уровни столбов MACD на горбах.
Функция поиска медвежьей дивергенции зеркальна, разобраться очень легко.
Я знаю, что это весьма примитивно и можно сделать аккуратнее, но пока нет времени и особого желания разбираться.
Чтобы скопировать функции, нажмите на одну из соцсетей снизу и текст станет доступен. Пишите комментарии.
[sociallocker]
double GorbMacdHigh(string sy="",int tf=0,int ne=0) //Горб при МАСД выше нуля возвращает номер бара с горбом
{
if(sy=="" || sy=="0") sy=Symbol();
double MACD,MACD_minus_1,MACD_plus_1,MACD_minus_2,MACD_plus_2,MACD_minus_3,MACD_plus_3;
int i,k=iBars(sy,tf),ke=0;
for(i=1; i<150; i++)
{
MACD=iMACD(Symbol(),0,FastMACD,SlowMACD,SignalMACD,PRICE_CLOSE,MODE_MAIN,i);
// if(MACD < 0) break;
MACD_minus_1=iMACD(Symbol(),0,FastMACD,SlowMACD,SignalMACD,PRICE_CLOSE,MODE_MAIN,i-1);
MACD_minus_2=iMACD(Symbol(),0,FastMACD,SlowMACD,SignalMACD,PRICE_CLOSE,MODE_MAIN,i-2);
MACD_minus_3=iMACD(Symbol(),0,FastMACD,SlowMACD,SignalMACD,PRICE_CLOSE,MODE_MAIN,i-3);
MACD_plus_1=iMACD(Symbol(),0,FastMACD,SlowMACD,SignalMACD,PRICE_CLOSE,MODE_MAIN,i+1);
MACD_plus_2=iMACD(Symbol(),0,FastMACD,SlowMACD,SignalMACD,PRICE_CLOSE,MODE_MAIN,i+2);
MACD_plus_3=iMACD(Symbol(),0,FastMACD,SlowMACD,SignalMACD,PRICE_CLOSE,MODE_MAIN,i+3);
if(MACD>MACD_plus_1 && MACD>MACD_plus_2 && MACD>MACD_plus_3 && MACD>MACD_minus_1 && MACD>MACD_minus_2 && MACD>MACD_minus_3) // MACD!=0 &&
{
ke++;
if(ke>ne) return(i);
}
}
Comment("Горб № ",ne," не найден");
return(0);
}
////////////////// функция поиска впадин
double VpadinaMacdLow(string sy="",int tf=0,int ne=0) //Горб при МАСД выше нуля возвращает номер бара с горбом
{
if(sy=="" || sy=="0") sy=Symbol();
double MACD,MACD_minus_1,MACD_plus_1,MACD_minus_2,MACD_plus_2,MACD_minus_3,MACD_plus_3;
int i,k=iBars(sy,tf),ke=0;
for(i=1; i<150; i++)
{
MACD=iMACD(Symbol(),0,FastMACD,SlowMACD,SignalMACD,PRICE_CLOSE,MODE_MAIN,i);
MACD_minus_1=iMACD(Symbol(),0,FastMACD,SlowMACD,SignalMACD,PRICE_CLOSE,MODE_MAIN,i-1);
MACD_minus_2=iMACD(Symbol(),0,FastMACD,SlowMACD,SignalMACD,PRICE_CLOSE,MODE_MAIN,i-2);
MACD_minus_3=iMACD(Symbol(),0,FastMACD,SlowMACD,SignalMACD,PRICE_CLOSE,MODE_MAIN,i-3);
MACD_plus_1=iMACD(Symbol(),0,FastMACD,SlowMACD,SignalMACD,PRICE_CLOSE,MODE_MAIN,i+1);
MACD_plus_2=iMACD(Symbol(),0,FastMACD,SlowMACD,SignalMACD,PRICE_CLOSE,MODE_MAIN,i+2);
MACD_plus_3=iMACD(Symbol(),0,FastMACD,SlowMACD,SignalMACD,PRICE_CLOSE,MODE_MAIN,i+3);
if(MACD<MACD_plus_1 && MACD<MACD_plus_2 && MACD<MACD_plus_3 && MACD<MACD_minus_1 && MACD<MACD_minus_2 && MACD<MACD_minus_3)
{
ke++;
if(ke>ne) return(i);
}
}
Comment("Впадина № ",ne," не найдена");
return(0);
}
[/sociallocker]