#MAMA_001





/*
//----+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ 
//Version  July 20, 2006                                             |
Editing   Nikolay Kositsin  15.12.2006  farria@mail.redcom.ru        |
//----+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ 
*/
//+------------------------------------------------------------------+
//|                                                      #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
//---- òîëùèíà èíäèêàòîðíûõ ëèíèé
#property indicator_width1 1
#property indicator_width2 1
//---- ÂÕÎÄÍÛÅ ÏÀÐÀÌÅÒÐÛ ÈÍÄÈÊÀÒÎÐÀ --------------------------------------------------------------------------------------------------+
extern double FastLimit = 0.5;
extern double SlowLimit = 0.05;
extern int Input_Price_Customs = 0;   //Âûáîð öåí, ïî êîòîðûì ïðîèçâîäèòñÿ ðàñ÷¸ò èíäèêàòîðà 
//(0-CLOSE, 1-OPEN, 2-HIGH, 3-LOW, 4-MEDIAN, 5-TYPICAL, 6-WEIGHTED, 7-Heiken Ashi Close, 8-SIMPL, 9-TRENDFOLLOW, 10-0.5*TRENDFOLLOW)
//---- -------------------------------------------------------------------------------------------------------------------------------+
//---- èíäèêàòîðíûå áóôôåðû
double FABuffer[];
double MABuffer[];
//+------------------------------------------------------------------+  
//----+ Ââåäåíèå ôóíêöèè PriceSeries
//----+ Ââåäåíèå ôóíêöèè PriceSeriesAlert 
#include <PriceSeries.mqh>
//+------------------------------------------------------------------+ 
//| #MAMA initialization function                                    |
//+------------------------------------------------------------------+
int init()
  {
//---- Ñòèëü èñïîëíåíèÿ ãðàôèêà
    SetIndexStyle(0, DRAW_LINE);
    SetIndexStyle(1, DRAW_LINE);
//---- 2 èíäèêàòîðíûõ áóôôåðà èñïîëüçîâàíû äëÿ ñ÷¸òà
    SetIndexBuffer(0, FABuffer);
    SetIndexBuffer(1, MABuffer);
//---- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
    SetIndexEmptyValue(0,0.0);
    SetIndexEmptyValue(1,0.0);
//---- èìÿ äëÿ îêîí äàííûõ è ëýéáà äëÿ ñóáúîêîí
    IndicatorShortName("#MAMA");
    SetIndexLabel(0, "#FAMA");
    SetIndexLabel(1, "#MAMA");
//---- óñòàíîâêà íîìåðà áàðà, íà÷èíàÿ ñ êîòîðîãî áóäåò îòðèñîâûâàòüñÿ èíäèêàòîð 
    SetIndexDrawBegin(0, 50);
    SetIndexDrawBegin(1, 50);
//---- óñòàíîâêà àëåðòîâ íà íåäîïóñòèìûå çíà÷åíèÿ âõîäíûõ ïàðàìåòðîâ
    PriceSeriesAlert(Input_Price_Customs);
//---- çàâåðøåíèå èíèöèàëèçàöèè
    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], I1[7][2], I2[2][2], Q2[2][2];
    static double Re[2][2], Im[2][2], SmoothPeriod[2][2], Period_[2][2], 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("Îøèáêà âîññòàíîâëåíèÿ ïåðåìåííûõ!!! Tnew>time2");
       else Print("Îøèáêà âîññòàíîâëåíèÿ ïåðåìåííûõ!!! Tnew<time2");
       Print("Áóäåò ïðîèçâåä¸í ïåðåñ÷¸ò èíäèêàòîðà íà âñåõ áàðàõ!");
       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++)
                 {
                   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];
                 }
               time2=Time[2];
             }
        //+---+==========================================+   
        for(iii = 0; iii < 4; iii++) Price[iii][0]=PriceSeries(Input_Price_Customs,bar+iii);
        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


Indicator Curves created:

Implements a curve of type DRAW_LINE


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features:

It issuies visual alerts to the screen