#MAMA_NK





//+------------------------------------------------------------------+ 
//|                                         Version  July 20, 2006   |
//|  Editing   Nikolay Kositsin  15.06.2006  farria@mail.redcom.ru   |
//+------------------------------------------------------------------+ 
//+------------------------------------------------------------------+
//|                                                   #MAMA_NK.mq4   |
//|                                                                  |
//|                                        http://forex.kbpauk.ru/   |
//+------------------------------------------------------------------+
#property link      "http://forex.kbpauk.ru/"
//---- îòðèñîâêà èíäèêàòîðà â ãëàâíîì îêíå
#property indicator_chart_window 
//---- êîëè÷åñòâî èíäèêàòîðíûõ áóôôåðîâ
#property indicator_buffers 2 
//---- öâåòà èíäèêàòîðà
#property indicator_color1 Blue
#property indicator_color2 Red
//---- òîëùèíà èíäèêàòîðíûõ ëèíèé
#property indicator_width1 1
#property indicator_width2 1
//---- ÂÕÎÄÍÛÅ ÏÀÐÀÌÅÒÐÛ ÈÍÄÈÊÀÒÎÐÀ
extern double FastLimit = 0.5;
extern double SlowLimit = 0.05;
//---- èíäèêàòîðíûå áóôôåðû
double FABuffer[];
double MABuffer[];
//+------------------------------------------------------------------+
//| #MAMA initialization function                                    |
//+------------------------------------------------------------------+
int init()
  {
//---- Ñòèëü èñïîëíåíèÿ ãðàôèêà
    SetIndexStyle(0, DRAW_LINE, 0, 2);
    SetIndexStyle(1, DRAW_LINE, 0, 2);
//---- 2 èíäèêàòîðíûõ áóôôåðà èñïîëüçîâàíû äëÿ ñ÷¸òà
    SetIndexBuffer(0, FABuffer);
    SetIndexBuffer(1, MABuffer);
//---- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
    SetIndexEmptyValue(0, 0.0);
    SetIndexEmptyValue(1, 0.0);
//---- èìÿ äëÿ îêîí äàííûõ è ëýéáà äëÿ ñóáúîêîí
    IndicatorShortName("#MAMA_NK");
    SetIndexLabel(0, "#FAMA_NK");
    SetIndexLabel(1, "#MAMA_NK");
//---- óñòàíîâêà íîìåðà áàðà, íà÷èíàÿ ñ êîòîðîãî áóäåò îòðèñîâûâàòüñÿ èíäèêàòîð 
    SetIndexDrawBegin(0, 50);
    SetIndexDrawBegin(1, 50);
//---- çàâåðøåíèå èíèöèàëèçàöèè
    return(0);
  }
//+------------------------------------------------------------------+
//|    #MAMA                                                         |
//+------------------------------------------------------------------+
int start()
  {
    //---- ïðîâåðêà êîëè÷åñòâà áàðîâ íà äîñòàòî÷íîñòü äëÿ ðàñ÷¸òà
    if(Bars <= 7) 
        return(0);
    //---- ââåäåíèå ïåðåìåííûõ ïàìÿòè  
    static int time2;
    static double Price[4][2], Smooth[7][2], Detrender[7][2], Q1[7][2]; 
    static double I1[7][2], I2[2][2], Q2[2][2];
    static double Re[2][2], Im[2][2], SmoothPeriod[2][2], Period_[2][2]; 
    static double Phase[2][2], MAMA[2][2], FAMA[2][2];
    //----+ Ââåäåíèå öåëûõ ïåðåìåííûõ è ïîëó÷åíèå óæå ïîäñ÷èòàííûõ áàðîâ
    int MaxBar, limit, bar, iii, counted_bars = IndicatorCounted();
    //---- ïðîâåðêà íà âîçìîæíûå îøèáêè
    if(counted_bars < 0)
        return(-1);
    //---- ïîñëåäíèé ïîäñ÷èòàííûé áàð äîëæåí áûòü ïåðåñ÷èòàí 
    if(counted_bars > 0) 
        counted_bars--;
    //----+ Ââåäåíèå ïåðåìåííûõ ñ ïëàâàþùåé òî÷êîé
    double jI, jQ, DeltaPhase, alpha, ttime; 
    //---- îïðåäåëåíèå íîìåðà ñàìîãî ñòàðîãî áàðà, íà÷èíàÿ ñ êîòîðîãî áóäåò ïðîèçâåä¸í ïîëíûé ïåðåñ÷¸ò âñåõ áàðîâ 
    MaxBar = Bars - 1 - 7;
    //---- îïðåäåëåíèå íîìåðà ñàìîãî ñòàðîãî áàðà, íà÷èíàÿ ñ êîòîðîãî áóäåò ïðîèçåä¸í ïåðåñ÷¸ò òîëüêî íîâûõ áàðîâ 
    limit = Bars - 1 - counted_bars;
    //---- èíèöèàëèçàöèÿ íóëÿ
    if(limit >= MaxBar)
      {
        for(iii = Bars - 1; iii > MaxBar; iii--) 
          {
            FABuffer[bar] = 0;
            MABuffer[bar] = 0;
            limit = MaxBar;
          }
      }
    //+--- âîññòàíîâëåíèå çíà÷åíèé ïåðåìåííûõ +====+
    int Tnew = Time[limit+1];
    if(limit < MaxBar)
    if(Tnew == time2)
      {
        for(iii = 0; iii < 4; iii++)   
            Price[iii][0] = Price[iii][1];
        for(iii = 0; iii < 7; iii++)
          {
            Smooth[iii][0] = Smooth[iii][1];
            Detrender[iii][0] = Detrender[iii][1];
            Q1[iii][0] = Q1[iii][1]; 
            I1[iii][0] = I1[iii][1];
          }
       for(iii = 0; iii < 2; iii++)
         {
           I2[iii][0] = I2[iii][1];
           Q2[iii][0] = Q2[iii][1];
           Re[iii][0] = Re[iii][1];
           Im[iii][0] = Im[iii][1];
           SmoothPeriod[iii][0] = SmoothPeriod[iii][1];
           Period_[iii][0] = Period_[iii][1];
           Phase[iii][0] = Phase[iii][1];
           MAMA [iii][0] = MAMA [iii][1];
           FAMA [iii][0] = FAMA [iii][1];
         }
      } 
    else 
      {
        if(Tnew > time2)
            Print("ERROR01");  
        else 
            Print("ERROR02");
        return(-1);  
      }
//----
    bar = limit;
    while(bar >= 0)
      {
        //+--- Ñîõðàíåíèå çíà÷åíèé ïåðåìåííûõ +==========+ 
        if(bar == 1)
            if(((limit == 1) && (time2 == Time[2])) || (limit > 1))
              {
                for(iii = 0; iii < 4; iii++)   
                    Price[iii][1] = Price[iii][0];
                //----
                for(iii = 0; iii < 7; iii++)
                  {
                    time2 = Time[2];
                    Smooth[iii][1] = Smooth[iii][0];
                    Detrender[iii][1] = Detrender[iii][0];
                    Q1[iii][1] = Q1[iii][0]; 
                    I1[iii][1] = I1[iii][0];
                  }
                //----
                for(iii = 0; iii < 2; iii++)
                  {
                    I2[iii][1] = I2[iii][0];
                    Q2[iii][1] = Q2[iii][0];
                    Re[iii][1] = Re[iii][0];
                    Im[iii][1] = Im[iii][0];
                    SmoothPeriod[iii][1] = SmoothPeriod[iii][0];
                    Period_[iii][1] = Period_[iii][0];
                    Phase[iii][1] = Phase[iii][0];
                    MAMA [iii][1] = MAMA [iii][0];
                    FAMA [iii][1] = FAMA [iii][0];
                  }
              }
        //+---+==========================================+   
        for(iii = 0; iii < 4; iii++) 
            Price[iii][0] = (High[bar+iii] + Low[bar+iii]) / 2; 
        Smooth[0][0] = (4*Price[0][0] + 3*Price[1][0] + 2*Price[2][0] + Price[3][0]) / 10; 
        Detrender[0][0] = (0.0962*Smooth[0][0] + 0.5769*Smooth[2][0] - 0.5769*Smooth[4][0] - 
                           0.0962*Smooth[6][0])*(0.075*Period_[2][0] + 0.54); 
        // {Compute InPhase and Quadrature components} 
        Q1[0][0] = (0.0962*Detrender[0][0] + 0.5769*Detrender[2][0] - 0.5769*Detrender[4][0] - 
                    0.0962*Detrender[6][0])*(0.075*Period_[2][0] + 0.54); 
        I1[0][0] = Detrender[3][0]; 
        // {Advance the phase of I1 and Q1 by 90 degrees} 
        jI = (0.0962*I1[0][0] + 0.5769*I1[2][0] - 0.5769*I1[4][0] - 
              0.0962*I1[6][0])*(0.075*Period_[1][0] + 0.54); 
        jQ = (0.0962*Q1[0][0] + 0.5769*Q1[2][0] - 0.5769*Q1[4][0] - 
              0.0962*Q1[6][0])*(0.075*Period_[1][0] + 0.54); 
        // {Phasor addition for 3 bar averaging)} 
        I2[0][0] = I1[0][0] - jQ; 
        Q2[0][0] = Q1[0][0] + jI; 
        // {Smooth the I and Q components before applying the discriminator} 
        I2[1][0] = 0.2*I2[1][0] + 0.8*I2[2][0]; 
        Q2[1][0] = 0.2*Q2[1][0] + 0.8*Q2[2][0]; 
        // {Homodyne Discriminator} 
        Re[0][0] = I2[0][0]*I2[1][0] + Q2[0][0]*Q2[1][0]; 
        Im[0][0] = I2[0][0]*Q2[1][0] - Q2[0][0]*I2[1][0]; 
        Re[0][0] = 0.2*Re[0][0] + 0.8*Re[1][0]; 
        Im[0][0] = 0.2*Im[0][0] + 0.8*Im[1][0]; 
        //----
        if(Im[0][0] != 0 && Re[0][0] != 0) 
            Period_ [0][0]= 360 / MathArctan(Im[0][0] / Re[0][0]); 
        //----
        if(Period_[0][0] > 1.5*Period_[1][0]) 
            Period_[0][0] = 1.5*Period_[1][0]; 
        //----
        if(Period_[0][0] < 0.67*Period_[1][0]) 
            Period_[0][0] = 0.67*Period_[1][0]; 
        //----
        if(Period_[0][0] < 6) 
            Period_[0][0] = 6; 
        //----
        if(Period_[0][0] > 50) 
            Period_[0][0] = 50; 
        //----
        Period_[0][0] = 0.2*Period_[0][0] + 0.8*Period_[1][0]; 
        SmoothPeriod[0][0] = 0.33*Period_[0][0] + 0.67*SmoothPeriod[1][0]; 
        //----
        if(I1[0][0] != 0) 
            Phase[0][0] = (MathArctan(Q1[0][0] / I1[0][0])); 
        DeltaPhase = Phase[1][0] - Phase[0][0]; 
        //----
        if(DeltaPhase < 1) 
            DeltaPhase = 1; 
        alpha = FastLimit / DeltaPhase; 
        //----
        if(alpha < SlowLimit) 
            alpha = SlowLimit; 
        MAMA[0][0] = alpha*Price[0][0] + (1 - alpha)*MAMA[1][0]; 
        FAMA[0][0] = 0.5*alpha*MAMA[0][0] + (1 - 0.5*alpha)*FAMA[1][0]; 
        //----
        if(bar <= Bars - 50)
          {
            FABuffer[bar] = MAMA[0][0];
            MABuffer[bar] = FAMA[0][0];
          }
        else 
          {
            FABuffer[bar] = 0;
            MABuffer[bar] = 0;
          }
        //----
        bar--;
        //----
        if(bar < 0)
            break;
        //----
        Smooth[6][0] = Smooth[5][0];
        Smooth[5][0] = Smooth[4][0];
        Smooth[4][0] = Smooth[3][0];
        Smooth[3][0] = Smooth[2][0];
        Smooth[2][0] = Smooth[1][0];
        Smooth[1][0] = Smooth[0][0]; 
        //----
        Detrender[6][0] = Detrender[5][0];
        Detrender[5][0] = Detrender[4][0];
        Detrender[4][0] = Detrender[3][0];
        Detrender[3][0] = Detrender[2][0];
        Detrender[2][0] = Detrender[1][0]; 
        Detrender[1][0] = Detrender[0][0];
        //----
        Q1[6][0] = Q1[5][0];
        Q1[5][0] = Q1[4][0];
        Q1[4][0] = Q1[3][0];
        Q1[3][0] = Q1[2][0];
        Q1[2][0] = Q1[1][0]; 
        Q1[1][0] = Q1[0][0];
        //----
        I1[6][0] = I1[5][0];
        I1[5][0] = I1[4][0];
        I1[4][0] = I1[3][0];
        I1[3][0] = I1[2][0];
        I1[2][0] = I1[1][0]; 
        I1[1][0] = I1[0][0];
        //----
        Q2[1][0] = Q2[0][0]; 
        I2[1][0] = I2[0][0]; 
        Re[1][0] = Re[0][0]; 
        Im[1][0] = Im[0][0]; 
        SmoothPeriod[1][0] = SmoothPeriod[0][0]; 
        Phase[1][0] = Phase[0][0]; 
        Period_[1][0] = Period_[0][0]; 
        MAMA[1][0] = MAMA[0][0]; 
        FAMA[1][0] = FAMA[0][0];
        //---- 
     }
    return(0);
  }
//+------------------------------------------------------------------+



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar


Indicator Curves created:

Implements a curve of type DRAW_LINE


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features: