Индекс вариации ценового ряда

Подробнее
8 года 7 мес. назад - 6 года 3 мес. назад #572 от admin
Попросили перенести индикатор тренда из метатрейдера4 в Амиброкер.

Индикатор отображает индекс вариации ценового ряда, вычисленного на минимальном предшествующем интервале длины 2^n. Индекс вариации показывает, что преобладает во временном ряду – трендовая или флетовая составляющая, или же ряд ведет себя случайно.

М.М. Дубовиков и др. - Размерность минимального покрытия и локальный анализ фрактальных временных рядов.

Изначально выглядело оно так:
//+------------------------------------------------------------------+
//|                                                         iVAR.mq4 |
//|                                        (C)opyright © 2008, Ilnur |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+

#property copyright "(C)opyright © 2008, Ilnur"
#property link      "http://www.metaquotes.net"
//---- настройки индикатора
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_level1 0.5
//---- входные параметры
extern int n = 5;
extern int nBars = 1000;
//---- буфер индикатора
double ibuffer[];
//+------------------------------------------------------------------+
//| Функция инициализации индикатора                                 |
//+------------------------------------------------------------------+
int init()
{
//---- настройка параметров отрисовки
   SetIndexBuffer(0,ibuffer);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexDrawBegin(0,Bars-nBars);
   SetIndexLabel(0,"iVAR");
//---- "короткое имя" отображаемое в окне индикатора
   IndicatorShortName("iVAR("+n+")");
   return(0);
}
//+------------------------------------------------------------------+
//| Основная функция индикатора                                      |
//+------------------------------------------------------------------+
int start()
{
   int i, j, k, nTotal, nCountedBars = IndicatorCounted();
   int ihigh, ilow, nInterval;
   double Delta, Xс, Yс, Sx, Sy, Sxx, Sxy;
//---- последний посчитанный бар будет пересчитан
   if(nCountedBars==0) nTotal = nBars;
   if(nCountedBars>0) nTotal = Bars-nCountedBars-1;
//---- основной цикл индикатора
   for(j=nTotal; j>=0; j--)
   {
      Sx = 0; Sy = 0; Sxx = 0; Sxy = 0;
      for(i=0; i<=n; i++)
      {
         nInterval = MathPow(2,n-i);
      //---- суммируем разницы максимальной и минимальной цен на интервале
         for(Delta=0, k=0; k<MathPow(2,i); k++)
         {
            ihigh = iHighest(Symbol(),0,MODE_HIGH,nInterval,nInterval*k+j);
            ilow = iLowest(Symbol(),0,MODE_LOW,nInterval,nInterval*k+j);
            Delta += High[ihigh]-Low[ilow];
         }
      //---- вычисляем координаты вариации в двойном логарифмическом масштабе
         Xс = (n-i)*MathLog(2.0);
         Yс = MathLog(Delta);
      //---- накапливаем данные для нахождения коэффициентов линии регрессии с помощью МНК
         Sx += Xс; 
         Sy += Yс;
         Sxx += Xс*Xс; 
         Sxy += Xс*Yс;
      }
   //---- вычисляем индекс вариации (коэффициент наклона линии регрессии)
      ibuffer[j] = -(Sx*Sy-(n+1)*Sxy)/(Sx*Sx-(n+1)*Sxx);
   }
   return(0);
}



В результате на AFL получилось следующее:
_SECTION_BEGIN("iVAR");

n = Param("n",5,3,15);
Sx = Sy = Sxx = Sxy = 0;

for (i=0; i<=n; i++)
{	nInterval = 2^(n-i);
        
//---- суммируем разницы максимальной и минимальной цен на интервале
	Delta = 0;
	for(k=0; k<2^i ; k++)
		Delta += HHV(Ref(High,nInterval*k),-nInterval)- LLV(Ref(Low,nInterval*k),-nInterval);
		
//---- вычисляем координаты вариации в двойном логарифмическом масштабе
	Xc = (n-i)*log(2);
	Yc = log(Delta);
	
//---- накапливаем данные для нахождения коэффициентов линии регрессии с помощью МНК
	Sx += Xc; 
	Sy += Yc;
	Sxx += Xc*Xc; 
	Sxy += Xc*Yc;
}

ibuffer = -(Sx*Sy-(n+1)*Sxy)/(Sx*Sx-(n+1)*Sxx);
Plot(ibuffer,"iVar("+NumToStr(n,1,False)+")",IIf(ibuffer>0.5,colorRed,colorBlack),styleLine);
Plot(0.5,"",colorBlack);
_SECTION_END();

Скажем так: слегка покороче B)
Последнее редактирование: 6 года 3 мес. назад пользователем admin.
Спасибо сказали: AlexLan, darshan

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Подробнее
8 года 7 мес. назад - 8 года 7 мес. назад #574 от AlexLan
Михаил, спасибо ;) интересный индикатор.
Красиво написана программа.
Последнее редактирование: 8 года 7 мес. назад пользователем AlexLan.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Подробнее
8 года 6 мес. назад #628 от alexby
Михаил, добрый день,

но вот по этому фрагменту кода Ref(High,nInterval*k) получается что хорошо заглядываем вперед?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Подробнее
8 года 6 мес. назад - 6 года 3 мес. назад #629 от admin
Точно. Минусики надо подрисовать правильности для. :S

Подрисовал.
Последнее редактирование: 6 года 3 мес. назад пользователем admin.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Подробнее
6 года 2 мес. назад #1143 от admin

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Подробнее
5 года 6 мес. назад #2115 от Ambrosiy
Добрый день, Михаил
Познавато спрашиваю но все таки, индикатор для амика постоянно показывает 1 с небольшим отклонением,
ниже 0,5 не опускается.
И в чем дело не знаю, подскажите пожалуйста.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Подробнее
5 года 6 мес. назад #2119 от admin
Здравствуйте!

А что неправильного в описанной вами ситуации?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Подробнее
5 года 6 мес. назад #2120 от Ambrosiy
Сам индикатор я не ставил на Метатрейдер, но по скринам и в описании он совершает движение ниже отметки
0,5, у меня на 10 летний истории не разу не пересек эту отметку, в основном это прямая линия без движения.
Амик 5.90.1

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Подробнее
5 года 6 мес. назад - 5 года 6 мес. назад #2121 от admin
Вы используете неверную логику. Во дворе у соседа есть курица, которая птица и которая не летает. Это совершенно не означает что все птицы не должны летать.

Точно также если на ваших данных индикатор опускается ниже 0.5 совершенно не означает, что на других данных это обязательно должно происходить.

Если вы сможете произвести расчет, в качестве исходных данных принимая показания графика и сможете показать, что в индикаторе есть неточности -велкам.
Последнее редактирование: 5 года 6 мес. назад пользователем admin.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Модераторы: admin