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