//+------------------------------------------------------------------+
//| 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);}
}
Comments