i-PSIkTD-Lines

Author: Copyright � 2011, TarasBY WM Z670270286972
0 Views
0 Downloads
0 Favorites
i-PSIkTD-Lines
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                          Indicator-advisor based on Demark threory with additions |
//|                                                                i-PSI@TD-Lines.mq4 |
//|                                  Copyright © 2005-2011, TarasBY & Kara & GreenDog |
//|               Some part of the code was taken from Ind-TD-DeMark-3-1.mq4 [Kara ©] |
//|                           Edit code was taken from DeMark lines.mq4  [GreenDog ©] |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
#property copyright "Copyright © 2011, TarasBY WM Z670270286972"
#property link      "taras_bulba@tut.by"
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
#property indicator_chart_window 
#property indicator_buffers 4
#property indicator_color1 Red 
#property indicator_color2 Blue 
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  *****         Ïàðàìåòðû èíäèêàòîðà        *****                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
extern int    ShowBars       = 3000;    // åñëè = 0, òî òî÷êè äåìàðêà îòîáðàæàåòñÿ äëÿ âñåãî ãðàôèêà
extern int    LevDP          = 2;       // óðîâåíü òî÷åê äåìàðêà; 2 = öåíòðàëüíûé áàð áóäåò âûøå (íèæå) 2-õ áàðîâ ñëåâà è 2-õ áàðîâ ñïðàâà
extern int    Steps          = 1;       // êîëè÷åñòâî îòîáðàæàåìûõ øàãîâ, íå áîëåå 3-õ
extern int    BackSteps      = 0;       // êîëè÷åñòâî øàãîâ íàçàä
extern int    StartBar       = 0;       // åñëè 0, òî ðåêîìåíäàöèè äëÿ òåêóùåãî áàðà, åñëè 1 - òî äëÿ ïðåäïîëàãàåìîãî ñëåäóþùåãî áàðà
extern bool   TrendLine      = true;    // false = ëèíèé òðåíäà íå áóäåò
extern bool   HorizontLine   = false;   // true = òî áóäóò ïðîðèñîâàíû óðîâíè ïðîáîÿ
extern bool   ChannelLine    = true;    // true = ñòðîèòü ïàðàëåëüíî ëèíèÿì òðåíäà êàíàëû
extern bool   TakeLines      = true;    // true = òî ðèñóåì óðîâíè òåéêà
extern bool   Comments       = false;   // true = comments
extern int    Trend          = 0;       // 1 = òîëüêî äëÿ UpTrendLines, -1 = òîëüêî äëÿ DownTrendLines, 0 = äëÿ âñåõ TrendLines
extern bool   ShowFractals   = true;
extern bool   CustomFeatures = true;
extern color  UpTrendColor   = Green;
extern color  DownTrendColor = Red;
extern int    TrendlineWidth = 3;
extern bool   ShowAlerts     = false;
extern bool   EmailAlert     = false;
//IIIIIIIIIIIIIIIIIII======Ãëîáàëüíûå ïåðåìåííûå èíäèêàòîðà=====IIIIIIIIIIIIIIIIIIIIII+
int           trendwidth, DotPip = 10, qBars, gi_Decimal = 1, gi_Digits, gd_1Point,
              ColNum[] = {Red,DarkBlue,Coral,Aqua,SaddleBrown,MediumSeaGreen};
color         trendcol;
string        //Col[] = {"Red","DarkBlue","Coral","Aqua","SaddleBrown","MediumSeaGreen"},
              Col[] = {"Êðàñíàÿ","Ñèíÿÿ","Ðîçîâàÿ","Ãîëóáàÿ","Êîðè÷íåâàÿ","Ñàëàòíàÿ"},
              gs_NameGV;
double        gd_Point, gd_DotPip,
//---- buffers
              buf_BUY[], buf_SELL[], buf_DW[], buf_UP[];
datetime      qTime = 0;                // ïåðåìåííàÿ äëÿ ëèêâèäàöèè ãëþêîâ ïðè çàãðóçêå
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|               Custom indicator initialization function                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int init() 
{
//----
	 IndicatorBuffers (4);
	 gs_NameGV = StringConcatenate (Symbol(), "_", Period(), "_");
    qBars = Bars;
    gd_Point = Point;
    gi_Digits = Digits;
    //---- Ó÷èòûâàåì ðàáîòó 5-òè çíàêà
    if (gi_Digits == 3 || gi_Digits == 5)
    {gi_Decimal = 10;}
    Steps = MathMin (3, Steps);
    //while (NormalizeDouble (Point, qPoint) == 0) qPoint++;
    gd_1Point = gi_Decimal * gd_Point;
    DotPip *= gi_Decimal;
    gd_DotPip = DotPip * gd_Point;
    string Rem = "TD-Lines";
    IndicatorShortName (Rem); 
    if (ShowFractals)
    {
        SetIndexStyle (0, DRAW_ARROW);
        SetIndexStyle (1, DRAW_ARROW);
    }
    SetIndexArrow (0, 217);
    SetIndexArrow (1, 218);
    SetIndexBuffer (0, buf_DW);
    SetIndexBuffer (1, buf_UP);
    SetIndexEmptyValue (0, 0.0);
    SetIndexEmptyValue (1, 0.0);
    SetIndexLabel (0, "TD DW");
    SetIndexLabel (1, "TD UP");

    SetIndexStyle (2, DRAW_ARROW, EMPTY, 1, Lime);
    SetIndexArrow (2, 217);
    SetIndexBuffer (2, buf_BUY);
    SetIndexLabel (2, "BUY");

    SetIndexStyle (3, DRAW_ARROW, EMPTY, 1, Magenta);
    SetIndexArrow (3, 218);
    SetIndexBuffer (3, buf_SELL);
    SetIndexLabel (3, "SELL");
//----
    return (0);
} 
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  Custor indicator deinitialization function                       |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int deinit()
{
//----
    Comment ("");
    for (int i = 1; i <= LevDP; i++)
    {
        DelObject ("HL_" + i);
        DelObject ("LL_" + i);
        DelObject ("HHL_" + i);
        DelObject ("HLL_" + i);
        DelObject ("HCL_" + i);
        DelObject ("LCL_" + i);
        for (int j = 0; j < 4; j++)
        {
            DelObject ("HTL_" + i + j);
            DelObject ("LTL_" + i + j);
            if (i == 1)
            {
                GlobalVariableDel ("HTL_" + j);
                GlobalVariableDel ("LTL_" + j);
            }
        }
    }
    string ls_Name;
    //---- Óäàëÿåì ñ ãðàôèêà OBJ_ARROW
    for (int li_OBJ = ObjectsTotal() - 1; li_OBJ >= 0; li_OBJ--)
    {
        ls_Name = ObjectName (li_OBJ);
        if (StringFind (ls_Name, "HA_") >= 0)
        {
            ObjectDelete (ls_Name);
            continue;
        }
        if (StringFind (ls_Name, "LA_") >= 0)
        {ObjectDelete (ls_Name);}
    }
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|               Custom indicator iteration function                                 |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int start()
{
    /*if (qBars != Bars)
    {
        deinit();
        Comment ("Demark, âåðñèÿ © GameOver\nÏîäîæäèòå, èäåò çàãðóçêà áàðîâ..."); 
        Sleep (1000);
        qBars = Bars;
        qTime = 0;
        return (0);
    }*/
    if (qTime == Time[0])
    {return (0);}
    //---- Çàïóñêàåòñÿ òîëüêî íà 1-ì òèêå
    qTime = Time[0];
    //---- Çàïîëíèëè è îòîáðàçèëè òî÷êè äåìàðêà
    if (ShowBars == 0)
    {ShowBars = Bars - LevDP;}
    for (int cnt = ShowBars; cnt > LevDP; cnt--)
    {
        buf_DW[cnt] = DemHigh (cnt, LevDP);
        buf_UP[cnt] = DemLow (cnt, LevDP);
    }
    string Comm = "TD-Lines\n—————————————————————————\n";
    Comm = StringConcatenate (Comm, "Ëèíèÿ òðåíäà[", On (TrendLine), "]; Êàíàë [", On (ChannelLine),
    "]; Óðîâåíü ïðîáîÿ [", On (HorizontLine), "]; Öåëè [", On (TakeLines), "]\n");
       for (cnt = 1; cnt <= Steps; cnt++)
    {Comm = StringConcatenate (Comm, (TDMain (cnt)));}
    Comm = StringConcatenate (Comm, "————————° PSI©TarasBY °————————");
    if (Comments) Comment (Comm);
    return (0); 
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                                                                                   |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string TDMain (int Step)
{
//----
    int    H1, H2, L1, L2, qExt, i, col;
    double tmp, qTL, qLevel, HT[4], LT[4];
    bool   IsHitch;
    //string Comm = StringConcatenate ("»—»—» Step ", Step, " of ", Steps, " (BackSteps ", BackSteps, ")\n"),
    string Comm = StringConcatenate ("—————   Øàã ", Step, " èç ", Steps, " (BackSteps ", BackSteps, ")  —————\n"),
           Text, Rem, qp;
    static datetime timealertupper, timealertlower;
   
    //---- Äëÿ DownTrendLines
    if (Trend <= 0)
    {
        Comm = StringConcatenate (Comm, "DW TrendLine - ", Col[Step*2-2]);
        col = ColNum[Step*2-2];
        H1 = GetTD (Step + BackSteps, buf_DW);
        H2 = GetNextHighTD (H1);
        qTL = (High[H2] - High[H1]) / (H2 - H1);
        
        //---- Íàõîäèì ëîêàëüíûé ìèíèìóì ìåæäó òî÷êàìè
        qExt = iLowest (NULL, 0, MODE_LOW, H2 - H1, H1);
        qLevel = High[H2] - qTL * H2;
        if (Step + BackSteps == 1) {qLevel -= (qTL * StartBar);}
        if (H1 < 0 || H2 < 0) //Comm = StringConcatenate (Comm, "not enough points on the chart for construction\n");
        {Comm = StringConcatenate (Comm, "Íà ãðàôèêå íåäîñòàòî÷íî òî÷åê äëÿ ïîñòðîåíèÿ.\n");}
        else
        {
            Comm = StringConcatenate (Comm, " [", DSD (High[H2]), " - ", DSD (High[H1]), "]\n");
            //Comm = StringConcatenate (Comm, "; Level ", DSD (qLevel));
            Comm = StringConcatenate (Comm, "Óðîâåíü ", DSD (qLevel));
            if (Step + BackSteps == 1)
            {
                if (StartBar > 0) {Comm = StringConcatenate (Comm, "; Future Bar ", UpHitch (-1, qLevel));}
                else {Comm = StringConcatenate (Comm, "; Last Bar ", UpHitch (StartBar, qLevel));}
            }
            Comm = StringConcatenate (Comm, "\n");
            //---- Àíàëèç - áûë ëè ïðîáîé òðåíäîâîé ëèíèè
            i = H1;
            IsHitch = false;
            while (i > 0 && IsHitch == false)
            {
                buf_BUY[i] = 0.0;
                //---- Çíà÷åíèå öåíû íà ëèíèè (H1,H2) íà áàðå i
                tmp = High[H2] - qTL * (H2 - i);
                Rem = StringConcatenate ("HA_", TimeToStr (Time[i]), "_", Step);
                qp = "";
                Text = "";         
                if (Close[i] > tmp)
                {
                    //---- Ïðîâåðÿåì óñëîâèÿ ïðîðûâà ñíèçó ââåðõ
                    qp = UpHitch (i, tmp);
                    if (StringLen (qp) > 0)
                    {
                        //Text = StringConcatenate (Text, "Source ", DSD (tmp), " ", qp);
                        Text = StringConcatenate (Text, "Èñòèííûé (óðîâåíü ", DSD (tmp), ") ", qp);
                        buf_BUY[i] = Low[i] - gd_DotPip;
                        if (timealertupper != Time[i])
                        {
                            if (ShowAlerts)
                            {Alert ("MOUTEKI: Upper trendline broken on ", Symbol(), " TF: ", Period(), " @ ", Bid);}
                            if (EmailAlert)
                            {SendMail (StringConcatenate ("MOUTEKI: Upper trendline broken on ", Symbol(), " TF: ", Period(), " @ ", Bid), StringConcatenate ("MOUTEKI: Upper trendline broken on ", Symbol(), " TF: ", Period(), " @ ", Bid));}
                            timealertupper = Time[i];
                        }
                        if (ShowFractals)
                        {
                            ObjectCreate (Rem, OBJ_ARROW, 0, 0, 0, 0, 0);
                            ObjectSet (Rem, OBJPROP_COLOR, col);
                            ObjectSet (Rem, OBJPROP_PRICE1, Low[i] - gd_1Point);
                            ObjectSet (Rem, OBJPROP_TIME1, Time[i]);
                            ObjectSet (Rem, OBJPROP_ARROWCODE, 241);
                        }
                        Rem = StringConcatenate (Rem, "_Cl");
                        //---- Ïðîáîé îòìåíåí, åñëè ïîñëå ïðîáîÿ áûë íîâûé ëîó èëè çàêðûòèå íèæå
                        while (i > 0)
                        { 
                            i--;
                            if (Low[i] < Low[qExt] || Close[i] < (Low[qExt] + (High[H1] - Low[qExt]) * 0.236))
                            {                        
                                //Text = StringConcatenate (Text, " (cancel)");
                                Text = StringConcatenate (Text, " (îòìåí¸í.)");
                                ObjectSet (Rem, OBJPROP_PRICE1, Low[i] - gd_1Point);
                                ObjectSet (Rem, OBJPROP_TIME1, Time[i]);
                                ObjectSet (Rem, OBJPROP_ARROWCODE, 251);
                                //---- Ñáðàñûâàåì ïîêàçàíèÿ â áóôåðå
                                buf_BUY[i] = 0.0;
                                break;
                            }
                        }
                        IsHitch = true;
                    }
                    else
                    {
                        //Text = StringConcatenate (Text, "False ", DSD (tmp), ";");
                        Text = StringConcatenate (Text, "Ëîæíûé (óðîâåíü ", DSD (tmp), ");");
                        //---- Ñáðàñûâàåì ïîêàçàíèÿ â áóôåðå
                        buf_BUY[i] = 0.0;
                        //DelObject (Rem);
                    }
                }
                i--;
            }
            //if (Text == "") {Text = "No breakout";}
            if (StringLen (Text) == 0) {Text = "Ïðîáîÿ íå áûëî.";}
            Comm = StringConcatenate (Comm, Text, "\n");
            //---- end analysis
            //---- Ëèíèÿ òðåíäà
            Rem = StringConcatenate ("HL_", Step);
            if (CustomFeatures) {trendcol = DownTrendColor;} else {trendcol = col;}
            if (TrendLine)
            {
                if (!CustomFeatures) {trendwidth = 3 - MathMin (2, Step);} else {trendwidth = TrendlineWidth;}
                ObjectCreate (Rem, OBJ_TREND, 0, 0, 0, 0, 0);
                ObjectSet (Rem, OBJPROP_TIME1, Time[H2]);
                ObjectSet (Rem, OBJPROP_TIME2, Time[H1]);
                ObjectSet (Rem, OBJPROP_PRICE1, High[H2]);
                ObjectSet (Rem, OBJPROP_PRICE2, High[H1]);
                ObjectSet (Rem, OBJPROP_COLOR, trendcol);
                ObjectSet (Rem, OBJPROP_WIDTH, trendwidth);
                ObjectSetText (Rem, Rem, 8);
            }    
            else {DelObject (Rem);}
            //---- Óðîâåíü ïðîáîÿ ëèíèè òðåíäà
            Rem = StringConcatenate ("HHL_", Step);
            if (HorizontLine && (Step + BackSteps) == 1)
            {
                ObjectCreate (Rem, OBJ_HLINE, 0, 0, 0, 0, 0);
                ObjectSet (Rem, OBJPROP_PRICE1, qLevel);
                ObjectSet (Rem, OBJPROP_COLOR, trendcol);
                ObjectSetText (Rem, Rem, 8);
            }
            else {DelObject (Rem);}
             //---- Ëèíèÿ êàíàëà
            Rem = StringConcatenate ("HCL_", Step);
            if (ChannelLine)
            {
                ObjectCreate (Rem, OBJ_TREND, 0, 0, 0, 0, 0);
                ObjectSet (Rem, OBJPROP_TIME1, Time[qExt]);
                ObjectSet (Rem, OBJPROP_TIME2, Time[0]);
                ObjectSet (Rem, OBJPROP_PRICE1, Low[qExt]);
                ObjectSet (Rem, OBJPROP_PRICE2, Low[qExt] - qTL * qExt);
                ObjectSet (Rem, OBJPROP_COLOR, trendcol);
                ObjectSetText (Rem, Rem, 8);
            }
            else {DelObject (Rem);}
            //---- Ëèíèè öåëåé
            Rem = StringConcatenate ("HTL_", Step);
            if (TakeLines)
            {
                //---- Äîï. óðîâåíü
                HT[3] = Low[qExt] + (High[H1] - Low[qExt]) * 1.618 - qLevel;
                HT[0] = High[H2] - qTL * (H2 - qExt) - Low[qExt];
                HT[1] = High[H2] - qTL * (H2 - qExt) - Close[qExt];
                qExt = iLowest (NULL, 0, MODE_CLOSE, H2 - H1, H1);
                HT[2] = High[H2] - qTL * (H2 - qExt) - Close[qExt];
                Comm = StringConcatenate (Comm, "Öåëè: ");
                string ls_Name;
                for (i = 0; i < 4; i++)
                {
                    qTL = NDD (qLevel + HT[i]);
                    ls_Name = StringConcatenate (Rem, i);
                    ObjectCreate (ls_Name, OBJ_TREND, 0, 0, 0, 0, 0);
                    ObjectSet (ls_Name, OBJPROP_TIME1, Time[i]);
                    ObjectSet (ls_Name, OBJPROP_PRICE1, qTL);
                    ObjectSet (ls_Name, OBJPROP_TIME2, Time[i] + 2 * Period() * 60);
                    ObjectSet (ls_Name, OBJPROP_PRICE2, qTL);
                    ObjectSet (ls_Name, OBJPROP_RAY, True);
                    ObjectSet (ls_Name, OBJPROP_WIDTH, Step);
                    ObjectSet (ls_Name, OBJPROP_COLOR, trendcol);
                    if (Step == 1)
                    {GlobalVariableSet (StringConcatenate (gs_NameGV, "HTL_", i), qTL);}
                    //Comm = StringConcatenate (Comm, DSD (qTL), " (", DoubleToStr (HT[i] / gd_Point, 0), " pips.) ");
                    Comm = StringConcatenate (Comm, DSD (qTL), " (", DoubleToStr (HT[i] / gd_Point, 0), " ïï.) ");
                }
                Comm = StringConcatenate (Comm, "\n");
            }
            else
            {for (i = 0; i < 4; i++) {DelObject (Rem + i);}}
        }
    }
    //---- Äëÿ UpTrendLines
    if (Trend >= 0)
    {
        Comm = StringConcatenate (Comm, "UP TrendLine - ", Col[Step*2-1]);
        col = ColNum[Step*2-1];
        L1 = GetTD (Step + BackSteps, buf_UP);
        L2 = GetNextLowTD (L1);
        qTL = (Low[L1] - Low[L2]) / (L2 - L1);
        //---- Íàõîäèì ëîêàëüíûé ìèíèìóì ìåæäó òî÷êàìè
        qExt = iHighest (NULL, 0, MODE_HIGH, L2 - L1, L1);
        qLevel = Low[L2] + qTL * L2;
        if (Step + BackSteps == 1) {qLevel = qLevel + qTL * StartBar;}
        if (L1 < 0 || L2 < 0) //{Comm = StringConcatenate (Comm, "not enough points on the chart for construction\n");}
        Comm = StringConcatenate (Comm, "íà ãðàôèêå íåäîñòàòî÷íî òî÷åê äëÿ ïîñòðîåíèÿ.\n");
        else
        {
            Comm = StringConcatenate (Comm, " [", DSD (Low[L2]), " - ", DSD (Low[L1]), "]\n");
            //Comm = StringConcatenate (Comm, "Level ", DSD (qLevel));
            Comm = StringConcatenate (Comm, "Óðîâåíü ", DSD (qLevel));
            if (Step + BackSteps == 1)
            {
                if (StartBar > 0) {Comm = StringConcatenate (Comm, "; Future Bar ", DownHitch (-1, qLevel));}
                else {Comm = StringConcatenate (Comm, "; Last Bar ", DownHitch (StartBar, qLevel));}
            }
            Comm = StringConcatenate (Comm, "\n");
            //---- Àíàëèç - áûë ëè ïðîáîé òðåíäîâîé ëèíèè
            i = L1;
            IsHitch = false;
            while (i > 0 && IsHitch == false)
            {
                buf_SELL[i] = 0;
                tmp = Low[L2] + qTL * (L2 - i);
                Rem = StringConcatenate ("LA_", TimeToStr (Time[i]), "_", Step);
                qp = "";
                Text = "";
                if (Close[i] < tmp)
                {
                    qp = DownHitch (i, tmp);
                    if (StringLen (qp) > 0)
                    {
                        //Text = StringConcatenate (Text, "Source ", DSD (tmp), " ", qp);
                        Text = StringConcatenate (Text, "Èñòèííûé (óðîâåíü ", DSD (tmp), ") ", qp);
                        buf_SELL[i] = High[i] + gd_DotPip;
                        if (timealertlower != Time[i])
                        {
                            if (ShowAlerts)
                            {Alert ("MOUTEKI: Lower trendline broken on ", Symbol(), " TF: ", Period(), " @ ", Bid);}
                            if (EmailAlert)
                            {SendMail (StringConcatenate ("MOUTEKI: Lower trendline broken on ", Symbol(), " TF: ", Period(), " @ ", Bid), StringConcatenate ("MOUTEKI: Lower trendline broken on ", Symbol(), " TF: ", Period(), " @ ", Bid));}
                            timealertlower = Time[i];
                        }
                        if (ShowFractals)
                        {
                            ObjectCreate (Rem, OBJ_ARROW, 0, 0, 0, 0, 0);
                            ObjectSet (Rem, OBJPROP_COLOR, col);
                            ObjectSet (Rem, OBJPROP_PRICE1, Low[i] - gd_1Point);
                            ObjectSet (Rem, OBJPROP_TIME1, Time[i]);
                            ObjectSet (Rem, OBJPROP_ARROWCODE, 242);
                            Print (Text, " ", Rem);
                        }
                        //---- Ïðîáîé îòìåíåí, åñëè ïîñëå ïðîáîÿ áûë íîâûé õàé èëè çàêðûòèå âûøå
                        Rem = StringConcatenate (Rem, "_Cl");
                        while (i > 0)
                        {
                            i--;
                            if (High[i] > High[qExt] || Close[i] > High[qExt] - (High[qExt] - Low[L1]) * 0.236)
                            {
                                //Text = StringConcatenate (Text, " (cancel)");
                                Text = StringConcatenate (Text, " (îòìåí¸í.)");
                                ObjectSet (Rem, OBJPROP_PRICE1, Low[i] - gd_1Point);
                                ObjectSet (Rem, OBJPROP_TIME1, Time[i]);
                                ObjectSet (Rem, OBJPROP_ARROWCODE, 251);
                                Print (Text, " ", Rem);
                                //---- Ñáðàñûâàåì ïîêàçàíèÿ â áóôåðå
                                buf_SELL[i] = 0.0;
                                break;
                            }
                        }
                        IsHitch = true;
                    }
                    else
                    {
                        //Text = StringConcatenate (Text, "False ", DSD (tmp), "; ");
                        Text = StringConcatenate (Text, "Ëîæíûé (óðîâåíü ", DSD (tmp), ");");
                        //---- Ñáðàñûâàåì ïîêàçàíèÿ â áóôåðå
                        buf_SELL[i] = 0.0;
                        //DelObject (Rem);
                    }
                }
                i--;
            }
            //if (Text == "") {Text = "No breakout";}
            if (StringLen (Text) == 0) {Text = "Ïðîáîÿ íå áûëî.";}
            Comm = StringConcatenate (Comm, Text, "\n");
            //---- end analysis
            //---- Ëèíèÿ òðåíäà
            Rem = StringConcatenate ("LL_", Step);
            if (CustomFeatures) {trendcol = UpTrendColor;} else {trendcol = col;}
            if (TrendLine == 1)
            {
                if (!CustomFeatures) {trendwidth = 3 - MathMin (2, Step);} else {trendwidth = TrendlineWidth;}
                ObjectCreate (Rem, OBJ_TREND, 0, 0, 0, 0, 0);
                ObjectSet (Rem, OBJPROP_TIME1, Time[L2]);
                ObjectSet (Rem, OBJPROP_TIME2, Time[L1]);
                ObjectSet (Rem, OBJPROP_PRICE1, Low[L2]);
                ObjectSet (Rem, OBJPROP_PRICE2, Low[L1]);
                ObjectSet (Rem, OBJPROP_COLOR, trendcol);
                ObjectSet (Rem, OBJPROP_WIDTH, trendwidth);
                ObjectSetText (Rem, Rem, 8);
            }    
            else {DelObject (Rem);}
            //---- Óðîâåíü ïðîáîÿ ëèíèè òðåíäà
            Rem = StringConcatenate ("HLL_", Step);
            if (HorizontLine && (Step + BackSteps) == 1)
            {
                ObjectCreate (Rem, OBJ_HLINE, 0, 0, 0, 0, 0);
                ObjectSet (Rem, OBJPROP_PRICE1, qLevel);
                ObjectSet (Rem, OBJPROP_COLOR, trendcol);
                ObjectSetText (Rem, Rem, 8);
            }
            else {DelObject (Rem);}
            //---- Ëèíèÿ êàíàëà
            Rem = StringConcatenate ("LCL_", Step);
            if (ChannelLine)
            {
                ObjectCreate (Rem, OBJ_TREND, 0, 0, 0, 0, 0);
                ObjectSet (Rem, OBJPROP_TIME1, Time[qExt]);
                ObjectSet(Rem, OBJPROP_TIME2, Time[0]);
                ObjectSet (Rem, OBJPROP_PRICE1, High[qExt]);
                ObjectSet(Rem, OBJPROP_PRICE2, High[qExt] + qTL * qExt);
                ObjectSet (Rem, OBJPROP_COLOR, trendcol);
                ObjectSetText (Rem, Rem, 8);
            }
            else {DelObject (Rem);}
            //---- Ëèíèè öåëåé
            Rem = StringConcatenate ("LTL_", Step);
            if (TakeLines)
            {
                //---- Äîï. óðîâåíü
                LT[3] = qLevel - High[qExt] + (High[qExt] - Low[L1]) * 1.618;
                LT[0] = High[qExt] - qTL * (L2 - qExt) - Low[L2];
                LT[1] = Close[qExt] - qTL * (L2 - qExt) - Low[L2];
                qExt = iHighest (NULL, 0, MODE_CLOSE, L2 - L1, L1);
                LT[2] = Close[qExt] - qTL * (L2 - qExt) - Low[L2];
                //Comm = StringConcatenate (Comm, "Targets: ");
                Comm = StringConcatenate (Comm, "Öåëè: ");
                for (i = 0; i < 4; i++)
                {
                    qTL = NDD (qLevel - LT[i]);
                    ls_Name = StringConcatenate (Rem, i);
                    ObjectCreate (ls_Name, OBJ_TREND, 0, 0, 0, 0, 0);
                    ObjectSet (ls_Name, OBJPROP_TIME1, Time[i]);
                    ObjectSet (ls_Name, OBJPROP_PRICE1, qTL);
                    ObjectSet (ls_Name, OBJPROP_TIME2, Time[i] + 2 * Period() * 60);
                    ObjectSet (ls_Name, OBJPROP_PRICE2, qTL);
                    ObjectSet (ls_Name, OBJPROP_RAY, True);
                    ObjectSet (ls_Name, OBJPROP_WIDTH, Step);
                    ObjectSet (ls_Name, OBJPROP_COLOR, trendcol);
                    if (Step == 1)
                    {GlobalVariableSet (StringConcatenate (gs_NameGV, "LTL_", i), qTL);}
                    //Comm = StringConcatenate (Comm, DSD (qTL), " (", DoubleToStr (LT[i] / gd_Point, 0), " pips.) ");
                    Comm = StringConcatenate (Comm, DSD (qTL), " (", DoubleToStr (LT[i] / gd_Point, 0), " ïï.) ");
                }
                Comm = StringConcatenate (Comm, "\n");
            }
            else {for (i = 0; i < 4; i++) {DelObject (Rem + i);}}
        }
    }
//----
    return (Comm);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                                                                                   |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int GetTD (int P, double Arr[])
{
    int i = 0, j = 0;
//----
    while (j < P)
    {
        i++;
        while (Arr[i] == 0)
        {
            i++;
            if (i > ShowBars - 2) {return (-1);}
        }
        j++;
    }
//----
    return (i);         
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                                                                                   |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int GetNextHighTD (int P)
{ 
    int i = P + 1;
//----
    while (buf_DW[i] <= High[P])
    {
        i++;
        if (i > ShowBars - 2) {return (-1);}
    }
//----
    return (i);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                                                                                   |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int GetNextLowTD (int P)
{
    int i = P+1;
//----
    while (buf_UP[i] >= Low[P] || buf_UP[i] == 0)
    {
        i++;
        if (i > ShowBars - 2) {return (-1);}
    }
//----
    return (i);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|     Ðåêóðñèâíàÿ ïðîâåðêà íà óñëîâèÿ Äåìàðêà (õàé), âîçâðàùàåò çíà÷åíèå èëè 0      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double DemHigh (int cnt, int sh)
{
//----
    if (High[cnt] >= High[cnt+sh] && High[cnt] > High[cnt-sh])
    {
      if (sh > 1) {return (DemHigh (cnt, sh - 1));}
      else {return (High[cnt]);}
    }
    else return (0);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|     Ðåêóðñèâíàÿ ïðîâåðêà íà óñëîâèÿ Äåìàðêà (ëîó), âîçâðàùàåò çíà÷åíèå èëè 0      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double DemLow (int cnt, int sh)
{
//----
    if (Low[cnt] <= Low[cnt+sh] && Low[cnt] < Low[cnt-sh])
    {
        if (sh > 1) {return (DemLow (cnt, sh - 1));}
        else {return (Low[cnt]);}
    }
    else return (0);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                                                                                   |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string On (bool On)
//{if (On) return ("on"); else return ("off");}
{if (On) return("Âêë."); else return ("Âûêë.");}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Îïðåäåëåíèå êâàëèôèêàòîðîâ ïðîðûâà ââåðõ                                     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string UpHitch (int P, double qLevel)
{
    string Comm = "";
//----
    if (Close[P+1] < Close[P+2]) Comm = StringConcatenate (Comm, " 1");
    if (P >= 0 && Open[P] > qLevel) Comm = StringConcatenate (Comm, " 2");
    if (2 * Close[P+1] - Low[P+1] < qLevel) Comm = StringConcatenate (Comm, " 3");
    if (Comm != "") //Comm = StringConcatenate ("[ Break Qualificator:", Comm, " ]");
    {Comm = StringConcatenate ("[ Êâàëèôèêàòîð Ïðîðûâà:", Comm, " ]");}
//----
    return (Comm);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Îïðåäåëåíèå êâàëèôèêàòîðîâ ïðîðûâà âíèç                                      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string DownHitch (int P, double qLevel)
{
    string Comm = "";
//----
    if (Close[P+1] > Close[P+2]) Comm = StringConcatenate (Comm, " 1");
    if (P >= 0 && Open[P] < qLevel) Comm = StringConcatenate (Comm, " 2");
    if (2 * Close[P+1] - High[P+1] > qLevel) Comm = StringConcatenate (Comm, " 3");
    if (Comm != "") //Comm = StringConcatenate ("[ Break Qualificator:", Comm, " ]");
    Comm = StringConcatenate ("[ Êâàëèôèêàòîð Ïðîðûâà:", Comm, " ]");
//----
    return (Comm);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Îáùèå ôóíêöèè                                                             |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôóíêöèÿ, ïåðåâîäà çíà÷åíèÿ èç double â string c íîðìàëèçàöèåé ïî Digit     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string DSD (double v)
{return (DoubleToStr (v, gi_Digits));} 
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôóíêöèÿ, íîðìàëèçàöèè çíà÷åíèÿ double äî Digit                             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double NDD (double v)
{return (NormalizeDouble (v, gi_Digits));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòà ñ ãðàôè÷åñêèìè îáúåêòàìè                                           |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//          ÓÄÀËÅÍÈÅ ÃÐÀÔÈ×ÅÑÊÎÃÎ ÎÁÚÅÊÒÀ                                             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool DelObject (string fs_Name)
{
//----
    //---- Èùåì îáúåêò ïî èìåíè
    if (ObjectFind (fs_Name) != -1)
    {
        if (ObjectDelete (fs_Name))
        {return (true);}
    }
//----
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

Comments