Индикаторы: Волатильность, агрессивность и их нормализация - страница 2

 
fxxx:
EvgeTrofi:
Vlad72:

Смотрю на индикаторы,ерунда полная.

Сколько людей, столько и мнений.

"смотрю в книгу..."

Согласен, что мои индикаторы могут расходиться с мнениями высокоуважаемых гуру... или названия не совсем удачно подобраны. Но главное, чтобы они приносили пользу, ведь новые зависимости искать никто не запрещал. Даже в книгах.

 
EvgeTrofi:

Чем ближе к 0, тем "мертвее" рынок. Границу определяем подбором (оптимизацией). Торгуем на пробой.

Когда волатильность низкая (меньше 50), а агрессивность высокая, то рынок нестабилен. Тренда нет, но швырять его может не по детски. Лучше переждать.

Когда обе линии стремительно и вместе взлетают вверх, наблюдается устойчивый тренд. Понятно, что делать :)

Е.В., как-бы вот-так?
извините, не удержался, дописал "радиво" - для красоты и все руками дорисовал : (((((((

Е.В., еще раз огромное спасибо за индикаторы и примеры

(п.с. мне про дворника объяснение больше всего понравилось - я типа ничо не понял - а про дворника - сразу все понял

п.п.с. тока я про двориника ничо не понял - так он достал бабло или нет?

 

Нашёл, как правильно расчитывается волатильность: 'Standard Deviation, StdDev'

С учётом этого изменяю и свою нормализацию:

//+---------------------------------------------------------------------+
//|                                                      Silence.mq4    |
//|                                         Copyright © Trofimov 2009   |
//+---------------------------------------------------------------------+
//| Тишина                                                              |
//|                                                                     |
//| Описание: Показывает на сколько процентов активен рынок             |
//| Синяя - процент агрессивности (скорости изменения цены)             |
//| Красная - процент волатильности (по индикатору StdDev)              |
//| Авторское право принадлежит Трофимову Евгению Витальевичу, 2009     |
//+---------------------------------------------------------------------+
#property copyright "Copyright © Trofimov Evgeniy, 2009"
#property link      "http://www.mql4.com/ru/users/EvgeTrofi"
//---- Свойства индикатора
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_width1 1
#property indicator_color2 Red
#property indicator_width2 1
#property indicator_maximum 100
#property indicator_minimum 0
#property indicator_level1 50
//---- Входящие параметры
extern int MyPeriod=12;
extern int BuffSize=288;
bool ReDraw=true; //-если включен, то перерисовывает нулевой бар при каждом новом тике
// если выключен, то нулевой бар содержит фиксированное значение, вычисленное по предыдущим (готовым) барам
double Buff_line1[]; // - агрессивность 
double Buff_line2[]; // - волатильность
double Aggress[], Volatility[];
//+------------------------------------------------------------------+
//|                Функция инициализации индикатора                  |
//+------------------------------------------------------------------+
int init()
  {
//---- x дополнительных буфера, используемых для расчета
   IndicatorBuffers(2);
   IndicatorDigits(2); 
//---- параметры рисования (установка начального бара)
   SetIndexDrawBegin(0,BuffSize+MyPeriod);
   SetIndexDrawBegin(1,BuffSize+MyPeriod);
//---- x распределенных буфера индикатора
   SetIndexBuffer(0,Buff_line1);
   SetIndexBuffer(1,Buff_line2);
//---- имя индикатора и подсказки для линий
   IndicatorShortName("Silence2("+MyPeriod+","+BuffSize+") = ");
   SetIndexLabel(0,"Aggressiveness");
   SetIndexLabel(1,"Volatility");
   ArrayResize(Aggress,BuffSize);
   ArrayResize(Volatility,BuffSize);
   return(0);
  }
//+------------------------------------------------------------------+
//|                Функция индикатора                                |
//+------------------------------------------------------------------+
int start() {
   static datetime LastTime;
   int limit, RD;
   double MAX,MIN;
   //double upPrice,downPrice;
   double dAmount,dMovingAverage,dAPrice;
   if(ReDraw) RD=1;
   // Пропущенные бары
   int counted_bars=IndicatorCounted();
//---- обходим возможные ошибки
   if(counted_bars<0) return(-1);
//---- новые бары не появились и поэтому ничего рисовать не нужно
   limit=Bars-counted_bars-1+RD;
//---- основные переменные
   double B;
//---- основной цикл
   for(int t=limit-RD; t>-RD; t--) {
      
      //Вычисление агрессивности бара t
      B=0;
      for(int x=t+MyPeriod-1; x>=t; x--) { 
         if(Close[x]>Open[x]) {
            //белая свеча
            B=B+(Close[x]-Close[x+1]);
         }else{
            //чёрная свеча
            B=B+(Close[x+1]-Close[x]);
         }
      }//Next x
      
      //Вычисление волатильности бара t
      //upPrice=High[iHighest(Symbol(),0,MODE_HIGH,MyPeriod,t)];//максимум за N баров 
      //downPrice=Low[iLowest(Symbol(),0,MODE_LOW,MyPeriod,t)]; //минимум за N баров 
      dAmount=0.0;
      dMovingAverage=iMA(NULL,0,MyPeriod,0,0,0,t);
      for(x=t+MyPeriod-1; x>=t; x--)
        {
         dAPrice=Close[x];
         dAmount+=(dAPrice-dMovingAverage)*(dAPrice-dMovingAverage);
        }
      
      //Если образовался новый бар, то производится сдвижка массива
      if(LastTime!=Time[t+1]){
         for(x=BuffSize-1; x>0; x--) {
            Aggress[x]=Aggress[x-1];
            Volatility[x]=Volatility[x-1];
         }//Next x
         LastTime=Time[t+1];
      }
      //Конец сдвижки массива
      
      //Перерисовка агрессивности
      Aggress[0]=B/Point/MyPeriod;
      MAX=Aggress[ArrayMaximum(Aggress)];
      MIN=Aggress[ArrayMinimum(Aggress)];
      Buff_line1[t]=Интерполяция(MAX,MIN,100,0,Aggress[0]);
      if(!ReDraw && t==1) Buff_line1[0]=Buff_line1[1];
      //Конец перерисовка агрессивности
      
      //Перерисовка волатильности
      Volatility[0]=MathSqrt(dAmount/MyPeriod);
      MAX=Volatility[ArrayMaximum(Volatility)];
      MIN=Volatility[ArrayMinimum(Volatility)];
      Buff_line2[t]=Интерполяция(MAX,MIN,100,0,Volatility[0]);
      if(!ReDraw && t==1) Buff_line2[0]=Buff_line2[1];
      //Конец перерисовка волатильности
      
   }//Next t
   return(0);
}
//+------------------------------------------------------------------+
double Интерполяция(double a,double b,double c,double d,double X) {
//a; X; b - столбец изветных чисел, c; d; - столбец со стороны неизвестной.
    if(b - a == 0)
        return(10000000); //бесконечность
    else
        return(d - (b - X) * (d - c) / (b - a));
}//Интерполяция
//+------------------------------------------------------------------+
 

Хороший индикатор! А можно попросить автора упростить его для скальперов, что бы на графике цены было видно сколько пунктов прошла пара от локального минимума (фрактала) или максимума до текущей цены, так как у каждой валютной пары во время импульса есть максимальный ход, а в это время обычно не до подчетов.

 
Jetix:

Хороший индикатор! А можно попросить автора упростить его для скальперов, что бы на графике цены было видно сколько пунктов прошла пара от локального минимума (фрактала) или максимума до текущей цены, так как у каждой валютной пары во время импульса есть максимальный ход, а в это время обычно не до подчетов.

Спасибо. А можно по подробней? Мне нужно сначала определить последний фрактал, а затем узнать на сколькто пункотв от него цена отклонилась? Это, наверно, лучше сделать в отдельном окне индикатора. Или я чего то недопонял? Буду презнателен, если расскажешь мне секреты своей торговли. Могу сделать эксперта под твой стиль торговли.

 
EvgeTrofi:

Нашёл, как правильно расчитывается волатильность: 'Standard Deviation, StdDev'

С учётом этого изменяю и свою нормализацию:

//+---------------------------------------------------------------------+
//|                                                      Silence.mq4    |
//|                                         Copyright © Trofimov 2009   |
//+---------------------------------------------------------------------+
//| Тишина                                                              |
//|                                                                     |
//| Описание: Показывает на сколько процентов активен рынок             |
//| Синяя - процент агрессивности (скорости изменения цены)             |
//| Красная - процент волатильности (по индикатору StdDev)              |
//| Авторское право принадлежит Трофимову Евгению Витальевичу, 2009     |
//+---------------------------------------------------------------------+
#property copyright "Copyright © Trofimov Evgeniy, 2009"
#property link      "http://www.mql4.com/ru/users/EvgeTrofi"
//---- Свойства индикатора
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_width1 1
#property indicator_color2 Red
#property indicator_width2 1
#property indicator_maximum 100
#property indicator_minimum 0
#property indicator_level1 50
//---- Входящие параметры
extern int MyPeriod=12;
extern int BuffSize=288;
bool ReDraw=true; //-если включен, то перерисовывает нулевой бар при каждом новом тике
// если выключен, то нулевой бар содержит фиксированное значение, вычисленное по предыдущим (готовым) барам
double Buff_line1[]; // - агрессивность 
double Buff_line2[]; // - волатильность
double Aggress[], Volatility[];
//+------------------------------------------------------------------+
//|                Функция инициализации индикатора                  |
//+------------------------------------------------------------------+
int init()
  {
//---- x дополнительных буфера, используемых для расчета
   IndicatorBuffers(2);
   IndicatorDigits(2); 
//---- параметры рисования (установка начального бара)
   SetIndexDrawBegin(0,BuffSize+MyPeriod);
   SetIndexDrawBegin(1,BuffSize+MyPeriod);
//---- x распределенных буфера индикатора
   SetIndexBuffer(0,Buff_line1);
   SetIndexBuffer(1,Buff_line2);
//---- имя индикатора и подсказки для линий
   IndicatorShortName("Silence2("+MyPeriod+","+BuffSize+") = ");
   SetIndexLabel(0,"Aggressiveness");
   SetIndexLabel(1,"Volatility");
   ArrayResize(Aggress,BuffSize);
   ArrayResize(Volatility,BuffSize);
   return(0);
  }
//+------------------------------------------------------------------+
//|                Функция индикатора                                |
//+------------------------------------------------------------------+
int start() {
   static datetime LastTime;
   int limit, RD;
   double MAX,MIN;
   //double upPrice,downPrice;
   double dAmount,dMovingAverage,dAPrice;
   if(ReDraw) RD=1;
   // Пропущенные бары
   int counted_bars=IndicatorCounted();
//---- обходим возможные ошибки
   if(counted_bars<0) return(-1);
//---- новые бары не появились и поэтому ничего рисовать не нужно
   limit=Bars-counted_bars-1+RD;
//---- основные переменные
   double B;
//---- основной цикл
   for(int t=limit-RD; t>-RD; t--) {
      
      //Вычисление агрессивности бара t
      B=0;
      for(int x=t+MyPeriod-1; x>=t; x--) { 
         if(Close[x]>Open[x]) {
            //белая свеча
            B=B+(Close[x]-Close[x+1]);
         }else{
            //чёрная свеча
            B=B+(Close[x+1]-Close[x]);
         }
      }//Next x
      
      //Вычисление волатильности бара t
      //upPrice=High[iHighest(Symbol(),0,MODE_HIGH,MyPeriod,t)];//максимум за N баров 
      //downPrice=Low[iLowest(Symbol(),0,MODE_LOW,MyPeriod,t)]; //минимум за N баров 
      dAmount=0.0;
      dMovingAverage=iMA(NULL,0,MyPeriod,0,0,0,t);
      for(x=t+MyPeriod-1; x>=t; x--)
        {
         dAPrice=Close[x];
         dAmount+=(dAPrice-dMovingAverage)*(dAPrice-dMovingAverage);
        }
      
      //Если образовался новый бар, то производится сдвижка массива
      if(LastTime!=Time[t+1]){
         for(x=BuffSize-1; x>0; x--) {
            Aggress[x]=Aggress[x-1];
            Volatility[x]=Volatility[x-1];
         }//Next x
         LastTime=Time[t+1];
      }
      //Конец сдвижки массива
      
      //Перерисовка агрессивности
      Aggress[0]=B/Point/MyPeriod;
      MAX=Aggress[ArrayMaximum(Aggress)];
      MIN=Aggress[ArrayMinimum(Aggress)];
      Buff_line1[t]=Интерполяция(MAX,MIN,100,0,Aggress[0]);
      if(!ReDraw && t==1) Buff_line1[0]=Buff_line1[1];
      //Конец перерисовка агрессивности
      
      //Перерисовка волатильности
      Volatility[0]=MathSqrt(dAmount/MyPeriod);
      MAX=Volatility[ArrayMaximum(Volatility)];
      MIN=Volatility[ArrayMinimum(Volatility)];
      Buff_line2[t]=Интерполяция(MAX,MIN,100,0,Volatility[0]);
      if(!ReDraw && t==1) Buff_line2[0]=Buff_line2[1];
      //Конец перерисовка волатильности
      
   }//Next t
   return(0);
}
//+------------------------------------------------------------------+
double Интерполяция(double a,double b,double c,double d,double X) {
//a; X; b - столбец изветных чисел, c; d; - столбец со стороны неизвестной.
    if(b - a == 0)
        return(10000000); //бесконечность
    else
        return(d - (b - X) * (d - c) / (b - a));
}//Интерполяция
//+------------------------------------------------------------------+
 

Ваш второй вариант индикатора мне понравился, он не только подсказывает начало или окончание тренда, но и предсказывает их заранее. Оценка 10.

 

Извините, как можно оптимизировать (подобрать параметры) этот индикатор?

 
evbut:

Извините, как можно оптимизировать (подобрать параметры) этот индикатор?

Я не понял вопрос. Можно по конкретней? Что именно Вы собираетесь делать?

 
EvgeTrofi:
Jetix:

Хороший индикатор! А можно попросить автора упростить его для скальперов, что бы на графике цены было видно сколько пунктов прошла пара от локального минимума (фрактала) или максимума до текущей цены, так как у каждой валютной пары во время импульса есть максимальный ход, а в это время обычно не до подчетов.

Спасибо. А можно по подробней? Мне нужно сначала определить последний фрактал, а затем узнать на сколькто пункотв от него цена отклонилась? Это, наверно, лучше сделать в отдельном окне индикатора. Или я чего то недопонял? Буду презнателен, если расскажешь мне секреты своей торговли. Могу сделать эксперта под твой стиль торговли.

Среднестатистический ход определяется по уровням.

Причина обращения: