| / | Forum |
|
OldZ
2010.05.26 11:04
//+------------------------------------------------------------------+ //| SHI_Channel_true.mq4 | //| Copyright © 2004, Shurka & Kevin | //| | //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, Shurka & Kevin" #property link "" //---- #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Red double ExtMapBuffer1[]; //---- input parameters extern int AllBars = 240; extern int BarsForFract = 0; int CurrentBar = 0; double Step = 0; int B1 = -1, B2 = -1; int UpDown = 0; double P1 = 0, P2 = 0, PP = 0; int i = 0, AB = 300, BFF = 0; int ishift = 0; double iprice = 0; datetime T1, T2; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0, DRAW_ARROW); SetIndexArrow(0, 164); SetIndexBuffer(0, ExtMapBuffer1); SetIndexEmptyValue(0, 0.0); //---- return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { ObjectDelete("TL1"); ObjectDelete("TL2"); ObjectDelete("MIDL"); Comment(" "); //---- return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void DelObj() { ObjectDelete("TL1"); ObjectDelete("TL2"); ObjectDelete("MIDL"); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars = IndicatorCounted(); //---- if((AllBars == 0) || (Bars < AllBars)) AB = Bars; else AB = AllBars; //AB-количество обсчитываемых баров if(BarsForFract > 0) BFF = BarsForFract; else switch (Period()) { case 1: BFF = 12; break; case 5: BFF = 48; break; case 15: BFF = 24; break; case 30: BFF = 24; break; case 60: BFF = 12; break; case 240: BFF = 15; break; case 1440: BFF = 10; break; case 10080: BFF = 6; break; default: DelObj(); return(-1); break; } CurrentBar = 2; //считаем с третьего бара, чтобы фрактал "закрепился B1 = -1; B2 = -1; UpDown = 0; while(((B1 == -1) || (B2==-1)) && (CurrentBar<AB)) { //UpDown = 1 значит первый фрактал найден сверху, UpDown = -1 значит первый фрактал //найден снизу, UpDown = 0 значит фрактал ещё не найден. //В1 и В2 - номера баров с фракталами, через них строим опорную линию. //Р1 и Р2 - соответственно цены через которые будем линию проводить if((UpDown < 1) && (CurrentBar == Lowest(Symbol(), Period(), MODE_LOW, BFF*2 + 1, CurrentBar - BFF))) { if(UpDown == 0) { UpDown = -1; B1 = CurrentBar; P1 = Low[B1]; } else { B2 = CurrentBar; P2 = Low[B2]; } } if((UpDown > -1) && (CurrentBar == Highest(Symbol(), Period(), MODE_HIGH, BFF*2 + 1, CurrentBar - BFF))) { if(UpDown == 0) { UpDown = 1; B1 = CurrentBar; P1 = High[B1]; } else { B2 = CurrentBar; P2 = High[B2]; } } CurrentBar++; } if((B1 == -1) || (B2 == -1)) { DelObj(); return(-1); } // Значит не нашли фракталов среди 300 баров 8-) Step = (P2 - P1) / (B2 - B1); //Вычислили шаг, если он положительный, то канал нисходящий P1 = P1 - B1*Step; B1 = 0; //переставляем цену и первый бар к нулю //А теперь опорную точку противоположной линии канала. ishift = 0; iprice = 0; if(UpDown == 1) { PP = Low[2] - 2*Step; for(i = 3; i <= B2; i++) { if(Low[i] < PP + Step*i) PP = Low[i] - i*Step; } if(Low[0] < PP) { ishift = 0; iprice = PP; } if(Low[1] < PP + Step) { ishift = 1; iprice = PP + Step; } if(High[0] > P1) { ishift = 0; iprice = P1; } if(High[1] > P1 + Step) { ishift = 1; iprice = P1 + Step; } } else { PP = High[2] - 2*Step; for(i = 3; i <= B2; i++) { if(High[i] > PP + Step*i) PP = High[i] - i*Step; } if(Low[0] < P1) { ishift = 0; iprice = P1; } if(Low[1] < P1 + Step) { ishift = 1; iprice = P1 + Step; } if(High[0] > PP) { ishift = 0; iprice = PP; } if(High[1] > PP + Step) { ishift = 1; iprice = PP + Step; } } //Теперь переставим конечную цену и бар на АВ, чтобы линии канала рисовались подлиннее P2 = P1 + AB*Step; T1 = Time[B1]; T2 = Time[AB]; //Если не было пересечения канала, то 0, иначе ставим псису. if(iprice != 0) ExtMapBuffer1[ishift] = iprice; DelObj(); ObjectCreate("TL1", OBJ_TREND, 0, T2, PP + Step*AB, T1, PP); ObjectSet("TL1", OBJPROP_COLOR, Lime); ObjectSet("TL1", OBJPROP_WIDTH, 2); ObjectSet("TL1", OBJPROP_STYLE, STYLE_SOLID); ObjectCreate("TL2", OBJ_TREND, 0, T2, P2, T1, P1); ObjectSet("TL2", OBJPROP_COLOR, Lime); ObjectSet("TL2", OBJPROP_WIDTH, 2); ObjectSet("TL2", OBJPROP_STYLE, STYLE_SOLID); ObjectCreate("MIDL", OBJ_TREND, 0, T2, (P2 + PP + Step*AB) / 2, T1, (P1 + PP) / 2); ObjectSet("MIDL", OBJPROP_COLOR, Lime); ObjectSet("MIDL", OBJPROP_WIDTH, 1); ObjectSet("MIDL", OBJPROP_STYLE, STYLE_DOT); Comment(" Channel size = ", DoubleToStr(MathAbs(PP - P1) / Point, 0), " Slope = ", DoubleToStr(-Step / Point, 2)); //---- return(0); } //+------------------------------------------------------------------+Thank you ! |
|
Secrets of MetaTrader 4 Client Terminal: File Library in MetaEditor When creating custom programs, code editor is of great importance. The more functions are available in the editor, the faster and more convenient is creation of the program. Many programs are created on basis of an already existing code. Do you use an indicator or a script that does not fully suit your purposes? Download the code of this program from our website and customize it for yourselves. |
|
1005phillip
2010.05.26 16:00
//+------------------------------------------------------------------+ //| SHI_Channel_true.mq4 | //| Copyright © 2004, Shurka & Kevin | //| | //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, Shurka & Kevin" #property link "" //---- #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Red double ExtMapBuffer1[]; //---- input parameters extern int AllBars = 240; extern int BarsForFract = 0; int CurrentBar = 0; double Step = 0; int B1 = -1, B2 = -1; int UpDown = 0; double P1 = 0, P2 = 0, PP = 0; int i = 0, AB = 300, BFF = 0; int ishift = 0; double iprice = 0; datetime T1, T2; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0, DRAW_ARROW); SetIndexArrow(0, 164); SetIndexBuffer(0, ExtMapBuffer1); SetIndexEmptyValue(0, 0.0); //---- return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { ObjectDelete("TL1"); ObjectDelete("TL2"); ObjectDelete("MIDL"); Comment(" "); //---- return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void DelObj() { ObjectDelete("TL1"); ObjectDelete("TL2"); ObjectDelete("MIDL"); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars = IndicatorCounted(); //---- if((AllBars == 0) || (Bars < AllBars)) AB = Bars; else AB = AllBars; //AB-number cheat bars if(BarsForFract > 0) BFF = BarsForFract; else switch (Period()) { case 1: BFF = 12; break; case 5: BFF = 48; break; case 15: BFF = 24; break; case 30: BFF = 24; break; case 60: BFF = 12; break; case 240: BFF = 15; break; case 1440: BFF = 10; break; case 10080: BFF = 6; break; default: DelObj(); return(-1); break; } CurrentBar = 2; //consider the third bar to the fractal "Lock" B1 = -1; B2 = -1; UpDown = 0; while(((B1 == -1) || (B2==-1)) && (CurrentBar<AB)) { //UpDown = 1 then the first fractal discovered above, UpDown = -1 then the first fractal //found below, UpDown = 0 then the fractal is not found. //B1 and B2 - room bars with fractals, through them, build a support line. //P1 and P2 - respectively, the prices are going through the line of conduct if((UpDown < 1) && (CurrentBar == Lowest(Symbol(), Period(), MODE_LOW, BFF*2 + 1, CurrentBar - BFF))) { if(UpDown == 0) { UpDown = -1; B1 = CurrentBar; P1 = Low[B1]; } else { B2 = CurrentBar; P2 = Low[B2]; } } if((UpDown > -1) && (CurrentBar == Highest(Symbol(), Period(), MODE_HIGH, BFF*2 + 1, CurrentBar - BFF))) { if(UpDown == 0) { UpDown = 1; B1 = CurrentBar; P1 = High[B1]; } else { B2 = CurrentBar; P2 = High[B2]; } } CurrentBar++; } if((B1 == -1) || (B2 == -1)) { DelObj(); return(-1); } // Fractal mean not find the middle bars 300 8-) Step = (P2 - P1) / (B2 - B1); //Calculated step, if it is positive, then the channel downstream P1 = P1 - B1*Step; B1 = 0; //swap the price and the first bar to zero //And now the pivot point opposite edge of the channel. ishift = 0; iprice = 0; if(UpDown == 1) { PP = Low[2] - 2*Step; for(i = 3; i <= B2; i++) { if(Low[i] < PP + Step*i) PP = Low[i] - i*Step; } if(Low[0] < PP) { ishift = 0; iprice = PP; } if(Low[1] < PP + Step) { ishift = 1; iprice = PP + Step; } if(High[0] > P1) { ishift = 0; iprice = P1; } if(High[1] > P1 + Step) { ishift = 1; iprice = P1 + Step; } } else { PP = High[2] - 2*Step; for(i = 3; i <= B2; i++) { if(High[i] > PP + Step*i) PP = High[i] - i*Step; } if(Low[0] < P1) { ishift = 0; iprice = P1; } if(Low[1] < P1 + Step) { ishift = 1; iprice = P1 + Step; } if(High[0] > PP) { ishift = 0; iprice = PP; } if(High[1] > PP + Step) { ishift = 1; iprice = PP + Step; } } //Now permute the final price and bar on the AB to the line were drawn by the original canal P2 = P1 + AB*Step; T1 = Time[B1]; T2 = Time[AB]; //If there was no crossing the channel, then 0, otherwise set iprice. if(iprice != 0) ExtMapBuffer1[ishift] = iprice; DelObj(); ObjectCreate("TL1", OBJ_TREND, 0, T2, PP + Step*AB, T1, PP); ObjectSet("TL1", OBJPROP_COLOR, Lime); ObjectSet("TL1", OBJPROP_WIDTH, 2); ObjectSet("TL1", OBJPROP_STYLE, STYLE_SOLID); ObjectCreate("TL2", OBJ_TREND, 0, T2, P2, T1, P1); ObjectSet("TL2", OBJPROP_COLOR, Lime); ObjectSet("TL2", OBJPROP_WIDTH, 2); ObjectSet("TL2", OBJPROP_STYLE, STYLE_SOLID); ObjectCreate("MIDL", OBJ_TREND, 0, T2, (P2 + PP + Step*AB) / 2, T1, (P1 + PP) / 2); ObjectSet("MIDL", OBJPROP_COLOR, Lime); ObjectSet("MIDL", OBJPROP_WIDTH, 1); ObjectSet("MIDL", OBJPROP_STYLE, STYLE_DOT); Comment(" Channel size = ", DoubleToStr(MathAbs(PP - P1) / Point, 0), " Slope = ", DoubleToStr(-Step / Point, 2)); //---- return(0); } //+------------------------------------------------------------------+ |
|
OldZ
2010.05.26 18:47
Thank you 1005phillip ! |