//+------------------------------------------------------------------+ //| 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 #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])/PointSave_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=iHigh(NULL,0,BH3) || iTime(NULL,0,BH3)=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)=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=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]