//+------------+-----------------------------------------------------+ //| v.11.09.06 | SnakeInBorders.mq4 | //+------------+ "ÔÈËÜÒÐÓÉ ÁÀÇÀÐ!" | //| Êîìïëåêò | Bookkeeper, 2006, yuzefovich@gmail.com | //+------------------------------------------------------------------+ //| Snake ðàññ÷èòûâàåò êîðèäîð îòôèëüòðîâàííîãî ðûíêà, îãðàíè÷åííûé | //| äâóìÿ áîðäþðàìè BorderTop[] è BorderBot[], è ñèãíàëüíóþ Mart[]. | //| | //| Âíåøíèå ïåðåìåííûå: | //| SnakeRange - ïîëóïåðèîä ðàñ÷åòà îñè Snake'à Axis[] - îïòèìàëüíî | //| = 4; | //| FilterPeriod - ïåðèîä ôèëüòðàöèè. ( îïòèìàëüíî áîëüøå 13); | //| MartFiltr - êîýôôèöèåíò ôèëüòðàöèè ðûíêà. ×åì MartFiltr áîëüøå, | //| òåì óæå êîðèäîð îòôèëüòðîâàííîãî ðûíêà. Êîýôôèöèåíò íàäî | //| ïîäáèðàòü, ïî óìîë÷àíèþ = 2; | //| Ó Snake'à äâà ðåæèìà: HardCalc = true - íå ïåðåñ÷èòûâàòü, è | //| = false - ïåðåñ÷èòûâàòü çíà÷åíèÿ Axis[Pos]...[Pos+SnakeRange+1].| //| Ïîâåäåíèå ñèãíàëüíîé Mart[] âíóòðè êîðèäîðà: | //| Ïðè äâèæåíèè ðûíêà ââåðõ - ñèãíàëüíàÿ îòõîäèò îò íèæíåãî | //| áîðäþðà, ïåðåñåêàåò êîðèäîð è ñëèâàåòñÿ ñ âåðõíèì áîðäþðîì. | //| Àíàëîãè÷íî, ñ òî÷íîñòüþ äî íàîáîðîò, - ïðè äâèæåíèè ðûíêà âíèç. | //| Äî òåõ ïîð, ïîêà ðûíîê áóäåò äâèãàòüñÿ íàïðàâëåííî, ñèãíàëüíàÿ | //| áóäåò "äåðæàòüñÿ" ñîîòâåòñòâóþùåé ãðàíèöû êîðèäîðà. Ïðè ýòîì | //| óâåëè÷åíèå øèðèíû êîðèäîðà îçíà÷àåò íàïðàâëåííîå äâèæåíèå. Ïðè | //| êîëåáàíèÿõ ðûíêà êîðèäîð íà÷èíàåò ñóæàòüñÿ. Ñóæåíèåì êîðèäîðà | //| ñîïðîâîæäàåòñÿ äâèæåíèåì ñèãíàëüíîé îò îäíîé ãðàíèöû ê äðóãîé | //| âíóòðè êîðèäîðà, ïîñëå äîñòèæåíèÿ ïðîòèâîïîëîæíîé ãðàíèöû - | //| êîðèäîð íà÷íåò ðàñøèðÿòüñÿ. | //| Snake ìîæíî èñïîëüçîâàòü êàê ñàìîñòîÿòåëüíî, ñðàâíèâàÿ äâèæåíèå | //| ñèãíàëüíîé íà ðàçíûõ ÒÔ îäíîâðåìåííî, òàê è äëÿ ïîñòðîåíèÿ | //| äðóãèõ èíäèêàòîðîâ, èñïîëüçóÿ Mart[] âìåñòî öåíû áàðà. Äëÿ | //| èíäèêàòîðîâ òèïà MA, OA, AC,.. èñïîëüçîâàòü HardCalc = true, à | //| äëÿ èíäèêàòîðîâ òèïà ZigZag, Channel,.. - HardCalc = false, à | //| çíà÷åíèå MartFiltr ïîäáèðàòü îò 3...5. Ïðè ýòîì ìîæíî îòñåèâàòü | //| èñòèííûå è ëîæíûå âåðøèíû: åñëè âåðøèíà ïðîìåæóòî÷íàÿ, | //| ñèãíàëüíàÿ Mart[] íå áóäåò ñîâïàäàòü ñ áîðäþðîì. | //+------------------------------------------------------------------+ #property copyright "" #property link "yuzefovich@gmail.com" //---- #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 Red #property indicator_color2 Red #property indicator_color3 Blue //---- extern int SnakeRange = 2; extern int FilterPeriod = 24; extern double MartFiltr = 2; extern bool HardCalc = true; //---- double BorderTop[]; double BorderBot[]; double Mart[]; double Axis[]; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void deinit() { Comment(""); return; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int init() { int draw_begin; draw_begin = FilterPeriod + SnakeRange + 2; IndicatorBuffers (4); SetIndexBuffer (0, BorderTop); SetIndexBuffer (1, BorderBot); SetIndexBuffer (2, Mart); SetIndexBuffer (3, Axis); SetIndexStyle (0, DRAW_LINE); SetIndexStyle (1, DRAW_LINE); SetIndexStyle (2, DRAW_LINE, 0, 2); SetIndexDrawBegin (0, draw_begin); SetIndexDrawBegin (1, draw_begin); SetIndexDrawBegin (2, draw_begin); return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { int counted_bars = IndicatorCounted(); int limit, i; if(counted_bars < 0) return(-1); if(Bars <= (FilterPeriod + SnakeRange+2)) return(0); if(SnakeRange < 4) SnakeRange = 4; if(counted_bars > 0) counted_bars--; limit = Bars - counted_bars; for(i = limit; i >= 0; i--) MainCalculation(i); return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void MainCalculation(int Pos) { int v; MartAxis(Pos); if(HardCalc == true) SmoothOverMart2(Pos); else SmoothOverMart(Pos); //---- return; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void MartAxis(int Pos) { int SnakeWeight, i, w, ww, Shift; double SnakeSum; Axis[Pos] = iMA(NULL, 0, SnakeRange + 1, 0, MODE_LWMA, PRICE_WEIGHTED, Pos); for(Shift = Pos + SnakeRange + 2; Shift > Pos; Shift--) { SnakeSum = 0.0; SnakeWeight = 0; i = 0; w = Shift + SnakeRange; ww = Shift - SnakeRange; if(ww < Pos) ww = Pos; while(w >= Shift) { i++; SnakeSum = SnakeSum + i*SnakePrice(w); SnakeWeight = SnakeWeight + i; w--; } while(w >= ww) { i--; SnakeSum = SnakeSum + i*SnakePrice(w); SnakeWeight = SnakeWeight + i; w--; } Axis[Shift] = SnakeSum / SnakeWeight; } return; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double SnakePrice(int Shift) { return((2*Close[Shift] + High[Shift] + Low[Shift]) / 4); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void SmoothOverMart(int Pos) { // Ïðàâèì èñòîðèþ íà ïîñëåäíèõ Pos...(Pos+SnakeRange+2) áàðàõ int Shift; double a, t, b; for(Shift = Pos + SnakeRange + 2; Shift >= Pos; Shift--) { t = Axis[ArrayMaximum(Axis, FilterPeriod, Shift)]; b = Axis[ArrayMinimum(Axis, FilterPeriod, Shift)]; a = Axis[Shift]; BorderTop[Shift] = (2*(1 + MartFiltr)*a + (t - b)) / 2 / (1 + MartFiltr); BorderBot[Shift] = (2*(1 + MartFiltr)*a - (t - b)) / 2 / (1 + MartFiltr); Mart[Shift] = (2*(2 + MartFiltr)*a - (t + b)) / 2 / (1 + MartFiltr); } return; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void SmoothOverMart2(int Shift) { // Íå ïîäïðàâëÿåì èñòîðèþ íà ïîñëåäíèõ áàðàõ double a, t, b; t = Axis[ArrayMaximum(Axis, FilterPeriod, Shift)]; b = Axis[ArrayMinimum(Axis, FilterPeriod, Shift)]; a = Axis[Shift]; BorderTop[Shift] = (2*(1 + MartFiltr)*a + (t - b))/2/(1 + MartFiltr); BorderBot[Shift] = (2*(1 + MartFiltr)*a - (t - b))/2/(1 + MartFiltr); Mart[Shift] = (2*(2 + MartFiltr)*a - (t + b)) / 2 / (1 + MartFiltr); return; } //---------------------------------------------------------------------
Sample
Analysis
Market Information Used:
Series array that contains close prices for each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Indicator Curves created:
Indicators Used:
Moving average indicator
Custom Indicators Used:
Order Management characteristics:
Other Features: