Как разместить 6 буферов в одном под окне индиктора - страница 2

 
Sergey Savinkin:

Спасибо, буду пробывать

 

Расскажу подробно к какому решению пришел я.

Так как я использую тиковый объем который не особо нормирован, первым делом пришлось избавится от выбросов.

Для этого:

  • копируем все тики в массив
  • массив сортируем по возрастанию
  • в середине массива значение равное половине всех возможных значений. - это медиана
  • вычислим верхний квартиль - он будет лежать на 25 % выше медианы. (Пример массив содержит 100 значащий, медиана будет лежать под индексом 50, верхний квартиль под индексом 75)
  • вычислим нижний квартиль - он будет лежать на 25 % нижемедианы. (Пример массив содержит 100 значащий, медиана будет лежать под индексом 50, нижний квартиль под индексом 25)
  • найдем межквартириальный диапазон - вычтем из верхнего квантиля значение нижнего квантиля
  • найдем внутренние границы значений - верхняя граница - межквартириальный диапазон умножем на 1.5 и прибавим к верхний квартилю. Нижняя граница межквартириальный диапазон умножем на 1.5 и вычитаем к нижнего квартиля
  • Так как я использую тиковый объем который не может быть ниже 0, то я в цикле проверию текущий тиковый объем выше верхнего квартиля? если да то он равняется верхнему квантилю, иначе равняется самому себе.

График у меня разделен на 3 зоны по 130 пунков каждый. Для того что бы уместить тики  в 130 пунктах я верхний квантиль делю на 130 и узнаю коэффициент. Буфер индикатора заполняю значениями тиковый объем деленный на коэффициент. 

Так же поступаем с 2 буфером только в в конце добавляем 130 что бы поднять его над 1 буфером. 3 буфер соотвественно так же только добавляем 260 что бы приподнять над 2 буфером.

   int otschet;
   int corekt1=130;
   long c[], volume, buffer[];

   otschet=ArraySize(tick_volume)-1;
   ArrayCopy(c,tick_volume,0,0);
   ArraySort(c);
  
   long MedianCur=c[(otschet)/2]; // медиана
   long LongMedianCur=c[(otschet)/4]; // нижний квантиль 
   long ShortMedianCur=c[(otschet)-((otschet)/4)]; //верхний квантиль
   
   DeltaCur=((ShortMedianCur-LongMedianCur)*konf1)+ShortMedianCur; // верхняя граница
   kof1=DeltaCur/corekt1;  // Коэффициент

for(int i=0;i<=otschet && !IsStopped() ;i++)
{
   if(tick_volume[i]<DeltaCur){volume=tick_volume[i];}
   else{volume=DeltaCur;}
   buffer[i]=volume/kof1;
}

 
Evgeny Raspaev:

Расскажу подробно к какому решению пришел я.

Так как я использую тиковый объем который не особо нормирован, первым делом пришлось избавится от выбросов.

Для этого:

  • копируем все тики в массив
  • массив сортируем по возрастанию
  • в середине массива значение равное половине всех возможных значений. - это медиана
  • вычислим верхний квартиль - он будет лежать на 25 % выше медианы. (Пример массив содержит 100 значащий, медиана будет лежать под индексом 50, верхний квартиль под индексом 75)
  • вычислим нижний квартиль - он будет лежать на 25 % нижемедианы. (Пример массив содержит 100 значащий, медиана будет лежать под индексом 50, нижний квартиль под индексом 25)
  • найдем межквартириальный диапазон - вычтем из верхнего квантиля значение нижнего квантиля
  • найдем внутренние границы значений - верхняя граница - межквартириальный диапазон умножем на 1.5 и прибавим к верхний квартилю. Нижняя граница межквартириальный диапазон умножем на 1.5 и вычитаем к нижнего квартиля
  • Так как я использую тиковый объем который не может быть ниже 0, то я в цикле проверию текущий тиковый объем выше верхнего квартиля? если да то он равняется верхнему квантилю, иначе равняется самому себе.

График у меня разделен на 3 зоны по 130 пунков каждый. Для того что бы уместить тики  в 130 пунктах я верхний квантиль делю на 130 и узнаю коэффициент. Буфер индикатора заполняю значениями тиковый объем деленный на коэффициент. 

Так же поступаем с 2 буфером только в в конце добавляем 130 что бы поднять его над 1 буфером. 3 буфер соотвественно так же только добавляем 260 что бы приподнять над 2 буфером.

Так как у Вас написано - не медиана а среднее. Расчеты IQR по средней неверны

 
Vladimir Perervenko:

Так как у Вас написано - не медиана а среднее. Расчеты IQR по средней неверны

Напишите как верно. Я считаю средние это сумма всех значений деленная на их количество. Здесь же я взял все значения расположил по возрастанию и из середины массивы взял значение. 

 
Evgeny Raspaev:

... я взял все значения расположил по возрастанию и из середины массивы взял значение. 

Это верное определение медианы( для нечетного количества членов массива), для четного обычно берут среднее из двух расположенных посредине значений. 

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

Удачи