//+------------------------------------------------------------------+ //| MA_Multi_Impulse.mq4 | //| TarasBY | //| | //+------------------------------------------------------------------+ #property copyright "TarasBY © 2010" #property link "" //---- indicator settings #property indicator_separate_window #property indicator_buffers 8 //#property indicator_color1 Yellow //#property indicator_color2 White #property indicator_width1 2 #property indicator_level1 0.0 #property indicator_levelcolor RoyalBlue //---- indicator parameters extern int MA_Variant = 0; // 0-iMA; 1-VininLRMA; 2-HMA; 3-_HMA; 4-VininI_HMA; 5-J2JMA; 6-Var Mov Avg; 7-EMA_Adaptive_v22; extern int Level_Calculate = 0; // 1-Angle; extern bool TimeIsBar = True; extern int MA_Period = 25; extern int Bar_SUM = 5; // Количество последних просчитываемых баров extern int MA_MODE = MODE_EMA; // 0-SMA; 1-EMA; 2-SMMA; 3-LWMA extern int MA_PRICE = PRICE_CLOSE; // 0-C; 1-O; 2-H; 3-L; 4-Md; 5-Tp; 6-WghC: Md(HL/2)4,Tp(HLC/3)5,Wgh(HLCC/4)6 extern string List_Pairs = "EURUSD,USDCHF,USDJPY,EURCHF,EURNZD,NZDUSD,EURCAD,EURAUD,AUDUSD,USDCAD,USDSEK,USDNOK,USDSGD,USDZAR,USDDKK,USDHKD,EURDKK,EURNOK,EURSEK"; extern color SUMM_Line = Yellow; extern color Basic_Line = White; extern color Uni_Line = Green; // Цвет валютных пар, у которых с валютной парой графика совпадает базовая или котируемая валюта extern color Anti_Line = Red; //---- indicator buffers double Buf_SUMM[], Buf_Impulse_Basic[], Buf_Impulse_1[], Buf_Impulse_2[], Buf_Impulse_3[], Buf_Impulse_4[]; double Buf_Impulse_5[], Buf_Impulse_6[], Buf_Impulse_7[], Buf_Impulse_8[], Buf_Impulse_9[]; int gi_Buf; string Multi_Pairs[10]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- string ls_Pairs, tmp_Array[], ls_Pair[] = {"",""}; string Pairs_Array[] = {"EUR","USD","GBP","JPY","CAD","AUD","NZD","CHF","SGD","HKD","SEK","DKK","ZAR","NOK"}; fSplitStrToStr (List_Pairs, tmp_Array, ","); int ind, cnt; // в 0-buf суммирующий импульс; 1 - символ графика cnt = 1; for (int l_int = 0; l_int < ArraySize (tmp_Array); l_int++) { if (Symbol() == tmp_Array[l_int]) {continue;} for (int li_Pair = 0; li_Pair < ArraySize (Pairs_Array); li_Pair++) { if (StringFind (Symbol(), Pairs_Array[li_Pair]) == 0) { ls_Pair[0] = Pairs_Array[li_Pair]; if (ls_Pair[0] != "" && ls_Pair[1] != "") {break;} continue; } if (StringFind (Symbol(), Pairs_Array[li_Pair]) == 3) { ls_Pair[1] = Pairs_Array[li_Pair]; if (ls_Pair[0] != "" && ls_Pair[1] != "") {break;} continue; } } for (li_Pair = 0; li_Pair < 2; li_Pair++) { if (StringFind (tmp_Array[l_int], ls_Pair[li_Pair]) != -1) { Multi_Pairs[cnt] = tmp_Array[l_int]; if (cnt < 7) { // Определяем цвета линий пар switch (li_Pair) { case 0: if (StringFind (tmp_Array[l_int], ls_Pair[li_Pair]) == 0) {SetIndexStyle (cnt + 1, DRAW_LINE, STYLE_SOLID, 1, Uni_Line);} if (StringFind (tmp_Array[l_int], ls_Pair[li_Pair]) == 3) {SetIndexStyle (cnt + 1, DRAW_LINE, STYLE_SOLID, 1, Anti_Line);} break; case 1: if (StringFind (tmp_Array[l_int], ls_Pair[li_Pair]) == 0) {SetIndexStyle (cnt + 1, DRAW_LINE, STYLE_SOLID, 1, Anti_Line);} if (StringFind (tmp_Array[l_int], ls_Pair[li_Pair]) == 3) {SetIndexStyle (cnt + 1, DRAW_LINE, STYLE_SOLID, 1, Uni_Line);} break; } } cnt++; } } // У нас враспоряжении только 8 индикаторных буферов, выходим из цикла if (cnt > 8) { Print ("Не хватает индикаторных буферов, выходим из цикла !!!"); break; } } if (cnt < 8) {ArrayResize (Multi_Pairs, cnt);} gi_Buf = cnt; Multi_Pairs[0] = Symbol(); IndicatorBuffers (ArraySize (Multi_Pairs)); //---- drawing settings SetIndexStyle (0, DRAW_LINE, STYLE_SOLID, 2, SUMM_Line); SetIndexStyle (1, DRAW_LINE, STYLE_SOLID, 1, Basic_Line); //---- 8 indicator buffers mapping ls_Pairs = "В расчётах индикатора задействованы валютные пары:\n"; for (l_int = 0; l_int < MathMin (8, gi_Buf); l_int++) { switch (l_int) { case 0: SetIndexBuffer (l_int, Buf_SUMM); break; case 1: SetIndexBuffer (l_int, Buf_Impulse_Basic); break; case 2: SetIndexBuffer (l_int, Buf_Impulse_1); break; case 3: SetIndexBuffer (l_int, Buf_Impulse_2); break; case 4: SetIndexBuffer (l_int, Buf_Impulse_3); break; case 5: SetIndexBuffer (l_int, Buf_Impulse_4); break; case 6: SetIndexBuffer (l_int, Buf_Impulse_5); break; case 7: SetIndexBuffer (l_int, Buf_Impulse_6); break; } ls_Pairs = StringConcatenate (ls_Pairs, Multi_Pairs[l_int], "; "); } Print (ls_Pairs); Comment (ls_Pairs); //---- name for DataWindow and indicator subwindow label string Ind_Name = StringConcatenate ("MA(", MA_Variant, "/", Level_Calculate, ") Multi Impulse (", MA_Period, ": ", gi_Buf, ")"); IndicatorShortName (Ind_Name); for (l_int = 0; l_int < MathMin (7, gi_Buf); l_int++) {SetIndexLabel (l_int + 1, "Imp_" + Multi_Pairs[l_int]);} SetIndexLabel (0, "SUMM Imp"); IndicatorDigits (MarketInfo (Symbol(), MODE_DIGITS) + 2); for (l_int = 0; l_int < MathMin (7, gi_Buf); l_int++) {SetIndexDrawBegin (l_int, MA_Period);} //---- initialization done return (0); } //+------------------------------------------------------------------+ //| The angle for EMA | //+------------------------------------------------------------------+ int start() { double fEndMA, fStartMA, ld_Div, ld_Con, ld_MA, ld_MA_Last, ld_Price_SMB, ld_Price, ld_SUMM_Impulse; double ld_MA_shift, ld_MA_Last_shift, ld_Angle0, ld_Angle_shift, ld_dAngle, ld_K_Price, ld_Impulse; int nLimit, i, l_int, li_SMB, li_Period = Period(); int nCountedBars; nCountedBars = IndicatorCounted(); //---- check for possible errors if (nCountedBars < 0) {return (-1);} //---- last counted bar will be recounted nLimit = Bars - nCountedBars - 1; //---- main loop ld_Price = Bid; if (ld_Price == 0.0) {return (0);} for (i = nLimit; i >= 0; i--) { ld_SUMM_Impulse = 0.0; Buf_SUMM[i] = 0.0; for (li_SMB = 0; li_SMB < gi_Buf; li_SMB++) { ld_Price_SMB = MarketInfo (Multi_Pairs[li_SMB], MODE_BID); ld_K_Price = (ld_Price_SMB / ld_Price); if (ld_K_Price == 0) {ld_K_Price = 1;} ld_Div = 0.0; ld_Con = 0.0; ld_dAngle = 0.0; for (l_int = i; l_int < i + Bar_SUM; l_int++) { ld_MA = fGetMA_Price (MA_Variant, Multi_Pairs[li_SMB], li_Period, MA_Period, MA_MODE, MA_PRICE, l_int); ld_MA_Last = fGetMA_Price (MA_Variant, Multi_Pairs[li_SMB], li_Period, MA_Period, MA_MODE, MA_PRICE, l_int + 1); switch (Level_Calculate) { case 0: if (ld_MA_Last <= ld_MA) {ld_Div += ld_MA - ld_MA_Last;} else {ld_Con += ld_MA_Last - ld_MA;} break; default: ld_MA_shift = fGetMA_Price (MA_Variant, Multi_Pairs[li_SMB], li_Period, MA_Period, MA_MODE, MA_PRICE, l_int + MA_Period); ld_MA_Last_shift = fGetMA_Price (MA_Variant, Multi_Pairs[li_SMB], li_Period, MA_Period, MA_MODE, MA_PRICE, l_int + 1 + MA_Period); ld_Angle0 = fGetAngleMA (Level_Calculate, Multi_Pairs[li_SMB], ld_MA, ld_MA_Last, l_int); ld_Angle_shift = fGetAngleMA (Level_Calculate, Multi_Pairs[li_SMB], ld_MA_shift, ld_MA_Last_shift, l_int + MA_Period); ld_dAngle += ld_Angle0 - ld_Angle_shift; break; } } ld_Impulse = fGetImpulse (Level_Calculate, ld_Div - ld_Con, ld_dAngle) / ld_K_Price; switch (li_SMB) { case 0: Buf_Impulse_Basic[i] = fGetImpulse (Level_Calculate, ld_Div - ld_Con, ld_dAngle); ld_SUMM_Impulse += MathAbs (Buf_Impulse_Basic[i] - Buf_Impulse_Basic[i+1]); break; case 1: Buf_Impulse_1[i] = ld_Impulse; ld_SUMM_Impulse += MathAbs (Buf_Impulse_1[i] - Buf_Impulse_1[i+1]); break; case 2: Buf_Impulse_2[i] = ld_Impulse; ld_SUMM_Impulse += MathAbs (Buf_Impulse_2[i] - Buf_Impulse_2[i+1]); break; case 3: Buf_Impulse_3[i] = ld_Impulse; ld_SUMM_Impulse += MathAbs (Buf_Impulse_3[i] - Buf_Impulse_3[i+1]); break; case 4: Buf_Impulse_4[i] = ld_Impulse; ld_SUMM_Impulse += MathAbs (Buf_Impulse_4[i] - Buf_Impulse_4[i+1]); break; case 5: Buf_Impulse_5[i] = ld_Impulse; ld_SUMM_Impulse += MathAbs (Buf_Impulse_5[i] - Buf_Impulse_5[i+1]); break; case 6: Buf_Impulse_6[i] = ld_Impulse; ld_SUMM_Impulse += MathAbs (Buf_Impulse_6[i] - Buf_Impulse_6[i+1]); break; case 7: Buf_Impulse_7[i] = ld_Impulse; ld_SUMM_Impulse += MathAbs (Buf_Impulse_7[i] - Buf_Impulse_7[i+1]); break; case 8: Buf_Impulse_8[i] = ld_Impulse; ld_SUMM_Impulse += MathAbs (Buf_Impulse_8[i] - Buf_Impulse_8[i+1]); break; case 9: Buf_Impulse_9[i] = ld_Impulse; ld_SUMM_Impulse += MathAbs (Buf_Impulse_9[i] - Buf_Impulse_9[i+1]); break; } } if (Buf_Impulse_Basic[i] < 0.0) {Buf_SUMM[i] = -ld_SUMM_Impulse;} else {Buf_SUMM[i] = ld_SUMM_Impulse;} } return (0); } //+------------------------------------------------------------------+ int fSplitStrToStr (string aString, string& aArray[], string aDelimiter) { string tmp_str = ""; string tmp_char = ""; ArrayResize (aArray, 0); for (int i = 0; i < StringLen (aString); i++) { tmp_char = StringSubstr (aString, i, 1); if (tmp_char == aDelimiter) { if (StringTrimLeft (StringTrimRight (tmp_str)) != "") { ArrayResize (aArray, ArraySize (aArray) + 1); aArray[ArraySize (aArray)-1] = tmp_str; } tmp_str = ""; } else { if (tmp_char != " ") tmp_str = tmp_str + tmp_char; } } if (StringTrimLeft (StringTrimRight (tmp_str)) != "") { ArrayResize (aArray, ArraySize (aArray) + 1); aArray[ArraySize (aArray)-1] = tmp_str; } return (ArraySize (aArray)); } //+------------------------------------------------------------------+ double fGetMA_Price (int MAVariant, string Sym, int TF, int MAPeriod, int MAMode, int MAPrice, int bar = 0) { switch (MAVariant) { case 1: return (iCustom (Sym, TF, "VininLRMA", MAPeriod, 0, bar)); case 2: return (iCustom (Sym, TF, "HMA", MAPeriod, 0, bar)); case 3: return (iCustom (Sym, TF, "_HMA", MAPeriod, MAMode, MAPrice, 0, bar)); case 4: return (iCustom (Sym, TF, "VininI_HMA", MAPeriod, MAMode, MAPrice, 0, 0, bar)); case 5: return (iCustom (Sym, TF, "J2JMA", MAPeriod, MAPeriod, 50, 50, 0, MAPrice, 0, bar)); case 6: return (iCustom (Sym, TF, "Var Mov Avg", MAPeriod, 4, MAPeriod, 2.0, 2.0, 0, bar)); case 7: return (iCustom (Sym, TF, "EMA_Adaptive_v22", 9, MAPeriod, 5, 1, false, 0, bar)); default: return (iMA (Sym, TF, MAPeriod, 0, MAMode, MAPrice, bar)); } return (0); } //+------------------------------------------------------------------+ double fGetImpulse (int Variant, double Value0, double Value1, double Value2 = 0) { switch (Variant) { case 0: return (Value0); default: return (Value1); } return (0); } //+------------------------------------------------------------------+ double fGetAngleMA (int Variant, string Sym, double MA_Begin, double MA_End, int Bar_Begin) { //double Пи (3.14) * MathArccos( delta значений времени / sqrt (delta значений времени(напр. в барах) ^2+ delta значений МА в начальной и конечной точках данного времени)^2) ) double X, Y, X1, Y1, X2, Y2, K1, K2; double Angle_K0, ld_Angle; double Pi = 3.1415926535; X1 = IIFi (TimeIsBar, Bar_Begin, iTime (Sym, 0, Bar_Begin)); Y1 = MA_Begin; // Точка А (X1,Y1) X2 = IIFi (TimeIsBar, Bar_Begin + 1, iTime (Sym, 0, Bar_Begin + 1)); Y2 = MA_End; // Точка В (X2,Y2) switch (Variant) { case 1: Y = (X2 - X1) / IIFi (TimeIsBar, -1, Period() * 60); if (Y == 0) {Y = 1;} X = (Y2 - Y1) * IIFi (TimeIsBar, 1, Period()); ld_Angle = MathArctan (X / Y); break; case 2: // Уравнение прямой //Angle_K0 = (Y2 - Y1) / (X2 - X1); Angle_K0 = MA_End - MA_Begin; //Angle_K0 * (X - X1) - Y + Y1 = 0; // Уравнение 1-ой прямой (наклонной) //Angle_K0 * X - Angle_K0 * X1 - Y + Y1 = 0; //Y = Angle_K0 * X - Angle_K0 * X1 + Y1; K1 = Angle_K0; // Уравнение 2-ой прямой (параллельной) //Y1 - Y = 0; //Y = Y1; K2 = 0; //ld_Angle = MathTan ((K2 - K1) / (1 + K1 * K2)); ld_Angle = MathTan (-Angle_K0); break; case 3: X = (X2 - X1) / IIFi (TimeIsBar, -1, Period() * 60); Y = (Y2 - Y1) * IIFi (TimeIsBar, 1, Period()); double ld_Sqrt = MathSqrt (MathPow (X, 2) + MathPow (Y, 2)); if (ld_Sqrt == 0) {ld_Sqrt = 1;} ld_Angle = Pi * MathArccos (X / MathSqrt (MathPow (X, 2) + MathPow (Y, 2))); break; } return (ld_Angle); } //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 01.02.2008 | //| Описание : Возвращает одно из двух значений взависимости от условия. | //+----------------------------------------------------------------------------+ int IIFi (bool condition, int ifTrue, int ifFalse) { if (condition) {return (ifTrue);} else {return (ifFalse);} }