Индикаторы: WmiVol - страница 2

 
kaprall:
Блиииииииииин... На 509 билде не работает! Кто шарит, можно подладить тему? Оч нужная вещь!!!

да простит меня автор...)

#property copyright "Copyright 2014, Murad Ismayilov"
#property link      "http://www.mql4.com/ru/users/wmlab"
//+------------------------------------------------------------------+
#property indicator_separate_window
//+------------------------------------------------------------------+
#property indicator_minimum 0
#property indicator_maximum 1
//+------------------------------------------------------------------+
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Green
#property indicator_width1 2
#property indicator_width2 2
#property indicator_style1 STYLE_SOLID
#property indicator_style2 STYLE_SOLID
 
double BufLowVol[];  // массив низкой волатильности
double BufHighVol[]; // массив высокой волатильности
double Buf10[]; // массив 1-0 (для использования в советнике)
 
double barVols[];     // массив волатильности
double avgVol;       // граница волатильности
//-------------------------------------------------
int barsInDay;
//-------------------------------------------------
int init() 
{ 
  barsInDay = 1440 / Period();   // кол. баров в течение дня
  if (barsInDay == 0)return(0);
  //....................................
  IndicatorBuffers(3);
  SetIndexBuffer(0, BufLowVol);
  SetIndexBuffer(1, BufHighVol);
  SetIndexBuffer(2, Buf10);
  SetIndexStyle(0, DRAW_HISTOGRAM);
  SetIndexStyle(1, DRAW_HISTOGRAM);
  SetIndexStyle(2, DRAW_LINE);
  SetIndexShift(0, barsInDay);
  SetIndexShift(1, barsInDay);
  SetIndexShift(2, barsInDay);
  //....................................
  ArrayResize(barVols, barsInDay);
  int barCounts[];  // массив количества измерений
  ArrayResize(barCounts, barsInDay);
  ArrayInitialize(barVols,0);
  ArrayInitialize(barCounts,0);
  //....................................
  for (int iBar = 1; iBar <= Bars; iBar++) 
  {
    int barOfDay = iBarOfDay(iTime(NULL, 0, iBar));
    barVols[barOfDay] += GetVol(iBar); // накапливаем разницу баров в соотв. ячейке массива
    barCounts[barOfDay]++; // количество накоплений в каждой ячейке
  }
  
  for (int i = 0; i < barsInDay; i++) // усредняем измерения
    if (barCounts[i] != 0)barVols[i] /= barCounts[i];
  
  double maxVol = barVols[ArrayMaximum(barVols)];
  double minVol = barVols[ArrayMinimum(barVols)];
  
  avgVol = 0.0;   // найти границу волатильности
  if (maxVol > minVol)
     for (i = 0; i < barsInDay; i++) 
     {
         barVols[i] = (barVols[i] - minVol) / (maxVol - minVol); // нормализуем измерения в диапазоне 0...1
         avgVol += barVols[i];   // суммируем все измерения
     }
  
  avgVol /= barsInDay;  // среднее значение всех измерений - порог волатильности
 
  return(0);
}
//-------------------------------------------------
int start()
{
   if (barsInDay == 0)return(0);
   int    limit;
   int    counted_bars=IndicatorCounted();
   //---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
  
  for(int iBar = 0; iBar < limit; iBar++) 
  {
    int barOfDay = iBarOfDay(iTime(NULL, 0, iBar));
    double vol = barVols[barOfDay];
    if (vol >= avgVol) 
    {
      BufLowVol[iBar] = EMPTY_VALUE;
      BufHighVol[iBar] = vol;
      Buf10[iBar]=1;
    }
    else 
    {
      BufLowVol[iBar] = vol;
      BufHighVol[iBar] = EMPTY_VALUE;
      Buf10[iBar]=0;
    }
  }
                
  return(0);
}
//-------------------------------------------------
int iBarOfDay(datetime timeOpenBar) 
{
  int minutesInPeriod = Period();
  double minutesSinceMidnight = MathMod(timeOpenBar / 60, 1440); // определить минуту дня
  int barsSinceMidnight = MathFloor(minutesSinceMidnight / minutesInPeriod); // привязать эту минуту к ячейке массива дня
  return (barsSinceMidnight);
}
//-------------------------------------------------
double GetVol(int iBar) 
{
   return (iHigh(NULL, 0, iBar) - iLow(NULL, 0, iBar));
}
//-------------------------------------------------
 

Добрый день.

Что то уж больно волатильность одинаковая по дням.

Подозрительно как то ?

все ли правильно в коде ?

даже значения совпадают по барам в разные сутки

 
Stells:

Добрый день.

Что то уж больно волатильность одинаковая по дням.

Подозрительно как то ?

все ли правильно в коде ?

даже значения совпадают по барам в разные сутки


Может быть стоит почитать предыдущие комментарии ?
 
vorese:
Stells:

Добрый день.

Что то уж больно волатильность одинаковая по дням.

Подозрительно как то ?

все ли правильно в коде ?

даже значения совпадают по барам в разные сутки


Может быть стоит почитать предыдущие комментарии ?

то что он прогноз делает

на основе предыдущих дней это понятно.
но ведь все равно волотильности по дням отличается


 

Вот картинка отражающая реальное поведение

 
Vinin:

Вот картинка отражающая реальное поведение

а код ?
 
Evgen57:
Vinin:

Вот картинка отражающая реальное поведение

а код ?

//+------------------------------------------------------------------+
//|                                                    VininI_VmiVol |
//|                                            Copyright 2014, Vinin |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "vinin@mail.ru"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 clrRed
#property indicator_color2 clrGreen
#property indicator_width1 2
#property indicator_width2 2
#property indicator_style1 STYLE_SOLID
#property indicator_style2 STYLE_SOLID
double BufLowVol[];
double BufHighVol[];
double BufVolume[];
int CalcBar;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init() 
  {
   CalcBar= PERIOD_D1/Period();
   IndicatorBuffers(3);
   SetIndexBuffer(0,BufLowVol);
   SetIndexBuffer(1,BufHighVol);
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexShift(0, CalcBar);
   SetIndexShift(1, CalcBar);
   
   SetIndexBuffer(2,BufVolume);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start() 
  {
   if (Period()>=PERIOD_D1) return(0);
   int i, prev_calculated=IndicatorCounted();
   int limit=Bars-prev_calculated-1;
   for(i=limit;i>=0;i--) 
      BufVolume[i]=(double)Volume[i];
   if (limit>1)
      limit-=CalcBar;
   
   for(i=limit; i>=0; i--) 
     {
      double avgVol=iMAOnArray(BufVolume, 0, CalcBar, 0, MODE_SMA, i);
      BufLowVol[i]=EMPTY_VALUE;
      BufHighVol[i]=EMPTY_VALUE;
      if(Volume[i]>=avgVol) 
        {
         BufHighVol[i]=(double)Volume[i];
        }
      else 
        {
         BufLowVol[i]=(double)Volume[i];
        }
     }
   return(0);
  }
 
Vinin:
Evgen57:
Vinin:

Вот картинка отражающая реальное поведение

а код ?

   SetIndexShift(0, CalcBar);
   SetIndexShift(1, CalcBar);   

Вроде эти две строчки лишние ?... А то получается, мы по волатильности вчерашнего дня пробуем предугадать волатильность сегодня... (если было бы усреднение за неделю, тогда можно было бы)

В Вашем варианте волатильность формируется динамически в течение дня и можно сразу принимать решение по цвету текущих столбиков...

 
Evgen57:
Vinin:
Evgen57:
Vinin:

Вот картинка отражающая реальное поведение

а код ?
   SetIndexShift(0, CalcBar);
   SetIndexShift(1, CalcBar);   

Вроде эти две строчки лишние ?... А то получается, мы по волатильности вчерашнего дня пробуем предугадать волатильность сегодня... (если было бы усреднение за неделю, тогда можно было бы)

В Вашем варианте волатильность формируется динамически в течение дня и можно сразу принимать решение по цвету текущих столбиков...

можете сделать код с усреднением за неделю ?
 

Stells:

можете сделать код с усреднением за неделю ?
//+------------------------------------------------------------------+
//|                                                    VininI_VmiVol |
//|                                            Copyright 2014, Vinin |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "vinin@mail.ru"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 clrRed
#property indicator_color2 clrGreen
#property indicator_width1 2
#property indicator_width2 2
#property indicator_style1 STYLE_SOLID
#property indicator_style2 STYLE_SOLID
double BufLowVol[];
double BufHighVol[];
double BufVolume[];
int CalcBar;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init() 
  {
   CalcBar= PERIOD_W1/Period();
   IndicatorBuffers(3);
   SetIndexBuffer(0,BufLowVol);
   SetIndexBuffer(1,BufHighVol);
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   
   SetIndexBuffer(2,BufVolume);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start() 
  {
   if (Period()>=PERIOD_W1) return(0);
   int i, prev_calculated=IndicatorCounted();
   int limit=Bars-prev_calculated-1;
   
   for(i=limit;i>=0;i--) BufVolume[i]=(double)Volume[i];
      
   if (limit>1)limit-=CalcBar;
      
   
   for(i=limit; i>=0; i--) 
     {
      double avgVol=iMAOnArray(BufVolume, 0, CalcBar, 0, MODE_SMA, i);
      BufLowVol[i]=EMPTY_VALUE;
      BufHighVol[i]=EMPTY_VALUE;
      if(Volume[i]>=avgVol) 
        {
         BufHighVol[i]=(double)Volume[i];
        }
      else 
        {
         BufLowVol[i]=(double)Volume[i];
        }
     }
   return(0);
  }
Причина обращения: