//+---------------------------------------------------------------------+ //| Gliding Channels [CF].mq4 | //| Crazy_Fox [UA] | //| e-mail: crazy_fox@ua.fm | //| ICQ: 529330 | //| ÄËß ÍÅÊÎÌÌÅÐ×ÅÑÊÎÃÎ ÈÑÏÎËÜÇÎÂÀÍÈß, ÏÓÁËÈÊÀÖÈß ÐÀÇÐÅØÅÍÀ ÒÎËÜÊÎ Ñ | //| ÓÊÀÇÀÍÈÅÌ ÏÅÐÂÎÈÑÒÎ×ÍÈÊÀ (http://www.community.finlist.org) | //| È ÈÌÅÍÈ ÀÂÒÎÐÀ (Crazy_Fox [UA]) | //| ÐÅÄÀÊÒÈÐÎÂÀÍÈÅ ÈÑÕÎÄÍÎÃÎ ÊÎÄÀ ÐÀÇÐÅØÀÅÒÑß ÒÎËÜÊÎ ÏÐÈ ÓÑËÎÂÈÈ | //| ÑÎÕÐÀÍÅÍÈß ÄÀÍÍÎÃÎ ÒÅÊÑÒÀ, ÀÄÐÅÑÎÂ È ÑÑÛËÎÊ. ÏÐÎÄÀÆÀ, ÈÍÄÈÊÀÒÎÐÀ, | //| ÎÒÄÅËÜÍÛÕ ×ÀÑÒÅÉ ÈÑÕÎÄÍÎÃÎ ÊÎÄÀ, ÃÐÀÔÈÊÎÂ, ÈÌ ÏÎÑÒÐÎÅÍÍÛÕ ÇÀÏÐÅÙÅÍÀ | //| ÀÂÒÎÐ ÍÅ ÍÅÑ¨Ò ÎÒÂÅÒÑÒÂÅÍÍÎÑÒÈ ÇÀ ÂÎÇÌÎÆÍÛÅ ÓÁÛÒÊÈ, ÏÎËÓ×ÅÍÍÛÅ | //|  ÐÅÇÓËÜÒÀÒÅ ÐÀÁÎÒÛ ÈÍÄÈÊÀÒÎÐÀ | //| Ñêîëüçÿùèå êàíàëû Áàðèøïîëüöà | //| Êàíàëû ñòðîÿòñÿ ïî òðåì ïîñëåäíèì ýêñòðåìóìàì - ëèíèÿ ïî äâóì | //| íèçàì è ïàðàëëåëüíàÿ ÷åðåç âåðøèíó, èëè íàîáîðîò, ëèíèÿ ïî äâóì | //| âåðøèíàì è ïàðàëëåëüíàÿ ïî íèçó. Ëèíèè ñòðîÿòñÿ ÏÎ ÌÀÊÑÈÌÀËÜÍÛÌ | //| (ÌÈÍÈÌÀËÜÍÛÌ) ÇÍÀ×ÅÍÈßÌ, òî åñòü ïî òåíÿì ñâå÷åé. Ýêñòðåìóì | //| èäåíòèôèöèðóåòñÿ ïðè íå ìåíåå 2 ñâå÷åê äî è 2 ñâå÷åê ïîñëå åãî | //| ïðîõîæäåíèÿ. Òî åñòü äëÿ ìàêñèìóìà íåîáõîäèìî íå ìåíåå 2 ñâå÷åê | //| ìåíüøå ìàêñèìàëüíîé ñâå÷è äî, è íå ìåíåå 2 ñâå÷åê ìåíüøå ìàêñèìóìà | //| - ïîñëå. Ðàññòîÿíèå ìåæäó ñîñåäíèìè ýêñòðåìóìàìè íå îãðàíè÷èâàåòñÿ. | //| Âñòðå÷àþòñÿ "ãðóïïîâûå ýêñòðåìóìû" - äâå èëè äàæå òðè ñâå÷è ñ | //| ïðàêòè÷åñêè îäèíàêîâûìè ìàêñèìóìàìè (ìèíèìóìàìè). Èäåíòèôèöèðóåì èõ | //| êàê îäèí ýêñòðåìóì, ëèíèþ êàíàëà ïðîâîäèì ÷åðåç âåðõ (íèç) ïðàâîé | //| èç íèõ. | //+---------------------------------------------------------------------+ #property copyright "Crazy_Fox [UA]" #property link "http://finlist.ru" #property indicator_chart_window //---- extern int Start_Bar = 2; extern int Line_Width = 2; extern int Num_of_Channels = 1; extern int Sensitivity = 0; extern bool Show_Labels = true; extern bool Channel_as_Ray = true; extern bool Show_Alerts = true; extern color Channel_Color1 = Blue; extern color Channel_Color2 = LightSkyBlue; extern color Channel_Color3 = DeepPink; extern color Channel_Color4 = DodgerBlue; extern color Channel_Color5 = PaleGreen; extern color Channel_Color6 = DarkOrange; extern color Channel_Color7 = DodgerBlue; extern color Channel_Color8 = Yellow; //---- double x1 = 0, y1 = 0, x2 = 0, y2 = 0, x_l = 0, y_l = 0, x_f = 0, y_f = 0, x_m = 0, y_m = 0, step = 0, l_border = 0, h_border=0, Price = 0; bool main_is_up = true, price_at_border = false; int CurrentBar = 0, Extremum[3], TempExtremum[3], Colors[8], f_bar = 0, m_bar = 0, l_bar = 0; //+------------------------------------------------------------------+ //| init | //+------------------------------------------------------------------+ int init() { Colors[0] = Channel_Color1; Colors[1] = Channel_Color2; Colors[2] = Channel_Color3; Colors[3] = Channel_Color4; Colors[4] = Channel_Color5; Colors[5] = Channel_Color6; Colors[6] = Channel_Color7; Colors[7] = Channel_Color8; ArrayInitialize(Extremum, 0); ArrayInitialize(TempExtremum, 0); return(0); } //+------------------------------------------------------------------+ //| deinit | //+------------------------------------------------------------------+ int deinit() { //  öèêëå óäàëÿåì âñå îòðèñîâàííûå îáúåêòû for (int i = 1; i <= Num_of_Channels; i++) { ObjectDelete("Channel_"+i); if(Show_Labels) { ObjectDelete("Extremum_1_" + i); ObjectDelete("Extremum_2_" + i); ObjectDelete("Extremum_3_" + i); } } Comment(" "); ArrayInitialize(Extremum, 0); ArrayInitialize(TempExtremum, 0); return(0); } //+------------------------------------------------------------------+ //| min_ext | //+------------------------------------------------------------------+ int min_ext(int bar) { int find, i, result; result = 0; i = bar; find = 0; while(find != 1) { if((Low[i-2] >= Low[i]) && (Low[i-1] >= Low[i]) && (Low[i] <= Low[i+1]) && (Low[i] <= Low[i+2])) { // Åñëè i ìåíüøå ëèáî ðàâíî äâóì áëèçñòîÿùèì ñâå÷àì è ñîñåäÿì ýòèõ ñâå÷åé - // ýòî íàø ìèíèìóì result=i; find++; } i++; } return(result); } //+------------------------------------------------------------------+ //| max_ext | //+------------------------------------------------------------------+ int max_ext(int bar) { int find, i, result; result = 0; i = bar; find = 0; while(find != 1) { if((High[i-2] <= High[i]) && (High[i-1] <= High[i]) && (High[i] >= High[i+1]) && (High[i] >= High[i+2])) { // Åñëè i áîëüøå ëèáî ðàâíî äâóì áëèçñòîÿùèì ñâå÷àì è ñîñåäÿì ýòèõ ñâå÷åé - // ýòî íàø ìàêñèìóì result=i; find++; } i++; } return(result); } //+------------------------------------------------------------------+ //| find_extremums | //+------------------------------------------------------------------+ void find_extremums(int i) { ArrayInitialize(Extremum, 0); // Èùåì ïåðâûé ìèíèìóì, îïðåäåëÿåì êîîðäèíàòû Extremum[0] = min_ext(i); y1=Low[Extremum[0]]; x1=Time[Extremum[0]]; // Èùåì ïåðâûé ìàêñèìóì, îïðåäåëÿåì êîîðäèíàòû Extremum[1] = max_ext(i); y2=High[Extremum[1]]; x2=Time[Extremum[1]]; // Åñëè ìèíèìóì âñòðå÷àåòñÿ ðàíüøå ìàêñèìóìà - òðåòüÿ ýêñòðåìóì èùåì âíèçó if(Extremum[0] < Extremum[1]) { // Ôóíêöèÿ min_ext âîçâðàùàåò íîìåð ïåðâîãî ìèíèìóìà, ïîèñê íà÷èíàåòñÿ ñ Extremum[2] = min_ext(Extremum[1]); y_l = Low[Extremum[2]]; x_l = Time[Extremum[2]]; y_f = y1; x_f = x1; y_m = y2; x_m = x2; f_bar = Extremum[0]; m_bar = Extremum[1]; l_bar = Extremum[2]; main_is_up = false; } if(Extremum[0] > Extremum[1]) { Extremum[2] = max_ext(Extremum[0]); y_l = High[Extremum[2]]; x_l = Time[Extremum[2]]; y_f = y2; x_f = x2; y_m = y1; x_m = x1; f_bar = Extremum[1]; m_bar = Extremum[0]; l_bar = Extremum[2]; main_is_up = true; } if(Extremum[0] == Extremum[1]) if(min_ext(Extremum[0] + 1) < max_ext(Extremum[0] + 2)) { Extremum[2] = min_ext(Extremum[0] + 2); y_l = Low[Extremum[2]]; x_l = Time[Extremum[2]]; y_f = y1; x_f = x1; y_m = y2; x_m = x2; f_bar =Extremum[0]; m_bar = Extremum[1]; l_bar = Extremum[2]; main_is_up = false; } else { Extremum[2] = max_ext(Extremum[0] + 2); y_l = High[Extremum[2]]; x_l = Time[Extremum[2]]; y_f = y2; x_f = x2; y_m = y1; x_m = x1; f_bar = Extremum[0]; m_bar = Extremum[1]; l_bar = Extremum[2]; main_is_up = true; } } //+------------------------------------------------------------------+ //| indicator start function | //+------------------------------------------------------------------+ int start() { int n = 1, c = 0, i = 0; // Ñ÷¸ò÷èê êàíàëîâ è ñ÷¸ò÷èê öâåòîâ if(Start_Bar > 0) CurrentBar = Start_Bar; else CurrentBar = 2; //Òåêóùèé áàð - 2 (äëÿ ïîäòâåðæäåíèÿ ýêñòðåìóìà) ArrayInitialize(TempExtremum, 0); find_extremums(CurrentBar); // Íà ñêîëüêî èçìåíÿåòñÿ öåíà ñ êàæäîé ïîñëåäóþùåé ñâå÷¸é step = (y_f - y_l) / (l_bar - f_bar); if(main_is_up) { h_border = High[f_bar] + step*f_bar; l_border = Low [m_bar] + step*m_bar; } else { l_border = Low [f_bar] + step*f_bar; h_border = High[m_bar] + step*m_bar; } // Åñëè äîñòèãëè âåðõíåé ãðàíèöû êàíàëà if((Bid >= (h_border - Sensitivity*Point)) && (Bid <= (h_border + Sensitivity*Point))) { if(Show_Alerts) Alert("Âåðõ êàíàëà - ïðîäàæà."); } // Åñëè äîñòèãëè íèæíåé ãðàíèöû êàíàëà if((Ask <= (l_border + Sensitivity*Point)) && (Ask >= (l_border - Sensitivity*Point))) { if(Show_Alerts) Alert("Íèç êàíàëà - ïîêóïêà"); } deinit(); Comment("Ïàðàìåòðû êàíàëà:\nØèðèíà = ", (h_border - l_border) / Point, "; Íàêëîí = ", -step / Point, ";\nÂåðõíÿÿ ãðàíèöà = ", DoubleToStr(h_border, Digits), "; Íèæíÿÿ ãðàíèöà = ", DoubleToStr(l_border, Digits), ";"); //  öèêëå îò 1 äî Num_of_Channels ðàñ÷èòûâàåì ýêñòðåìóìû è ðèñóåì êàíàë ñ íîìåðîì N while(n <= Num_of_Channels) { TempExtremum[0] = Extremum[0]; TempExtremum[1] = Extremum[1]; TempExtremum[2] = Extremum[2]; find_extremums(CurrentBar); if((TempExtremum[0] == Extremum[0]) && (TempExtremum[1] == Extremum[1]) && (TempExtremum[2] == Extremum[2])) CurrentBar++; else { //SetIndexStyle(0, DRAW_ARROW); //SetIndexArrow(0, 164); //SetIndexBuffer(0, ExtMapBuffer); //SetIndexEmptyValue(0, 0.0); if(Show_Labels) { ObjectCreate("Extremum_1_" + n, OBJ_ARROW, 0, x1, y1); ObjectSet("Extremum_1_" + n, OBJPROP_COLOR, Colors[c]); ObjectSet("Extremum_1_" + n, OBJPROP_WIDTH, 1); ObjectSet("Extremum_1_" + n, OBJPROP_ARROWCODE, SYMBOL_LEFTPRICE); ObjectSet("Extremum_1_" + n, OBJPROP_STYLE, STYLE_SOLID); ObjectCreate("Extremum_2_" + n, OBJ_ARROW, 0, x2, y2); ObjectSet("Extremum_2_" + n, OBJPROP_COLOR, Colors[c]); ObjectSet("Extremum_2_" + n, OBJPROP_WIDTH, 1); ObjectSet("Extremum_2_" + n, OBJPROP_ARROWCODE, SYMBOL_LEFTPRICE); ObjectSet("Extremum_2_" + n, OBJPROP_STYLE, STYLE_SOLID); ObjectCreate("Extremum_3_" + n, OBJ_ARROW, 0, x_l, y_l); ObjectSet("Extremum_3_" + n, OBJPROP_COLOR, Colors[c]); ObjectSet("Extremum_3_" + n, OBJPROP_WIDTH, 1); ObjectSet("Extremum_3_" + n, OBJPROP_ARROWCODE, SYMBOL_RIGHTPRICE); ObjectSet("Extremum_3_" + n, OBJPROP_STYLE, STYLE_SOLID); } ObjectCreate("Channel_" + n, OBJ_CHANNEL, 0, x_l, y_l, x_f, y_f, x_m, y_m); ObjectSet("Channel_" + n, OBJPROP_COLOR, Colors[c]); ObjectSet("Channel_" + n, OBJPROP_WIDTH, Line_Width); ObjectSet("Channel_" + n, OBJPROP_RAY, Channel_as_Ray); ObjectSet("Channel_" + n, OBJPROP_STYLE, STYLE_SOLID); n++; if(c < 7) c++; else c=0; } CurrentBar++; } return(0); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains the lowest prices of each bar
Series array that contains the highest prices of each bar
Series array that contains open time of each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features:
It issuies visual alerts to the screen