/* //----+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ //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