#MAMA_v2





//+------------------------------------------------------------------+
//|                                                      #MAMA.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
//---- input parameters
extern double FastLimit = 0.5;
extern double SlowLimit = 0.05;
//---- buffers
double FABuffer[];
double MABuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
    string short_name;
    //---- indicator line
    SetIndexStyle(0, DRAW_LINE, 0, 2);
    SetIndexStyle(1, DRAW_LINE, 0, 2);
    SetIndexBuffer(0, FABuffer);
    SetIndexBuffer(1, MABuffer);
    //---- name for DataWindow and indicator subwindow label
    short_name = "#MAMA";
    IndicatorShortName(short_name);
    SetIndexLabel(0, "#FAMA");
    SetIndexLabel(1, "#MAMA");
    //----
    SetIndexDrawBegin(0, 50);
    SetIndexDrawBegin(1, 50);
    //----
    return(0);
  }
//+------------------------------------------------------------------+
//|    #MAMA                                                         |
//+------------------------------------------------------------------+
int start()
  {
    int i, counted_bars = IndicatorCounted();
    double jI, jQ, DeltaPhase, alpha, ttime; 
    double Price[5], Smooth[8], Detrender[8], Q1[8], I1[8], I2[3], Q2[3];
    double Re[3], Im[3], SmoothPeriod[3], Period_[3], Phase[3], MAMA[3], FAMA[3];
//----
    if(Bars <= 5) 
        return(0);
//----
    i = (Bars - counted_bars) + 50;
//----
    while(i >= 0)
      {
        Price[1] = ((High[i] + Low[i]) / 2); 
        Price[2] = ((High[i+1] + Low[i+1]) / 2); 
        Price[3] = ((High[i+2] + Low[i+2]) / 2); 
        Price[4] = ((High[i+3] + Low[i+3]) / 2); 
        Smooth[1] = (4*Price[1] + 3*Price[2] + 2*Price[3] + Price[4]) / 10; 
        Detrender[1] = (0.0962*Smooth[1] + 0.5769*Smooth[3] - 0.5769*Smooth[5] - 
                        0.0962*Smooth[7])*(0.075*Period_[2] + 0.54); 
        // {Compute InPhase and Quadrature components} 
        Q1[1] = (0.0962*Detrender[1] + 0.5769*Detrender[3] - 0.5769*Detrender[5] - 
                 0.0962*Detrender[7])*(0.075*Period_[2] + 0.54); 
        I1[1] = Detrender[4]; 
        // {Advance the phase of I1 and Q1 by 90 degrees} 
        jI = (0.0962*I1[1] + 0.5769*I1[3] - 0.5769*I1[5] - 0.0962*I1[7])*
             (0.075*Period_[2] + 0.54); 
        jQ = (0.0962*Q1[1] + 0.5769*Q1[3] - 0.5769*Q1[5] - 0.0962*Q1[7])*
             (0.075*Period_[2] + 0.54); 
        // {Phasor addition for 3 bar averaging)} 
        I2[1] = I1[1] - jQ; 
        Q2[1] = Q1[1] + jI; 
        // {Smooth the I and Q components before applying the discriminator} 
        I2[1] = 0.2*I2[1] + 0.8*I2[2]; 
        Q2[1] = 0.2*Q2[1] + 0.8*Q2[2]; 
        // {Homodyne Discriminator} 
        Re[1] = I2[1]*I2[2] + Q2[1]*Q2[2]; 
        Im[1] = I2[1]*Q2[2] - Q2[1]*I2[2]; 
        Re[1] = 0.2*Re[1] + 0.8*Re[2]; 
        Im[1] = 0.2*Im[1] + 0.8*Im[2]; 
        //----
        if(Im[1] != 0 && Re[1] != 0) 
            Period_ [1]= 360 / MathArctan(Im[1] / Re[1]); 
        //----
        if(Period_[1] > 1.5*Period_[2]) 
            Period_[1] = 1.5*Period_[2]; 
        //----
        if(Period_[1] < 0.67*Period_[2])
            Period_[1] = 0.67*Period_[2]; 
        //----
        if(Period_[1] < 6) 
            Period_[1] = 6; 
        //----
        if(Period_[1] > 50) 
            Period_[1] = 50; 
        Period_[1] = 0.2*Period_[1] + 0.8*Period_[2]; 
        SmoothPeriod[1] = 0.33*Period_[1] + 0.67*SmoothPeriod[2]; 
        //----
        if(I1[1] != 0) 
            Phase[1] = (MathArctan(Q1[1] / I1[1])); 
        DeltaPhase = Phase[2] - Phase[1]; 
        //----
        if(DeltaPhase < 1) 
            DeltaPhase = 1; 
        alpha = FastLimit / DeltaPhase; 
        //----
        if(alpha < SlowLimit)  
            alpha = SlowLimit; 
        MAMA[1] = alpha*Price[1] + (1 - alpha)*MAMA[2]; 
        FAMA[1] = 0.5*alpha*MAMA[1] + (1 - 0.5*alpha)*FAMA[2]; 
        FABuffer[i] = MAMA[1];
        MABuffer[i] = FAMA[1];
        //----
        Smooth[7] = Smooth[5];
        Smooth[6] = Smooth[5];
        Smooth[5] = Smooth[4];
        Smooth[4] = Smooth[3];
        Smooth[3] = Smooth[2];
        Smooth[2] = Smooth[1]; 
        //----
        Detrender[7] = Detrender[6];
        Detrender[6] = Detrender[5];
        Detrender[5] = Detrender[4];
        Detrender[4] = Detrender[3];
        Detrender[3] = Detrender[2];
        Detrender[2] = Detrender[1]; 
        //----
        Q1[7] = Q1[6];
        Q1[6] = Q1[5];
        Q1[5] = Q1[4];
        Q1[4] = Q1[3];
        Q1[3] = Q1[2];
        Q1[2] = Q1[1]; 
        //----
        I1[7] = I1[6];
        I1[6] = I1[5];
        I1[5] = I1[4];
        I1[4] = I1[3];
        I1[3] = I1[2];
        I1[2] = I1[1]; 
        //----
        Q2[2] = Q2[1]; 
        I2[2] = I2[1]; 
        Re[2] = Re[1]; 
        Im[2] = Im[1]; 
        SmoothPeriod[2] = SmoothPeriod[1]; 
        Phase[2] = Phase[1]; 
        Period_[2] = Period_[1]; 
        MAMA[2] = MAMA[1]; 
        FAMA[2] = FAMA[1]; 
        i--;
     }
    return(0);
  }
//+------------------------------------------------------------------+



Sample





Analysis



Market Information Used:

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: