Каналы основанные на волатильности.

 
Кто-нибудь встречал каналы которые рисуются в зависимости от волатильности торгуемой пары? То есть чем больше волатильность тем больше канал. Я написал, но к сожалению ничего не получилось, получилась правда, но только верхняя линия а нижняя рисуется непонятно как...... Может у кого есть такого типа индикатор, чтобы велосипед не изобретать?
 
Bollinger Bands, например. Есть у всех в комплекте поставки МТ, в двух вариантах.
 

Нет, немного не то. Квадратное отклонение я не хочу чтобы высчитывало, я хочу чтобы, если за последние n баров диапазон лежал в пределах 30 пунктов, например,ширина канала была одна. А при диапазоне в 40 другая. Что-либо подобное может кто встречал?

 
'Канал cредней точки' (Middle Point Channel). Был где-то здесь в Code Base.
 
Нет не такой.... Я найду свой на другом компе и выложу что сделал, может кто поправит код....
 
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Magenta
#property indicator_color3 Blue
 
//---- indicator buffers
double ExtMapBuffer[];
double ExtMapBuffer_up[];
double ExtMapBuffer_do[];
 
//---- indicator parameters
extern int MA_Period=8;
extern int MA_Shift=0;
 
//----
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- drawing settings
   SetIndexBuffer(0,ExtMapBuffer);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexLabel(0,"ema center "+MA_Period);
 
 
   SetIndexBuffer(1,ExtMapBuffer_up);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexLabel(1,"up line");
   
   SetIndexBuffer(2,ExtMapBuffer_do);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexLabel(2,"bottom line");
  }
Вот такая шапка у меня в коде индикатора. Проблема в том что не рисуется буффер под номером 2. Если менять местами, то есть цифры 2 на 1 или 2 на 0, те линии которым присваиваются значения далее в коде прорисовываются правильно. А вот с индексом 2 линия рисоваться не хочет. Где может быть ошибка. Подскажите пожалуйста!!!
 
KING:
Вот такая шапка у меня в коде индикатора. Проблема в том что не рисуется буффер под номером 2. Если менять местами, то есть цифры 2 на 1 или 2 на 0, те линии которым присваиваются значения далее в коде прорисовываются правильно. А вот с индексом 2 линия рисоваться не хочет. Где может быть ошибка. Подскажите пожалуйста!!!

Невижу в коде ошибки.

 
Не вижу криминала. Ищите ниже.
 
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Magenta
#property indicator_color3 Blue
 
//---- indicator buffers
double ExtMapBuffer[];
double ExtMapBuffer_up[];
double ExtMapBuffer_do[];
 
//---- indicator parameters
extern int MA_Period=8;
extern int MA_Shift=0;
 
//----
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- drawing settings
   SetIndexBuffer(0,ExtMapBuffer);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexLabel(0,"ema center "+MA_Period);
 
 
   SetIndexBuffer(1,ExtMapBuffer_up);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexLabel(1,"up line");
   
   SetIndexBuffer(2,ExtMapBuffer_do);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexLabel(2,"bottom line");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   if(Bars<=MA_Period) return(0);
   ExtCountedBars=IndicatorCounted();
//---- check for possible errors
   if (ExtCountedBars<0) return(-1);
//---- last counted bar will be recounted
   if (ExtCountedBars>0) ExtCountedBars--;
//----
 
 
//+------------------------------------------------------------------+
//| Exponential Moving Average                                       |
//+------------------------------------------------------------------+
 
   double pr=2.0/(MA_Period+1);
   double indidigits = MarketInfo(Symbol(),MODE_DIGITS);
   
   double   
   digi,
   l15,
   l30,
   l50;
   digi=15/MathPow(10,indidigits);
   //Alert (digi);
   int    pos=Bars-2;
   if(ExtCountedBars>2) pos=Bars-ExtCountedBars-1;
//---- main calculation loop
 
   l15=15/MathPow(10,indidigits);
  
double range,ge;
//Alert (range);
   while(pos>=0)
     {
      if(pos==Bars-2) ExtMapBuffer[pos+1]=Close[pos+1];
      ExtMapBuffer[pos]=Close[pos]*pr+ExtMapBuffer[pos+1]*(1-pr);
        
        
         range =iCustom(NULL,0,"TR",0,pos);
        if (range<=22) 
         { 
         ExtMapBuffer_up[pos] = ExtMapBuffer[pos]+l15;
         ExtMapBuffer_do[pos] = ExtMapBuffer[pos]-l15;
         }
         
        if (range>20 && range<=45) 
         { 
         ExtMapBuffer_up[pos] = ExtMapBuffer[pos]+30/MathPow(10,indidigits);
         ExtMapBuffer_do[pos] = ExtMapBuffer[pos]-30/MathPow(10,indidigits);
         }
         
        if (range>45) 
         { 
         ExtMapBuffer_up[pos] = ExtMapBuffer[pos]+50/MathPow(10,indidigits);
         ExtMapBuffer_do[pos] = ExtMapBuffer[pos]-50/MathPow(10,indidigits);
         }
      
         pos--;
     }
   //  ge =iCustom(NULL,0,"TR",0,2);
   //  Alert (ge);
  }
   return(0);
Все целиком. Я думаю что оибка именно сверху. Так как повторюсь что при изменении например:
   SetIndexBuffer(0,ExtMapBuffer);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexLabel(0,"ema center "+MA_Period);
 
 
   SetIndexBuffer(1,ExtMapBuffer_up);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexLabel(1,"up line");
   
   SetIndexBuffer(2,ExtMapBuffer_do);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexLabel(2,"bottom line");
на
   SetIndexBuffer(0,ExtMapBuffer);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexLabel(0,"ema center "+MA_Period);
 
 
   SetIndexBuffer(2,ExtMapBuffer_up);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexLabel(2,"up line");
   
   SetIndexBuffer(1,ExtMapBuffer_do);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexLabel(1,"bottom line");

начинает рисоваться линия

ExtMapBuffer_do[]

Вот такая вот проблема.......

 
KING:
Кто-нибудь встречал каналы которые рисуются в зависимости от волатильности торгуемой пары? То есть чем больше волатильность тем больше канал. Я написал, но к сожалению ничего не получилось, получилась правда, но только верхняя линия а нижняя рисуется непонятно как...... Может у кого есть такого типа индикатор, чтобы велосипед не изобретать?
Файлы:
 

Во первых у меня все линии отображаются


Во вторых я бы перед делением

ExtMapBuffer[pos]-50/MathPow(10,indidigits);

добавил бы проверку на ноль, чтоб не попасть на ошибку zero divide