//+------------------------------------------------------------------+
//| 1VS_ChanelTrend_V1.0.mq4 |
//| Copyright © 2010, Vladimir Sautkin |
//| sly_fox@list.ru |
//|Ïîñòðîåíèå ëèíèé ïîääåðæêè , ñîïðîòèâëåíèÿ è êàíàëîâ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010,Vladimir Sautkin"
#property indicator_chart_window
extern int FirstBar = 1; // Íà÷àëüíûé áàð ïîñòðîåíèÿ ëèíèé ( êîîðäèíàòà âåðòèêàëüíîé ëèíèè StartTL )
extern int DeltaBar = 3; // Ìèíèìàëüíûé ðàçìåð ëèíèé â áàðàõ
extern bool InsLine = true; // Ñòðîèì èëè íåò äîïîëíèòåëüíóþ âíóòðåííåþ ëèíèþ ïîääåðæêè è ñîïðîòèâëåíèÿ
color ColorTL_U = Blue,
ColorTL_D = Red,
ColorCH_U = Blue,
ColorCH_D = Red,
ColorTR_U = Green,
ColorTR_D = Violet;
string NameTL_U = "Up_",
NameTL_D = "Dn_",
NameCH_U = "UpZ_",
NameCH_D = "DnZ_",
NameTR_U = "UpTr_",
NameTR_D = "DnTr_";
int last_bar = 0,
cntLine = 1, // ×èñëî òðåíäîâûõ ëèíèé
Line_U[100][2], // Ìàññèâ êîîðäèíàò òðåíäîâûõ ëèíèé . Ïåðâûé èíäåõ íîìåð áàðà íà÷àëà
Line_D[100][2], // Ìàññèâ êîîðäèíàò òðåíäîâûõ ëèíèé . Ïåðâûé èíäåõ íîìåð áàðà íà÷àëà
LineI_U[100][2], // Ìàññèâ êîîðäèíàò ÂÍÓÒÐÅÍÍÈÕ òðåíäîâûõ ëèíèé . Ïåðâûé èíäåõ íîìåð áàðà íà÷àëà
LineI_D[100][2], // Ìàññèâ êîîðäèíàò ÂÍÓÒÐÅÍÍÈÕ òðåíäîâûõ ëèíèé . Ïåðâûé èíäåêñ íîìåð áàðà íà÷àëà
LineShow_U[100][2], // Ìàññèâ êîîðäèíàò ÈÇÎÁÐÀÆÅÍÍÛÕ òðåíäîâûõ ëèíèé . Ïåðâûé èíäåêñ íîìåð áàðà íà÷àëà - ïîäìíîæåñòâî Line_U[100][2]
LineShow_D[100][2]; // Ìàññèâ êîîðäèíàò ÈÇÎÁÐÀÆÅÍÍÛÕ òðåíäîâûõ ëèíèé . Ïåðâûé èíäåêñ íîìåð áàðà íà÷àëà - ïîäìíîæåñòâî Line_D[100][2]
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
if(!ObjectCreate("StartTL", OBJ_VLINE, 0, Time[FirstBar], 0, 0, 0, 0, 0)) return(0);
ObjectSet("StartTL",OBJPROP_COLOR,Orange);
ObjectCreate ("MyLabel_D",OBJ_LABEL,0,0,0,0,0,0,0);
ObjectSetText("MyLabel_D", "Down= ", 10, "Times New Roman", Red);
ObjectSet("MyLabel_D", OBJPROP_CORNER, 1);
ObjectSet("MyLabel_D", OBJPROP_XDISTANCE,50);
ObjectSet("MyLabel_D", OBJPROP_YDISTANCE,20);
ObjectCreate ("MyLabel_U",OBJ_LABEL,0,0,0,0,0,0,0);
ObjectSetText("MyLabel_U", "Up= ", 10, "Times New Roman", Blue);
ObjectSet("MyLabel_U", OBJPROP_CORNER, 1);
ObjectSet("MyLabel_U", OBJPROP_XDISTANCE,50);
ObjectSet("MyLabel_U", OBJPROP_YDISTANCE,40);
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
ObjectDelete("StartTL");
DeleteTrendLine( NameTL_U, 100);
DeleteTrendLine( NameTL_D, 100);
DeleteTrendLine( NameCH_U, 100);
DeleteTrendLine( NameCH_D, 100);
DeleteTrendLine( NameTR_U, 100);
DeleteTrendLine( NameTR_D, 100);
ObjectDelete("MyLabel_D");
ObjectDelete("MyLabel_U");
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
if (last_bar == Bars )
{
if ( FirstBar != iBarShift(Symbol(),Period(), ObjectGet("StartTL",0), FALSE) ) Draw_TL ();
return(0);
}
last_bar = Bars;
ObjectMove("StartTL", 0, Time[FirstBar],0);
Draw_TL ();
return(0);
}
//+------------------------------------------------------------------+
// Ðèñóåì òðåíäîâûå ëèíèè |
//+------------------------------------------------------------------+
void Draw_TL ()
{
int i,
j,
MaxTL,Bar2;
double Bar1_Value,
Bar2_Value,
Bar0_Value;
FirstBar=iBarShift(Symbol(),Period(), ObjectGet("StartTL",0), FALSE);
DeleteTrendLine( NameTL_U, 100);
DeleteTrendLine( NameTL_D, 100);
DeleteTrendLine( NameCH_U, 100);
DeleteTrendLine( NameCH_D, 100);
DeleteTrendLine( NameTR_U, 100);
DeleteTrendLine( NameTR_D, 100);
Line_U[0,0]=FirstBar; // Ïåðâûé áàð ïåðâîé òðåíäîâîé ëèíèè Up
Line_U[0,1]=FindPoint(Line_U[0,0],Bars,1); // Âòîðîé áàð ïåðâîé òðåíäîâîé ëèíèè Up
Line_D[0,0]=FirstBar; // Ïåðâûé áàð ïåðâîé òðåíäîâîé ëèíèè Down
Line_D[0,1]=FindPoint(Line_D[0,0],Bars,-1); // Âòîðîé áàð ïåðâîé òðåíäîâîé ëèíèè Down
//-------------
i=0;
while ( Line_U[i,1] > Line_U[i,0] ) // Ïîêà íàõîäèì òðåíäîâûå ëèíèè çàíîñèì èõ êîîðäèíàòû â ìàññèâ Line
{
i++;
Line_U[i,0]=Line_U[i-1,1];
Line_U[i,1]=FindPoint(Line_U[i,0],Bars,1);
}
//-------------
MaxTL=i-1;
cntLine=0;
j=0;
for (i=0; i<=MaxTL; i++) // Ïî çàïîëíåííîìó ìàññèâó íà÷èíàåì ñòðîèòü òðåíäîâûå êàíàëû
{
if(Line_U[i,1]-Line_U[i,0] >=DeltaBar )
{
cntLine++;
LineShow_U[j,0]=Line_U[i,0]; // Çàïîëíÿåì ìàññèâ ñ ïðîðèñîâàííûìè òðåíäîâûìè ëèíèÿìè. 1 êîîðäèíàòà
LineShow_U[j,1]=Line_U[i,1]; // Çàïîëíÿåì ìàññèâ ñ ïðîðèñîâàííûìè òðåíäîâûìè ëèíèÿìè. 2 êîîðäèíàòà
j++;
CreateLine(NameTL_U+cntLine,Time[Line_U[i,1]], Low[ Line_U[i,1] ],Time[Line_U[i,0]],Low[ Line_U[i,0] ],ColorTL_U,STYLE_SOLID);
// Âûçîâ ôóíêöèè íàõîæäåíèÿ âòîðîé òî÷êè äîïîëíèòåëüíîé ëèíèè êàíàëà
// int DrawLine (NameTL_U+cntLine, StartPoin, FinPoint, UpDown) Èìÿ òðåíäîâîé ëèíèè,Íîìåð ïåðâîãî áàðà Line_U[i,1], íîìåð êîíå÷íîãî áàðà Line_U[i,0], íàïðàâëåíèå òðåíäà (Up=1, Down=-1)
Bar2=DrawLine (NameTL_U+cntLine, Line_U[i,1], Line_U[i,0], 1); // Îïîðíûé áàð äîïîëíèòåëüíîé ëèíèè êàíàëà
Bar2_Value=ObjectGetValueByShift(NameTL_U+cntLine, Bar2); // Çíà÷åíèå ýòîãî áàðà
Bar0_Value=Low[ Line_U[i,0] ]+(High[ Bar2 ]-Bar2_Value ); // Ðàçíèöà ìåæäó äèíèåé òðåíäà è âòîðûì áàðîì
CreateLine(NameCH_U+cntLine,Time[Line_U[i,1]], Low[ Line_U[i,1] ]+(High[ Bar2 ]-Bar2_Value ), Time[Line_U[i,0]],Bar0_Value,ColorCH_U,STYLE_DASH);
ObjectSet (NameCH_U+cntLine,OBJPROP_RAY,false);
}
}
ObjectSetText("MyLabel_U", "Up= "+ cntLine, 12, "Times New Roman", Blue);
if (InsLine==true)
{
//---------- Çàïîëíÿåì Êàíàëû âíóòðåííèìè òðåíäîâûìè ëèíèÿìè (ëèíèè ïîääåðæêè)
int Bar_1,Bar_2;
MaxTL=j;
for(j=0; j<MaxTL; j++)
{
Bar_1=iHighest(Symbol(),Period(),MODE_HIGH,LineShow_U[j][1]-LineShow_U[j][0],LineShow_U[j][0]); //Ïåðâûé áàð. Îïðåäåëåí, êàê Ìàêñèìàëüíûé íà äàííîì òðåíäå.
Bar_2=LineShow_U[j,1]; // Âòîðîé áàð äèàïàçîíà Âòîðîé áàð ïåðâîé òðåíäîâîé ëèíèè Up
LineI_U[0,0]=Bar_1; //Ïåðâûé áàð òðåíäîâûé ëèíèè. Îïðåäåëåí êàê Ìàêñèìàëüíûé íà äàííîì òðåíäå.
LineI_U[0,1]=FindPoint(Bar_1,Bar_2,1); // Âòîðîé áàð ïåðâîé òðåíäîâîé ëèíèè Up
i=0;
while ( LineI_U[i,1] > LineI_U[i,0] ) // Ïîêà íàõîäèì òðåíäîâûå ëèíèè çàíîñèì èõ êîîðäèíàòû â ìàññèâ Line
{
if ( LineI_U[i,1] - LineI_U[i,0] >DeltaBar ) CreateLine(NameTR_U+((j+1)*10+i+1),Time[LineI_U[i,1]], Low[ LineI_U[i,1] ], Time[LineI_U[i,0]],Low[ LineI_U[i,0] ],ColorTR_U,STYLE_SOLID);
ObjectSet (NameTR_U+((j+1)*10+i+1),OBJPROP_RAY,false);
i++;
LineI_U[i,0]=LineI_U[i-1,1];
LineI_U[i,1]=FindPoint(LineI_U[i,0],Bar_2,1);
}
}
}
//---------------------------------------- DOWN
i=0;
while ( Line_D[i,1] > Line_D[i,0] ) // Ïîêà íàõîäèì òðåíäîâûå ëèíèè çàíîñèì èõ êîîðäèíàòû â ìàññèâ Line
{
i++;
Line_D[i,0]=Line_D[i-1,1];
Line_D[i,1]=FindPoint(Line_D[i,0],Bars,-1);
}
MaxTL=i-1;
cntLine=0;
j=0;
for (i=0; i<=MaxTL; i++)
{
if(Line_D[i,1]-Line_D[i,0] >=DeltaBar )
{
cntLine++;
LineShow_D[j,0]=Line_D[i,0]; // Çàïîëíÿåì ìàññèâ ñ ïðîðèñîâàííûìè òðåíäîâûìè ëèíèÿìè. 1 êîîðäèíàòà
LineShow_D[j,1]=Line_D[i,1]; // Çàïîëíÿåì ìàññèâ ñ ïðîðèñîâàííûìè òðåíäîâûìè ëèíèÿìè. 2 êîîðäèíàòà
j++;
CreateLine(NameTL_D+cntLine,Time[Line_D[i,1]], High[ Line_D[i,1] ], Time[Line_D[i,0]],High[ Line_D[i,0] ],ColorTL_D,STYLE_SOLID);
// Âûçîâ ôóíêöèè íàõîæäåíèÿ âòîðîé òî÷êè äîïîëíèòåëüíîé ëèíèè êàíàëà
// int DrawLine (NameTL_U+cntLine, StartPoin, FinPoint, UpDown) Èìÿ òðåíäîâîé ëèíèè,Íîìåð ïåðâîãî áàðà Line_U[i,1], íîìåð êîíå÷íîãî áàðà Line_U[i,0], íàïðàâëåíèå òðåíäà (Up=1, Down=-1)
Bar2=DrawLine (NameTL_D+cntLine, Line_D[i,1], Line_D[i,0], -1);
Bar2_Value=ObjectGetValueByShift(NameTL_D+cntLine, Bar2);
Bar0_Value=High[ Line_D[i,0] ]-(Bar2_Value-Low[ Bar2 ] ); // Ðàçíèöà ìåæäó äèíèåé òðåíäà è âòîðûì áàðîì
CreateLine(NameCH_D+cntLine,Time[Line_D[i,1]], High[ Line_D[i,1] ]-(Bar2_Value-Low[ Bar2 ] ), Time[Line_D[i,0]],Bar0_Value,ColorCH_D,STYLE_DASH);
// Bar1_Value=ObjectGetValueByShift(NameCH_D+cntLine, Line_D[i,0]);
// MoveLine(NameCH_D+cntLine, Time[Line_D[i,1]], High[ Line_D[i,1] ]-(Bar2_Value-Low[ Bar2 ] ), Time[Line_D[i,0]], Bar1_Value);
ObjectSet (NameCH_D+cntLine,OBJPROP_RAY,false);
}
}
ObjectSetText("MyLabel_D", "Down= "+cntLine , 12, "Times New Roman", Red);
//---------- Çàïîëíÿåì Êàíàëû âíóòðåííèìè òðåíäîâûìè ëèíèÿìè DOWN
if (InsLine==true)
{
MaxTL=j;
for(j=0; j<MaxTL; j++)
{
Bar_1=iLowest(Symbol(),Period(),MODE_LOW,LineShow_D[j][1]-LineShow_D[j][0],LineShow_D[j][0]); //Ïåðâûé áàð. Îïðåäåëåí, êàê Ìèíèìàëüíûé íà äàííîì òðåíäå.
Bar_2=LineShow_D[j,1]; // Âòîðîé áàð äèàïàçîíà Âòîðîé áàð ïåðâîé òðåíäîâîé ëèíèè Up
LineI_D[0,0]=Bar_1; //Ïåðâûé áàð òðåíäîâûé ëèíèè. Îïðåäåëåí êàê Ìàêñèìàëüíûé íà äàííîì òðåíäå.
LineI_D[0,1]=FindPoint(Bar_1,Bar_2,-1); // Âòîðîé áàð ïåðâîé òðåíäîâîé ëèíèè Up
i=0;
while ( LineI_D[i,1] > LineI_D[i,0] ) // Ïîêà íàõîäèì òðåíäîâûå ëèíèè çàíîñèì èõ êîîðäèíàòû â ìàññèâ Line
{
if ( LineI_D[i,1] - LineI_D[i,0] >DeltaBar ) CreateLine(NameTR_D+((j+1)*10+i+1),Time[LineI_D[i,1]], High[ LineI_D[i,1] ], Time[LineI_D[i,0]],High[ LineI_D[i,0] ],ColorTR_D,STYLE_SOLID);
ObjectSet (NameTR_D+((j+1)*10+i+1),OBJPROP_RAY,false);
i++;
LineI_D[i,0]=LineI_D[i-1,1];
LineI_D[i,1]=FindPoint(LineI_D[i,0],Bar_2,-1);
}
}
}
}
//+------------------------------------------------------------------+
//| ôóíêöèè íàõîæäåíèÿ âòîðîé òî÷êè äîïîëíèòåëüíîé ëèíèè êàíàëà |
//+------------------------------------------------------------------+
int DrawLine (string NameTL,int StartPoint, int FinPoint, int UpDown)
// NameTL - Íàèìåíîâàíèå òðåíäîâîé ëèíèè, ïî êîòîðîé èùåì
// StartPoint - íà÷àëî ïîèñêà
// FinPoint - îêîí÷àíèå ïîèñêà
// UpDown - íàïðàâëåíèå òðåíäà (Up=1, Down=-1)
// Íîìåð ïåðâîãî áàðà Line_U[i,1], íîìåð êîíå÷íîãî áàðà Line_U[i,0], íàïðàâëåíèå òðåíäà (Up=1, Down=-1)
{
int i,
FinBar;
double MaxValue=0,
TekValue=0;
FinBar=StartPoint;
for (i=StartPoint; i>=FinPoint; i--)
{
if (UpDown==1) TekValue=High[i]-ObjectGetValueByShift(NameTL, i);
else TekValue=ObjectGetValueByShift(NameTL, i)-Low[i];
if(TekValue>MaxValue)
{
MaxValue=TekValue;
FinBar=i;
}
}
return(FinBar);
}
//+------------------------------------------------------------------+
//| Ñîçäàíèå òðåíäîâîé ëèíè |
//+------------------------------------------------------------------+
bool CreateLine(string Name_Line,datetime X1, double Y1, datetime X2, double Y2, color Color_Line, int Style_Line)
{
if (!ObjectCreate(Name_Line, OBJ_TREND, 0, 0, 0, 0, 0, 0, 0)) return( false);
ObjectSet(Name_Line,OBJPROP_COLOR,Color_Line);
ObjectSet(Name_Line,OBJPROP_STYLE,Style_Line);
MoveLine(Name_Line, X1, Y1, X2,Y2 );
return (true);
}
//+------------------------------------------------------------------+
//| Ïåðåìåùåíèå òðåíäîâîé ëèíè |
//+------------------------------------------------------------------+
void MoveLine(string NameLine,datetime X1, double Y1, datetime X2, double Y2)
{
ObjectMove(NameLine, 0, X1, Y1);
ObjectMove(NameLine, 1, X2, Y2);
return;
}
//+------------------------------------------------------------------+
//| Ïîèñê âòîðîé òî÷êè òðåíäîâîé ëèíèè UP |
//+------------------------------------------------------------------+
int FindPoint(int Bar_1, int Bar_Fin, int Trend )
// Bar_1 - Íîìåð áàðà äëÿ íà÷àëà ïîèñêà è ïåðâàÿ òî÷êà òðåíäîâîé ëèíèè
// Bar_Fin - Áàð îêîí÷àíèÿ ïîèñêà
// Bar_2 - Âîçâðàùàåìîå çíà÷åíèå - îìåð áàðà âòîðîé òî÷êè òðåíäîâîé ëèíèè
{
int Bar_2,
i;
double BarValue_1,
BarValue_2,
BarValue_i;
Bar_2=Bar_1;
for ( i= Bar_1+1; i<Bar_Fin; i++) // Èùåì ïåðâóþ òî÷êó Bar_2, êîòîðàÿ ìåíüøå Bar_1
{
if (Trend==1) // Åñëè Up
{
if (Low[i]<Low[Bar_1])
{
Bar_2=i;
break;
}
}
else // Åñëè Down
{
if (High[i]>High[Bar_1])
{
Bar_2=i;
break;
}
}
}
if (Bar_2>Bar_1) // Åñëè Bar_2 íàéäåíà, òî
{
int MaxBar=Bar_2;
double LineFirst;
if (Trend==1) // Åñëè Up
{
LineFirst=(Low[Bar_1]-Low[Bar_2])/(Bar_2-Bar_1);
for (i=MaxBar+1; i<Bars ; i++) // èùåì íàèìåíüøóþ òî÷êó
{
if ( (Low[Bar_1]-Low[i])/(i-Bar_1) > LineFirst )
{
Bar_2=i;
LineFirst=(Low[Bar_1]-Low[Bar_2])/(Bar_2-Bar_1);
}
}
}
else // Åñëè Down
{
LineFirst=(High[Bar_2]-High[Bar_1])/(Bar_2-Bar_1);
for (i=MaxBar+1; i<Bars ; i++) // èùåì íàèìåíüøóþ òî÷êó
{
if ( (High[i]-High[Bar_1])/(i-Bar_1) > LineFirst )
{
Bar_2=i;
LineFirst=(High[Bar_2]-High[Bar_1])/(Bar_2-Bar_1);
}
}
}
}
return (Bar_2);
}
//+------------------------------------------------------------------+
//| Óäàëåíèå òðåíäîâûõ ëèíèé nameTL â êîëè÷åñòâå qntTL |
//+------------------------------------------------------------------+
void DeleteTrendLine( string nameTL, int qntTL)
{
for (int i=1; i< qntTL+10; i++) ObjectDelete(nameTL+i);
}
//+------------------------------------------------------------------+
Comments