SnakeInBorders





//+------------+-----------------------------------------------------+
//| 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: