TAACH_Chanels
Download scriptThis script is designed to automatically identify and draw trend channels and related trading levels on a financial chart based on "fractals"—specific high or low points in price action that represent potential structural turning points.
Core Functionality
The logic operates by scanning the market history for these fractal points to establish geometric trend lines. Instead of relying on arbitrary manual drawing, it uses mathematical identification of peaks and troughs to construct "channels."
Key components of the logic include:
- Fractal Identification: The script searches back through previous price bars to find local highs and lows. It uses these points as anchors for drawing both upper (resistance) and lower (support) trend lines.
- Dynamic Channel Construction: Based on the identified fractals, the script calculates the trajectory of the price movement. It determines the slope of the trend to project where future support and resistance levels might occur.
- Visual Feedback System: The tool includes an interactive "Control Panel" directly on the chart. This allows you to toggle specific channels on or off, adjust the length of the lines, and shift the data horizontally to align with different market structures without needing to rewrite any settings.
Advanced Technical Layers
Beyond basic trend lines, the script applies several layers of analysis to each channel:
- Fibonacci Integration: It can automatically calculate and project Fibonacci-based retracement levels from the established trend lines, providing specific price targets based on common harmonic ratios.
- Proportional Level Marking: The logic calculates the "width" of a channel and projects additional percentage-based levels (such as 10% or 50% offsets). These represent extended zones of support or resistance relative to the current trend's geometry.
- Adaptive Projection: Depending on whether a fractal is identified as a "low base" or a "high base," the script adjusts its calculations to ensure that the projected levels stay proportional to the current market volatility and trend direction.
User Experience
For a non-technical user, this means the tool acts as an automated geometric analyst. It identifies the "skeleton" of the market trend using fractals and then automatically overlays a map of potential price targets (Fibonacci levels and percentage offsets), allowing for a more structured view of where the price might move next.
//+------------------------------------------------------------------+
//| ChanelByFractals.mq4 |
//| Denis Orlov |
//| http://denis-or-love.narod.ru |
//| Ïîñòðîåíèå êàíàëîâ è ôèáî-óðîâíåé ïî ôðàêòàëàì |
//|
//+------------------------------------------------------------------+
#property copyright "Denis Orlov"
#property link "http://denis-or-love.narod.ru"
#property indicator_separate_window
#include <WinUser32.mqh>
#property indicator_level1 0
#property indicator_minimum -25
#property indicator_maximum 15
#property indicator_levelstyle STYLE_DOT
#property indicator_levelcolor Coral
#property show_inputs
//extern string On_Off?="Âûêëþ÷àòåëü:";
//extern bool On_Off=True;
//extern string ChanelMin?="Ìèíèìàëüíàÿ øèðèíà êàíàëà:";
//extern int ChanelMin=0;
//extern string Bar?="Ðàñ÷èòàòü îò êàêîãî áàðà:";
//extern int Bar=0;
//extern string Shift?="Çàïàçäûâàíèå êàíàëîâ:";
//extern
int Shift=0;
//extern string Long?="Äëèííà êàíàëîâ:";
//extern
int Long=3;
//extern string Save_Chanels?="Ñîõðàíèòü ñòàðûõ êàíàëîâ:";
//extern int Save_Chanels=3;
bool ByLowFraclals=True;
string MX;//ñòðîêîâàÿ ìàòðèöà äëÿ ïðîâåðêè ïàíåëè
int PX=100,PYH=0,PYL=15, PYTresh=3, FSize=14;//ïàðàìåòðû ïàíåëè
int EraserX=500, ShowChX=200,
FiboX=310, AddLevelX=370, ShiftX=235, LongX=275, ChanelMinX=275, stepX=15;
int per;
int ChanelN=0;//òåêóùèé êàíàë äëÿ ïåðåíîñà âïåðåä
datetime BH1T, BL1T;
bool Fibo,AddLevel,Fibo_old,AddLevel_old;
bool initDone=False;
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int init()
{
//----
IndicatorShortName("Control Panel");
int Win=WindowFind("Control Panel");
DrawLabels("All", 1, PX, PYH, "All_On", Red,Win, FSize);
DrawLabels("Help", 1, PX-60, PYL, "Help", SaddleBrown,Win, FSize);
DrawLabels("Eraser", 1, PX+EraserX, PYL, "Del", Red,Win, FSize);
for(int i=0;i<=9;i++)
{
if(i==0)
DrawLabels("ShowChanel "+i, 1, PX+ShowChX-i*stepX, PYH, i, Green,Win, FSize);
else
DrawLabels("ShowChanel "+i, 1, PX+ShowChX-i*stepX, PYL, i, Red, Win, FSize);
}
DrawLabels("Shift", 1, PX+ShiftX, PYH, Shift, Blue ,Win, FSize);
//DrawLabels("ChanelMin", 1, PX+ChanelMinX, PYH, ChanelMin, Blue ,Win, FSize);
DrawLabels("Long", 1, PX+LongX, PYH+(Long-1)*3, Long, Blue ,Win, FSize);
DrawLabels("Fibo", 1, PX+FiboX, PYL, "FIBO", Red ,Win, FSize);
DrawLabels("AddLevel", 1, PX+AddLevelX, PYL, "Levels", Red ,Win, FSize);
//Panel();
// AlertHelp();
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
Delete_My_Obj("Chanels_Line");
Delete_My_Obj("On_Off");
Delete_My_Obj("Digit");
return(0);
}
//----
int start()
{
if(initDone==False)
{
init(); initDone=True;
}
//----
Panel();
// if(On_Off!=True) return;
if (per == Time[0]) return; // îäèí ðàç â áàð
per = Time[0];
//----
//for(int i=0; i<=9;i++)
// if(ObjectGet("Digit "+i,OBJPROP_PRICE1)>0)
// {
//DrawChanel(i);
//}
//----
return(0);
}
void Panel()
{
int Win=WindowFind("Control Panel");
if(ObjectGet("Eraser",OBJPROP_YDISTANCE)<=PYTresh)
{
// DrawLabels("Eraser", 1, PX+EraserX, PYTresh, "Del", Green,Win, FSize);
DrawLabels("Eraser", 1, PX+EraserX, PYL, "Del", Red,Win, FSize);
Delete_My_Obj("Chanels_Line");
DrawLabels("All", 1, PX, PYH, "All_On", Red,Win, FSize);
}
int y=ObjectGet("Fibo",OBJPROP_YDISTANCE);
if(y<=PYTresh) {Fibo=True; color clr=Green; y=PYH; }
else {Fibo=False; clr=Red; y=PYL;}
DrawLabels("Fibo", 1, PX+FiboX, y, "FIBO", clr ,Win, FSize);
y=ObjectGet("AddLevel",OBJPROP_YDISTANCE);
if(y<=PYTresh) {AddLevel=True; clr=Green; y=PYH;}
else {AddLevel=False; clr=Red; y=PYL;}
DrawLabels("AddLevel", 1, PX+AddLevelX, y, "Levels", clr ,Win, FSize);
if (Fibo_old!=Fibo || AddLevel_old!=AddLevel)
{
Fibo_old=Fibo; AddLevel_old=AddLevel;
for(int i=0;i<=9;i++)
{
y=ObjectGet("ShowChanel "+i,OBJPROP_YDISTANCE);
if(y<=PYTresh)
DrawAddLines(i);
}
}
//=========All, Help
/* y=ObjectGet("On_Off",OBJPROP_YDISTANCE);
if(y<=PYTresh)
{
On_Off=True; DrawLabels("On_Off", 1, PX+0, PYH, "OFF", Green,Win, FSize);
}
else
{
On_Off=False; DrawLabels("On_Off", 1, PX+0, PYL, "ON", Red,Win, FSize);
}
if(On_Off!=True) return; */
y=ObjectGet("All",OBJPROP_YDISTANCE);
if(y>=PYL)
{
DrawLabels("All", 1, PX, PYL, "All", SaddleBrown,Win, FSize);
}
else
if(y<=PYTresh)
{
DrawLabels("All", 1, PX, PYH, "All_On", Green,Win, FSize);
for( i=0;i<=9;i++)
{
if(i==0)
DrawLabels("ShowChanel "+i, 1, PX+ShowChX-i*stepX, PYH, i, Green,Win, FSize);
else
DrawLabels("ShowChanel "+i, 1, PX+ShowChX-i*stepX, PYL, i, Red, Win, FSize);
}
DrawLabels("All", 1, PX, PYL, "All", SaddleBrown,Win, FSize);
}
else
{
DrawLabels("All", 1, PX, PYL, "All_Off", Red,Win, FSize);
for( i=0;i<=9;i++)
{
if(i!=0)
DrawLabels("ShowChanel "+i, 1, PX+ShowChX-i*stepX, PYH, i, Green,Win, FSize);
else
DrawLabels("ShowChanel "+i, 1, PX+ShowChX-i*stepX, PYL, i, Red, Win, FSize);
}
DrawLabels("All", 1, PX, PYL, "All", SaddleBrown,Win, FSize);
}
if(ObjectGet("Help",OBJPROP_YDISTANCE)<=PYTresh)
{
DrawLabels("Help", 1, PX-60, PYL, "Help", SaddleBrown,Win, FSize);
AlertHelp();
}
//=========All, Help
string mx="";
for(i=0;i<=9;i++)
{
y=ObjectGet("ShowChanel "+i,OBJPROP_YDISTANCE);
if(y<=PYTresh) {mx=mx+"1"; clr=Green; y=PYH;}
else {mx=mx+"0"; clr=Red; y=PYL;}
DrawLabels("ShowChanel "+i, 1, PX+ShowChX-i*stepX, y, i, clr,Win, FSize);
}
Shift=StrToInteger( ObjectDescription("Shift") );
DrawLabels("Shift", 1, PX+ShiftX, PYH, Shift, Blue ,Win, FSize);
//ChanelMin=StrToInteger( ObjectDescription("ChanelMin") );
//DrawLabels("ChanelMin", 1, PX+ChanelMinX, PYH, ChanelMin, Blue ,Win, FSize);
Long=MathRound(ObjectGet("Long",OBJPROP_YDISTANCE)/3)+1;
DrawLabels("Long", 1, PX+LongX, PYH+(Long-1)*3, Long, Blue ,Win, FSize);
mx=mx+Shift+Long;//+ChanelMin;
if(MX!=mx)
{
MX="";
for(i=0;i<=9;i++)
{
y=ObjectGet("ShowChanel "+i,OBJPROP_YDISTANCE);
if(y<=PYTresh)
{
DrawChanel(i);
DrawAddLines(i);
MX=MX+"1";
}
else
{
Delete_My_Obj("Chanels_LineH "+i);
Delete_My_Obj("Chanels_LineL "+i);
MX=MX+"0";
}
}
MX=MX+Shift+Long;//+ChanelMin;
}
/* bool ResFound=False;
for(int i=0;i<=9;i++)
{
int t=12,p=-4;
if(i>4){t=22; p=-14;}
if( ObjectGet("Digit "+i,OBJPROP_PRICE1)>0)
{
color clr=Green; Save_Chanels=i; ResFound=True;
for(int j=i-1;j>=0;j--)
{
t=12;p=-4;
if(j>4){t=22; p=-14;}
DrawArrows("Digit "+j, Time[t-j*2], p, 139+j, Red, Win,
"Çíà÷åíèå äëÿ Save_Chanels");
// break;
}
}
else
{
clr=Red;
}
t=12;
if(i>4)t=22;
DrawArrows("Digit "+i, Time[t-i*2], ObjectGet("Digit "+i,OBJPROP_PRICE1), 139+i, clr, Win,
"Çíà÷åíèå äëÿ Save_Chanels");
}
if(ResFound!=True)
{Save_Chanels=0;
t=12;p=10;
DrawArrows("Digit "+0, Time[t], p, 139, Green, Win,
"Çíà÷åíèå äëÿ Save_Chanels");
for(i=1;i<=9;i++)
{
p=-4;
if(i>4){t=22; p=-14;}
DrawArrows("Digit "+i, Time[t-i*2], p, 139+i, Red, Win,
"Çíà÷åíèå äëÿ Save_Chanels");
}
}*/
}
int FindFractByNumber(int FractN)
{
double Fr=0; // çíà÷åíèå ôðàêòàëîâ
int BarN=1; // íîìåðà áàðîâ,òàê ÷òîáû ïîèñê íà÷àòü ñî 2-ãî(1 è 0 äëÿ ïðîâåðêè ôðàêòàëüíîñòè)
for(int i=0;i<=FractN;i++)//ñ÷åò÷èê ïîèñêà
{
Fr=0;
while(Fr==0) //ïîèñê ñëåä.ôðàêòàëà îò BarN
{
BarN++;//áåðåì ñëåä. áàð
Fr=iFractals(NULL,0,MODE_LOWER,BarN);
if(Fr==0)
Fr=iFractals(NULL,0,MODE_UPPER,BarN);
}
}
return(BarN);
}
int DrawChanel(int FracN)
{
double FH1=0, FH3=0, FL1=0, FL3=0, F13; // íîìåðà ôðàêòàëîâ
int BH1, BH3, BL1, BL3, SR, bar2; //=Bar+2 // íîìåðà áàðîâ
SR=FindFractByNumber(FracN+Shift);//
while(FL3==0 || FH3==0) //ïîèñê ôðàêòàëîâ
{
F13=iFractals(NULL,0,MODE_LOWER,SR);
if (F13!=0)
{
while(iLow(NULL,0,SR)==iLow(NULL,0,SR+1)) SR++;
if (FL1==0){BL1=SR; FL1=F13;}
else if (FL3==0){BL3=SR; FL3=F13;}
}
F13=iFractals(NULL,0,MODE_UPPER,SR);
if (F13!=0)
{
while(iHigh(NULL,0,SR)==iHigh(NULL,0,SR+1)) SR++;
if (FH1==0){BH1=SR; FH1=F13;}
else if (FH3==0){BH3=SR; FH3=F13;}
}
SR++;
}
//if( (High[BH1]-Low[BL1])/Point<ChanelMin ) return;
/*if(BH1T==iTime(NULL,0,BH1) && BL1T==iTime(NULL,0,BL1)) return;
else
{
BH1T=iTime(NULL,0,BH1); BL1T=iTime(NULL,0,BL1);
}
if(Save_Chanels==0)//(Delete_Old_Lines)
Delete_My_Obj("ChanelByFractals");
else
{
ChanelN++;
if(ChanelN>Save_Chanels+1) ChanelN=1;
}*/
string nameH="Chanels_LineH "+FracN,//ChanelN
nameL="Chanels_LineL "+FracN;//ChanelN
Delete_My_Obj(nameH);
Delete_My_Obj(nameL);
if(BL1<BH1) ByLowFraclals=True; else ByLowFraclals=False;
if(ByLowFraclals)
{
datetime t2=iTime(NULL,0,BL1)+(iTime(NULL,0,BL1)-iTime(NULL,0,BL3))*Long;
double p2=iLow(NULL,0,BL1)+(iLow(NULL,0,BL1)-iLow(NULL,0,BL3))*Long;
DrawTrends(nameL, iTime(NULL,0,BL3),iLow(NULL,0,BL3),t2,p2,Green,2,"");
/* ObjectCreate(nameL, OBJ_TREND, 0,0,0,0,0);//ñîçäàíèå òðåíäîâîé ëèíèè
ObjectSet(nameL, OBJPROP_TIME1 ,iTime(NULL,0,BL3));
ObjectSet(nameL, OBJPROP_PRICE1,iLow(NULL,0,BL3));
ObjectSet(nameL, OBJPROP_TIME2 ,t2);
ObjectSet(nameL, OBJPROP_PRICE2,p2);
ObjectSet(nameL, OBJPROP_RAY , false);
ObjectSet(nameL, OBJPROP_COLOR , Green);
ObjectSet(nameL, OBJPROP_WIDTH , 2);*/
// Alert(TrendLToBar(nameL, BH1)+"; "+BH1+"; "+BarOfTrendL(nameL, BH3)+"; "+BH3);
if (iHigh(NULL,0,BH1)>=iHigh(NULL,0,BH3) || iTime(NULL,0,BH3)<iTime(NULL,0,BL3))
bar2=BH1; else bar2=BH3;//(BL3>=BH3 && BH3>=BL1)
datetime t1=iTime(NULL,0,bar2)-(iTime(NULL,0,BL1)-iTime(NULL,0,BL3));
double p1=iHigh(NULL,0,bar2)-(iLow(NULL,0,BL1)-iLow(NULL,0,BL3));
t2=iTime(NULL,0,bar2)+(iTime(NULL,0,BL1)-iTime(NULL,0,BL3))*Long;
p2=iHigh(NULL,0,bar2)+(iLow(NULL,0,BL1)-iLow(NULL,0,BL3))*Long;
DrawTrends(nameH, t1,p1,t2,p2,Red,1,"") ;
/*ObjectCreate(nameH, OBJ_TREND, 0,0,0,0,0);//ñîçäàíèå òðåíäîâîé ëèíèè
ObjectSet(nameH, OBJPROP_TIME1 ,t1);
ObjectSet(nameH, OBJPROP_TIME2 ,t2);
ObjectSet(nameH, OBJPROP_PRICE1,p1);
ObjectSet(nameH, OBJPROP_PRICE2,p2);
ObjectSet(nameH, OBJPROP_RAY , false);
ObjectSet(nameH, OBJPROP_COLOR , Red);*/
}
if(ByLowFraclals!=True)
{
t2=iTime(NULL,0,BH1)+(iTime(NULL,0,BH1)-iTime(NULL,0,BH3))*Long;
p2=iHigh(NULL,0,BH1)+(iHigh(NULL,0,BH1)-iHigh(NULL,0,BH3))*Long;
DrawTrends(nameH,iTime(NULL,0,BH3),iHigh(NULL,0,BH3),t2,p2,Red,2,"");
/*ObjectCreate(nameH, OBJ_TREND, 0,0,0,0,0);//ñîçäàíèå òðåíäîâîé ëèíèè
ObjectSet(nameH, OBJPROP_TIME1 ,iTime(NULL,0,BH3));
ObjectSet(nameH, OBJPROP_PRICE1,iHigh(NULL,0,BH3));
ObjectSet(nameH, OBJPROP_TIME2 ,t2);
ObjectSet(nameH, OBJPROP_PRICE2,p2);
ObjectSet(nameH, OBJPROP_RAY , false);
ObjectSet(nameH, OBJPROP_COLOR , Red);
ObjectSet(nameH, OBJPROP_WIDTH , 2);*/
if (iLow(NULL,0,BL1)<=iLow(NULL,0,BL3) || iTime(NULL,0,BL3)<iTime(NULL,0,BH3))
bar2=BL1; else bar2=BL3;//(BH3>=BL3 && BL3>=BH1)
t1=iTime(NULL,0,bar2)-(iTime(NULL,0,BH1)-iTime(NULL,0,BH3));
p1=iLow(NULL,0,bar2)-(iHigh(NULL,0,BH1)-iHigh(NULL,0,BH3));
t2=iTime(NULL,0,bar2)+(iTime(NULL,0,BH1)-iTime(NULL,0,BH3))*Long;
p2=iLow(NULL,0,bar2)+(iHigh(NULL,0,BH1)-iHigh(NULL,0,BH3))*Long;
DrawTrends(nameL, t1,p1,t2,p2,Green,1,"");
/*ObjectCreate(nameL, OBJ_TREND, 0,0,0,0,0);//ñîçäàíèå òðåíäîâîé ëèíèè
ObjectSet(nameL, OBJPROP_TIME1 ,t1);
ObjectSet(nameL, OBJPROP_TIME2 ,t2);
ObjectSet(nameL, OBJPROP_PRICE1,p1);
ObjectSet(nameL, OBJPROP_PRICE2,p2);
ObjectSet(nameL, OBJPROP_RAY , false);
ObjectSet(nameL, OBJPROP_COLOR , Green);*/
}
}
//+------------------------------------------------------------------+
int DrawAddLines(int ChanelN)
{
string nameH="Chanels_LineH "+ChanelN, nameL="Chanels_LineL "+ChanelN;
if (ObjectFind(nameH)<0) return;
datetime
th1=ObjectGet(nameH, OBJPROP_TIME1),
th2=ObjectGet(nameH, OBJPROP_TIME2),
tl1=ObjectGet(nameL, OBJPROP_TIME1),
tl2=ObjectGet(nameL, OBJPROP_TIME2), tf1,tf2;
double
ph1=ObjectGet(nameH, OBJPROP_PRICE1),
ph2=ObjectGet(nameH, OBJPROP_PRICE2),
pl1=ObjectGet(nameL, OBJPROP_PRICE1),
pl2=ObjectGet(nameL, OBJPROP_PRICE2), pf1,pf2;
int leftbar=TimeToBar(th1);
double ChanelW=TrendLToBar(nameH, leftbar)-TrendLToBar(nameL, leftbar);
bool LowBase=ObjectGet(nameL, OBJPROP_WIDTH)>ObjectGet(nameH, OBJPROP_WIDTH);
Comment(ChanelW);
if(AddLevel)
{
if(LowBase)
{
DrawTrends(nameL+" -90%", tl1,pl1-ChanelW*0.9,tl2,pl2-ChanelW*0.9,Green,1,"");
ObjectSet(nameL+" -90%",OBJPROP_STYLE,2);
DrawTrends(nameL+" -100%", tl1,pl1-ChanelW,tl2,pl2-ChanelW,Green,1,"");
ObjectSet(nameL+" -100%",OBJPROP_STYLE,1);
DrawTrends(nameL+" -10%", tl1,pl1-ChanelW*0.1,tl2,pl2-ChanelW*0.1,Red,1,"");
ObjectSet(nameL+" -10%",OBJPROP_STYLE,2);
}
else
{
DrawTrends(nameH+" +90%", th1,ph1+ChanelW*0.9,th2,ph2+ChanelW*0.9,Red,1,"");
ObjectSet(nameH+" +90%",OBJPROP_STYLE,2);
DrawTrends(nameH+" +100%", th1,ph1+ChanelW,th2,ph2+ChanelW,Red,1,"");
ObjectSet(nameH+" +100%",OBJPROP_STYLE,1);
DrawTrends(nameH+" +10%", th1,ph1+ChanelW*0.1,th2,ph2+ChanelW*0.1,Green,1,"");
ObjectSet(nameH+" +10%",OBJPROP_STYLE,2);
}
DrawTrends(nameH+" -10%", th1,ph1-ChanelW*0.1,th2,ph2-ChanelW*0.1,Red,1,"");
ObjectSet(nameH+" -10%",OBJPROP_STYLE,2);
DrawTrends(nameH+" 50%", th1,ph1-ChanelW*0.5,th2,ph2-ChanelW*0.5,Red,1,"");
ObjectSet(nameH+" 50%",OBJPROP_STYLE,2) ;
DrawTrends(nameL+" +10%", tl1,pl1+ChanelW*0.1,tl2,pl2+ChanelW*0.1,Green,1,"");
ObjectSet(nameL+" +10%",OBJPROP_STYLE,2);
}
else
{
Delete_My_Obj(nameH+" ");
Delete_My_Obj(nameL+" ");
}
if(Fibo)
{
if(LowBase)
{
color clr=Red; //levclr=Red;
string fiboname=nameL+"Fibo";
tf1=tl1; tf2=tl2; pf1=pl1;
//pf2=pl2;
if(pl1<pl2)
//double fiboLev=0.382; else fiboLev=-0.382;
pf2=pl2-((pl2-pl1)/61.8*23.6); else pf2=pl2-((pl1-pl2)/38.2*23.6);
}
else
{
clr=Green; //levclr=Green;
fiboname=nameH+"Fibo";
tf1=th1; tf2=th2; pf1=ph1;
//pf2=ph2;
if(ph1<ph2)
//fiboLev=-0.382; else fiboLev=0.382;
pf2=ph2+((ph2-ph1)/38.2*23.6); else pf2=ph2+((ph1-ph2)/61.8*23.6);
}
DrawTrends(fiboname, tf1,pf1,tf2,pf2,clr,1,"");
/* ObjectCreate(fiboname,OBJ_FIBOFAN,0,tf1,pf1,tf2,pf2);
ObjectSet(fiboname,OBJPROP_STYLE,0);
ObjectSet(fiboname,OBJPROP_COLOR, clr);
ObjectSet(fiboname,OBJPROP_LEVELCOLOR, levclr);
ObjectSet(fiboname,OBJPROP_FIBOLEVELS,1);
ObjectSet(fiboname,OBJPROP_FIRSTLEVEL+0,fiboLev);*/
}
else
{
Delete_My_Obj(nameH+"Fibo");
Delete_My_Obj(nameL+"Fibo");
}
}
//---------------
//--------------
int DrawLabels(string name, int corn, int X, int Y, string Text, color Clr=Green, int Win=0, int FSize=10)
{
int Error=ObjectFind(name);// Çàïðîñ
if (Error!=Win)// Åñëè îáúåêòà â óê. îêíå íåò :(
{
ObjectCreate(name,OBJ_LABEL,Win, 0,0); // Ñîçäàíèå îáúåêòà
}
ObjectSet(name, OBJPROP_CORNER, corn); // Ïðèâÿçêà ê óãëó
ObjectSet(name, OBJPROP_XDISTANCE, X); // Êîîðäèíàòà Õ
ObjectSet(name,OBJPROP_YDISTANCE,Y);// Êîîðäèíàòà Y
ObjectSetText(name,Text,FSize,"Arial",Clr);
}
//---------------
//-------------------------------------
int DrawTrends(string name, datetime T1, double P1, datetime T2, double P2, color Clr, int W=1, string Text="", bool ray=false, int Win=0)
{
int Error=ObjectFind(name);// Çàïðîñ
if (Error!=Win)// Åñëè îáúåêòà â óê. îêíå íåò :(
{
ObjectCreate(name, OBJ_TREND, Win,T1,P1,T2,P2);//ñîçäàíèå òðåíäîâîé ëèíèè
}
ObjectSet(name, OBJPROP_TIME1 ,T1);
ObjectSet(name, OBJPROP_PRICE1,P1);
ObjectSet(name, OBJPROP_TIME2 ,T2);
ObjectSet(name, OBJPROP_PRICE2,P2);
ObjectSet(name, OBJPROP_RAY , ray);
ObjectSet(name, OBJPROP_COLOR , Clr);
ObjectSet(name, OBJPROP_WIDTH , W);
ObjectSetText(name,Text);
// WindowRedraw();
}
//-------------------------------------
void Delete_My_Obj(string Prefix)
{//Alert(ObjectsTotal());
for(int k=ObjectsTotal()-1; k>=0; k--) // Ïî êîëè÷åñòâó âñåõ îáúåêòîâ
{
string Obj_Name=ObjectName(k); // Çàïðàøèâàåì èìÿ îáúåêòà
string Head=StringSubstr(Obj_Name,0,StringLen(Prefix));// Èçâëåêàåì ïåðâûå ñèì
if (Head==Prefix)// Íàéäåí îáúåêò, ..
{
ObjectDelete(Obj_Name);
//Alert(Head+";"+Prefix);
}
}
}
//-------------------------------------
//-------------------------------------
double TrendLToBar(string name, int BarN)
{
datetime T1=ObjectGet(name,OBJPROP_TIME1), T2=ObjectGet(name,OBJPROP_TIME2);
double P1=ObjectGet(name,OBJPROP_PRICE1), P2=ObjectGet(name,OBJPROP_PRICE2);
double Step=(P2-P1)/(T2-T1),
Res=P1+((Time[BarN]-T1)*Step);
return(Res);
}
int TimeToBar(datetime T)
{
int i=0;
while(Time[i]>=T) i++;
if(T-Time[i]<Time[i-1]-T)
return(i); else return(i-1);
}
//-------------------------------------
//-------------------------------------
void AlertHelp()
{
string text=
"*****"+"ÑÏÐÀÂÊÀ ÏÎ ÈÍÄÈÊÀÒÎÐÓ TAACH_CHANELS."+"*****\n"+
"\t"+"Àâòîð :"+"\t"+"Äåíèñ Îðëîâ"+"\n"+
"\t"+"http://denis-or-love.narod.ru"+"\n"+
"\t"+"http://vkontakte.ru/club3368806"+"\n"+"\n"+
"\t"+"ÎÏÈÑÀÍÈÅ."+"\n"+
"Ïîñòðîåíèå êàíàëîâ è ôèáî-óðîâíåé ïî ôðàêòàëàì ïî ìåòîäó \"ÒÀÀ×\" Ñ.×óâàøîâà."+"\n"+"\n"+
"Âñå ôóíêöèè êðîìå Shift óïðàâëÿþòñÿ âûäåëåíèåì(äâîéíûì ùåë÷êîì)"+"\n"+
"è ñäâèãàíèåì ââåðõ-âíèç ïî Control Panel."+"\n"+"\n"+
"Del :"+"\t"+"Î÷èñòèòü ãðàôèê îò îáúåêòîâ èíäèêàòîðà"+"\n"+
"Levels:"+"\t"+"Íàðèñîâàòü/Ñòåðåòü äîáàâî÷íûå óðîâíè êàíàëîâ."+"\n"+
"FIBO :"+"\t"+"Íàðèñîâàòü/Ñòåðåòü ôèáî-óðîâåíü îò ðàáî÷åé ëèíèè êàíàëà."+"\n"+
"Long :"+"\t"+"Èçìåíèòü äëèííó ëèíèé êàíàëîâ."+"\n"+
"Shift :"+"\t"+"Ñäâèã êàíàëîâ ïî ôðàêòàëàì âëåâî."+"\n"+
"\t"+"(óïðàâëÿåòñÿ ÷åðåç ñâîéñòâî îáúåêòà \"Òåêñò\")"+"\n"+
"0-9 :"+"\t"+"Íàðèñîâàòü/Ñòåðåòü óêàçàííûé êàíàë."+"\n"+
"All :"+"\t"+"Íàðèñîâàòü/Ñòåðåòü ÂÑÅ êàíàëû êðîìå ïåðâîãî."+"\n"+
"\t"+"(íàâåðõ ÍÅ äî óïîðà/íàâåðõ äî óïîðà)"+"\n"+"\n"+
"\t"+"*****\n"+
"\t"+"ÏÎËÜÇÓÉÒÅÑÜ È ÏÐÎÖÂÅÒÀÉÒÅ!"+"\n"+"\n"+
"\t"+"Âñå ìîè èíäèêàòîðû :"+"\n"+
"\t"+"http://codebase.mql4.com/ru/author/denis_orlov";
//MessageBox(text, "ÑÏÐÀÂÊÀ ÏÎ ÈÍÄÈÊÀÒÎÐÓ",MB_OK|MB_ICONINFORMATION );
Alert(text);
}
Comments