i-PSI7MA_Multi_Impulse

0 Views
0 Downloads
0 Favorites
i-PSI7MA_Multi_Impulse
//+------------------------------------------------------------------+
//|                                             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