Вс. Ноя 24th, 2024

Функция дивергенции 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]

от drivermql

Добавить комментарий

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.